├── .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 | ![](https://github.com/patleeman/VSNotes/raw/master/img/vsnotes_commands.png) 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://i3.ytimg.com/vi/Kcf4rpRDmlQ/maxresdefault.jpg)](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 | ![](https://github.com/patleeman/VSNotes/raw/master/img/vsnotes_path_detection.png) 122 | 123 | *VSCode generates necessary subfolders and places the new note inside* 124 | 125 | ![](https://github.com/patleeman/VSNotes/raw/master/img/vsnotes_path_detection_completed.png) 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 | ![](https://github.com/patleeman/VSNotes/raw/master/img/vsnotes_view.png) 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 | 3 | 4 | VSNotesIcon@1.5x 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | VS 18 | 19 | 20 | NOTES 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /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 | 3 | 4 | file-directory 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /media/dark/file.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | file 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /media/dark/sync.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sync 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /media/dark/tag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | tag 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /media/icon/vsnotes_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patleeman/VSNotes/48825438789e785c28b6040df1134e2bd1b779f8/media/icon/vsnotes_icon.png -------------------------------------------------------------------------------- /media/icon/vsnotes_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /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 | 3 | 4 | file-directory 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /media/light/file.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | file 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /media/light/sync.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sync 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /media/light/tag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | tag 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /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; --------------------------------------------------------------------------------