├── .eslintrc.json
├── .gitignore
├── .vscode
├── extensions.json
├── launch.json
└── settings.json
├── .vscodeignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── extension.js
├── img
├── new_icon
│ ├── VSNotesIcon.sketch
│ ├── VSNotesIcon@1.5x.svg
│ ├── VSNotesIcon@1x.png
│ ├── VSNotesIcon@2x.png
│ └── VSNotesIcon@3x.png
├── old_icon
│ ├── vsnotes_icon.png
│ └── vsnotes_icon_big.png
├── vsnotes_commands.png
├── vsnotes_path_detection.png
├── vsnotes_path_detection_completed.png
└── vsnotes_view.png
├── jsconfig.json
├── media
├── dark
│ ├── file-directory.svg
│ ├── file.svg
│ ├── sync.svg
│ └── tag.svg
├── icon
│ ├── vsnotes_icon.png
│ ├── vsnotes_icon.svg
│ └── vsnotes_icon_big.png
└── light
│ ├── file-directory.svg
│ ├── file.svg
│ ├── sync.svg
│ └── tag.svg
├── package-lock.json
├── package.json
├── snippets
└── markdown.json
├── src
├── commitPush.js
├── listNotes.js
├── listTags.js
├── newNote.js
├── pull.js
├── search.js
├── setupNotes.js
├── treeView.js
└── utils.js
└── test
├── extension.test.js
└── index.js
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": false,
4 | "commonjs": true,
5 | "es6": true,
6 | "node": true
7 | },
8 | "parserOptions": {
9 | "ecmaVersion": 2017,
10 | "ecmaFeatures": {
11 | "jsx": true
12 | },
13 | "sourceType": "module"
14 | },
15 | "rules": {
16 | "no-const-assign": "warn",
17 | "no-this-before-super": "warn",
18 | "no-undef": "warn",
19 | "no-unreachable": "warn",
20 | "no-unused-vars": "warn",
21 | "constructor-super": "warn",
22 | "valid-typeof": "warn"
23 | }
24 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .vscode-test/
3 | .vsix
4 | .DS_Store
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See https://go.microsoft.com/fwlink/?LinkId=733558
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "dbaeumer.vscode-eslint"
6 | ]
7 | }
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | // A launch configuration that launches the extension inside a new window
2 | {
3 | "version": "0.1.0",
4 | "configurations": [
5 | {
6 | "name": "Extension",
7 | "type": "extensionHost",
8 | "request": "launch",
9 | "runtimeExecutable": "${execPath}",
10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
11 | "stopOnEntry": false
12 | },
13 | {
14 | "name": "Extension Tests",
15 | "type": "extensionHost",
16 | "request": "launch",
17 | "runtimeExecutable": "${execPath}",
18 | "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/test" ],
19 | "stopOnEntry": false
20 | }
21 | ]
22 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 | }
--------------------------------------------------------------------------------
/.vscodeignore:
--------------------------------------------------------------------------------
1 | .vscode/**
2 | .vscode-test/**
3 | test/**
4 | .gitignore
5 | jsconfig.json
6 | vsc-extension-quickstart.md
7 | .eslintrc.json
8 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 | All notable changes to the "vsnotes" extension will be documented in this file.
3 |
4 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
5 |
6 | ## [0.7.1] - 2019-7-15
7 | ### Added
8 | - Added option `vsnotes.additionalNoteTitles` and ability to pick note title format
9 | during note creation.
10 | - Added "Open Note" command. Depricating `List Recent Notes` command and will remove in 0.8.0.
11 |
12 | ### Fixes
13 | - Fixed event-stream vulnerability and update dependencies.
14 |
15 | ## [0.6.0] - 2018-10-8
16 | ### Added
17 | - You can now use the home designator (~/) in the defaultNotePath.
18 | - Adds a new command that creates a note in a currently opened workspace.
19 |
20 | ### Fixes
21 | - Fixes namespace for commands.
22 | - Fixes bug [#26](https://github.com/patleeman/VSNotes/issues/26).
23 |
24 |
25 | ## [0.5.1] - 2018-6-6
26 | ### Added
27 | - Updated NPM dependencies
28 | - New icon thanks to Phil Helm
29 |
30 | ### Changed
31 | - Moved treeview into custom activitybar.
32 |
33 | ### Fixes
34 | - Merged in [MR#16](https://github.com/patleeman/VSNotes/pull/15) which sorts tags alphabetically
35 |
36 |
37 |
38 | ## [0.5.0] - 2018-3-6
39 | - Add search command
40 | - Update dependencies and close moment.js vulnerability
41 | - Updated Open Note Folder command to open in a new window
42 | - Add `defaultNoteName` and pre-populate create note command with it to quickly create notes
43 | - Fix listRecentItems feature not sorting correctly
44 |
45 | ## [0.4.2] - 2017-11-15
46 | ### Fixes
47 | - Fix Tags not populating on editor view and in quick pick if more than a few notes in notes folder.
48 | - Fix List Recent Notes not respecting ignore patterns
49 |
50 | ## [0.4.1] - 2017-11-14
51 | ### Fixes
52 | - [Windows note path getting mangled](https://github.com/patleeman/VSNotes/issues/3)
53 |
54 | ## [0.4.0] - 2017-11-14
55 | ### Added
56 | - Commit and push command added.
57 | - Commit and push command setting added.
58 | - Commit and push default commit message added.
59 |
60 | ## [0.3.1] - 2017-11-13
61 | ### Added
62 | - Icon
63 |
64 | ## [0.3.0] - 2017-11-13
65 | ### Added
66 | - Explorer tree view. 0.3.0 adds a tree view to the explorer (left sidebar) that displays tags and files inside the note directory.
67 | - Added file ignore pattern to settings. Ignore filenames and exclude them from listings using regex.
68 |
69 | ### Removed
70 | - Removed hardcoded dependency on markdown files. VS Notes now shows all files not ignored in the ignore pattern setting.
71 |
72 | ## [0.2.0] - 2017-11-9
73 | ### Added
74 | - `List Tags` Command. VSNotes will recurse notes directory and look for YAML encoded frontmatter with a tags key. Tags are then indexed and shown.
75 | - Automatically execute snippet on new note creation. VS Notes will now automatically execute a snippet named `vsnotes` after creating a new note.
76 |
77 | ## [0.1.0] - 2017-11-7
78 | ### Added
79 | - Initial release
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to VS Notes
2 |
3 | Contributions and bug fixes are welcome.
4 |
5 | How you can contribute:
6 | - Report bugs
7 | - Fix bugs and resolve issues
8 | - Work on features
9 | - Help build tests
10 |
11 | ## Reporting bugs
12 |
13 | Bugs are pesky and if you find one, please open up a new [issue](https://github.com/patleeman/VSNotes/issues) with as much information as you can give us. The more detailed and reproducable the information the easier it is for us to fix the problem.
14 |
15 | ## Fixing bugs
16 |
17 | Want to help fix some bugs? Fork the repository, create a feature branch, then submit a pull request. We'll work it out there.
18 |
19 | ## Working on features
20 |
21 | Have a feature you're interested in contributing? Open an issue and lets talk.
22 |
23 | ## Build tests
24 |
25 | If you like building tests, hop on in there.
26 |
27 | # Not covered?
28 | If you're interested in contributing but not sure how, open a new [issue](https://github.com/patleeman/VSNotes/issues).
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2018 Patrick Lee
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 |
7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8 |
9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # VS NOTES
2 |
3 | !!! This project is no longer maintained (and hasn't been for a few years). !!!
4 |
5 |
6 |
7 | VS Notes is a simple tool that takes care of the creation and management of plain text notes and harnesses the power of VS Code via the Command Palette.
8 |
9 | 
10 |
11 |
12 |
13 | - [VS NOTES](#vs-notes)
14 | - [Demo Video](#demo-video)
15 | - [Repository](#repository)
16 | - [Features](#features)
17 | - [Quick Start](#quick-start)
18 | - [Taking Notes](#taking-notes)
19 | - [Note Filename](#note-filename)
20 | - [Filename Tokens](#filename-tokens)
21 | - [File Path Detection](#file-path-detection)
22 | - [Default Template](#default-template)
23 | - [Custom Templates](#custom-templates)
24 | - [Tags](#tags)
25 | - [Custom Activity Bar Section & Explorer View](#custom-activity-bar-section--explorer-view)
26 | - [Commit and Push](#commit-and-push)
27 | - [Settings](#settings)
28 | - [Tips and tricks](#tips-and-tricks)
29 | - [Roadmap & Features](#roadmap--features)
30 | - [Change log](#change-log)
31 | - [Contributing](#contributing)
32 | - [Contributors](#contributors)
33 | - [Reviews](#reviews)
34 |
35 |
36 |
37 | # Demo Video
38 |
39 | [Click to watch 1 min demo video.](https://www.youtube.com/watch?v=Kcf4rpRDmlQ)
40 |
41 | [](https://www.youtube.com/watch?v=Kcf4rpRDmlQ)
42 |
43 | # Repository
44 | [VS Notes is MIT Licensed and available on Github](https://github.com/patleeman/VSNotes)
45 |
46 | # Features
47 | 1. Access commands quickly from the VS Code command palette `Ctrl/Cmd + Shift + p`.
48 | 2. Set a base folder for your notes and all notes created will be saved in that folder.
49 | 3. Easily access latest notes with `Open Note` command.
50 | 4. Retrieve notes via tags in YAML encoded frontmatter on your notes.
51 | 5. Open your note folder in a new window.
52 | 6. View your notes and tags in your filebar.
53 | 7. Automatically insert a VS Code snippet upon creation of a new note.
54 | 8. Commit and push to your upstream repository with a single command.
55 | 9. *New* Create a note in a currently open workspace.
56 |
57 | # Quick Start
58 |
59 | - Install the extension from the VS Code Extension menu or [click install on this page.](https://marketplace.visualstudio.com/items?itemName=patricklee.vsnotes).
60 | - Open the command palette `Ctrl/Cmd + Shift + p` and type `vsnotes`. Select Run Setup.
61 | - Click start and then select a directory to save your notes to.
62 |
63 | > To modify other settings, open the VS Code settings `Preferences > Settings` or hit `Ctrl/Cmd + ,` and type in vsnotes in the search bar. To override the setting, copy it over to your user settings file and modify.
64 |
65 | - Access VSNotes commands in the command pallette by pressing `ctrl/cmd + shift + p` and typing vsnotes.
66 |
67 | # Taking Notes
68 | VSNotes is just a quick way to create files in a single location and retrieve them later. Harness the power of VSCode and the extension ecosystem to customize your note taking workflow. The default file type is markdown and features are built around taking markdown notes. However if you want to save your notes as other types of plain text files, you can change the settings to append a different file extension.
69 |
70 | [New in 0.6.0] Create a note in one of the currently open workspaces with the new Create note in workspace command. If you have multiple workspaces open, you will be down a dropdown list to pick which workspace to create a note in.
71 |
72 | ## Note Filename
73 | When creating a new note, VS Notes will look at the `vsnotes.defaultNoteTitle` setting to grab the format for the file name. This string contains several [tokens](#filename-tokens) that is converted by VS Notes when a note is created. Tokens can be modified in the `vsnotes.tokens` setting, but shouldn't be modified unless necessary. When asked to input a title for your new note, VSNotes can [detect file paths and will create subfolders as necessary](#file-path-detection).
74 |
75 | ### Filename Tokens
76 | Tokens are added to the `defaultNoteTitle` setting and will automatically insert desired data into the file name of the note. This gives us the ability to specify a simple title for a note and have additional metadata added to the file name.
77 |
78 | - datetime: Inserts the current date time in a format specified by the format key. [Formatting options](https://momentjs.com/docs/#/displaying/format/). Don't modify type or token keys unless you know what you're doing.
79 |
80 | ```
81 | {
82 | "type": "datetime",
83 | "token": "{dt}",
84 | "format": "YYYY-MM-DD_HH-mm",
85 | "description": "Insert current datetime"
86 | }
87 | ```
88 |
89 | - title: When you create a new note, VS Notes will ask you for a title for the note. After entering a title, it will replace this token with the input text. There shouldn't be any need to modify this setting.
90 |
91 | ```
92 | {
93 | "type": "title",
94 | "token": "{title}",
95 | "description": "Insert note title",
96 | "format": "Untitled"
97 | },
98 | ```
99 |
100 | - extension: The file extension for the file. Defaults to markdown but you can change it to whatever you want. For example, if you prefer plain text notes, change it to `.txt`.
101 |
102 | ```
103 | {
104 | "type": "extension",
105 | "token": "{ext}",
106 | "description": "Insert file extension",
107 | "format": "md"
108 | }
109 | ```
110 |
111 | ### Additional Note Titles
112 |
113 | [New in 0.7.1] Added a new option `vsnotes.additionalNoteTitles` which is an array that contains note title tokens. If there are any tokens in this array, a picker will be shown with the option to choose which note title format you'd like to use.
114 |
115 | ### File Path Detection
116 |
117 | VSNotes understands file paths and will create folders as necessary. When prompted for a note title, inputting a path will nest the new note under the folders designated in the path. All paths are generated from the main notes folder.
118 |
119 | *Input text delimited by your system's file path separator. Windows: `\` Mac/Linux: `/`*
120 |
121 | 
122 |
123 | *VSCode generates necessary subfolders and places the new note inside*
124 |
125 | 
126 |
127 |
128 | ### Default Template
129 |
130 | [New in 0.2.0] VS Notes will automatically execute a snippet after creating a note to pre-populate the note with a handy form template. The default snippet is called `vsnote_template_default` and created for the markdown language. You can override it by adding this option to your settings.json file and pointing it to a [custom snippet you've created](https://code.visualstudio.com/docs/editor/userdefinedsnippets).
131 |
132 | ```
133 | "vsnotes.defaultSnippet": {
134 | "langId": "markdown",
135 | "name": "vsnote_template_default"
136 | },
137 | ```
138 |
139 | - Set `langId` to the desired language and `name` to a snippet's name.
140 | - Set `langId` to a language and `name` to `null` and a menu will open with all available snippets for your chosen language.
141 | - Set both `langId` and `name` to null to disable automatic snippet insertion.
142 |
143 | ### Custom Templates
144 |
145 | [New in 0.7.0] VS Notes adds the ability to choose markdown snippets on new note creation. To use this new feature, you first must add markdown snippets with a `vsnote_template_` prefix.
146 |
147 | Navigate to `Code > Preferences > User Snippets > Markdown` and add additional snippets. For example:
148 |
149 | ```
150 | "vsnote_template_meeting": {
151 | "prefix": "vsnote_template_meeting",
152 | "body": [
153 | "---",
154 | "tags:",
155 | "\t- meeting",
156 | "---",
157 | "\n# Meeting: $1 - $CURRENT_DATE/$CURRENT_MONTH/$CURRENT_YEAR\n",
158 | "$2",
159 | ],
160 | "description": "Generic Meeting Template",
161 | },
162 | ```
163 |
164 | Once you create your snippet in `settings.json`, add the `vsnotes.templates` to your settings and add the name of the template (without the `vsnote_template_` prefix)
165 |
166 | ```
167 | "vsnotes.templates": [
168 | "meeting",
169 | ],
170 | ```
171 |
172 | Afterwards when you execute the `Create a New Note` command, you will be shown a prompt to select which template you'd like to use for your new note. To use the default template, hit escape.
173 |
174 | ### Tags
175 | [New in 0.2.0] VS Notes adds the ability to pull tags out of documents containing a [YAML](http://yaml.org/) [frontmatter block (a la jekyll's frontmatter)](https://jekyllrb.com/docs/frontmatter/). YAML frontmatter is a way to encode machine parsable data in a way that is friendly to read and write.
176 |
177 | If a file in your note folder has YAML frontmatter with a tag array, VS Notes will extract the tags from the note and show you all notes with specific tags.
178 |
179 | Example YAML frontmatter
180 |
181 | ```
182 | // file.md
183 | ---
184 | tags:
185 | - tag1
186 | - tag2
187 | ---
188 |
189 | The rest of the document goes here
190 | ...
191 | ```
192 |
193 | VS Notes ships with a default YAML encoded snippet that it will insert on creation of a new note.
194 |
195 | ### Custom Activity Bar Section & Explorer View
196 | 
197 |
198 | [New in 0.5.1] VS Notes moves the treeview into it's own custom location in the activity bar.
199 |
200 | Access your notes no matter what you're doing. This new treeview adds a quick way to access your tags or files at any time by placing a small window in your explorer (file bar) that displays your tags and the contents of your note folder. Now you don't have to navigate away from a project or open a new window to reference your notes. Quick and easy.
201 |
202 | [New in 0.5.1] Show or hide the tags or files section of the treeview with the `treeviewHideTags` and `treeviewHideFiles` settings.
203 |
204 | ### Commit and Push
205 |
206 | [New in 0.4.0] The Commit and Push command is a simple way to add all changes, commit, and push your changes if a version control system like Git is set up in your notes folder. The default command is set up for *nix style systems and requires the git command be accessible.
207 |
208 | To customize the command and the default command and commit message, update the settings: `vsnotes.commitPushShellCommand` and `vsnotes.commitPushDefaultCommitMessage`.
209 |
210 | ### Pull
211 | [New in 0.8.0] The Pull command is a companion to the Commit and Push command. It pulls from remote repo with `git pull` by default. To customize the command, update the settings `vsnotes.pullShellCommand`.
212 |
213 | # Settings
214 | Available settings
215 |
216 | ```
217 | // List of additional note title tokens to choose from. If supplied, a picker will be shown when creating a new note.
218 | "vsnotes.additionalNoteTitles": [],
219 |
220 | // The default commit message used if none is provided with the Commit and Push command.
221 | "vsnotes.commitPushDefaultCommitMessage": "VS Notes Commit and Push",
222 |
223 | // Shell command to execute in the note directory when the Commit and Push command is executed. The {msg} token will be replaced with the contents of an input box shown or, if empty, the default commit message.
224 | "vsnotes.commitPushShellCommand": "git add -A && git commit -m \"{msg}\" && git push",
225 |
226 | // Default title for new notes.
227 | "vsnotes.defaultNoteName": "New_Note",
228 |
229 | // Path to directory to save notes. Use ~/ to denote a relative path from home folder.
230 | "vsnotes.defaultNotePath": "",
231 |
232 | // Default note title. Utilizes tokens set in vsnotes.tokens.
233 | "vsnotes.defaultNoteTitle": "{dt}_{title}.{ext}",
234 |
235 | // Default vscode snippet to execute after creating a note. Set both langId and name to null to disable.
236 | "vsnotes.defaultSnippet": {
237 | "langId": "markdown",
238 | "name": "vsnote_template_default"
239 | },
240 |
241 | // Regular expressions for file names to ignore when parsing documents in note folder.
242 | "vsnotes.ignorePatterns": [
243 | "^\\."
244 | ],
245 |
246 | // Number of recent files to show when running command `List Notes`.
247 | "vsnotes.listRecentLimit": 15,
248 |
249 | // Automatically convert blank spaces in title to character. To disable set to `null`.
250 | "vsnotes.noteTitleConvertSpaces": "_",
251 |
252 | // A list of markdown templates to choose from when creating a new note.
253 | "vsnotes.templates": [],
254 |
255 | // Tokens used to replace text in file name.
256 | "vsnotes.tokens": [
257 | {
258 | "type": "datetime",
259 | "token": "{dt}",
260 | "format": "YYYY-MM-DD_HH-mm",
261 | "description": "Insert formatted datetime."
262 | },
263 | {
264 | "type": "title",
265 | "token": "{title}",
266 | "description": "Insert note title from input box.",
267 | "format": "Untitled"
268 | },
269 | {
270 | "type": "extension",
271 | "token": "{ext}",
272 | "description": "Insert file vsnotes.",
273 | "format": "md"
274 | }
275 | ],
276 |
277 | // Hide the files section in the sidebar. Requires application restart.
278 | "vsnotes.treeviewHideFiles": false,
279 |
280 | // Hide the tags section in the sidebar. Requires application restart.
281 | "vsnotes.treeviewHideTags": false,
282 | ```
283 |
284 | # Tips and tricks
285 | - [Customize your default template with snippets](https://code.visualstudio.com/docs/editor/userdefinedsnippets). Create your own snippets and automatically have them populate when creating a new note with the `vsnotes.defaultSnippet` setting.
286 | - [Take advantage of built in markdown features in VSCode](https://code.visualstudio.com/docs/languages/markdown). VS Code has some very rich Markdown features to take advantage of.
287 | - [Supercharge your markdown workflow with extensions](https://marketplace.visualstudio.com/search?term=markdown&target=VSCode&category=All%20categories&sortBy=Relevance). Find extensions in the marketplace to add markdown functionality to your workflow.
288 |
289 | # Roadmap & Features
290 |
291 | [See Github Issues](https://github.com/patleeman/VSNotes/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement)
292 |
293 | # Change log
294 |
295 | [See CHANGELOG.md](./CHANGELOG.md)
296 |
297 | # Contributing
298 |
299 | [See CONTRIBUTING.md](./CONTRIBUTING.md)
300 |
301 | # Contributors
302 |
303 | These lovely people have helped make VS Notes a better tool for everybody! Thank you!
304 |
305 | - [Github code contributions](https://github.com/patleeman/VSNotes/graphs/contributors)
306 | - VSCode icon created by [Phil Helm](https://github.com/phelma)
307 |
308 |
309 | # Reviews
310 |
311 | [Do you like VS Notes? Leave a review.](https://marketplace.visualstudio.com/items?itemName=patricklee.vsnotes#review-details)
312 |
--------------------------------------------------------------------------------
/extension.js:
--------------------------------------------------------------------------------
1 | const vscode = require('vscode');
2 |
3 | const {newNote, newNoteInWorkspace} = require('./src/newNote');
4 | const listNotes = require('./src/listNotes');
5 | const listTags = require('./src/listTags')
6 | const setupNotes = require('./src/setupNotes');
7 | const VSNotesTreeView = require('./src/treeView');
8 | const commitPush = require('./src/commitPush');
9 | const pull = require('./src/pull');
10 | const search = require('./src/search');
11 | const utils = require('./src/utils');
12 |
13 | // this method is called when your extension is activated
14 | // your extension is activated the very first time the command is executed
15 | function activate(context) {
16 | const tv = new VSNotesTreeView()
17 | vscode.window.registerTreeDataProvider('vsnotes', tv);
18 |
19 | // Refresh View
20 | vscode.commands.registerCommand('vsnotes.refreshVSNotesView', () => tv.refresh());
21 |
22 | // Create a new note
23 | let newNoteDisposable = vscode.commands.registerCommand('vsnotes.newNote', newNote);
24 | context.subscriptions.push(newNoteDisposable);
25 |
26 | // Create a new note in a current workspace
27 | let newNoteInWorkspaceDisposable = vscode.commands.registerCommand('vsnotes.newNoteInWorkspace', newNoteInWorkspace);
28 | context.subscriptions.push(newNoteInWorkspaceDisposable);
29 |
30 | // Open a note
31 | let listNotesDisposable = vscode.commands.registerCommand('vsnotes.listNotes', listNotes);
32 | context.subscriptions.push(listNotesDisposable);
33 |
34 | // List tags
35 | let listTagsDisposable = vscode.commands.registerCommand('vsnotes.listTags', listTags);
36 | context.subscriptions.push(listTagsDisposable);
37 |
38 | // Run setup
39 | let setupDisposable = vscode.commands.registerCommand('vsnotes.setupNotes', setupNotes);
40 | context.subscriptions.push(setupDisposable);
41 |
42 | // Commit and Push
43 | let commitPushDisposable = vscode.commands.registerCommand('vsnotes.commitPush', commitPush);
44 | context.subscriptions.push(commitPushDisposable);
45 |
46 | let pullDisposable = vscode.commands.registerCommand('vsnotes.pull', pull);
47 | context.subscriptions.push(pullDisposable);
48 |
49 | // Search
50 | let searchDisposable = vscode.commands.registerCommand('vsnotes.search', search, {context: context});
51 | context.subscriptions.push(searchDisposable);
52 |
53 | // Open note folder in new workspace
54 | let openNoteFolderDisposable = vscode.commands.registerCommand('vsnotes.openNoteFolder', () => {
55 | const noteFolder = vscode.workspace.getConfiguration('vsnotes').get('defaultNotePath');
56 | const folderPath = utils.resolveHome(noteFolder);
57 | const uri = vscode.Uri.file(folderPath)
58 | return vscode.commands.executeCommand('vscode.openFolder', uri, true);
59 | })
60 | context.subscriptions.push(openNoteFolderDisposable);
61 |
62 | }
63 | exports.activate = activate;
64 |
65 | // this method is called when your extension is deactivated
66 | function deactivate() {
67 | }
68 | exports.deactivate = deactivate;
--------------------------------------------------------------------------------
/img/new_icon/VSNotesIcon.sketch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/new_icon/VSNotesIcon.sketch
--------------------------------------------------------------------------------
/img/new_icon/VSNotesIcon@1.5x.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/img/new_icon/VSNotesIcon@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/new_icon/VSNotesIcon@1x.png
--------------------------------------------------------------------------------
/img/new_icon/VSNotesIcon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/new_icon/VSNotesIcon@2x.png
--------------------------------------------------------------------------------
/img/new_icon/VSNotesIcon@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/new_icon/VSNotesIcon@3x.png
--------------------------------------------------------------------------------
/img/old_icon/vsnotes_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/old_icon/vsnotes_icon.png
--------------------------------------------------------------------------------
/img/old_icon/vsnotes_icon_big.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/old_icon/vsnotes_icon_big.png
--------------------------------------------------------------------------------
/img/vsnotes_commands.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/vsnotes_commands.png
--------------------------------------------------------------------------------
/img/vsnotes_path_detection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/vsnotes_path_detection.png
--------------------------------------------------------------------------------
/img/vsnotes_path_detection_completed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/vsnotes_path_detection_completed.png
--------------------------------------------------------------------------------
/img/vsnotes_view.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/img/vsnotes_view.png
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "target": "es6",
5 | "lib": [
6 | "es6"
7 | ]
8 | },
9 | "exclude": [
10 | "node_modules"
11 | ]
12 | }
--------------------------------------------------------------------------------
/media/dark/file-directory.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/dark/file.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/dark/sync.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/dark/tag.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/icon/vsnotes_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/media/icon/vsnotes_icon.png
--------------------------------------------------------------------------------
/media/icon/vsnotes_icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/icon/vsnotes_icon_big.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/media/icon/vsnotes_icon_big.png
--------------------------------------------------------------------------------
/media/light/file-directory.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/light/file.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/light/sync.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/media/light/tag.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vsnotes",
3 | "version": "0.7.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/mocha": {
8 | "version": "5.2.7",
9 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
10 | "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==",
11 | "dev": true
12 | },
13 | "@types/node": {
14 | "version": "10.14.12",
15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.12.tgz",
16 | "integrity": "sha512-QcAKpaO6nhHLlxWBvpc4WeLrTvPqlHOvaj0s5GriKkA1zq+bsFBPpfYCvQhLqLgYlIko8A9YrPdaMHCo5mBcpg==",
17 | "dev": true
18 | },
19 | "acorn": {
20 | "version": "5.7.3",
21 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
22 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
23 | "dev": true
24 | },
25 | "acorn-jsx": {
26 | "version": "3.0.1",
27 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
28 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
29 | "dev": true,
30 | "requires": {
31 | "acorn": "^3.0.4"
32 | },
33 | "dependencies": {
34 | "acorn": {
35 | "version": "3.3.0",
36 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
37 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
38 | "dev": true
39 | }
40 | }
41 | },
42 | "agent-base": {
43 | "version": "4.3.0",
44 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
45 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
46 | "dev": true,
47 | "requires": {
48 | "es6-promisify": "^5.0.0"
49 | }
50 | },
51 | "ajv": {
52 | "version": "5.5.2",
53 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
54 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
55 | "dev": true,
56 | "requires": {
57 | "co": "^4.6.0",
58 | "fast-deep-equal": "^1.0.0",
59 | "fast-json-stable-stringify": "^2.0.0",
60 | "json-schema-traverse": "^0.3.0"
61 | }
62 | },
63 | "ajv-keywords": {
64 | "version": "2.1.1",
65 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
66 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
67 | "dev": true
68 | },
69 | "ansi-escapes": {
70 | "version": "3.2.0",
71 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
72 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
73 | "dev": true
74 | },
75 | "ansi-regex": {
76 | "version": "2.1.1",
77 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
78 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
79 | "dev": true
80 | },
81 | "ansi-styles": {
82 | "version": "2.2.1",
83 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
84 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
85 | "dev": true
86 | },
87 | "argparse": {
88 | "version": "1.0.10",
89 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
90 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
91 | "requires": {
92 | "sprintf-js": "~1.0.2"
93 | }
94 | },
95 | "asn1": {
96 | "version": "0.2.4",
97 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
98 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
99 | "dev": true,
100 | "requires": {
101 | "safer-buffer": "~2.1.0"
102 | }
103 | },
104 | "assert-plus": {
105 | "version": "1.0.0",
106 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
107 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
108 | "dev": true
109 | },
110 | "asynckit": {
111 | "version": "0.4.0",
112 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
113 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
114 | "dev": true
115 | },
116 | "aws-sign2": {
117 | "version": "0.7.0",
118 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
119 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
120 | "dev": true
121 | },
122 | "aws4": {
123 | "version": "1.8.0",
124 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
125 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
126 | "dev": true
127 | },
128 | "babel-code-frame": {
129 | "version": "6.26.0",
130 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
131 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
132 | "dev": true,
133 | "requires": {
134 | "chalk": "^1.1.3",
135 | "esutils": "^2.0.2",
136 | "js-tokens": "^3.0.2"
137 | },
138 | "dependencies": {
139 | "chalk": {
140 | "version": "1.1.3",
141 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
142 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
143 | "dev": true,
144 | "requires": {
145 | "ansi-styles": "^2.2.1",
146 | "escape-string-regexp": "^1.0.2",
147 | "has-ansi": "^2.0.0",
148 | "strip-ansi": "^3.0.0",
149 | "supports-color": "^2.0.0"
150 | }
151 | },
152 | "strip-ansi": {
153 | "version": "3.0.1",
154 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
155 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
156 | "dev": true,
157 | "requires": {
158 | "ansi-regex": "^2.0.0"
159 | }
160 | }
161 | }
162 | },
163 | "balanced-match": {
164 | "version": "1.0.0",
165 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
166 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
167 | "dev": true
168 | },
169 | "bcrypt-pbkdf": {
170 | "version": "1.0.2",
171 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
172 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
173 | "dev": true,
174 | "requires": {
175 | "tweetnacl": "^0.14.3"
176 | }
177 | },
178 | "brace-expansion": {
179 | "version": "1.1.11",
180 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
181 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
182 | "dev": true,
183 | "requires": {
184 | "balanced-match": "^1.0.0",
185 | "concat-map": "0.0.1"
186 | }
187 | },
188 | "browser-stdout": {
189 | "version": "1.3.1",
190 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
191 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
192 | "dev": true
193 | },
194 | "buffer-from": {
195 | "version": "1.1.1",
196 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
197 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
198 | "dev": true
199 | },
200 | "caller-path": {
201 | "version": "0.1.0",
202 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
203 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
204 | "dev": true,
205 | "requires": {
206 | "callsites": "^0.2.0"
207 | }
208 | },
209 | "callsites": {
210 | "version": "0.2.0",
211 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
212 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
213 | "dev": true
214 | },
215 | "caseless": {
216 | "version": "0.12.0",
217 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
218 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
219 | "dev": true
220 | },
221 | "chalk": {
222 | "version": "2.4.2",
223 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
224 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
225 | "dev": true,
226 | "requires": {
227 | "ansi-styles": "^3.2.1",
228 | "escape-string-regexp": "^1.0.5",
229 | "supports-color": "^5.3.0"
230 | },
231 | "dependencies": {
232 | "ansi-styles": {
233 | "version": "3.2.1",
234 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
235 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
236 | "dev": true,
237 | "requires": {
238 | "color-convert": "^1.9.0"
239 | }
240 | },
241 | "supports-color": {
242 | "version": "5.5.0",
243 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
244 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
245 | "dev": true,
246 | "requires": {
247 | "has-flag": "^3.0.0"
248 | }
249 | }
250 | }
251 | },
252 | "chardet": {
253 | "version": "0.4.2",
254 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
255 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
256 | "dev": true
257 | },
258 | "circular-json": {
259 | "version": "0.3.3",
260 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
261 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
262 | "dev": true
263 | },
264 | "cli-cursor": {
265 | "version": "2.1.0",
266 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
267 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
268 | "dev": true,
269 | "requires": {
270 | "restore-cursor": "^2.0.0"
271 | }
272 | },
273 | "cli-width": {
274 | "version": "2.2.0",
275 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
276 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
277 | "dev": true
278 | },
279 | "co": {
280 | "version": "4.6.0",
281 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
282 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
283 | "dev": true
284 | },
285 | "color-convert": {
286 | "version": "1.9.3",
287 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
288 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
289 | "dev": true,
290 | "requires": {
291 | "color-name": "1.1.3"
292 | }
293 | },
294 | "color-name": {
295 | "version": "1.1.3",
296 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
297 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
298 | "dev": true
299 | },
300 | "combined-stream": {
301 | "version": "1.0.8",
302 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
303 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
304 | "dev": true,
305 | "requires": {
306 | "delayed-stream": "~1.0.0"
307 | }
308 | },
309 | "commander": {
310 | "version": "2.15.1",
311 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
312 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
313 | "dev": true
314 | },
315 | "concat-map": {
316 | "version": "0.0.1",
317 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
318 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
319 | "dev": true
320 | },
321 | "concat-stream": {
322 | "version": "1.6.2",
323 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
324 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
325 | "dev": true,
326 | "requires": {
327 | "buffer-from": "^1.0.0",
328 | "inherits": "^2.0.3",
329 | "readable-stream": "^2.2.2",
330 | "typedarray": "^0.0.6"
331 | }
332 | },
333 | "core-util-is": {
334 | "version": "1.0.2",
335 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
336 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
337 | "dev": true
338 | },
339 | "cross-spawn": {
340 | "version": "5.1.0",
341 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
342 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
343 | "dev": true,
344 | "requires": {
345 | "lru-cache": "^4.0.1",
346 | "shebang-command": "^1.2.0",
347 | "which": "^1.2.9"
348 | }
349 | },
350 | "dashdash": {
351 | "version": "1.14.1",
352 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
353 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
354 | "dev": true,
355 | "requires": {
356 | "assert-plus": "^1.0.0"
357 | }
358 | },
359 | "debug": {
360 | "version": "3.2.6",
361 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
362 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
363 | "dev": true,
364 | "requires": {
365 | "ms": "^2.1.1"
366 | }
367 | },
368 | "deep-is": {
369 | "version": "0.1.3",
370 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
371 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
372 | "dev": true
373 | },
374 | "delayed-stream": {
375 | "version": "1.0.0",
376 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
377 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
378 | "dev": true
379 | },
380 | "diff": {
381 | "version": "3.5.0",
382 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
383 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
384 | "dev": true
385 | },
386 | "doctrine": {
387 | "version": "2.1.0",
388 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
389 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
390 | "dev": true,
391 | "requires": {
392 | "esutils": "^2.0.2"
393 | }
394 | },
395 | "ecc-jsbn": {
396 | "version": "0.1.2",
397 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
398 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
399 | "dev": true,
400 | "requires": {
401 | "jsbn": "~0.1.0",
402 | "safer-buffer": "^2.1.0"
403 | }
404 | },
405 | "es6-promise": {
406 | "version": "4.2.8",
407 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
408 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
409 | "dev": true
410 | },
411 | "es6-promisify": {
412 | "version": "5.0.0",
413 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
414 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
415 | "dev": true,
416 | "requires": {
417 | "es6-promise": "^4.0.3"
418 | }
419 | },
420 | "escape-string-regexp": {
421 | "version": "1.0.5",
422 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
423 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
424 | "dev": true
425 | },
426 | "eslint": {
427 | "version": "4.19.1",
428 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
429 | "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
430 | "dev": true,
431 | "requires": {
432 | "ajv": "^5.3.0",
433 | "babel-code-frame": "^6.22.0",
434 | "chalk": "^2.1.0",
435 | "concat-stream": "^1.6.0",
436 | "cross-spawn": "^5.1.0",
437 | "debug": "^3.1.0",
438 | "doctrine": "^2.1.0",
439 | "eslint-scope": "^3.7.1",
440 | "eslint-visitor-keys": "^1.0.0",
441 | "espree": "^3.5.4",
442 | "esquery": "^1.0.0",
443 | "esutils": "^2.0.2",
444 | "file-entry-cache": "^2.0.0",
445 | "functional-red-black-tree": "^1.0.1",
446 | "glob": "^7.1.2",
447 | "globals": "^11.0.1",
448 | "ignore": "^3.3.3",
449 | "imurmurhash": "^0.1.4",
450 | "inquirer": "^3.0.6",
451 | "is-resolvable": "^1.0.0",
452 | "js-yaml": "^3.9.1",
453 | "json-stable-stringify-without-jsonify": "^1.0.1",
454 | "levn": "^0.3.0",
455 | "lodash": "^4.17.4",
456 | "minimatch": "^3.0.2",
457 | "mkdirp": "^0.5.1",
458 | "natural-compare": "^1.4.0",
459 | "optionator": "^0.8.2",
460 | "path-is-inside": "^1.0.2",
461 | "pluralize": "^7.0.0",
462 | "progress": "^2.0.0",
463 | "regexpp": "^1.0.1",
464 | "require-uncached": "^1.0.3",
465 | "semver": "^5.3.0",
466 | "strip-ansi": "^4.0.0",
467 | "strip-json-comments": "~2.0.1",
468 | "table": "4.0.2",
469 | "text-table": "~0.2.0"
470 | }
471 | },
472 | "eslint-scope": {
473 | "version": "3.7.3",
474 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
475 | "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
476 | "dev": true,
477 | "requires": {
478 | "esrecurse": "^4.1.0",
479 | "estraverse": "^4.1.1"
480 | }
481 | },
482 | "eslint-visitor-keys": {
483 | "version": "1.0.0",
484 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
485 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
486 | "dev": true
487 | },
488 | "espree": {
489 | "version": "3.5.4",
490 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
491 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
492 | "dev": true,
493 | "requires": {
494 | "acorn": "^5.5.0",
495 | "acorn-jsx": "^3.0.0"
496 | }
497 | },
498 | "esprima": {
499 | "version": "4.0.1",
500 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
501 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
502 | },
503 | "esquery": {
504 | "version": "1.0.1",
505 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
506 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
507 | "dev": true,
508 | "requires": {
509 | "estraverse": "^4.0.0"
510 | }
511 | },
512 | "esrecurse": {
513 | "version": "4.2.1",
514 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
515 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
516 | "dev": true,
517 | "requires": {
518 | "estraverse": "^4.1.0"
519 | }
520 | },
521 | "estraverse": {
522 | "version": "4.2.0",
523 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
524 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
525 | "dev": true
526 | },
527 | "esutils": {
528 | "version": "2.0.2",
529 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
530 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
531 | "dev": true
532 | },
533 | "extend": {
534 | "version": "3.0.2",
535 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
536 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
537 | "dev": true
538 | },
539 | "extend-shallow": {
540 | "version": "2.0.1",
541 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
542 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
543 | "requires": {
544 | "is-extendable": "^0.1.0"
545 | }
546 | },
547 | "external-editor": {
548 | "version": "2.2.0",
549 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
550 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
551 | "dev": true,
552 | "requires": {
553 | "chardet": "^0.4.0",
554 | "iconv-lite": "^0.4.17",
555 | "tmp": "^0.0.33"
556 | }
557 | },
558 | "extsprintf": {
559 | "version": "1.3.0",
560 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
561 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
562 | "dev": true
563 | },
564 | "fast-deep-equal": {
565 | "version": "1.1.0",
566 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
567 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
568 | "dev": true
569 | },
570 | "fast-json-stable-stringify": {
571 | "version": "2.0.0",
572 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
573 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
574 | "dev": true
575 | },
576 | "fast-levenshtein": {
577 | "version": "2.0.6",
578 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
579 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
580 | "dev": true
581 | },
582 | "figures": {
583 | "version": "2.0.0",
584 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
585 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
586 | "dev": true,
587 | "requires": {
588 | "escape-string-regexp": "^1.0.5"
589 | }
590 | },
591 | "file-entry-cache": {
592 | "version": "2.0.0",
593 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
594 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
595 | "dev": true,
596 | "requires": {
597 | "flat-cache": "^1.2.1",
598 | "object-assign": "^4.0.1"
599 | }
600 | },
601 | "flat-cache": {
602 | "version": "1.3.4",
603 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
604 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
605 | "dev": true,
606 | "requires": {
607 | "circular-json": "^0.3.1",
608 | "graceful-fs": "^4.1.2",
609 | "rimraf": "~2.6.2",
610 | "write": "^0.2.1"
611 | }
612 | },
613 | "forever-agent": {
614 | "version": "0.6.1",
615 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
616 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
617 | "dev": true
618 | },
619 | "form-data": {
620 | "version": "2.3.3",
621 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
622 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
623 | "dev": true,
624 | "requires": {
625 | "asynckit": "^0.4.0",
626 | "combined-stream": "^1.0.6",
627 | "mime-types": "^2.1.12"
628 | }
629 | },
630 | "fs-extra": {
631 | "version": "6.0.1",
632 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
633 | "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
634 | "requires": {
635 | "graceful-fs": "^4.1.2",
636 | "jsonfile": "^4.0.0",
637 | "universalify": "^0.1.0"
638 | }
639 | },
640 | "fs.realpath": {
641 | "version": "1.0.0",
642 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
643 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
644 | "dev": true
645 | },
646 | "functional-red-black-tree": {
647 | "version": "1.0.1",
648 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
649 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
650 | "dev": true
651 | },
652 | "getpass": {
653 | "version": "0.1.7",
654 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
655 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
656 | "dev": true,
657 | "requires": {
658 | "assert-plus": "^1.0.0"
659 | }
660 | },
661 | "glob": {
662 | "version": "7.1.4",
663 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
664 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
665 | "dev": true,
666 | "requires": {
667 | "fs.realpath": "^1.0.0",
668 | "inflight": "^1.0.4",
669 | "inherits": "2",
670 | "minimatch": "^3.0.4",
671 | "once": "^1.3.0",
672 | "path-is-absolute": "^1.0.0"
673 | }
674 | },
675 | "globals": {
676 | "version": "11.12.0",
677 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
678 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
679 | "dev": true
680 | },
681 | "graceful-fs": {
682 | "version": "4.2.0",
683 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
684 | "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg=="
685 | },
686 | "gray-matter": {
687 | "version": "4.0.2",
688 | "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz",
689 | "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==",
690 | "requires": {
691 | "js-yaml": "^3.11.0",
692 | "kind-of": "^6.0.2",
693 | "section-matter": "^1.0.0",
694 | "strip-bom-string": "^1.0.0"
695 | }
696 | },
697 | "growl": {
698 | "version": "1.10.5",
699 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
700 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
701 | "dev": true
702 | },
703 | "har-schema": {
704 | "version": "2.0.0",
705 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
706 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
707 | "dev": true
708 | },
709 | "har-validator": {
710 | "version": "5.1.3",
711 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
712 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
713 | "dev": true,
714 | "requires": {
715 | "ajv": "^6.5.5",
716 | "har-schema": "^2.0.0"
717 | },
718 | "dependencies": {
719 | "ajv": {
720 | "version": "6.10.2",
721 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
722 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
723 | "dev": true,
724 | "requires": {
725 | "fast-deep-equal": "^2.0.1",
726 | "fast-json-stable-stringify": "^2.0.0",
727 | "json-schema-traverse": "^0.4.1",
728 | "uri-js": "^4.2.2"
729 | }
730 | },
731 | "fast-deep-equal": {
732 | "version": "2.0.1",
733 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
734 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
735 | "dev": true
736 | },
737 | "json-schema-traverse": {
738 | "version": "0.4.1",
739 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
740 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
741 | "dev": true
742 | }
743 | }
744 | },
745 | "has-ansi": {
746 | "version": "2.0.0",
747 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
748 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
749 | "dev": true,
750 | "requires": {
751 | "ansi-regex": "^2.0.0"
752 | }
753 | },
754 | "has-flag": {
755 | "version": "3.0.0",
756 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
757 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
758 | "dev": true
759 | },
760 | "he": {
761 | "version": "1.1.1",
762 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
763 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
764 | "dev": true
765 | },
766 | "http-proxy-agent": {
767 | "version": "2.1.0",
768 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
769 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
770 | "dev": true,
771 | "requires": {
772 | "agent-base": "4",
773 | "debug": "3.1.0"
774 | },
775 | "dependencies": {
776 | "debug": {
777 | "version": "3.1.0",
778 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
779 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
780 | "dev": true,
781 | "requires": {
782 | "ms": "2.0.0"
783 | }
784 | },
785 | "ms": {
786 | "version": "2.0.0",
787 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
788 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
789 | "dev": true
790 | }
791 | }
792 | },
793 | "http-signature": {
794 | "version": "1.2.0",
795 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
796 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
797 | "dev": true,
798 | "requires": {
799 | "assert-plus": "^1.0.0",
800 | "jsprim": "^1.2.2",
801 | "sshpk": "^1.7.0"
802 | }
803 | },
804 | "https-proxy-agent": {
805 | "version": "2.2.4",
806 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
807 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
808 | "dev": true,
809 | "requires": {
810 | "agent-base": "^4.3.0",
811 | "debug": "^3.1.0"
812 | }
813 | },
814 | "iconv-lite": {
815 | "version": "0.4.24",
816 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
817 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
818 | "dev": true,
819 | "requires": {
820 | "safer-buffer": ">= 2.1.2 < 3"
821 | }
822 | },
823 | "ignore": {
824 | "version": "3.3.10",
825 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
826 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
827 | "dev": true
828 | },
829 | "imurmurhash": {
830 | "version": "0.1.4",
831 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
832 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
833 | "dev": true
834 | },
835 | "inflight": {
836 | "version": "1.0.6",
837 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
838 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
839 | "dev": true,
840 | "requires": {
841 | "once": "^1.3.0",
842 | "wrappy": "1"
843 | }
844 | },
845 | "inherits": {
846 | "version": "2.0.4",
847 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
848 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
849 | "dev": true
850 | },
851 | "inquirer": {
852 | "version": "3.3.0",
853 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
854 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
855 | "dev": true,
856 | "requires": {
857 | "ansi-escapes": "^3.0.0",
858 | "chalk": "^2.0.0",
859 | "cli-cursor": "^2.1.0",
860 | "cli-width": "^2.0.0",
861 | "external-editor": "^2.0.4",
862 | "figures": "^2.0.0",
863 | "lodash": "^4.3.0",
864 | "mute-stream": "0.0.7",
865 | "run-async": "^2.2.0",
866 | "rx-lite": "^4.0.8",
867 | "rx-lite-aggregates": "^4.0.8",
868 | "string-width": "^2.1.0",
869 | "strip-ansi": "^4.0.0",
870 | "through": "^2.3.6"
871 | }
872 | },
873 | "is-extendable": {
874 | "version": "0.1.1",
875 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
876 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
877 | },
878 | "is-fullwidth-code-point": {
879 | "version": "2.0.0",
880 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
881 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
882 | "dev": true
883 | },
884 | "is-promise": {
885 | "version": "2.1.0",
886 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
887 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
888 | "dev": true
889 | },
890 | "is-resolvable": {
891 | "version": "1.1.0",
892 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
893 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
894 | "dev": true
895 | },
896 | "is-typedarray": {
897 | "version": "1.0.0",
898 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
899 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
900 | "dev": true
901 | },
902 | "isarray": {
903 | "version": "1.0.0",
904 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
905 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
906 | "dev": true
907 | },
908 | "isexe": {
909 | "version": "2.0.0",
910 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
911 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
912 | "dev": true
913 | },
914 | "isstream": {
915 | "version": "0.1.2",
916 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
917 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
918 | "dev": true
919 | },
920 | "js-tokens": {
921 | "version": "3.0.2",
922 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
923 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
924 | "dev": true
925 | },
926 | "js-yaml": {
927 | "version": "3.13.1",
928 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
929 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
930 | "requires": {
931 | "argparse": "^1.0.7",
932 | "esprima": "^4.0.0"
933 | }
934 | },
935 | "jsbn": {
936 | "version": "0.1.1",
937 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
938 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
939 | "dev": true
940 | },
941 | "json-schema": {
942 | "version": "0.2.3",
943 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
944 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
945 | "dev": true
946 | },
947 | "json-schema-traverse": {
948 | "version": "0.3.1",
949 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
950 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
951 | "dev": true
952 | },
953 | "json-stable-stringify-without-jsonify": {
954 | "version": "1.0.1",
955 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
956 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
957 | "dev": true
958 | },
959 | "json-stringify-safe": {
960 | "version": "5.0.1",
961 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
962 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
963 | "dev": true
964 | },
965 | "jsonfile": {
966 | "version": "4.0.0",
967 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
968 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
969 | "requires": {
970 | "graceful-fs": "^4.1.6"
971 | }
972 | },
973 | "jsprim": {
974 | "version": "1.4.1",
975 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
976 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
977 | "dev": true,
978 | "requires": {
979 | "assert-plus": "1.0.0",
980 | "extsprintf": "1.3.0",
981 | "json-schema": "0.2.3",
982 | "verror": "1.10.0"
983 | }
984 | },
985 | "kind-of": {
986 | "version": "6.0.3",
987 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
988 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
989 | },
990 | "klaw": {
991 | "version": "2.1.1",
992 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.1.1.tgz",
993 | "integrity": "sha1-QrdolHARacyRD9DRnOZ3tfs3ivE=",
994 | "requires": {
995 | "graceful-fs": "^4.1.9"
996 | }
997 | },
998 | "levn": {
999 | "version": "0.3.0",
1000 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1001 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
1002 | "dev": true,
1003 | "requires": {
1004 | "prelude-ls": "~1.1.2",
1005 | "type-check": "~0.3.2"
1006 | }
1007 | },
1008 | "lodash": {
1009 | "version": "4.17.14",
1010 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz",
1011 | "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==",
1012 | "dev": true
1013 | },
1014 | "lru-cache": {
1015 | "version": "4.1.5",
1016 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
1017 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
1018 | "dev": true,
1019 | "requires": {
1020 | "pseudomap": "^1.0.2",
1021 | "yallist": "^2.1.2"
1022 | }
1023 | },
1024 | "mime-db": {
1025 | "version": "1.40.0",
1026 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
1027 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
1028 | "dev": true
1029 | },
1030 | "mime-types": {
1031 | "version": "2.1.24",
1032 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
1033 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
1034 | "dev": true,
1035 | "requires": {
1036 | "mime-db": "1.40.0"
1037 | }
1038 | },
1039 | "mimic-fn": {
1040 | "version": "1.2.0",
1041 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
1042 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
1043 | "dev": true
1044 | },
1045 | "minimatch": {
1046 | "version": "3.0.4",
1047 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1048 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1049 | "dev": true,
1050 | "requires": {
1051 | "brace-expansion": "^1.1.7"
1052 | }
1053 | },
1054 | "minimist": {
1055 | "version": "0.0.8",
1056 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1057 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1058 | "dev": true
1059 | },
1060 | "mkdirp": {
1061 | "version": "0.5.1",
1062 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1063 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1064 | "dev": true,
1065 | "requires": {
1066 | "minimist": "0.0.8"
1067 | }
1068 | },
1069 | "mocha": {
1070 | "version": "5.2.0",
1071 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
1072 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
1073 | "dev": true,
1074 | "requires": {
1075 | "browser-stdout": "1.3.1",
1076 | "commander": "2.15.1",
1077 | "debug": "3.1.0",
1078 | "diff": "3.5.0",
1079 | "escape-string-regexp": "1.0.5",
1080 | "glob": "7.1.2",
1081 | "growl": "1.10.5",
1082 | "he": "1.1.1",
1083 | "minimatch": "3.0.4",
1084 | "mkdirp": "0.5.1",
1085 | "supports-color": "5.4.0"
1086 | },
1087 | "dependencies": {
1088 | "debug": {
1089 | "version": "3.1.0",
1090 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1091 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1092 | "dev": true,
1093 | "requires": {
1094 | "ms": "2.0.0"
1095 | }
1096 | },
1097 | "glob": {
1098 | "version": "7.1.2",
1099 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
1100 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
1101 | "dev": true,
1102 | "requires": {
1103 | "fs.realpath": "^1.0.0",
1104 | "inflight": "^1.0.4",
1105 | "inherits": "2",
1106 | "minimatch": "^3.0.4",
1107 | "once": "^1.3.0",
1108 | "path-is-absolute": "^1.0.0"
1109 | }
1110 | },
1111 | "ms": {
1112 | "version": "2.0.0",
1113 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1114 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1115 | "dev": true
1116 | },
1117 | "supports-color": {
1118 | "version": "5.4.0",
1119 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
1120 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
1121 | "dev": true,
1122 | "requires": {
1123 | "has-flag": "^3.0.0"
1124 | }
1125 | }
1126 | }
1127 | },
1128 | "moment": {
1129 | "version": "2.24.0",
1130 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
1131 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
1132 | },
1133 | "ms": {
1134 | "version": "2.1.2",
1135 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1136 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1137 | "dev": true
1138 | },
1139 | "mute-stream": {
1140 | "version": "0.0.7",
1141 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
1142 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
1143 | "dev": true
1144 | },
1145 | "natural-compare": {
1146 | "version": "1.4.0",
1147 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1148 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1149 | "dev": true
1150 | },
1151 | "oauth-sign": {
1152 | "version": "0.9.0",
1153 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1154 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1155 | "dev": true
1156 | },
1157 | "object-assign": {
1158 | "version": "4.1.1",
1159 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1160 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1161 | "dev": true
1162 | },
1163 | "once": {
1164 | "version": "1.4.0",
1165 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1166 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1167 | "dev": true,
1168 | "requires": {
1169 | "wrappy": "1"
1170 | }
1171 | },
1172 | "onetime": {
1173 | "version": "2.0.1",
1174 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1175 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1176 | "dev": true,
1177 | "requires": {
1178 | "mimic-fn": "^1.0.0"
1179 | }
1180 | },
1181 | "optionator": {
1182 | "version": "0.8.2",
1183 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
1184 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
1185 | "dev": true,
1186 | "requires": {
1187 | "deep-is": "~0.1.3",
1188 | "fast-levenshtein": "~2.0.4",
1189 | "levn": "~0.3.0",
1190 | "prelude-ls": "~1.1.2",
1191 | "type-check": "~0.3.2",
1192 | "wordwrap": "~1.0.0"
1193 | }
1194 | },
1195 | "os-tmpdir": {
1196 | "version": "1.0.2",
1197 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1198 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1199 | "dev": true
1200 | },
1201 | "path-is-absolute": {
1202 | "version": "1.0.1",
1203 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1204 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1205 | "dev": true
1206 | },
1207 | "path-is-inside": {
1208 | "version": "1.0.2",
1209 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1210 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
1211 | "dev": true
1212 | },
1213 | "performance-now": {
1214 | "version": "2.1.0",
1215 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1216 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1217 | "dev": true
1218 | },
1219 | "pluralize": {
1220 | "version": "7.0.0",
1221 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
1222 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
1223 | "dev": true
1224 | },
1225 | "prelude-ls": {
1226 | "version": "1.1.2",
1227 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1228 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
1229 | "dev": true
1230 | },
1231 | "process-nextick-args": {
1232 | "version": "2.0.1",
1233 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1234 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1235 | "dev": true
1236 | },
1237 | "progress": {
1238 | "version": "2.0.3",
1239 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
1240 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
1241 | "dev": true
1242 | },
1243 | "pseudomap": {
1244 | "version": "1.0.2",
1245 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1246 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1247 | "dev": true
1248 | },
1249 | "psl": {
1250 | "version": "1.2.0",
1251 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz",
1252 | "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==",
1253 | "dev": true
1254 | },
1255 | "punycode": {
1256 | "version": "2.1.1",
1257 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1258 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1259 | "dev": true
1260 | },
1261 | "qs": {
1262 | "version": "6.5.2",
1263 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1264 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
1265 | "dev": true
1266 | },
1267 | "querystringify": {
1268 | "version": "2.1.1",
1269 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
1270 | "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
1271 | "dev": true
1272 | },
1273 | "readable-stream": {
1274 | "version": "2.3.6",
1275 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1276 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1277 | "dev": true,
1278 | "requires": {
1279 | "core-util-is": "~1.0.0",
1280 | "inherits": "~2.0.3",
1281 | "isarray": "~1.0.0",
1282 | "process-nextick-args": "~2.0.0",
1283 | "safe-buffer": "~5.1.1",
1284 | "string_decoder": "~1.1.1",
1285 | "util-deprecate": "~1.0.1"
1286 | }
1287 | },
1288 | "regexpp": {
1289 | "version": "1.1.0",
1290 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
1291 | "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
1292 | "dev": true
1293 | },
1294 | "request": {
1295 | "version": "2.88.0",
1296 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
1297 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
1298 | "dev": true,
1299 | "requires": {
1300 | "aws-sign2": "~0.7.0",
1301 | "aws4": "^1.8.0",
1302 | "caseless": "~0.12.0",
1303 | "combined-stream": "~1.0.6",
1304 | "extend": "~3.0.2",
1305 | "forever-agent": "~0.6.1",
1306 | "form-data": "~2.3.2",
1307 | "har-validator": "~5.1.0",
1308 | "http-signature": "~1.2.0",
1309 | "is-typedarray": "~1.0.0",
1310 | "isstream": "~0.1.2",
1311 | "json-stringify-safe": "~5.0.1",
1312 | "mime-types": "~2.1.19",
1313 | "oauth-sign": "~0.9.0",
1314 | "performance-now": "^2.1.0",
1315 | "qs": "~6.5.2",
1316 | "safe-buffer": "^5.1.2",
1317 | "tough-cookie": "~2.4.3",
1318 | "tunnel-agent": "^0.6.0",
1319 | "uuid": "^3.3.2"
1320 | }
1321 | },
1322 | "require-uncached": {
1323 | "version": "1.0.3",
1324 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
1325 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
1326 | "dev": true,
1327 | "requires": {
1328 | "caller-path": "^0.1.0",
1329 | "resolve-from": "^1.0.0"
1330 | }
1331 | },
1332 | "requires-port": {
1333 | "version": "1.0.0",
1334 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1335 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
1336 | "dev": true
1337 | },
1338 | "resolve-from": {
1339 | "version": "1.0.1",
1340 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
1341 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
1342 | "dev": true
1343 | },
1344 | "restore-cursor": {
1345 | "version": "2.0.0",
1346 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1347 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1348 | "dev": true,
1349 | "requires": {
1350 | "onetime": "^2.0.0",
1351 | "signal-exit": "^3.0.2"
1352 | }
1353 | },
1354 | "rimraf": {
1355 | "version": "2.6.3",
1356 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1357 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1358 | "dev": true,
1359 | "requires": {
1360 | "glob": "^7.1.3"
1361 | }
1362 | },
1363 | "run-async": {
1364 | "version": "2.3.0",
1365 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
1366 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
1367 | "dev": true,
1368 | "requires": {
1369 | "is-promise": "^2.1.0"
1370 | }
1371 | },
1372 | "rx-lite": {
1373 | "version": "4.0.8",
1374 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
1375 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
1376 | "dev": true
1377 | },
1378 | "rx-lite-aggregates": {
1379 | "version": "4.0.8",
1380 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
1381 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
1382 | "dev": true,
1383 | "requires": {
1384 | "rx-lite": "*"
1385 | }
1386 | },
1387 | "safe-buffer": {
1388 | "version": "5.1.2",
1389 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1390 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1391 | "dev": true
1392 | },
1393 | "safer-buffer": {
1394 | "version": "2.1.2",
1395 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1396 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1397 | "dev": true
1398 | },
1399 | "section-matter": {
1400 | "version": "1.0.0",
1401 | "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
1402 | "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
1403 | "requires": {
1404 | "extend-shallow": "^2.0.1",
1405 | "kind-of": "^6.0.0"
1406 | }
1407 | },
1408 | "semver": {
1409 | "version": "5.7.0",
1410 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
1411 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
1412 | "dev": true
1413 | },
1414 | "shebang-command": {
1415 | "version": "1.2.0",
1416 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1417 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1418 | "dev": true,
1419 | "requires": {
1420 | "shebang-regex": "^1.0.0"
1421 | }
1422 | },
1423 | "shebang-regex": {
1424 | "version": "1.0.0",
1425 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1426 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1427 | "dev": true
1428 | },
1429 | "signal-exit": {
1430 | "version": "3.0.2",
1431 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1432 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1433 | "dev": true
1434 | },
1435 | "slice-ansi": {
1436 | "version": "1.0.0",
1437 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
1438 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
1439 | "dev": true,
1440 | "requires": {
1441 | "is-fullwidth-code-point": "^2.0.0"
1442 | }
1443 | },
1444 | "source-map": {
1445 | "version": "0.6.1",
1446 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1447 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1448 | "dev": true
1449 | },
1450 | "source-map-support": {
1451 | "version": "0.5.12",
1452 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
1453 | "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
1454 | "dev": true,
1455 | "requires": {
1456 | "buffer-from": "^1.0.0",
1457 | "source-map": "^0.6.0"
1458 | }
1459 | },
1460 | "sprintf-js": {
1461 | "version": "1.0.3",
1462 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1463 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
1464 | },
1465 | "sshpk": {
1466 | "version": "1.16.1",
1467 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1468 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1469 | "dev": true,
1470 | "requires": {
1471 | "asn1": "~0.2.3",
1472 | "assert-plus": "^1.0.0",
1473 | "bcrypt-pbkdf": "^1.0.0",
1474 | "dashdash": "^1.12.0",
1475 | "ecc-jsbn": "~0.1.1",
1476 | "getpass": "^0.1.1",
1477 | "jsbn": "~0.1.0",
1478 | "safer-buffer": "^2.0.2",
1479 | "tweetnacl": "~0.14.0"
1480 | }
1481 | },
1482 | "string-width": {
1483 | "version": "2.1.1",
1484 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1485 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1486 | "dev": true,
1487 | "requires": {
1488 | "is-fullwidth-code-point": "^2.0.0",
1489 | "strip-ansi": "^4.0.0"
1490 | }
1491 | },
1492 | "string_decoder": {
1493 | "version": "1.1.1",
1494 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1495 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1496 | "dev": true,
1497 | "requires": {
1498 | "safe-buffer": "~5.1.0"
1499 | }
1500 | },
1501 | "strip-ansi": {
1502 | "version": "4.0.0",
1503 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1504 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1505 | "dev": true,
1506 | "requires": {
1507 | "ansi-regex": "^3.0.0"
1508 | },
1509 | "dependencies": {
1510 | "ansi-regex": {
1511 | "version": "3.0.0",
1512 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1513 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1514 | "dev": true
1515 | }
1516 | }
1517 | },
1518 | "strip-bom-string": {
1519 | "version": "1.0.0",
1520 | "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
1521 | "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI="
1522 | },
1523 | "strip-json-comments": {
1524 | "version": "2.0.1",
1525 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1526 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1527 | "dev": true
1528 | },
1529 | "supports-color": {
1530 | "version": "2.0.0",
1531 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1532 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1533 | "dev": true
1534 | },
1535 | "table": {
1536 | "version": "4.0.2",
1537 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
1538 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
1539 | "dev": true,
1540 | "requires": {
1541 | "ajv": "^5.2.3",
1542 | "ajv-keywords": "^2.1.0",
1543 | "chalk": "^2.1.0",
1544 | "lodash": "^4.17.4",
1545 | "slice-ansi": "1.0.0",
1546 | "string-width": "^2.1.1"
1547 | }
1548 | },
1549 | "text-table": {
1550 | "version": "0.2.0",
1551 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1552 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1553 | "dev": true
1554 | },
1555 | "through": {
1556 | "version": "2.3.8",
1557 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1558 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1559 | "dev": true
1560 | },
1561 | "tmp": {
1562 | "version": "0.0.33",
1563 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1564 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1565 | "dev": true,
1566 | "requires": {
1567 | "os-tmpdir": "~1.0.2"
1568 | }
1569 | },
1570 | "tough-cookie": {
1571 | "version": "2.4.3",
1572 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
1573 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
1574 | "dev": true,
1575 | "requires": {
1576 | "psl": "^1.1.24",
1577 | "punycode": "^1.4.1"
1578 | },
1579 | "dependencies": {
1580 | "punycode": {
1581 | "version": "1.4.1",
1582 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1583 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
1584 | "dev": true
1585 | }
1586 | }
1587 | },
1588 | "tunnel-agent": {
1589 | "version": "0.6.0",
1590 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1591 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1592 | "dev": true,
1593 | "requires": {
1594 | "safe-buffer": "^5.0.1"
1595 | }
1596 | },
1597 | "tweetnacl": {
1598 | "version": "0.14.5",
1599 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1600 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1601 | "dev": true
1602 | },
1603 | "type-check": {
1604 | "version": "0.3.2",
1605 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1606 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1607 | "dev": true,
1608 | "requires": {
1609 | "prelude-ls": "~1.1.2"
1610 | }
1611 | },
1612 | "typedarray": {
1613 | "version": "0.0.6",
1614 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1615 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
1616 | "dev": true
1617 | },
1618 | "typescript": {
1619 | "version": "2.9.2",
1620 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
1621 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
1622 | "dev": true
1623 | },
1624 | "universalify": {
1625 | "version": "0.1.2",
1626 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1627 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
1628 | },
1629 | "uri-js": {
1630 | "version": "4.2.2",
1631 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1632 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1633 | "dev": true,
1634 | "requires": {
1635 | "punycode": "^2.1.0"
1636 | }
1637 | },
1638 | "url-parse": {
1639 | "version": "1.4.7",
1640 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
1641 | "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
1642 | "dev": true,
1643 | "requires": {
1644 | "querystringify": "^2.1.1",
1645 | "requires-port": "^1.0.0"
1646 | }
1647 | },
1648 | "util-deprecate": {
1649 | "version": "1.0.2",
1650 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1651 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1652 | "dev": true
1653 | },
1654 | "uuid": {
1655 | "version": "3.3.2",
1656 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1657 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
1658 | "dev": true
1659 | },
1660 | "verror": {
1661 | "version": "1.10.0",
1662 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1663 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1664 | "dev": true,
1665 | "requires": {
1666 | "assert-plus": "^1.0.0",
1667 | "core-util-is": "1.0.2",
1668 | "extsprintf": "^1.2.0"
1669 | }
1670 | },
1671 | "vscode": {
1672 | "version": "1.1.35",
1673 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.35.tgz",
1674 | "integrity": "sha512-xPnxzQU40LOS2yPyzWW+WKpTV6qA3z16TcgpZ9O38UWLA157Zz4GxUx5H7Gd07pxzw0GqvusbF4D+5GBgNxvEQ==",
1675 | "dev": true,
1676 | "requires": {
1677 | "glob": "^7.1.2",
1678 | "mocha": "^5.2.0",
1679 | "request": "^2.88.0",
1680 | "semver": "^5.4.1",
1681 | "source-map-support": "^0.5.0",
1682 | "url-parse": "^1.4.4",
1683 | "vscode-test": "^0.4.1"
1684 | }
1685 | },
1686 | "vscode-test": {
1687 | "version": "0.4.3",
1688 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz",
1689 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==",
1690 | "dev": true,
1691 | "requires": {
1692 | "http-proxy-agent": "^2.1.0",
1693 | "https-proxy-agent": "^2.2.1"
1694 | }
1695 | },
1696 | "which": {
1697 | "version": "1.3.1",
1698 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1699 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1700 | "dev": true,
1701 | "requires": {
1702 | "isexe": "^2.0.0"
1703 | }
1704 | },
1705 | "wordwrap": {
1706 | "version": "1.0.0",
1707 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1708 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
1709 | "dev": true
1710 | },
1711 | "wrappy": {
1712 | "version": "1.0.2",
1713 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1714 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1715 | "dev": true
1716 | },
1717 | "write": {
1718 | "version": "0.2.1",
1719 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
1720 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
1721 | "dev": true,
1722 | "requires": {
1723 | "mkdirp": "^0.5.1"
1724 | }
1725 | },
1726 | "yallist": {
1727 | "version": "2.1.2",
1728 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1729 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1730 | "dev": true
1731 | }
1732 | }
1733 | }
1734 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vsnotes",
3 | "displayName": "VSNotes",
4 | "description": "Simple VS Code extension for plain text note taking.",
5 | "version": "0.8.0",
6 | "publisher": "patricklee",
7 | "repository": {
8 | "type": "git",
9 | "url": "https://github.com/patleeman/VSNotes.git"
10 | },
11 | "icon": "media/icon/vsnotes_icon.png",
12 | "license": "MIT",
13 | "engines": {
14 | "vscode": "^1.17.0"
15 | },
16 | "categories": [
17 | "Other"
18 | ],
19 | "keywords": [
20 | "vsnotes",
21 | "notes",
22 | "note taking",
23 | "productivity",
24 | "note"
25 | ],
26 | "activationEvents": [
27 | "onCommand:vsnotes.newNote",
28 | "onCommand:vsnotes.newNoteInWorkspace",
29 | "onCommand:vsnotes.listNotes",
30 | "onCommand:vsnotes.listTags",
31 | "onCommand:vsnotes.setupNotes",
32 | "onCommand:vsnotes.openNoteFolder",
33 | "onCommand:vsnotes.commitPush",
34 | "onCommand:vsnotes.pull",
35 | "onCommand:vsnotes.search",
36 | "onView:vsnotes"
37 | ],
38 | "main": "./extension",
39 | "contributes": {
40 | "configuration": {
41 | "type": "object",
42 | "title": "VSNotes Configuration",
43 | "properties": {
44 | "vsnotes.defaultNotePath": {
45 | "type": "string",
46 | "default": "",
47 | "description": "Path to directory to save notes. Use ~/ to denote a relative path from home folder."
48 | },
49 | "vsnotes.tokens": {
50 | "type": "array",
51 | "description": "Tokens used to replace text in file name.",
52 | "items": {
53 | "type": "object",
54 | "properties": {
55 | "type": {
56 | "type": "string",
57 | "description": "Token name"
58 | },
59 | "token": {
60 | "type": "string",
61 | "description": "Token string"
62 | },
63 | "format": {
64 | "type": [
65 | "string",
66 | null
67 | ],
68 | "description": "Optional formatting information"
69 | },
70 | "description": {
71 | "type": [
72 | "string",
73 | null
74 | ],
75 | "description": "Token description"
76 | }
77 | }
78 | },
79 | "default": [
80 | {
81 | "type": "datetime",
82 | "token": "{dt}",
83 | "format": "YYYY-MM-DD_HH-mm",
84 | "description": "Insert formatted datetime."
85 | },
86 | {
87 | "type": "title",
88 | "token": "{title}",
89 | "description": "Insert note title from input box.",
90 | "format": "Untitled"
91 | },
92 | {
93 | "type": "extension",
94 | "token": "{ext}",
95 | "description": "Insert file vsnotes.",
96 | "format": "md"
97 | }
98 | ]
99 | },
100 | "vsnotes.defaultNoteTitle": {
101 | "type": "string",
102 | "default": "{dt}_{title}.{ext}",
103 | "description": "Default note title. Utilizes tokens set in vsnotes.tokens."
104 | },
105 | "vsnotes.additionalNoteTitles": {
106 | "type": "array",
107 | "items": {
108 | "type": "string"
109 | },
110 | "default": [],
111 | "description": "List of additional note title tokens to choose from. If supplied, a picker will be shown when creating a new note."
112 | },
113 | "vsnotes.defaultNoteName": {
114 | "type": "string",
115 | "default": "New_Note",
116 | "description": "Default title for new notes."
117 | },
118 | "vsnotes.listRecentLimit": {
119 | "type": "number",
120 | "default": 15,
121 | "description": "Number of recent files to show when running command `List Notes`."
122 | },
123 | "vsnotes.noteTitleConvertSpaces": {
124 | "type": ["string", "null"],
125 | "default": "_",
126 | "description": "Automatically convert blank spaces in title to character. To disable set to `null`."
127 | },
128 | "vsnotes.templates": {
129 | "type": "array",
130 | "items": {
131 | "type": "string"
132 | },
133 | "default": [],
134 | "description": "A list of markdown templates to choose from when creating a new note."
135 | },
136 | "vsnotes.defaultSnippet": {
137 | "type": "object",
138 | "properties": {
139 | "langId": {
140 | "type": "string",
141 | "description": "VS Code language identifier"
142 | },
143 | "name": {
144 | "type": "string",
145 | "description": "Snippet Name"
146 | }
147 | },
148 | "default": {
149 | "langId": "markdown",
150 | "name": "vsnote_template_default"
151 | },
152 | "description": "Default vscode snippet to execute after creating a note. Set both langId and name to null to disable."
153 | },
154 | "vsnotes.ignorePatterns": {
155 | "type": "array",
156 | "items": {
157 | "type": "string"
158 | },
159 | "default": [
160 | "^\\."
161 | ],
162 | "description": "Regular expressions for file names to ignore when parsing documents in note folder."
163 | },
164 | "vsnotes.commitPushShellCommand": {
165 | "type": "string",
166 | "default": "git add -A && git commit -m \"{msg}\" && git push",
167 | "description": "Shell command to execute in the note directory when the Commit and Push command is executed. The {msg} token will be replaced with the contents of an input box shown or, if empty, the default commit message."
168 | },
169 | "vsnotes.pullShellCommand": {
170 | "type": "string",
171 | "default": "git pull",
172 | "description": "Shell command to execute in the note directory when the Pull command is executed."
173 | },
174 | "vsnotes.commitPushDefaultCommitMessage": {
175 | "type": "string",
176 | "default": "VS Notes Commit and Push",
177 | "description": "The default commit message used if none is provided with the Commit and Push command."
178 | },
179 | "vsnotes.treeviewHideTags": {
180 | "type": "boolean",
181 | "default": false,
182 | "description": "Hide the tags section in the sidebar. Requires application restart."
183 | },
184 | "vsnotes.treeviewHideFiles": {
185 | "type": "boolean",
186 | "default": false,
187 | "description": "Hide the files section in the sidebar. Requires application restart."
188 | }
189 | }
190 | },
191 | "commands": [
192 | {
193 | "command": "vsnotes.newNote",
194 | "title": "VSNotes: Create a New Note"
195 | },
196 | {
197 | "command": "vsnotes.newNoteInWorkspace",
198 | "title": "VSNotes: Create a New Note in a workspace."
199 | },
200 | {
201 | "command": "vsnotes.listNotes",
202 | "title": "VSNotes: List recent notes"
203 | },
204 | {
205 | "command": "vsnotes.listNotes",
206 | "title": "VSNotes: Open note"
207 | },
208 | {
209 | "command": "vsnotes.listTags",
210 | "title": "VSNotes: List tags"
211 | },
212 | {
213 | "command": "vsnotes.openNoteFolder",
214 | "title": "VSNotes: Open Note Folder"
215 | },
216 | {
217 | "command": "vsnotes.setupNotes",
218 | "title": "VSNotes: Run setup"
219 | },
220 | {
221 | "command": "vsnotes.commitPush",
222 | "title": "VSNotes: Commit and Push"
223 | },
224 | {
225 | "command": "vsnotes.pull",
226 | "title": "VSNotes: Pull"
227 | },
228 | {
229 | "command": "vsnotes.search",
230 | "title": "VSNotes: Search notes"
231 | },
232 | {
233 | "command": "vsnotes.refreshVSNotesView",
234 | "title": "refresh",
235 | "icon": {
236 | "light": "./media/light/sync.svg",
237 | "dark": "./media/dark/sync.svg"
238 | }
239 | }
240 | ],
241 | "keybindings": [
242 | {
243 | "command": "vsnotes.newNote",
244 | "key": "",
245 | "mac": ""
246 | }
247 | ],
248 | "snippets": [
249 | {
250 | "language": "markdown",
251 | "path": "./snippets/markdown.json"
252 | }
253 | ],
254 | "views": {
255 | "vsnotes": [
256 | {
257 | "id": "vsnotes",
258 | "name": "VS Notes"
259 | }
260 | ]
261 | },
262 | "viewsContainers": {
263 | "activitybar": [
264 | {
265 | "id": "vsnotes",
266 | "title": "VS Notes",
267 | "icon": "./media/icon/vsnotes_icon.svg"
268 | }
269 | ]
270 | },
271 | "menus": {
272 | "view/title": [
273 | {
274 | "command": "vsnotes.refreshVSNotesView",
275 | "when": "view == vsnotes",
276 | "group": "navigation"
277 | }
278 | ]
279 | }
280 | },
281 | "scripts": {
282 | "postinstall": "node ./node_modules/vscode/bin/install",
283 | "test": "node ./node_modules/vscode/bin/test"
284 | },
285 | "devDependencies": {
286 | "@types/mocha": "^5.2.1",
287 | "@types/node": "^10.3.1",
288 | "eslint": "^4.19.1",
289 | "mocha": "^5.2.0",
290 | "typescript": "^2.9.1",
291 | "vscode": "^1.1.18"
292 | },
293 | "dependencies": {
294 | "fs-extra": "^6.0.1",
295 | "gray-matter": "^4.0.1",
296 | "klaw": "^2.1.1",
297 | "moment": "^2.22.2"
298 | }
299 | }
300 |
--------------------------------------------------------------------------------
/snippets/markdown.json:
--------------------------------------------------------------------------------
1 | {
2 | "vsnote_template_default": {
3 | "prefix": "vsnote_template_default",
4 | "body": [
5 | "---",
6 | "tags:",
7 | " - $1",
8 | "---",
9 | "$0"
10 | ],
11 | "description": "VSNotes note default template."
12 | },
13 | "vsnote_template_meeting": {
14 | "prefix": "vsnote_template_meeting",
15 | "body": [
16 | "---",
17 | "tags:",
18 | "\t- meeting",
19 | "---",
20 | "\n# Meeting: $1 - $CURRENT_DATE/$CURRENT_MONTH/$CURRENT_YEAR\n",
21 | "$2"
22 | ],
23 | "description": "Generic Meeting Template"
24 | }
25 | }
--------------------------------------------------------------------------------
/src/commitPush.js:
--------------------------------------------------------------------------------
1 | const vscode = require('vscode');
2 | const process = require('child_process');
3 | const {resolveHome} = require('./utils');
4 |
5 | module.exports = function () {
6 | const config = vscode.workspace.getConfiguration('vsnotes');
7 | const noteFolder = resolveHome(config.get('defaultNotePath'));
8 | const command = config.get('commitPushShellCommand');
9 | const defaultCommitMessage = config.get('commitPushDefaultCommitMessage');
10 | const options = {
11 | cwd: noteFolder
12 | }
13 |
14 | vscode.window.showInputBox({
15 | prompt: `Commit Message`,
16 | value: defaultCommitMessage,
17 | }).then(commitMessage => {
18 | if (commitMessage != null && commitMessage) {
19 | const fullCommand = command.replace(new RegExp('{msg}'), commitMessage);
20 | process.exec(fullCommand, options, function (err, stdout, stderr) {
21 | if (err) {
22 | vscode.window.showErrorMessage('Commit and push failed to execute. Check console for more information');
23 | console.error('Commit and push failed. Here is the error: ', err);
24 | } else {
25 | vscode.window.showInformationMessage(`Commit and Push executed!`);
26 | console.log(stdout, stderr);
27 | }
28 | })
29 | } else {
30 | vscode.window.showInformationMessage(`Commit and Push cancelled.`);
31 | }
32 | })
33 | }
--------------------------------------------------------------------------------
/src/listNotes.js:
--------------------------------------------------------------------------------
1 |
2 | const vscode = require('vscode');
3 | const klaw = require('klaw');
4 | const path = require('path');
5 | const {resolveHome} = require('./utils');
6 |
7 | module.exports = function () {
8 | const config = vscode.workspace.getConfiguration('vsnotes');
9 | const noteFolder = resolveHome(config.get('defaultNotePath'));
10 | const listRecentLimit = config.get('listRecentLimit');
11 | const ignorePattern = new RegExp(config.get('ignorePatterns')
12 | .map(function (pattern) { return '(' + pattern + ')' })
13 | .join('|'));
14 | const noteFolderLen = noteFolder.length;
15 | let files = [];
16 |
17 | // Using klaw, recursively iterate through notes directory.
18 | klaw(noteFolder)
19 | .on('data', item => {
20 | const relativePath = item.path.slice(noteFolder.length + 1, item.path.length);
21 | if (!ignorePattern.test(relativePath) && !item.stats.isDirectory()) {
22 | files.push(item);
23 | }
24 | })
25 | .on('error', (err, item) => {
26 | vscode.window.showErrorMessage('Error occurred while scanning file: ' + item)
27 | console.error('Error while walking notes folder: ', item, err);
28 | })
29 | .on('end', () => {
30 | // Sort files and generate path array
31 | files = files.sort(function (a, b) {
32 | const aTime = new Date(a.stats.mtime);
33 | const bTime = new Date(b.stats.mtime);
34 | if (aTime > bTime) {
35 | return -1;
36 | } else if (aTime < bTime) {
37 | return 1;
38 | } else {
39 | return 0;
40 | }
41 | });
42 | const shortPaths = [];
43 | for (let j = 0; j < files.length; j++) {
44 | if (j >= listRecentLimit) {
45 | break;
46 | }
47 | shortPaths.push(files[j].path.slice(noteFolderLen + 1, files[j].path.length));
48 | }
49 |
50 | vscode.window.showQuickPick(shortPaths).then(res => {
51 | if (res != null && res ) {
52 | vscode.window.showTextDocument(vscode.Uri.file(path.join(noteFolder, res))).then(file => {
53 | console.log('Opening file ', res);
54 | }, err => {
55 | console.error(err);
56 | })
57 | }
58 | }, err => {
59 | console.error(err);
60 | })
61 | });
62 | }
63 |
--------------------------------------------------------------------------------
/src/listTags.js:
--------------------------------------------------------------------------------
1 | const vscode = require('vscode');
2 | const path = require('path');
3 | const fs = require('fs-extra');
4 | const klaw = require('klaw');
5 | const matter = require('gray-matter');
6 | const {resolveHome} = require('./utils');
7 |
8 | module.exports = function () {
9 | const config = vscode.workspace.getConfiguration('vsnotes');
10 | const noteFolder = resolveHome(config.get('defaultNotePath'));
11 |
12 | const noteFolderLen = noteFolder.length;
13 |
14 |
15 | createTagIndex(noteFolder).then(tags => {
16 | vscode.window.showQuickPick(Object.keys(tags)).then(tag => {
17 | if (tag != null) {
18 |
19 | const shortPaths = tags[tag].map(function (item) {
20 | return item.slice(noteFolderLen + 1, item.length);
21 | })
22 |
23 | vscode.window.showQuickPick(shortPaths).then(chosenShortPath => {
24 | if (chosenShortPath != null && chosenShortPath) {
25 | const fullpath = path.join(noteFolder, chosenShortPath)
26 |
27 | vscode.window.showTextDocument(vscode.Uri.file(fullpath)).then(file => {
28 | console.log('Opening file ' + fullpath);
29 | }, err => {
30 | console.error(err);
31 | })
32 | }
33 | }, err => {
34 | console.error(err)
35 | })
36 | }
37 | }, err => {
38 | console.error(err)
39 | })
40 | })
41 | }
42 |
43 |
44 | // Given a folder path, traverse and find all markdown files.
45 | // Open and grab tags from front matter.
46 | function createTagIndex(noteFolderPath) {
47 | const config = vscode.workspace.getConfiguration('vsnotes');
48 | const ignorePattern = new RegExp(config.get('ignorePatterns')
49 | .map(function (pattern) { return '(' + pattern + ')' })
50 | .join('|'));
51 |
52 | return new Promise((resolve, reject) => {
53 | let files = [];
54 |
55 | klaw(noteFolderPath)
56 | .on('data', item => {
57 | files.push(new Promise((res, rej) => {
58 | const fileName = path.basename(item.path);
59 | if (!item.stats.isDirectory() && !ignorePattern.test(fileName)) {
60 | fs.readFile(item.path).then(contents => {
61 | res({ path: item.path, contents: contents});
62 | }).catch(err => {
63 | console.log(err);
64 | res(); // resolve undefined
65 | })
66 | } else {
67 | res(); // resolve undefined
68 | }
69 | }))
70 | })
71 | .on('error', (err, item) => {
72 | reject(err)
73 | console.error('Error while walking notes folder for tags: ', item, err);
74 | })
75 | .on('end', () => {
76 | Promise.all(files).then(files => {
77 | let tagIndex = {};
78 | for (let i = 0; i < files.length; i++) {
79 | if (files[i] != null && files[i]) {
80 | const parsedFrontMatter = parseFrontMatter(files[i]);
81 | if (parsedFrontMatter && 'tags' in parsedFrontMatter.data && parsedFrontMatter.data.tags) {
82 | for (let tag of parsedFrontMatter.data.tags) {
83 | if (tag in tagIndex) {
84 | tagIndex[tag].push(files[i].path);
85 | } else {
86 | tagIndex[tag] = [files[i].path];
87 | }
88 | }
89 | }
90 | }
91 | }
92 | resolve(tagIndex);
93 | }).catch(err => {
94 | console.error(err)
95 | })
96 | })
97 | })
98 | }
99 |
100 | function parseFrontMatter(file) {
101 | try {
102 | const parsedFrontMatter = matter(file.contents)
103 | if (!(parsedFrontMatter.data instanceof Object)) {
104 | console.error('YAML front-matter is not an object: ', file.path);
105 | return null;
106 | }
107 | return parsedFrontMatter;
108 | } catch (e) {
109 | console.error(file.path, e);
110 | return null;
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/src/newNote.js:
--------------------------------------------------------------------------------
1 |
2 | const vscode = require('vscode');
3 | const fs = require('fs-extra');
4 | const path = require('path');
5 | const moment = require('moment');
6 | const {resolveHome} = require('./utils');
7 |
8 |
9 | // This function handles creation of a new note in default note folder
10 | function newNote() {
11 | const config = vscode.workspace.getConfiguration('vsnotes');
12 | const noteFolder = resolveHome(config.get('defaultNotePath'));
13 | const templates = config.get('templates');
14 |
15 |
16 | if (!templates || !templates.length) {
17 | createNote({ noteFolder });
18 | return
19 | }
20 |
21 | vscode.window.showQuickPick (templates, {
22 | placeHolder: 'Please select a template. Hit esc to use default.',
23 | })
24 | .then(template => {
25 | console.log(template)
26 | createNote({ noteFolder, template });
27 | }, err => {
28 | console.error(err);
29 | })
30 | }
31 |
32 | function newNoteInWorkspace() {
33 | const workspaces = vscode.workspace.workspaceFolders;
34 | if (workspaces == null || workspaces.length === 0) {
35 | vscode.window.showErrorMessage('No workspaces open.');
36 | return
37 | } else if (workspaces.length === 1) {
38 | createNote({ noteFolder: workspaces[0].uri.fsPath });
39 | } else {
40 | const spaces = []
41 | workspaces.forEach(workspace => {
42 | spaces.push(workspace.name)
43 | })
44 |
45 | // Show dialog and ask which workspace to use.
46 | vscode.window.showQuickPick(spaces).then(workspaceName => {
47 | workspaces.every(workspace => {
48 | if (workspace.name === workspaceName) {
49 | const uri = workspace.uri
50 | createNote({ noteFolder: uri.fsPath })
51 | return false;
52 | }
53 | return true
54 | })
55 | })
56 | }
57 | }
58 |
59 |
60 | async function createNote({ noteFolder, template }) {
61 | const config = vscode.workspace.getConfiguration('vsnotes');
62 | const defaultNoteName = config.get('defaultNoteName');
63 | const tokens = config.get('tokens');
64 | const noteTitleConvertSpaces = config.get('noteTitleConvertSpaces');
65 |
66 | const noteTitles = config.get('additionalNoteTitles');
67 | let noteTitle = config.get('defaultNoteTitle');
68 | if (noteTitles.length > 0) {
69 | noteTitle = await vscode.window.showQuickPick([noteTitle, ...noteTitles], {
70 | placeHolder: 'Please select a note title format.'
71 | })
72 | }
73 |
74 |
75 | if (noteFolder == null || !noteFolder) {
76 | vscode.window.showErrorMessage('Default note folder not found. Please run setup.');
77 | return
78 | }
79 |
80 | // Get the name for the note
81 | const inputBoxPromise = vscode.window.showInputBox({
82 | prompt: `Note title? Current Format ${noteTitle}. Hit enter for instant note.`,
83 | value: "",
84 | })
85 |
86 | inputBoxPromise.then(noteName => {
87 | // Check for aborting the new note dialog
88 | if (noteName == null) {
89 | return false
90 | }
91 |
92 | // Check for empty string but confirmation in the new note dialog
93 | if (noteName == "" || !noteName) {
94 | noteName = defaultNoteName
95 | }
96 |
97 | let fileName = replaceTokens(noteTitle, noteName, tokens);
98 |
99 | if (noteTitleConvertSpaces != null) {
100 | fileName = fileName.replace(/\s/g, noteTitleConvertSpaces);
101 | }
102 |
103 | // Create the file
104 | const createFilePromise = createFile(noteFolder, fileName, '');
105 | createFilePromise.then(filePath => {
106 | if (typeof filePath !== 'string') {
107 | console.error('Invalid file path')
108 | return false
109 | }
110 |
111 | vscode.window.showTextDocument(vscode.Uri.file(filePath), {
112 | preserveFocus: false,
113 | preview: false,
114 | }).then(() => {
115 | console.log('Note created successfully: ', filePath);
116 |
117 | createTemplate({ template })
118 | })
119 | })
120 |
121 | }, err => {
122 | vscode.workspace.showErrorMessage('Error occurred while creating note.');
123 | console.error(err);
124 | })
125 | }
126 |
127 | function createTemplate({ template = null }) {
128 | const config = vscode.workspace.getConfiguration('vsnotes');
129 |
130 | if (template != null) {
131 | vscode.commands.executeCommand('editor.action.insertSnippet', ...[{ langId: 'markdown', name: `vsnote_template_${template}` }]).then(res => {
132 | vscode.window.showInformationMessage(`Note for "${template}" created!`);
133 | console.log('template created: ', res)
134 | }, err => {
135 | vscode.window.showErrorMessage('Template creation error.');
136 | console.error('template creation error: ', err)
137 | })
138 | } else {
139 | // default template
140 | const snippetLangId = config.get('defaultSnippet.langId');
141 | const snippetName = config.get('defaultSnippet.name');
142 |
143 | // Insert the default note text
144 | if (snippetLangId != null && snippetName != null) {
145 | vscode.commands.executeCommand('editor.action.insertSnippet', ...[{ langId: snippetLangId, name: snippetName }]).then(res => {
146 | console.log(res)
147 | }, err => {
148 | console.error(err)
149 | })
150 | }
151 | }
152 | }
153 |
154 |
155 | // Create the given file if it doesn't exist
156 | function createFile (folderPath, fileName) {
157 | return new Promise((resolve, reject) => {
158 | if (folderPath == null || fileName == null) {
159 | reject();
160 | }
161 | const fullPath = path.join(folderPath, fileName);
162 | // fs-extra
163 | fs.ensureFile(fullPath).then(() => {
164 | resolve(fullPath)
165 | }).catch(err => {
166 | reject(err)
167 | })
168 | });
169 | }
170 |
171 |
172 | function replaceTokens (format, title, tokens) {
173 | let newFormat = format
174 | const pattern = /(?:\{)(.+?)(?:\})/g;
175 | let result;
176 | while ((result = pattern.exec(format)) != null) {
177 | for (let token of tokens) {
178 | if (token.token === result[0]) {
179 | switch (token.type) {
180 | case "datetime":
181 | newFormat = newFormat.replace(new RegExp(result[0], 'g'), moment().format(token.format));
182 | break;
183 | case "title":
184 | let prependedPath = [];
185 | // Check if its a nested path
186 | const splitTitle = title.split(path.sep);
187 | if (splitTitle.length > 1) {
188 | title = splitTitle[splitTitle.length - 1];
189 | prependedPath = splitTitle.slice(0,splitTitle.length - 1);
190 | }
191 | newFormat = prependedPath.concat(newFormat.replace(new RegExp(token.token, 'g'), title)).join(path.sep);
192 | break;
193 | case "extension":
194 | newFormat = newFormat.replace(new RegExp(token.token, 'g'), token.format)
195 | break;
196 | }
197 | }
198 | }
199 | }
200 | return newFormat;
201 | }
202 |
203 | module.exports = {
204 | newNote,
205 | newNoteInWorkspace
206 | }
207 |
--------------------------------------------------------------------------------
/src/pull.js:
--------------------------------------------------------------------------------
1 | const vscode = require('vscode');
2 | const process = require('child_process');
3 | const { resolveHome } = require('./utils');
4 |
5 | module.exports = function () {
6 | const config = vscode.workspace.getConfiguration('vsnotes');
7 | const noteFolder = resolveHome(config.get('defaultNotePath'));
8 | const command = config.get('pullShellCommand');
9 | const options = {
10 | cwd: noteFolder
11 | }
12 |
13 | process.exec(command, options, function (err, stdout, stderr) {
14 | if (err) {
15 | vscode.window.showErrorMessage('Pull failed to execute. Check console for more information');
16 | console.error('Pull failed. Here is the error: ', err);
17 | } else {
18 | vscode.window.showInformationMessage(`Pull Finished at ${noteFolder}`);
19 | console.log(stdout, stderr);
20 | }
21 | })
22 | }
--------------------------------------------------------------------------------
/src/search.js:
--------------------------------------------------------------------------------
1 | const vscode = require('vscode');
2 | const {resolveHome} = require('./utils');
3 |
4 | module.exports = async function () {
5 | const config = vscode.workspace.getConfiguration('vsnotes');
6 | const folderPath = vscode.Uri.file(resolveHome(config.get('defaultNotePath')));
7 |
8 | // We need to check if a workspace folder is open. VSCode doesn't allow
9 | // findInFile if a workspace folder isn't available.
10 | const openWorkspace = vscode.workspace.workspaceFolders;
11 | if (openWorkspace == null) {
12 | vscode.window.showWarningMessage('Whoops, can\'t search without an open folder in the workspace. Open notes folder?', ...['Open']).then(val => {
13 | if (val == 'Open') {
14 | vscode.commands.executeCommand('vscode.openFolder', folderPath)
15 | }
16 | })
17 | } else {
18 | vscode.commands.executeCommand('filesExplorer.findInFolder', folderPath)
19 | }
20 | }
--------------------------------------------------------------------------------
/src/setupNotes.js:
--------------------------------------------------------------------------------
1 |
2 | const vscode = require('vscode');
3 | const path = require('path');
4 |
5 | module.exports = function () {
6 | const msg = 'Welcome to VSNotes. To begin, choose a location to save your notes. Click Start to continue ->';
7 |
8 | const startOption = vscode.window.showInformationMessage(msg, ...['Start']);
9 | startOption.then(value => {
10 |
11 | if (value === 'Start') {
12 | // Open a folder picker for user to choose note folder
13 | const uriPromise = vscode.window.showOpenDialog({
14 | canSelectFiles: false,
15 | canSelectFolders: true,
16 | canSelectMany: false,
17 | openLabel: 'Select'
18 | });
19 |
20 | uriPromise.then(res => {
21 | if (res.length > 0 && res[0].fsPath) {
22 | const noteFolder = vscode.workspace.getConfiguration('vsnotes');
23 | const update = noteFolder.update('defaultNotePath', path.normalize(res[0].fsPath), true);
24 | update.then(() => {
25 | vscode.window.showInformationMessage('Note Path Saved. Edit the location by re-running setup or editing the path in VS Code Settings.');
26 | });
27 | }
28 | }).catch(err => {
29 | vscode.window.showErrorMessage('Error occurred during setup.')
30 | console.error(err)
31 | });
32 |
33 | }
34 | })
35 | }
36 |
--------------------------------------------------------------------------------
/src/treeView.js:
--------------------------------------------------------------------------------
1 | const vscode = require('vscode');
2 | const fs = require('fs-extra');
3 | const path = require('path');
4 | const klaw = require('klaw');
5 | const matter = require('gray-matter');
6 | const {resolveHome} = require('./utils');
7 |
8 | class VSNotesTreeView {
9 | constructor () {
10 | const config = vscode.workspace.getConfiguration('vsnotes');
11 | this.baseDir = resolveHome(config.get('defaultNotePath'));
12 | this.ignorePattern = new RegExp(config.get('ignorePatterns')
13 | .map(function (pattern) {return '(' + pattern + ')'})
14 | .join('|'));
15 | this.hideTags = config.get('treeviewHideTags');
16 | this.hideFiles = config.get('treeviewHideFiles');
17 |
18 | this._onDidChangeTreeData = new vscode.EventEmitter();
19 | this.onDidChangeTreeData = this._onDidChangeTreeData.event;
20 | }
21 |
22 | refresh () {
23 | this._onDidChangeTreeData.fire();
24 | }
25 |
26 | getChildren (node) {
27 | if (node) {
28 | switch (node.type) {
29 | case 'rootTag':
30 | this.tags = Promise.resolve(this._getTags(this.baseDir))
31 | return this.tags;
32 | case 'tag':
33 | return node.files;
34 | case 'rootFile':
35 | return Promise.resolve(this._getDirectoryContents(this.baseDir));
36 | case 'file':
37 | return Promise.resolve(this._getDirectoryContents(node.path));
38 | }
39 | } else {
40 | const treeview = [];
41 | if (!this.hideFiles) {
42 | treeview.push({
43 | type: 'rootFile'
44 | });
45 | }
46 | if (!this.hideTags) {
47 | treeview.push({
48 | type: 'rootTag'
49 | });
50 | }
51 | return treeview;
52 | }
53 | }
54 |
55 | getTreeItem (node) {
56 | switch (node.type) {
57 | case 'rootTag':
58 | let rootTagTreeItem = new vscode.TreeItem('Tags', vscode.TreeItemCollapsibleState.Expanded);
59 | rootTagTreeItem.iconPath = {
60 | light: path.join(__filename, '..', '..', 'media', 'light', 'tag.svg'),
61 | dark: path.join(__filename, '..', '..', 'media', 'dark', 'tag.svg')
62 | };
63 | return rootTagTreeItem;
64 | case 'rootFile':
65 | let rootFileTreeItem = new vscode.TreeItem('Files', vscode.TreeItemCollapsibleState.Expanded);
66 | rootFileTreeItem.iconPath = {
67 | light: path.join(__filename, '..', '..', 'media', 'light', 'file-directory.svg'),
68 | dark: path.join(__filename, '..', '..', 'media', 'dark', 'file-directory.svg')
69 | };
70 | return rootFileTreeItem;
71 | case 'tag':
72 | let tagTreeItem = new vscode.TreeItem(node.tag, vscode.TreeItemCollapsibleState.Collapsed);
73 | tagTreeItem.iconPath = {
74 | light: path.join(__filename, '..', '..', 'media', 'light', 'tag.svg'),
75 | dark: path.join(__filename, '..', '..', 'media', 'dark', 'tag.svg')
76 | };
77 | return tagTreeItem;
78 | case 'file':
79 | const isDir = node.stats.isDirectory()
80 | const state = isDir ? vscode.TreeItemCollapsibleState.Collapsed : vscode.TreeItemCollapsibleState.None;
81 | let fileTreeItem = new vscode.TreeItem(node.file, state)
82 | if (isDir) {
83 | fileTreeItem.iconPath = {
84 | light: path.join(__filename, '..', '..', 'media', 'light', 'file-directory.svg'),
85 | dark: path.join(__filename, '..', '..', 'media', 'dark', 'file-directory.svg')
86 | };
87 | } else {
88 | fileTreeItem.command = {
89 | command: 'vscode.open',
90 | title: '',
91 | arguments: [vscode.Uri.file(node.path)]
92 | }
93 | fileTreeItem.iconPath = {
94 | light: path.join(__filename, '..', '..', 'media', 'light', 'file.svg'),
95 | dark: path.join(__filename, '..', '..', 'media', 'dark', 'file.svg')
96 | };
97 | }
98 | return fileTreeItem;
99 | }
100 | }
101 |
102 | // Given a filepath, return an array of TreeItems
103 | _getDirectoryContents (filePath) {
104 | return new Promise ((resolve, reject) => {
105 | fs.readdir(filePath).then(files => {
106 | let items = [];
107 | files.forEach(file => {
108 | if (!this.ignorePattern.test(file)) {
109 | items.push({
110 | type: 'file',
111 | file: file,
112 | path: path.join(filePath, file),
113 | stats: fs.statSync(path.join(filePath, file))
114 | });
115 | }
116 | });
117 | resolve(items);
118 | }).catch(err => {
119 | reject(err);
120 | })
121 | })
122 | }
123 |
124 | _getTags () {
125 | return new Promise((resolve, reject) => {
126 | let files = [];
127 |
128 | klaw(this.baseDir)
129 | .on('data', item => {
130 | files.push(new Promise((res, rej) => {
131 | const fileName = path.basename(item.path);
132 | if (!item.stats.isDirectory() && !this.ignorePattern.test(fileName)) {
133 | fs.readFile(item.path).then(contents => {
134 | res({
135 | path: item.path,
136 | contents: contents,
137 | payload: {
138 | type: 'file',
139 | file: fileName,
140 | path: item.path,
141 | stats: item.stats
142 | }
143 | });
144 | }).catch(err => {
145 | console.error(err);
146 | res();
147 | })
148 | } else {
149 | res();
150 | }
151 | }))
152 | })
153 | .on('error', (err, item) => {
154 | reject(err)
155 | console.error('Error while walking notes folder for tags: ', item, err);
156 | })
157 | .on('end', () => {
158 | Promise.all(files).then(files => {
159 |
160 | // Build a tag index first
161 | let tagIndex = {};
162 | for (let i = 0; i < files.length; i++) {
163 | if (files[i] != null && files[i]) {
164 | const parsedFrontMatter = this._parseFrontMatter(files[i]);
165 | if (parsedFrontMatter && 'tags' in parsedFrontMatter.data && parsedFrontMatter.data.tags) {
166 | for (let tag of parsedFrontMatter.data.tags) {
167 | if (tag in tagIndex) {
168 | tagIndex[tag].push(files[i].payload);
169 | } else {
170 | tagIndex[tag] = [files[i].payload];
171 | }
172 | }
173 | }
174 | }
175 | }
176 | // Then build an array of tags
177 | let tags = []
178 | for (let tag of Object.keys(tagIndex)) {
179 | tags.push({
180 | type: 'tag',
181 | tag: tag,
182 | files: tagIndex[tag]
183 | })
184 | }
185 | // Sort tags alphabetically
186 | tags.sort(function(a,b) {return (a.tag > b.tag) ? 1 : ((b.tag > a.tag) ? -1 : 0);} );
187 | resolve(tags);
188 | }).catch(err => {
189 | console.error(err)
190 | })
191 | })
192 | });
193 | }
194 |
195 | _parseFrontMatter (file) {
196 | try {
197 | const parsedFrontMatter = matter(file.contents)
198 | if (!(parsedFrontMatter.data instanceof Object)) {
199 | console.error('YAML front-matter is not an object: ', file.path);
200 | return null;
201 | }
202 | return parsedFrontMatter;
203 | } catch (e) {
204 | console.error(file.path, e);
205 | return null;
206 | }
207 | }
208 | }
209 |
210 | module.exports = VSNotesTreeView;
211 |
--------------------------------------------------------------------------------
/src/utils.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const os = require('os');
3 |
4 | // Resolves the home tilde.
5 | function resolveHome(filepath) {
6 | if (path == null || !filepath) {
7 | return ""
8 | }
9 |
10 | if (filepath[0] === '~') {
11 | return path.join(os.homedir(), filepath.slice(1));
12 | }
13 | return filepath
14 | }
15 |
16 | module.exports = {
17 | resolveHome
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/test/extension.test.js:
--------------------------------------------------------------------------------
1 | /* global suite, test */
2 |
3 | //
4 | // Note: This example test is leveraging the Mocha test framework.
5 | // Please refer to their documentation on https://mochajs.org/ for help.
6 | //
7 |
8 | // The module 'assert' provides assertion methods from node
9 | const assert = require('assert');
10 |
11 | // You can import and use all API from the 'vscode' module
12 | // as well as import your extension to test it
13 | const vscode = require('vscode');
14 | const myExtension = require('../extension');
15 |
16 | // Defines a Mocha test suite to group tests of similar kind together
17 | suite("Extension Tests", function() {
18 |
19 | // Defines a Mocha unit test
20 | test("Something 1", function() {
21 | assert.equal(-1, [1, 2, 3].indexOf(5));
22 | assert.equal(-1, [1, 2, 3].indexOf(0));
23 | });
24 | });
--------------------------------------------------------------------------------
/test/index.js:
--------------------------------------------------------------------------------
1 | //
2 | // PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING
3 | //
4 | // This file is providing the test runner to use when running extension tests.
5 | // By default the test runner in use is Mocha based.
6 | //
7 | // You can provide your own test runner if you want to override it by exporting
8 | // a function run(testRoot: string, clb: (error:Error) => void) that the extension
9 | // host can call to run the tests. The test runner is expected to use console.log
10 | // to report the results back to the caller. When the tests are finished, return
11 | // a possible error to the callback or null if none.
12 |
13 | const testRunner = require('vscode/lib/testrunner');
14 |
15 | // You can directly control Mocha options by uncommenting the following lines
16 | // See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info
17 | testRunner.configure({
18 | ui: 'tdd', // the TDD UI is being used in extension.test.js (suite, test, etc.)
19 | useColors: true // colored output from test results
20 | });
21 |
22 | module.exports = testRunner;
--------------------------------------------------------------------------------