├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .prettierignore ├── .travis.yml ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── appveyor.yml ├── jsannotations.png ├── package-lock.json ├── package.json ├── renovate.json ├── runTests.png ├── src ├── annotationProvider.ts ├── commands.ts ├── decorator.ts ├── extension.ts ├── functionCallObject.ts ├── paramExtractor.ts ├── parser.ts └── test │ ├── e2e │ └── extension.test.ts │ ├── examples │ ├── moreArgs.js │ ├── multipleLines.js │ ├── nested.ts │ ├── noDefinition.js │ ├── noParams.js │ ├── normalParams.js │ ├── react.jsx │ ├── rest.js │ └── this.ts │ ├── index.ts │ └── unit │ └── paramExtractor.test.ts ├── tsconfig.json └── tslint.json /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Find a bug or issue. Report it here to help let me know about it 4 | --- 5 | 6 | VS Code Version: 7 | Extension Version: 8 | 9 | What's the issue: -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Looking for a new feature or update to the extension 4 | --- 5 | 6 | What are you wanting to see improved / introduced? -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | .DS_STORE -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | * -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | os: 4 | - osx 5 | - linux 6 | 7 | before_install: 8 | - if [ $TRAVIS_OS_NAME == "linux" ]; then 9 | export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0; 10 | sh -e /etc/init.d/xvfb start; 11 | sleep 3; 12 | fi 13 | 14 | install: 15 | - npm install 16 | - npm run vscode:prepublish 17 | 18 | script: 19 | - npm test --silent 20 | - npm run lint -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--disable-extensions", 15 | "--extensionDevelopmentPath=${workspaceFolder}" 16 | ], 17 | "outFiles": [ 18 | "${workspaceFolder}/out/**/*.js" 19 | ], 20 | "preLaunchTask": "npm: watch" 21 | }, 22 | { 23 | "name": "Extension Tests", 24 | "type": "extensionHost", 25 | "request": "launch", 26 | "runtimeExecutable": "${execPath}", 27 | "args": [ 28 | "--disable-extensions", 29 | "--extensionDevelopmentPath=${workspaceFolder}", 30 | "--extensionTestsPath=${workspaceFolder}/out/test" 31 | ], 32 | "outFiles": [ 33 | "${workspaceFolder}/out/test/**/*.js" 34 | ], 35 | "preLaunchTask": "npm: watch" 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | } 9 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | out/**/*.map 5 | src/** 6 | .gitignore 7 | tsconfig.json 8 | vsc-extension-quickstart.md 9 | tslint.json -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 0.11.0 - Mar 11, 2019 4 | - [Feature] Added option to disable leading whitespace 5 | 6 | ## 0.10.1 - Mar 3, 2019 7 | - [Hotfix] Updating deps to get rid of security vulns. 8 | 9 | ## 0.10.0 - Dec 2, 2018 10 | - [Feature] Support for React files (only with the .JSX / .TSX extensions for now. Support for all files in the future) 11 | - [Bug] Fixed arrow functions without params not being used 12 | - [Bug] Expressions which were immediately invoked functions after importing ("require("module")(params)) now annotated properly 13 | - [Bug] documentCache was not specific enough and was tripping over itself. Now using last two parts of filepath for documentCache. 14 | - [Bug] Typescript fake `this` parameter won't be used when annotating 15 | - [Dev] Added script to package.json to run just unit tests 16 | - [Dev] Contributing Guide to describe how to install, test, and debug the extension. 17 | 18 | ## 0.9.1 - Oct 16, 2018 19 | - [Bug] TS casted params were incorrectly annotated by one column. 20 | 21 | ## 0.9.0 - Sep 29, 2018 22 | - [Feature] Annotations will now be added / remove in real time without needing to save. 23 | - [Hotfix] Fixed CI breaking 24 | - [Hotfix] Rest params with a space between the ... operator and the param name now annotated 25 | 26 | ## 0.8.4 - Sep 15, 2018 27 | - [Bug] Continued working on cleaning up parameter splitting algorithm. Now doesn't break with functions 28 | - [Feature] Wrote unit tests for splitToParamList function 29 | 30 | ## 0.8.3 - Sep 14, 2018 31 | - [Bug] Importing functions with require don't cause issues with annotations anymore. 32 | - [Bug] TS functions with Generic types now properly annotate 33 | 34 | ## 0.8.2 - Sep 14, 2018 35 | - [Hotfix] Duplicate diagnostics were showing up in problems panel. Fixed this in this patch. 36 | 37 | ## 0.8.1 - Sep 13, 2018 38 | - [Hotfix] Added settings to hide either of the diagnostics or error annotations 39 | 40 | ## 0.8.0 - Sep 13, 2018 41 | - [Feature] Invalid parameters in JS will now appear in the Problems panel 42 | 43 | ## 0.7.3 - Sep 12, 2018 44 | - [Bug] Definitions with extra spaces caused incorrect annotations 45 | 46 | ## 0.7.2 - Sep 6, 2018 47 | - [Bug] Param capturing did not fully capture definition parameter list. Switched off of a regex to properly capture string 48 | 49 | ## 0.7.1 - Sep 4, 2018 50 | - [Bug] Typescript functions with access modifiers were returning the modifiers instead of param names 51 | 52 | ## 0.7.0 - Sep 4, 2018 53 | - [Feature] Added config options for annotation font-weight and font-style 54 | - [Bug] Fixed issue where arguments that weren't supposed to be there were being annotated with undefined 55 | 56 | ## 0.6.1 - Sep 3, 2018 57 | - [Hotfix] Made nested new object expressions annotated 58 | 59 | ## 0.6.0 - Sep 3, 2018 60 | - [Feature] new object expressions now annotated 61 | 62 | ## 0.5.2 - Sep 1, 2018 63 | - [Hotfix] Made the last bug fix work with deeply nested object properties (ex: a.b.c.d) 64 | 65 | ## 0.5.1 - Sep 1, 2018 66 | - [Bug] Array access params (a[2]) and object property params (foo.bar) were not being annotated. 67 | 68 | ## 0.5.0 - Aug 30, 2018 69 | - [Feature] functions with variadic parameter will be spread across function calls 70 | 71 | ## 0.4.2 - Aug 29, 2018 72 | - [Bug] fixed issue where #! would break parser and cause annotations not to occur. 73 | 74 | ## 0.4.1 - Aug 28, 2018 75 | - [Hotfix] switched jsannotations.hideIfEqual to be on by default 76 | 77 | ## 0.4.0 - Aug 27, 2018 78 | - [Feature] new config: jsannotations.hideIfEqual - will not display annotation if the name of the argument matches the name of the parameter (configured to be false by default). 79 | 80 | ## 0.3.3 - Aug 27, 2018 81 | - [Bug] for-of loop iterating through functions could cause incorrect decoration. 82 | - [Bug] callback functions could cause incorrect decorations. 83 | 84 | ## 0.3.2 - Aug 25, 2018 85 | - [Bug] files using tabs as indentation were misaligning annotation 86 | 87 | ## 0.3.1 - Aug 24, 2018 88 | - [Hotfix] Updated Readme 89 | 90 | ## 0.3.0 - Aug 24, 2018 91 | - [Feature] Now supports Typescript 92 | 93 | ## 0.2.1 - Aug 20, 2018 94 | - [Hotfix] Added keybinding for toggling annotations ('ctrl/cmd+k a' by default) 95 | - [Hotfix] Switched color config to use builtin 'colors' contributes property 96 | 97 | ## 0.2.0 - Aug 19, 2018 98 | - [Feature] Configuration for enabling / disabling annotations: jsannotations.enabled 99 | - [Feature] Configuration for changing color of annotations on light and dark themes: jsannotations.colors 100 | - [Feature] Command to hide / show annotations: "JS Annotations: Hide / Show Annotations 101 | - [Bug] Fixed to only made decorate run on JS files 102 | 103 | ## 0.1.0 - Aug 15, 2018 104 | - Initial Release -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributors Guide 2 | 3 | The following is a good set of guidelines on contributing to this project. I am fully accepting any positive change into the project that will make it faster, more maintainable, and anything that increases the satisfaction of using it. 4 | 5 | ## Where to start 6 | 7 | If you want to work on something, look in the Issues tab first. Both a benefit to see that your contribution isn't already being worked on by someone else, but also to make sure that it is an appropriate contribution before diving into it. 8 | 9 | If you want to make something and there isn't an issue on it, post one and I will likely look at it within 24 hours max. 10 | 11 | Next, make sure you have the following installed: 12 | 13 | * Node v8 or later 14 | * Visual Studio Code 15 | 16 | ## Download the Extension 17 | 18 | Grab the repo from GitHub here with these commands: 19 | 20 | ``` 21 | git clone https://github.com/lannonbr/vscode-js-annotations.git 22 | cd vscode-js-annotations 23 | ``` 24 | 25 | Install it with the following commands: 26 | 27 | ``` 28 | npm install 29 | ``` 30 | 31 | Next, if you open the repo in VS Code and go to the Debug Panel and choose the `Extension` launch option, it will spin up the latest version of the extension. If you already have it installed through VS Code, it will overwrite the old version with this one. 32 | 33 | ## Unit Tests 34 | 35 | We use the VS Code testrunner for E2E tests which uses Mocha behind the scenes. To run all of the tests, open the Debug tag in VS Code and switch to the `Extension Tests` launch option. 36 | 37 | ![Launch Tests](runTests.png) 38 | 39 | ## Linting 40 | 41 | This project uses TSLint for linting. To keep consistency for code style, I have integrated it so builds will fail if TSLint doesn't pass. I highly recommend the [TSLint VS Code Extension](https://marketplace.visualstudio.com/items?itemName=eg2.tslint) to see visible warnings / errors in the editor itself if the code style is incorrect. 42 | 43 | ## Submitting PRs 44 | 45 | Once you have completed your contribution, feel free to submit a PR. I will pull down your branch and test it to confirm the change works and if any further changes need to happen before being merged in. Similar with issues, As long as I am not on vacation, I should get back to your contribution within 24 hours. 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2018 - 2019 Benjamin Lannon 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this 4 | software and associated documentation files (the "Software"), to deal in the Software 5 | without restriction, including without limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 7 | to whom the Software is furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies or 10 | substantial portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 13 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 | PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 15 | FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 16 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⚠️ This repo is no longer being maintained. See [#92](https://github.com/lannonbr/vscode-js-annotations/issues/92) 2 | 3 | --- 4 | 5 | # JS / TS Parameter Annotations for Visual Studio Code 6 | 7 | [![VS Marketplace Version](https://vsmarketplacebadge.apphb.com/version-short/lannonbr.vscode-js-annotations.svg)](https://marketplace.visualstudio.com/items?itemName=lannonbr.vscode-js-annotations) 8 | [![VS Marketplace Installs](https://vsmarketplacebadge.apphb.com/installs-short/lannonbr.vscode-js-annotations.svg)](https://marketplace.visualstudio.com/items?itemName=lannonbr.vscode-js-annotations) 9 | [![VS Marketplace Rating](https://vsmarketplacebadge.apphb.com/rating-short/lannonbr.vscode-js-annotations.svg)](https://marketplace.visualstudio.com/items?itemName=lannonbr.vscode-js-annotations) 10 | [![TravisCI Build Status](https://travis-ci.org/lannonbr/vscode-js-annotations.svg?branch=master)](https://travis-ci.org/lannonbr/vscode-js-annotations) 11 | [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/xdqr6dl8ofk27sdi?svg=true)](https://ci.appveyor.com/project/lannonbr/vscode-js-annotations) 12 | 13 | ![jsannotations screenshot](jsannotations.png) 14 | 15 | vscode-js-annotations goes through any Javascript or Typescript file and inserts parameter annotations into all function calls so it is easily noticable on what a particular parameter is. 16 | 17 | ## Settings 18 | 19 | There currently is a few configurable settings in the extension 20 | 21 | | Name | Description | Default | 22 | |-------|------------|---------| 23 | | `jsannotations.enabled` | Enable JS Annotations | true | 24 | | `jsannotations.hideIfEqual` | Hide annotation if argument name matches parameter name | true | 25 | | `jsannotations.hideInvalidAnnotation` | Hide annotations for invalid params | true | 26 | | `jsannotations.hideDiagnostics` | Hide red squiggles under invalid parameters | false | 27 | | `jsannotations.fontWeight` | Annotation styling of font-weight CSS property | "400" | 28 | | `jsannotations.fontStyle` | Font style for annotations. | "italic" | 29 | 30 | ## Themable Colors 31 | 32 | JS Annotations provides a single themable color being the color of what the annotation should be. It can be added to the `workbench.colorCustomizations` property in user settings. 33 | 34 | | Name | Description | 35 | |------|-------------| 36 | | `jsannotations.annotationForeground` | Specifies the foreground color for the annotations | 37 | 38 | ## Contributors 👨‍💻 👩‍💻 39 | 40 | Thanks to the following Contributors who have helped with this project in any way 41 | 42 | * Flavio Copes ([@flaviocopes](https://github.com/flaviocopes)) (PRs) 43 | * Guilherme Amorim ([@GuiAmPm](https://github.com/GuiAmPm)) (PRs) 44 | * Laurens Bosscher ([@LaurensBosscher](https://github.com/LaurensBosscher)) (Issues) 45 | * Luca Steeb ([@steebchen](https://github.com/steebchen)) (Issues) 46 | * Mike Erickson ([@mikeerickson](https://github.com/mikeerickson)) (PRs, Issues) 47 | * Nigel Scott ([@Gruntfuggly](https://github.com/Gruntfuggly)) (Issues) 48 | * Nurbol Alpysbayev ([@anurbol](https://github.com/anurbol)) (Issues) 49 | * Roman Pavlov ([@romap0](https://github.com/romap0)) (PRs) 50 | * Sioxas ([@sioxas](https://github.com/Sioxas)) (Issues) 51 | * Thibault Malbranche ([@Titozzz](https://github.com/Titozzz)) (Issues) 52 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | environment: 2 | matrix: 3 | - nodejs_version: "8" 4 | install: 5 | - ps: Install-Product node $env:nodejs_version 6 | - npm install 7 | - npm install -g tslint typescript 8 | - npm run vscode:prepublish 9 | test_script: 10 | - node --version 11 | - npm --version 12 | - tslint --project . 13 | - npm test --silent 14 | build: off -------------------------------------------------------------------------------- /jsannotations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lannonbr/vscode-js-annotations/05fff6eba70b690f7e7dbca0c0e03ab0e18bee33/jsannotations.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vscode-js-annotations", 3 | "version": "0.11.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/mocha": { 8 | "version": "5.2.5", 9 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", 10 | "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", 11 | "dev": true 12 | }, 13 | "@types/node": { 14 | "version": "7.0.69", 15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.69.tgz", 16 | "integrity": "sha512-S5NC8HV6HnRipg8nC0j30TPl7ktXjRTKqgyINLNe8K/64UJUI8Lq0sRopXC0hProsV2F5ibj8IqPkl1xpGggrw==", 17 | "dev": true 18 | }, 19 | "ajv": { 20 | "version": "6.10.0", 21 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 22 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 23 | "dev": true, 24 | "requires": { 25 | "fast-deep-equal": "^2.0.1", 26 | "fast-json-stable-stringify": "^2.0.0", 27 | "json-schema-traverse": "^0.4.1", 28 | "uri-js": "^4.2.2" 29 | } 30 | }, 31 | "ansi-cyan": { 32 | "version": "0.1.1", 33 | "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", 34 | "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", 35 | "dev": true, 36 | "requires": { 37 | "ansi-wrap": "0.1.0" 38 | } 39 | }, 40 | "ansi-red": { 41 | "version": "0.1.1", 42 | "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", 43 | "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", 44 | "dev": true, 45 | "requires": { 46 | "ansi-wrap": "0.1.0" 47 | } 48 | }, 49 | "ansi-regex": { 50 | "version": "2.1.1", 51 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 52 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 53 | }, 54 | "ansi-styles": { 55 | "version": "2.2.1", 56 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 57 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 58 | }, 59 | "ansi-wrap": { 60 | "version": "0.1.0", 61 | "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", 62 | "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", 63 | "dev": true 64 | }, 65 | "append-buffer": { 66 | "version": "1.0.2", 67 | "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", 68 | "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", 69 | "dev": true, 70 | "requires": { 71 | "buffer-equal": "^1.0.0" 72 | } 73 | }, 74 | "argparse": { 75 | "version": "1.0.10", 76 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 77 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 78 | "requires": { 79 | "sprintf-js": "~1.0.2" 80 | } 81 | }, 82 | "arr-diff": { 83 | "version": "1.1.0", 84 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", 85 | "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", 86 | "dev": true, 87 | "requires": { 88 | "arr-flatten": "^1.0.1", 89 | "array-slice": "^0.2.3" 90 | } 91 | }, 92 | "arr-flatten": { 93 | "version": "1.1.0", 94 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 95 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 96 | "dev": true 97 | }, 98 | "arr-union": { 99 | "version": "2.1.0", 100 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", 101 | "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", 102 | "dev": true 103 | }, 104 | "array-differ": { 105 | "version": "1.0.0", 106 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", 107 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", 108 | "dev": true 109 | }, 110 | "array-slice": { 111 | "version": "0.2.3", 112 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", 113 | "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", 114 | "dev": true 115 | }, 116 | "array-union": { 117 | "version": "1.0.2", 118 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 119 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 120 | "dev": true, 121 | "requires": { 122 | "array-uniq": "^1.0.1" 123 | } 124 | }, 125 | "array-uniq": { 126 | "version": "1.0.3", 127 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 128 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 129 | "dev": true 130 | }, 131 | "arrify": { 132 | "version": "1.0.1", 133 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 134 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 135 | "dev": true 136 | }, 137 | "asn1": { 138 | "version": "0.2.4", 139 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 140 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 141 | "dev": true, 142 | "requires": { 143 | "safer-buffer": "~2.1.0" 144 | } 145 | }, 146 | "assert-plus": { 147 | "version": "1.0.0", 148 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 149 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 150 | "dev": true 151 | }, 152 | "ast-types": { 153 | "version": "0.11.6", 154 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.6.tgz", 155 | "integrity": "sha512-nHiuV14upVGl7MWwFUYbzJ6YlfwWS084CU9EA8HajfYQjMSli5TQi3UTRygGF58LFWVkXxS1rbgRhROEqlQkXg==" 156 | }, 157 | "asynckit": { 158 | "version": "0.4.0", 159 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 160 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 161 | "dev": true 162 | }, 163 | "aws-sign2": { 164 | "version": "0.7.0", 165 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 166 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 167 | "dev": true 168 | }, 169 | "aws4": { 170 | "version": "1.8.0", 171 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 172 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 173 | "dev": true 174 | }, 175 | "babel-code-frame": { 176 | "version": "6.26.0", 177 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 178 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 179 | "requires": { 180 | "chalk": "^1.1.3", 181 | "esutils": "^2.0.2", 182 | "js-tokens": "^3.0.2" 183 | }, 184 | "dependencies": { 185 | "chalk": { 186 | "version": "1.1.3", 187 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 188 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 189 | "requires": { 190 | "ansi-styles": "^2.2.1", 191 | "escape-string-regexp": "^1.0.2", 192 | "has-ansi": "^2.0.0", 193 | "strip-ansi": "^3.0.0", 194 | "supports-color": "^2.0.0" 195 | } 196 | }, 197 | "supports-color": { 198 | "version": "2.0.0", 199 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 200 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 201 | } 202 | } 203 | }, 204 | "babylon": { 205 | "version": "7.0.0-beta.47", 206 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", 207 | "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==" 208 | }, 209 | "balanced-match": { 210 | "version": "1.0.0", 211 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 212 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 213 | }, 214 | "bcrypt-pbkdf": { 215 | "version": "1.0.2", 216 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 217 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 218 | "dev": true, 219 | "requires": { 220 | "tweetnacl": "^0.14.3" 221 | } 222 | }, 223 | "block-stream": { 224 | "version": "0.0.9", 225 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 226 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 227 | "dev": true, 228 | "requires": { 229 | "inherits": "~2.0.0" 230 | } 231 | }, 232 | "brace-expansion": { 233 | "version": "1.1.11", 234 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 235 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 236 | "requires": { 237 | "balanced-match": "^1.0.0", 238 | "concat-map": "0.0.1" 239 | } 240 | }, 241 | "browser-stdout": { 242 | "version": "1.3.0", 243 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 244 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 245 | "dev": true 246 | }, 247 | "buffer-crc32": { 248 | "version": "0.2.13", 249 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 250 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 251 | "dev": true 252 | }, 253 | "buffer-equal": { 254 | "version": "1.0.0", 255 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", 256 | "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", 257 | "dev": true 258 | }, 259 | "buffer-from": { 260 | "version": "1.1.1", 261 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 262 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 263 | "dev": true 264 | }, 265 | "builtin-modules": { 266 | "version": "1.1.1", 267 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 268 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 269 | }, 270 | "caseless": { 271 | "version": "0.12.0", 272 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 273 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 274 | "dev": true 275 | }, 276 | "chalk": { 277 | "version": "2.4.1", 278 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 279 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 280 | "requires": { 281 | "ansi-styles": "^3.2.1", 282 | "escape-string-regexp": "^1.0.5", 283 | "supports-color": "^5.3.0" 284 | }, 285 | "dependencies": { 286 | "ansi-styles": { 287 | "version": "3.2.1", 288 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 289 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 290 | "requires": { 291 | "color-convert": "^1.9.0" 292 | } 293 | }, 294 | "has-flag": { 295 | "version": "3.0.0", 296 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 297 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 298 | }, 299 | "supports-color": { 300 | "version": "5.5.0", 301 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 302 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 303 | "requires": { 304 | "has-flag": "^3.0.0" 305 | } 306 | } 307 | } 308 | }, 309 | "ci-info": { 310 | "version": "1.6.0", 311 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", 312 | "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", 313 | "dev": true 314 | }, 315 | "clone": { 316 | "version": "0.2.0", 317 | "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", 318 | "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", 319 | "dev": true 320 | }, 321 | "clone-buffer": { 322 | "version": "1.0.0", 323 | "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", 324 | "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", 325 | "dev": true 326 | }, 327 | "clone-stats": { 328 | "version": "0.0.1", 329 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", 330 | "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", 331 | "dev": true 332 | }, 333 | "cloneable-readable": { 334 | "version": "1.1.2", 335 | "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", 336 | "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", 337 | "dev": true, 338 | "requires": { 339 | "inherits": "^2.0.1", 340 | "process-nextick-args": "^2.0.0", 341 | "readable-stream": "^2.3.5" 342 | } 343 | }, 344 | "color-convert": { 345 | "version": "1.9.3", 346 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 347 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 348 | "requires": { 349 | "color-name": "1.1.3" 350 | } 351 | }, 352 | "color-name": { 353 | "version": "1.1.3", 354 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 355 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 356 | }, 357 | "combined-stream": { 358 | "version": "1.0.7", 359 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 360 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 361 | "dev": true, 362 | "requires": { 363 | "delayed-stream": "~1.0.0" 364 | } 365 | }, 366 | "commander": { 367 | "version": "2.11.0", 368 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 369 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 370 | "dev": true 371 | }, 372 | "concat-map": { 373 | "version": "0.0.1", 374 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 375 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 376 | }, 377 | "convert-source-map": { 378 | "version": "1.6.0", 379 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", 380 | "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", 381 | "dev": true, 382 | "requires": { 383 | "safe-buffer": "~5.1.1" 384 | } 385 | }, 386 | "core-util-is": { 387 | "version": "1.0.2", 388 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 389 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 390 | "dev": true 391 | }, 392 | "cosmiconfig": { 393 | "version": "5.0.6", 394 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", 395 | "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", 396 | "dev": true, 397 | "requires": { 398 | "is-directory": "^0.3.1", 399 | "js-yaml": "^3.9.0", 400 | "parse-json": "^4.0.0" 401 | } 402 | }, 403 | "cross-spawn": { 404 | "version": "5.1.0", 405 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 406 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 407 | "dev": true, 408 | "requires": { 409 | "lru-cache": "^4.0.1", 410 | "shebang-command": "^1.2.0", 411 | "which": "^1.2.9" 412 | } 413 | }, 414 | "dashdash": { 415 | "version": "1.14.1", 416 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 417 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 418 | "dev": true, 419 | "requires": { 420 | "assert-plus": "^1.0.0" 421 | } 422 | }, 423 | "debug": { 424 | "version": "3.1.0", 425 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 426 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 427 | "dev": true, 428 | "requires": { 429 | "ms": "2.0.0" 430 | } 431 | }, 432 | "deep-assign": { 433 | "version": "1.0.0", 434 | "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", 435 | "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", 436 | "dev": true, 437 | "requires": { 438 | "is-obj": "^1.0.0" 439 | } 440 | }, 441 | "define-properties": { 442 | "version": "1.1.3", 443 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 444 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 445 | "dev": true, 446 | "requires": { 447 | "object-keys": "^1.0.12" 448 | } 449 | }, 450 | "delayed-stream": { 451 | "version": "1.0.0", 452 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 453 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 454 | "dev": true 455 | }, 456 | "diff": { 457 | "version": "3.3.1", 458 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 459 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" 460 | }, 461 | "duplexer": { 462 | "version": "0.1.1", 463 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 464 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 465 | "dev": true 466 | }, 467 | "duplexify": { 468 | "version": "3.7.1", 469 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 470 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 471 | "dev": true, 472 | "requires": { 473 | "end-of-stream": "^1.0.0", 474 | "inherits": "^2.0.1", 475 | "readable-stream": "^2.0.0", 476 | "stream-shift": "^1.0.0" 477 | } 478 | }, 479 | "ecc-jsbn": { 480 | "version": "0.1.2", 481 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 482 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 483 | "dev": true, 484 | "requires": { 485 | "jsbn": "~0.1.0", 486 | "safer-buffer": "^2.1.0" 487 | } 488 | }, 489 | "end-of-stream": { 490 | "version": "1.4.1", 491 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 492 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 493 | "dev": true, 494 | "requires": { 495 | "once": "^1.4.0" 496 | } 497 | }, 498 | "error-ex": { 499 | "version": "1.3.2", 500 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 501 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 502 | "dev": true, 503 | "requires": { 504 | "is-arrayish": "^0.2.1" 505 | } 506 | }, 507 | "escape-string-regexp": { 508 | "version": "1.0.5", 509 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 510 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 511 | }, 512 | "esprima": { 513 | "version": "4.0.1", 514 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 515 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 516 | }, 517 | "esutils": { 518 | "version": "2.0.2", 519 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 520 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 521 | }, 522 | "event-stream": { 523 | "version": "3.3.4", 524 | "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 525 | "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", 526 | "dev": true, 527 | "requires": { 528 | "duplexer": "~0.1.1", 529 | "from": "~0", 530 | "map-stream": "~0.1.0", 531 | "pause-stream": "0.0.11", 532 | "split": "0.3", 533 | "stream-combiner": "~0.0.4", 534 | "through": "~2.3.1" 535 | } 536 | }, 537 | "execa": { 538 | "version": "0.9.0", 539 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", 540 | "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", 541 | "dev": true, 542 | "requires": { 543 | "cross-spawn": "^5.0.1", 544 | "get-stream": "^3.0.0", 545 | "is-stream": "^1.1.0", 546 | "npm-run-path": "^2.0.0", 547 | "p-finally": "^1.0.0", 548 | "signal-exit": "^3.0.0", 549 | "strip-eof": "^1.0.0" 550 | } 551 | }, 552 | "extend": { 553 | "version": "3.0.2", 554 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 555 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 556 | "dev": true 557 | }, 558 | "extend-shallow": { 559 | "version": "1.1.4", 560 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", 561 | "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", 562 | "dev": true, 563 | "requires": { 564 | "kind-of": "^1.1.0" 565 | } 566 | }, 567 | "extsprintf": { 568 | "version": "1.3.0", 569 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 570 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 571 | "dev": true 572 | }, 573 | "fast-deep-equal": { 574 | "version": "2.0.1", 575 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 576 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 577 | "dev": true 578 | }, 579 | "fast-json-stable-stringify": { 580 | "version": "2.0.0", 581 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 582 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 583 | "dev": true 584 | }, 585 | "fd-slicer": { 586 | "version": "1.1.0", 587 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 588 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 589 | "dev": true, 590 | "requires": { 591 | "pend": "~1.2.0" 592 | } 593 | }, 594 | "find-up": { 595 | "version": "3.0.0", 596 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 597 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 598 | "dev": true, 599 | "requires": { 600 | "locate-path": "^3.0.0" 601 | } 602 | }, 603 | "flush-write-stream": { 604 | "version": "1.1.1", 605 | "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", 606 | "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", 607 | "dev": true, 608 | "requires": { 609 | "inherits": "^2.0.3", 610 | "readable-stream": "^2.3.6" 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 | "from": { 631 | "version": "0.1.7", 632 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 633 | "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", 634 | "dev": true 635 | }, 636 | "fs-mkdirp-stream": { 637 | "version": "1.0.0", 638 | "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", 639 | "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", 640 | "dev": true, 641 | "requires": { 642 | "graceful-fs": "^4.1.11", 643 | "through2": "^2.0.3" 644 | } 645 | }, 646 | "fs.realpath": { 647 | "version": "1.0.0", 648 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 649 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 650 | }, 651 | "fstream": { 652 | "version": "1.0.11", 653 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 654 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 655 | "dev": true, 656 | "requires": { 657 | "graceful-fs": "^4.1.2", 658 | "inherits": "~2.0.0", 659 | "mkdirp": ">=0.5 0", 660 | "rimraf": "2" 661 | } 662 | }, 663 | "function-bind": { 664 | "version": "1.1.1", 665 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 666 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 667 | "dev": true 668 | }, 669 | "get-stdin": { 670 | "version": "6.0.0", 671 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 672 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 673 | "dev": true 674 | }, 675 | "get-stream": { 676 | "version": "3.0.0", 677 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 678 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 679 | "dev": true 680 | }, 681 | "getpass": { 682 | "version": "0.1.7", 683 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 684 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 685 | "dev": true, 686 | "requires": { 687 | "assert-plus": "^1.0.0" 688 | } 689 | }, 690 | "glob": { 691 | "version": "7.1.2", 692 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 693 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 694 | "requires": { 695 | "fs.realpath": "^1.0.0", 696 | "inflight": "^1.0.4", 697 | "inherits": "2", 698 | "minimatch": "^3.0.4", 699 | "once": "^1.3.0", 700 | "path-is-absolute": "^1.0.0" 701 | } 702 | }, 703 | "glob-parent": { 704 | "version": "3.1.0", 705 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 706 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 707 | "dev": true, 708 | "requires": { 709 | "is-glob": "^3.1.0", 710 | "path-dirname": "^1.0.0" 711 | } 712 | }, 713 | "glob-stream": { 714 | "version": "6.1.0", 715 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 716 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 717 | "dev": true, 718 | "requires": { 719 | "extend": "^3.0.0", 720 | "glob": "^7.1.1", 721 | "glob-parent": "^3.1.0", 722 | "is-negated-glob": "^1.0.0", 723 | "ordered-read-streams": "^1.0.0", 724 | "pumpify": "^1.3.5", 725 | "readable-stream": "^2.1.5", 726 | "remove-trailing-separator": "^1.0.1", 727 | "to-absolute-glob": "^2.0.0", 728 | "unique-stream": "^2.0.2" 729 | } 730 | }, 731 | "graceful-fs": { 732 | "version": "4.1.15", 733 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 734 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 735 | "dev": true 736 | }, 737 | "growl": { 738 | "version": "1.10.3", 739 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 740 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 741 | "dev": true 742 | }, 743 | "gulp-chmod": { 744 | "version": "2.0.0", 745 | "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", 746 | "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", 747 | "dev": true, 748 | "requires": { 749 | "deep-assign": "^1.0.0", 750 | "stat-mode": "^0.2.0", 751 | "through2": "^2.0.0" 752 | } 753 | }, 754 | "gulp-filter": { 755 | "version": "5.1.0", 756 | "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", 757 | "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", 758 | "dev": true, 759 | "requires": { 760 | "multimatch": "^2.0.0", 761 | "plugin-error": "^0.1.2", 762 | "streamfilter": "^1.0.5" 763 | } 764 | }, 765 | "gulp-gunzip": { 766 | "version": "1.0.0", 767 | "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", 768 | "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", 769 | "dev": true, 770 | "requires": { 771 | "through2": "~0.6.5", 772 | "vinyl": "~0.4.6" 773 | }, 774 | "dependencies": { 775 | "isarray": { 776 | "version": "0.0.1", 777 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 778 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 779 | "dev": true 780 | }, 781 | "readable-stream": { 782 | "version": "1.0.34", 783 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 784 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 785 | "dev": true, 786 | "requires": { 787 | "core-util-is": "~1.0.0", 788 | "inherits": "~2.0.1", 789 | "isarray": "0.0.1", 790 | "string_decoder": "~0.10.x" 791 | } 792 | }, 793 | "string_decoder": { 794 | "version": "0.10.31", 795 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 796 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 797 | "dev": true 798 | }, 799 | "through2": { 800 | "version": "0.6.5", 801 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 802 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 803 | "dev": true, 804 | "requires": { 805 | "readable-stream": ">=1.0.33-1 <1.1.0-0", 806 | "xtend": ">=4.0.0 <4.1.0-0" 807 | } 808 | } 809 | } 810 | }, 811 | "gulp-remote-src-vscode": { 812 | "version": "0.5.1", 813 | "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.1.tgz", 814 | "integrity": "sha512-mw4OGjtC/jlCWJFhbcAlel4YPvccChlpsl3JceNiB/DLJi24/UPxXt53/N26lgI3dknEqd4ErfdHrO8sJ5bATQ==", 815 | "dev": true, 816 | "requires": { 817 | "event-stream": "3.3.4", 818 | "node.extend": "^1.1.2", 819 | "request": "^2.79.0", 820 | "through2": "^2.0.3", 821 | "vinyl": "^2.0.1" 822 | }, 823 | "dependencies": { 824 | "clone": { 825 | "version": "2.1.2", 826 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 827 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 828 | "dev": true 829 | }, 830 | "clone-stats": { 831 | "version": "1.0.0", 832 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 833 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 834 | "dev": true 835 | }, 836 | "vinyl": { 837 | "version": "2.2.0", 838 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 839 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 840 | "dev": true, 841 | "requires": { 842 | "clone": "^2.1.1", 843 | "clone-buffer": "^1.0.0", 844 | "clone-stats": "^1.0.0", 845 | "cloneable-readable": "^1.0.0", 846 | "remove-trailing-separator": "^1.0.1", 847 | "replace-ext": "^1.0.0" 848 | } 849 | } 850 | } 851 | }, 852 | "gulp-untar": { 853 | "version": "0.0.7", 854 | "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", 855 | "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", 856 | "dev": true, 857 | "requires": { 858 | "event-stream": "~3.3.4", 859 | "streamifier": "~0.1.1", 860 | "tar": "^2.2.1", 861 | "through2": "~2.0.3", 862 | "vinyl": "^1.2.0" 863 | }, 864 | "dependencies": { 865 | "clone": { 866 | "version": "1.0.4", 867 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 868 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 869 | "dev": true 870 | }, 871 | "replace-ext": { 872 | "version": "0.0.1", 873 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", 874 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", 875 | "dev": true 876 | }, 877 | "vinyl": { 878 | "version": "1.2.0", 879 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", 880 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", 881 | "dev": true, 882 | "requires": { 883 | "clone": "^1.0.0", 884 | "clone-stats": "^0.0.1", 885 | "replace-ext": "0.0.1" 886 | } 887 | } 888 | } 889 | }, 890 | "gulp-vinyl-zip": { 891 | "version": "2.1.2", 892 | "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz", 893 | "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==", 894 | "dev": true, 895 | "requires": { 896 | "event-stream": "3.3.4", 897 | "queue": "^4.2.1", 898 | "through2": "^2.0.3", 899 | "vinyl": "^2.0.2", 900 | "vinyl-fs": "^3.0.3", 901 | "yauzl": "^2.2.1", 902 | "yazl": "^2.2.1" 903 | }, 904 | "dependencies": { 905 | "clone": { 906 | "version": "2.1.2", 907 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 908 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 909 | "dev": true 910 | }, 911 | "clone-stats": { 912 | "version": "1.0.0", 913 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 914 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 915 | "dev": true 916 | }, 917 | "vinyl": { 918 | "version": "2.2.0", 919 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 920 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 921 | "dev": true, 922 | "requires": { 923 | "clone": "^2.1.1", 924 | "clone-buffer": "^1.0.0", 925 | "clone-stats": "^1.0.0", 926 | "cloneable-readable": "^1.0.0", 927 | "remove-trailing-separator": "^1.0.1", 928 | "replace-ext": "^1.0.0" 929 | } 930 | } 931 | } 932 | }, 933 | "har-schema": { 934 | "version": "2.0.0", 935 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 936 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 937 | "dev": true 938 | }, 939 | "har-validator": { 940 | "version": "5.1.3", 941 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 942 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 943 | "dev": true, 944 | "requires": { 945 | "ajv": "^6.5.5", 946 | "har-schema": "^2.0.0" 947 | } 948 | }, 949 | "has": { 950 | "version": "1.0.3", 951 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 952 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 953 | "dev": true, 954 | "requires": { 955 | "function-bind": "^1.1.1" 956 | } 957 | }, 958 | "has-ansi": { 959 | "version": "2.0.0", 960 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 961 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 962 | "requires": { 963 | "ansi-regex": "^2.0.0" 964 | } 965 | }, 966 | "has-flag": { 967 | "version": "2.0.0", 968 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 969 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 970 | "dev": true 971 | }, 972 | "has-symbols": { 973 | "version": "1.0.0", 974 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 975 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 976 | "dev": true 977 | }, 978 | "he": { 979 | "version": "1.1.1", 980 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 981 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 982 | "dev": true 983 | }, 984 | "hosted-git-info": { 985 | "version": "2.7.1", 986 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 987 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", 988 | "dev": true 989 | }, 990 | "http-signature": { 991 | "version": "1.2.0", 992 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 993 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 994 | "dev": true, 995 | "requires": { 996 | "assert-plus": "^1.0.0", 997 | "jsprim": "^1.2.2", 998 | "sshpk": "^1.7.0" 999 | } 1000 | }, 1001 | "husky": { 1002 | "version": "1.0.1", 1003 | "resolved": "https://registry.npmjs.org/husky/-/husky-1.0.1.tgz", 1004 | "integrity": "sha512-MxwLwwwgY7mqV4auSpGWKPTCkZ9RmsdGojQQBvRtr6vxnjSOyI5l/M58QdUz0vRKb0igTpbzBeoUsScx4XJwQg==", 1005 | "dev": true, 1006 | "requires": { 1007 | "cosmiconfig": "^5.0.6", 1008 | "execa": "^0.9.0", 1009 | "find-up": "^3.0.0", 1010 | "get-stdin": "^6.0.0", 1011 | "is-ci": "^1.2.1", 1012 | "pkg-dir": "^3.0.0", 1013 | "please-upgrade-node": "^3.1.1", 1014 | "read-pkg": "^4.0.1", 1015 | "run-node": "^1.0.0", 1016 | "slash": "^2.0.0" 1017 | } 1018 | }, 1019 | "inflight": { 1020 | "version": "1.0.6", 1021 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1022 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1023 | "requires": { 1024 | "once": "^1.3.0", 1025 | "wrappy": "1" 1026 | } 1027 | }, 1028 | "inherits": { 1029 | "version": "2.0.3", 1030 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1031 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1032 | }, 1033 | "is": { 1034 | "version": "3.3.0", 1035 | "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", 1036 | "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", 1037 | "dev": true 1038 | }, 1039 | "is-absolute": { 1040 | "version": "1.0.0", 1041 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1042 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1043 | "dev": true, 1044 | "requires": { 1045 | "is-relative": "^1.0.0", 1046 | "is-windows": "^1.0.1" 1047 | } 1048 | }, 1049 | "is-arrayish": { 1050 | "version": "0.2.1", 1051 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1052 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1053 | "dev": true 1054 | }, 1055 | "is-buffer": { 1056 | "version": "1.1.6", 1057 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1058 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1059 | "dev": true 1060 | }, 1061 | "is-builtin-module": { 1062 | "version": "1.0.0", 1063 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1064 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1065 | "dev": true, 1066 | "requires": { 1067 | "builtin-modules": "^1.0.0" 1068 | } 1069 | }, 1070 | "is-ci": { 1071 | "version": "1.2.1", 1072 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", 1073 | "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", 1074 | "dev": true, 1075 | "requires": { 1076 | "ci-info": "^1.5.0" 1077 | } 1078 | }, 1079 | "is-directory": { 1080 | "version": "0.3.1", 1081 | "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", 1082 | "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", 1083 | "dev": true 1084 | }, 1085 | "is-extglob": { 1086 | "version": "2.1.1", 1087 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1088 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1089 | "dev": true 1090 | }, 1091 | "is-glob": { 1092 | "version": "3.1.0", 1093 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1094 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1095 | "dev": true, 1096 | "requires": { 1097 | "is-extglob": "^2.1.0" 1098 | } 1099 | }, 1100 | "is-negated-glob": { 1101 | "version": "1.0.0", 1102 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 1103 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", 1104 | "dev": true 1105 | }, 1106 | "is-obj": { 1107 | "version": "1.0.1", 1108 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1109 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 1110 | "dev": true 1111 | }, 1112 | "is-relative": { 1113 | "version": "1.0.0", 1114 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1115 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1116 | "dev": true, 1117 | "requires": { 1118 | "is-unc-path": "^1.0.0" 1119 | } 1120 | }, 1121 | "is-stream": { 1122 | "version": "1.1.0", 1123 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1124 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1125 | "dev": true 1126 | }, 1127 | "is-typedarray": { 1128 | "version": "1.0.0", 1129 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1130 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1131 | "dev": true 1132 | }, 1133 | "is-unc-path": { 1134 | "version": "1.0.0", 1135 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1136 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1137 | "dev": true, 1138 | "requires": { 1139 | "unc-path-regex": "^0.1.2" 1140 | } 1141 | }, 1142 | "is-utf8": { 1143 | "version": "0.2.1", 1144 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1145 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1146 | "dev": true 1147 | }, 1148 | "is-valid-glob": { 1149 | "version": "1.0.0", 1150 | "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", 1151 | "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", 1152 | "dev": true 1153 | }, 1154 | "is-windows": { 1155 | "version": "1.0.2", 1156 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1157 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1158 | "dev": true 1159 | }, 1160 | "isarray": { 1161 | "version": "1.0.0", 1162 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1163 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1164 | "dev": true 1165 | }, 1166 | "isexe": { 1167 | "version": "2.0.0", 1168 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1169 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1170 | "dev": true 1171 | }, 1172 | "isstream": { 1173 | "version": "0.1.2", 1174 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1175 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1176 | "dev": true 1177 | }, 1178 | "js-tokens": { 1179 | "version": "3.0.2", 1180 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1181 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" 1182 | }, 1183 | "js-yaml": { 1184 | "version": "3.12.0", 1185 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 1186 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 1187 | "requires": { 1188 | "argparse": "^1.0.7", 1189 | "esprima": "^4.0.0" 1190 | } 1191 | }, 1192 | "jsbn": { 1193 | "version": "0.1.1", 1194 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1195 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1196 | "dev": true 1197 | }, 1198 | "json-parse-better-errors": { 1199 | "version": "1.0.2", 1200 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1201 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1202 | "dev": true 1203 | }, 1204 | "json-schema": { 1205 | "version": "0.2.3", 1206 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1207 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1208 | "dev": true 1209 | }, 1210 | "json-schema-traverse": { 1211 | "version": "0.4.1", 1212 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1213 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1214 | "dev": true 1215 | }, 1216 | "json-stable-stringify-without-jsonify": { 1217 | "version": "1.0.1", 1218 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1219 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1220 | "dev": true 1221 | }, 1222 | "json-stringify-safe": { 1223 | "version": "5.0.1", 1224 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1225 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1226 | "dev": true 1227 | }, 1228 | "jsprim": { 1229 | "version": "1.4.1", 1230 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1231 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1232 | "dev": true, 1233 | "requires": { 1234 | "assert-plus": "1.0.0", 1235 | "extsprintf": "1.3.0", 1236 | "json-schema": "0.2.3", 1237 | "verror": "1.10.0" 1238 | } 1239 | }, 1240 | "kind-of": { 1241 | "version": "1.1.0", 1242 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", 1243 | "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", 1244 | "dev": true 1245 | }, 1246 | "lazystream": { 1247 | "version": "1.0.0", 1248 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", 1249 | "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", 1250 | "dev": true, 1251 | "requires": { 1252 | "readable-stream": "^2.0.5" 1253 | } 1254 | }, 1255 | "lead": { 1256 | "version": "1.0.0", 1257 | "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", 1258 | "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", 1259 | "dev": true, 1260 | "requires": { 1261 | "flush-write-stream": "^1.0.2" 1262 | } 1263 | }, 1264 | "locate-path": { 1265 | "version": "3.0.0", 1266 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1267 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1268 | "dev": true, 1269 | "requires": { 1270 | "p-locate": "^3.0.0", 1271 | "path-exists": "^3.0.0" 1272 | } 1273 | }, 1274 | "lru-cache": { 1275 | "version": "4.1.3", 1276 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 1277 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 1278 | "dev": true, 1279 | "requires": { 1280 | "pseudomap": "^1.0.2", 1281 | "yallist": "^2.1.2" 1282 | } 1283 | }, 1284 | "map-stream": { 1285 | "version": "0.1.0", 1286 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 1287 | "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", 1288 | "dev": true 1289 | }, 1290 | "mime-db": { 1291 | "version": "1.38.0", 1292 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 1293 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", 1294 | "dev": true 1295 | }, 1296 | "mime-types": { 1297 | "version": "2.1.22", 1298 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 1299 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 1300 | "dev": true, 1301 | "requires": { 1302 | "mime-db": "~1.38.0" 1303 | } 1304 | }, 1305 | "minimatch": { 1306 | "version": "3.0.4", 1307 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1308 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1309 | "requires": { 1310 | "brace-expansion": "^1.1.7" 1311 | } 1312 | }, 1313 | "minimist": { 1314 | "version": "0.0.8", 1315 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1316 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1317 | "dev": true 1318 | }, 1319 | "mkdirp": { 1320 | "version": "0.5.1", 1321 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1322 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1323 | "dev": true, 1324 | "requires": { 1325 | "minimist": "0.0.8" 1326 | } 1327 | }, 1328 | "mocha": { 1329 | "version": "4.1.0", 1330 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", 1331 | "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", 1332 | "dev": true, 1333 | "requires": { 1334 | "browser-stdout": "1.3.0", 1335 | "commander": "2.11.0", 1336 | "debug": "3.1.0", 1337 | "diff": "3.3.1", 1338 | "escape-string-regexp": "1.0.5", 1339 | "glob": "7.1.2", 1340 | "growl": "1.10.3", 1341 | "he": "1.1.1", 1342 | "mkdirp": "0.5.1", 1343 | "supports-color": "4.4.0" 1344 | } 1345 | }, 1346 | "ms": { 1347 | "version": "2.0.0", 1348 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1349 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1350 | "dev": true 1351 | }, 1352 | "multimatch": { 1353 | "version": "2.1.0", 1354 | "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", 1355 | "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", 1356 | "dev": true, 1357 | "requires": { 1358 | "array-differ": "^1.0.0", 1359 | "array-union": "^1.0.1", 1360 | "arrify": "^1.0.0", 1361 | "minimatch": "^3.0.0" 1362 | } 1363 | }, 1364 | "node.extend": { 1365 | "version": "1.1.8", 1366 | "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", 1367 | "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", 1368 | "dev": true, 1369 | "requires": { 1370 | "has": "^1.0.3", 1371 | "is": "^3.2.1" 1372 | } 1373 | }, 1374 | "normalize-package-data": { 1375 | "version": "2.4.0", 1376 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1377 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1378 | "dev": true, 1379 | "requires": { 1380 | "hosted-git-info": "^2.1.4", 1381 | "is-builtin-module": "^1.0.0", 1382 | "semver": "2 || 3 || 4 || 5", 1383 | "validate-npm-package-license": "^3.0.1" 1384 | } 1385 | }, 1386 | "normalize-path": { 1387 | "version": "2.1.1", 1388 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1389 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1390 | "dev": true, 1391 | "requires": { 1392 | "remove-trailing-separator": "^1.0.1" 1393 | } 1394 | }, 1395 | "now-and-later": { 1396 | "version": "2.0.0", 1397 | "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", 1398 | "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", 1399 | "dev": true, 1400 | "requires": { 1401 | "once": "^1.3.2" 1402 | } 1403 | }, 1404 | "npm-run-path": { 1405 | "version": "2.0.2", 1406 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1407 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1408 | "dev": true, 1409 | "requires": { 1410 | "path-key": "^2.0.0" 1411 | } 1412 | }, 1413 | "oauth-sign": { 1414 | "version": "0.9.0", 1415 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1416 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1417 | "dev": true 1418 | }, 1419 | "object-keys": { 1420 | "version": "1.1.0", 1421 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", 1422 | "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", 1423 | "dev": true 1424 | }, 1425 | "object.assign": { 1426 | "version": "4.1.0", 1427 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1428 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1429 | "dev": true, 1430 | "requires": { 1431 | "define-properties": "^1.1.2", 1432 | "function-bind": "^1.1.1", 1433 | "has-symbols": "^1.0.0", 1434 | "object-keys": "^1.0.11" 1435 | } 1436 | }, 1437 | "once": { 1438 | "version": "1.4.0", 1439 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1440 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1441 | "requires": { 1442 | "wrappy": "1" 1443 | } 1444 | }, 1445 | "ordered-read-streams": { 1446 | "version": "1.0.1", 1447 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 1448 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 1449 | "dev": true, 1450 | "requires": { 1451 | "readable-stream": "^2.0.1" 1452 | } 1453 | }, 1454 | "p-finally": { 1455 | "version": "1.0.0", 1456 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1457 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1458 | "dev": true 1459 | }, 1460 | "p-limit": { 1461 | "version": "2.0.0", 1462 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", 1463 | "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", 1464 | "dev": true, 1465 | "requires": { 1466 | "p-try": "^2.0.0" 1467 | } 1468 | }, 1469 | "p-locate": { 1470 | "version": "3.0.0", 1471 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1472 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1473 | "dev": true, 1474 | "requires": { 1475 | "p-limit": "^2.0.0" 1476 | } 1477 | }, 1478 | "p-try": { 1479 | "version": "2.0.0", 1480 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", 1481 | "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", 1482 | "dev": true 1483 | }, 1484 | "parse-json": { 1485 | "version": "4.0.0", 1486 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1487 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1488 | "dev": true, 1489 | "requires": { 1490 | "error-ex": "^1.3.1", 1491 | "json-parse-better-errors": "^1.0.1" 1492 | } 1493 | }, 1494 | "path-dirname": { 1495 | "version": "1.0.2", 1496 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1497 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", 1498 | "dev": true 1499 | }, 1500 | "path-exists": { 1501 | "version": "3.0.0", 1502 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1503 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1504 | "dev": true 1505 | }, 1506 | "path-is-absolute": { 1507 | "version": "1.0.1", 1508 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1509 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1510 | }, 1511 | "path-key": { 1512 | "version": "2.0.1", 1513 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1514 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1515 | "dev": true 1516 | }, 1517 | "path-parse": { 1518 | "version": "1.0.6", 1519 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1520 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1521 | }, 1522 | "pause-stream": { 1523 | "version": "0.0.11", 1524 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 1525 | "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 1526 | "dev": true, 1527 | "requires": { 1528 | "through": "~2.3" 1529 | } 1530 | }, 1531 | "pend": { 1532 | "version": "1.2.0", 1533 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1534 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1535 | "dev": true 1536 | }, 1537 | "performance-now": { 1538 | "version": "2.1.0", 1539 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1540 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1541 | "dev": true 1542 | }, 1543 | "pify": { 1544 | "version": "3.0.0", 1545 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1546 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1547 | "dev": true 1548 | }, 1549 | "pkg-dir": { 1550 | "version": "3.0.0", 1551 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", 1552 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", 1553 | "dev": true, 1554 | "requires": { 1555 | "find-up": "^3.0.0" 1556 | } 1557 | }, 1558 | "please-upgrade-node": { 1559 | "version": "3.1.1", 1560 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", 1561 | "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", 1562 | "dev": true, 1563 | "requires": { 1564 | "semver-compare": "^1.0.0" 1565 | } 1566 | }, 1567 | "plugin-error": { 1568 | "version": "0.1.2", 1569 | "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", 1570 | "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", 1571 | "dev": true, 1572 | "requires": { 1573 | "ansi-cyan": "^0.1.1", 1574 | "ansi-red": "^0.1.1", 1575 | "arr-diff": "^1.0.1", 1576 | "arr-union": "^2.0.1", 1577 | "extend-shallow": "^1.1.2" 1578 | } 1579 | }, 1580 | "private": { 1581 | "version": "0.1.8", 1582 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 1583 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" 1584 | }, 1585 | "process-nextick-args": { 1586 | "version": "2.0.0", 1587 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1588 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1589 | "dev": true 1590 | }, 1591 | "pseudomap": { 1592 | "version": "1.0.2", 1593 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1594 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1595 | "dev": true 1596 | }, 1597 | "psl": { 1598 | "version": "1.1.31", 1599 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 1600 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", 1601 | "dev": true 1602 | }, 1603 | "pump": { 1604 | "version": "2.0.1", 1605 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1606 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1607 | "dev": true, 1608 | "requires": { 1609 | "end-of-stream": "^1.1.0", 1610 | "once": "^1.3.1" 1611 | } 1612 | }, 1613 | "pumpify": { 1614 | "version": "1.5.1", 1615 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 1616 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 1617 | "dev": true, 1618 | "requires": { 1619 | "duplexify": "^3.6.0", 1620 | "inherits": "^2.0.3", 1621 | "pump": "^2.0.0" 1622 | } 1623 | }, 1624 | "punycode": { 1625 | "version": "2.1.1", 1626 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1627 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1628 | "dev": true 1629 | }, 1630 | "qs": { 1631 | "version": "6.5.2", 1632 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1633 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1634 | "dev": true 1635 | }, 1636 | "querystringify": { 1637 | "version": "2.1.0", 1638 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", 1639 | "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", 1640 | "dev": true 1641 | }, 1642 | "queue": { 1643 | "version": "4.5.1", 1644 | "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", 1645 | "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", 1646 | "dev": true, 1647 | "requires": { 1648 | "inherits": "~2.0.0" 1649 | } 1650 | }, 1651 | "read-pkg": { 1652 | "version": "4.0.1", 1653 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", 1654 | "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", 1655 | "dev": true, 1656 | "requires": { 1657 | "normalize-package-data": "^2.3.2", 1658 | "parse-json": "^4.0.0", 1659 | "pify": "^3.0.0" 1660 | } 1661 | }, 1662 | "readable-stream": { 1663 | "version": "2.3.6", 1664 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1665 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1666 | "dev": true, 1667 | "requires": { 1668 | "core-util-is": "~1.0.0", 1669 | "inherits": "~2.0.3", 1670 | "isarray": "~1.0.0", 1671 | "process-nextick-args": "~2.0.0", 1672 | "safe-buffer": "~5.1.1", 1673 | "string_decoder": "~1.1.1", 1674 | "util-deprecate": "~1.0.1" 1675 | } 1676 | }, 1677 | "recast": { 1678 | "version": "0.16.0", 1679 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.16.0.tgz", 1680 | "integrity": "sha512-cm2jw4gCBatvs404ZJrxmGirSgWswW+S1U3SQTPHKNqdlUMg+V3J2XAOUvdAAgD7Hg2th2nxZ4wmYUekHI2Qmg==", 1681 | "requires": { 1682 | "ast-types": "0.11.6", 1683 | "esprima": "^4.0.1", 1684 | "private": "~0.1.5", 1685 | "source-map": "~0.6.1" 1686 | } 1687 | }, 1688 | "remove-bom-buffer": { 1689 | "version": "3.0.0", 1690 | "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", 1691 | "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", 1692 | "dev": true, 1693 | "requires": { 1694 | "is-buffer": "^1.1.5", 1695 | "is-utf8": "^0.2.1" 1696 | } 1697 | }, 1698 | "remove-bom-stream": { 1699 | "version": "1.2.0", 1700 | "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", 1701 | "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", 1702 | "dev": true, 1703 | "requires": { 1704 | "remove-bom-buffer": "^3.0.0", 1705 | "safe-buffer": "^5.1.0", 1706 | "through2": "^2.0.3" 1707 | } 1708 | }, 1709 | "remove-trailing-separator": { 1710 | "version": "1.1.0", 1711 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1712 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1713 | "dev": true 1714 | }, 1715 | "replace-ext": { 1716 | "version": "1.0.0", 1717 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", 1718 | "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", 1719 | "dev": true 1720 | }, 1721 | "request": { 1722 | "version": "2.88.0", 1723 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1724 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1725 | "dev": true, 1726 | "requires": { 1727 | "aws-sign2": "~0.7.0", 1728 | "aws4": "^1.8.0", 1729 | "caseless": "~0.12.0", 1730 | "combined-stream": "~1.0.6", 1731 | "extend": "~3.0.2", 1732 | "forever-agent": "~0.6.1", 1733 | "form-data": "~2.3.2", 1734 | "har-validator": "~5.1.0", 1735 | "http-signature": "~1.2.0", 1736 | "is-typedarray": "~1.0.0", 1737 | "isstream": "~0.1.2", 1738 | "json-stringify-safe": "~5.0.1", 1739 | "mime-types": "~2.1.19", 1740 | "oauth-sign": "~0.9.0", 1741 | "performance-now": "^2.1.0", 1742 | "qs": "~6.5.2", 1743 | "safe-buffer": "^5.1.2", 1744 | "tough-cookie": "~2.4.3", 1745 | "tunnel-agent": "^0.6.0", 1746 | "uuid": "^3.3.2" 1747 | } 1748 | }, 1749 | "requires-port": { 1750 | "version": "1.0.0", 1751 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1752 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 1753 | "dev": true 1754 | }, 1755 | "resolve": { 1756 | "version": "1.9.0", 1757 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", 1758 | "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", 1759 | "requires": { 1760 | "path-parse": "^1.0.6" 1761 | } 1762 | }, 1763 | "resolve-options": { 1764 | "version": "1.1.0", 1765 | "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", 1766 | "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", 1767 | "dev": true, 1768 | "requires": { 1769 | "value-or-function": "^3.0.0" 1770 | } 1771 | }, 1772 | "rimraf": { 1773 | "version": "2.6.3", 1774 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1775 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1776 | "dev": true, 1777 | "requires": { 1778 | "glob": "^7.1.3" 1779 | }, 1780 | "dependencies": { 1781 | "glob": { 1782 | "version": "7.1.3", 1783 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1784 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1785 | "dev": true, 1786 | "requires": { 1787 | "fs.realpath": "^1.0.0", 1788 | "inflight": "^1.0.4", 1789 | "inherits": "2", 1790 | "minimatch": "^3.0.4", 1791 | "once": "^1.3.0", 1792 | "path-is-absolute": "^1.0.0" 1793 | } 1794 | } 1795 | } 1796 | }, 1797 | "run-node": { 1798 | "version": "1.0.0", 1799 | "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", 1800 | "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", 1801 | "dev": true 1802 | }, 1803 | "safe-buffer": { 1804 | "version": "5.1.2", 1805 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1806 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1807 | "dev": true 1808 | }, 1809 | "safer-buffer": { 1810 | "version": "2.1.2", 1811 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1812 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1813 | "dev": true 1814 | }, 1815 | "semver": { 1816 | "version": "5.5.1", 1817 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", 1818 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" 1819 | }, 1820 | "semver-compare": { 1821 | "version": "1.0.0", 1822 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 1823 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", 1824 | "dev": true 1825 | }, 1826 | "shebang-command": { 1827 | "version": "1.2.0", 1828 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1829 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1830 | "dev": true, 1831 | "requires": { 1832 | "shebang-regex": "^1.0.0" 1833 | } 1834 | }, 1835 | "shebang-regex": { 1836 | "version": "1.0.0", 1837 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1838 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1839 | "dev": true 1840 | }, 1841 | "signal-exit": { 1842 | "version": "3.0.2", 1843 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1844 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1845 | "dev": true 1846 | }, 1847 | "slash": { 1848 | "version": "2.0.0", 1849 | "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", 1850 | "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", 1851 | "dev": true 1852 | }, 1853 | "source-map": { 1854 | "version": "0.6.1", 1855 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1856 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1857 | }, 1858 | "source-map-support": { 1859 | "version": "0.5.10", 1860 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", 1861 | "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", 1862 | "dev": true, 1863 | "requires": { 1864 | "buffer-from": "^1.0.0", 1865 | "source-map": "^0.6.0" 1866 | } 1867 | }, 1868 | "spdx-correct": { 1869 | "version": "3.0.1", 1870 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.1.tgz", 1871 | "integrity": "sha512-hxSPZbRZvSDuOvADntOElzJpenIR7wXJkuoUcUtS0erbgt2fgeaoPIYretfKpslMhfFDY4k0MZ2F5CUzhBsSvQ==", 1872 | "dev": true, 1873 | "requires": { 1874 | "spdx-expression-parse": "^3.0.0", 1875 | "spdx-license-ids": "^3.0.0" 1876 | } 1877 | }, 1878 | "spdx-exceptions": { 1879 | "version": "2.1.0", 1880 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", 1881 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", 1882 | "dev": true 1883 | }, 1884 | "spdx-expression-parse": { 1885 | "version": "3.0.0", 1886 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1887 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1888 | "dev": true, 1889 | "requires": { 1890 | "spdx-exceptions": "^2.1.0", 1891 | "spdx-license-ids": "^3.0.0" 1892 | } 1893 | }, 1894 | "spdx-license-ids": { 1895 | "version": "3.0.1", 1896 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", 1897 | "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", 1898 | "dev": true 1899 | }, 1900 | "split": { 1901 | "version": "0.3.3", 1902 | "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", 1903 | "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", 1904 | "dev": true, 1905 | "requires": { 1906 | "through": "2" 1907 | } 1908 | }, 1909 | "sprintf-js": { 1910 | "version": "1.0.3", 1911 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1912 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1913 | }, 1914 | "sshpk": { 1915 | "version": "1.16.1", 1916 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1917 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1918 | "dev": true, 1919 | "requires": { 1920 | "asn1": "~0.2.3", 1921 | "assert-plus": "^1.0.0", 1922 | "bcrypt-pbkdf": "^1.0.0", 1923 | "dashdash": "^1.12.0", 1924 | "ecc-jsbn": "~0.1.1", 1925 | "getpass": "^0.1.1", 1926 | "jsbn": "~0.1.0", 1927 | "safer-buffer": "^2.0.2", 1928 | "tweetnacl": "~0.14.0" 1929 | } 1930 | }, 1931 | "stat-mode": { 1932 | "version": "0.2.2", 1933 | "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", 1934 | "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", 1935 | "dev": true 1936 | }, 1937 | "stream-combiner": { 1938 | "version": "0.0.4", 1939 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 1940 | "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", 1941 | "dev": true, 1942 | "requires": { 1943 | "duplexer": "~0.1.1" 1944 | } 1945 | }, 1946 | "stream-shift": { 1947 | "version": "1.0.0", 1948 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 1949 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", 1950 | "dev": true 1951 | }, 1952 | "streamfilter": { 1953 | "version": "1.0.7", 1954 | "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", 1955 | "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", 1956 | "dev": true, 1957 | "requires": { 1958 | "readable-stream": "^2.0.2" 1959 | } 1960 | }, 1961 | "streamifier": { 1962 | "version": "0.1.1", 1963 | "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", 1964 | "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", 1965 | "dev": true 1966 | }, 1967 | "string_decoder": { 1968 | "version": "1.1.1", 1969 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1970 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1971 | "dev": true, 1972 | "requires": { 1973 | "safe-buffer": "~5.1.0" 1974 | } 1975 | }, 1976 | "strip-ansi": { 1977 | "version": "3.0.1", 1978 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1979 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1980 | "requires": { 1981 | "ansi-regex": "^2.0.0" 1982 | } 1983 | }, 1984 | "strip-eof": { 1985 | "version": "1.0.0", 1986 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1987 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 1988 | "dev": true 1989 | }, 1990 | "supports-color": { 1991 | "version": "4.4.0", 1992 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1993 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1994 | "dev": true, 1995 | "requires": { 1996 | "has-flag": "^2.0.0" 1997 | } 1998 | }, 1999 | "tar": { 2000 | "version": "2.2.1", 2001 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 2002 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 2003 | "dev": true, 2004 | "requires": { 2005 | "block-stream": "*", 2006 | "fstream": "^1.0.2", 2007 | "inherits": "2" 2008 | } 2009 | }, 2010 | "through": { 2011 | "version": "2.3.8", 2012 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2013 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2014 | "dev": true 2015 | }, 2016 | "through2": { 2017 | "version": "2.0.5", 2018 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2019 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2020 | "dev": true, 2021 | "requires": { 2022 | "readable-stream": "~2.3.6", 2023 | "xtend": "~4.0.1" 2024 | } 2025 | }, 2026 | "through2-filter": { 2027 | "version": "3.0.0", 2028 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 2029 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 2030 | "dev": true, 2031 | "requires": { 2032 | "through2": "~2.0.0", 2033 | "xtend": "~4.0.0" 2034 | } 2035 | }, 2036 | "to-absolute-glob": { 2037 | "version": "2.0.2", 2038 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 2039 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 2040 | "dev": true, 2041 | "requires": { 2042 | "is-absolute": "^1.0.0", 2043 | "is-negated-glob": "^1.0.0" 2044 | } 2045 | }, 2046 | "to-through": { 2047 | "version": "2.0.0", 2048 | "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", 2049 | "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", 2050 | "dev": true, 2051 | "requires": { 2052 | "through2": "^2.0.3" 2053 | } 2054 | }, 2055 | "tough-cookie": { 2056 | "version": "2.4.3", 2057 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 2058 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 2059 | "dev": true, 2060 | "requires": { 2061 | "psl": "^1.1.24", 2062 | "punycode": "^1.4.1" 2063 | }, 2064 | "dependencies": { 2065 | "punycode": { 2066 | "version": "1.4.1", 2067 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2068 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2069 | "dev": true 2070 | } 2071 | } 2072 | }, 2073 | "tslib": { 2074 | "version": "1.9.3", 2075 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 2076 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 2077 | }, 2078 | "tslint": { 2079 | "version": "5.12.0", 2080 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", 2081 | "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", 2082 | "requires": { 2083 | "babel-code-frame": "^6.22.0", 2084 | "builtin-modules": "^1.1.1", 2085 | "chalk": "^2.3.0", 2086 | "commander": "^2.12.1", 2087 | "diff": "^3.2.0", 2088 | "glob": "^7.1.1", 2089 | "js-yaml": "^3.7.0", 2090 | "minimatch": "^3.0.4", 2091 | "resolve": "^1.3.2", 2092 | "semver": "^5.3.0", 2093 | "tslib": "^1.8.0", 2094 | "tsutils": "^2.27.2" 2095 | }, 2096 | "dependencies": { 2097 | "commander": { 2098 | "version": "2.19.0", 2099 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", 2100 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" 2101 | } 2102 | } 2103 | }, 2104 | "tsutils": { 2105 | "version": "2.29.0", 2106 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 2107 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 2108 | "requires": { 2109 | "tslib": "^1.8.1" 2110 | } 2111 | }, 2112 | "tunnel-agent": { 2113 | "version": "0.6.0", 2114 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2115 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2116 | "dev": true, 2117 | "requires": { 2118 | "safe-buffer": "^5.0.1" 2119 | } 2120 | }, 2121 | "tweetnacl": { 2122 | "version": "0.14.5", 2123 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2124 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2125 | "dev": true 2126 | }, 2127 | "typescript": { 2128 | "version": "3.1.3", 2129 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.3.tgz", 2130 | "integrity": "sha512-+81MUSyX+BaSo+u2RbozuQk/UWx6hfG0a5gHu4ANEM4sU96XbuIyAB+rWBW1u70c6a5QuZfuYICn3s2UjuHUpA==", 2131 | "dev": true 2132 | }, 2133 | "unc-path-regex": { 2134 | "version": "0.1.2", 2135 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 2136 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 2137 | "dev": true 2138 | }, 2139 | "unique-stream": { 2140 | "version": "2.3.1", 2141 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 2142 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 2143 | "dev": true, 2144 | "requires": { 2145 | "json-stable-stringify-without-jsonify": "^1.0.1", 2146 | "through2-filter": "^3.0.0" 2147 | } 2148 | }, 2149 | "uri-js": { 2150 | "version": "4.2.2", 2151 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2152 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2153 | "dev": true, 2154 | "requires": { 2155 | "punycode": "^2.1.0" 2156 | } 2157 | }, 2158 | "url-parse": { 2159 | "version": "1.4.4", 2160 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", 2161 | "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", 2162 | "dev": true, 2163 | "requires": { 2164 | "querystringify": "^2.0.0", 2165 | "requires-port": "^1.0.0" 2166 | } 2167 | }, 2168 | "util-deprecate": { 2169 | "version": "1.0.2", 2170 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2171 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2172 | "dev": true 2173 | }, 2174 | "uuid": { 2175 | "version": "3.3.2", 2176 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2177 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 2178 | "dev": true 2179 | }, 2180 | "validate-npm-package-license": { 2181 | "version": "3.0.4", 2182 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2183 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2184 | "dev": true, 2185 | "requires": { 2186 | "spdx-correct": "^3.0.0", 2187 | "spdx-expression-parse": "^3.0.0" 2188 | } 2189 | }, 2190 | "value-or-function": { 2191 | "version": "3.0.0", 2192 | "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", 2193 | "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", 2194 | "dev": true 2195 | }, 2196 | "verror": { 2197 | "version": "1.10.0", 2198 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2199 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2200 | "dev": true, 2201 | "requires": { 2202 | "assert-plus": "^1.0.0", 2203 | "core-util-is": "1.0.2", 2204 | "extsprintf": "^1.2.0" 2205 | } 2206 | }, 2207 | "vinyl": { 2208 | "version": "0.4.6", 2209 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", 2210 | "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", 2211 | "dev": true, 2212 | "requires": { 2213 | "clone": "^0.2.0", 2214 | "clone-stats": "^0.0.1" 2215 | } 2216 | }, 2217 | "vinyl-fs": { 2218 | "version": "3.0.3", 2219 | "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", 2220 | "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", 2221 | "dev": true, 2222 | "requires": { 2223 | "fs-mkdirp-stream": "^1.0.0", 2224 | "glob-stream": "^6.1.0", 2225 | "graceful-fs": "^4.0.0", 2226 | "is-valid-glob": "^1.0.0", 2227 | "lazystream": "^1.0.0", 2228 | "lead": "^1.0.0", 2229 | "object.assign": "^4.0.4", 2230 | "pumpify": "^1.3.5", 2231 | "readable-stream": "^2.3.3", 2232 | "remove-bom-buffer": "^3.0.0", 2233 | "remove-bom-stream": "^1.2.0", 2234 | "resolve-options": "^1.1.0", 2235 | "through2": "^2.0.0", 2236 | "to-through": "^2.0.0", 2237 | "value-or-function": "^3.0.0", 2238 | "vinyl": "^2.0.0", 2239 | "vinyl-sourcemap": "^1.1.0" 2240 | }, 2241 | "dependencies": { 2242 | "clone": { 2243 | "version": "2.1.2", 2244 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 2245 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 2246 | "dev": true 2247 | }, 2248 | "clone-stats": { 2249 | "version": "1.0.0", 2250 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 2251 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 2252 | "dev": true 2253 | }, 2254 | "vinyl": { 2255 | "version": "2.2.0", 2256 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 2257 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 2258 | "dev": true, 2259 | "requires": { 2260 | "clone": "^2.1.1", 2261 | "clone-buffer": "^1.0.0", 2262 | "clone-stats": "^1.0.0", 2263 | "cloneable-readable": "^1.0.0", 2264 | "remove-trailing-separator": "^1.0.1", 2265 | "replace-ext": "^1.0.0" 2266 | } 2267 | } 2268 | } 2269 | }, 2270 | "vinyl-source-stream": { 2271 | "version": "1.1.2", 2272 | "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", 2273 | "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", 2274 | "dev": true, 2275 | "requires": { 2276 | "through2": "^2.0.3", 2277 | "vinyl": "^0.4.3" 2278 | } 2279 | }, 2280 | "vinyl-sourcemap": { 2281 | "version": "1.1.0", 2282 | "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", 2283 | "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", 2284 | "dev": true, 2285 | "requires": { 2286 | "append-buffer": "^1.0.2", 2287 | "convert-source-map": "^1.5.0", 2288 | "graceful-fs": "^4.1.6", 2289 | "normalize-path": "^2.1.1", 2290 | "now-and-later": "^2.0.0", 2291 | "remove-bom-buffer": "^3.0.0", 2292 | "vinyl": "^2.0.0" 2293 | }, 2294 | "dependencies": { 2295 | "clone": { 2296 | "version": "2.1.2", 2297 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 2298 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 2299 | "dev": true 2300 | }, 2301 | "clone-stats": { 2302 | "version": "1.0.0", 2303 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", 2304 | "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", 2305 | "dev": true 2306 | }, 2307 | "vinyl": { 2308 | "version": "2.2.0", 2309 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", 2310 | "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", 2311 | "dev": true, 2312 | "requires": { 2313 | "clone": "^2.1.1", 2314 | "clone-buffer": "^1.0.0", 2315 | "clone-stats": "^1.0.0", 2316 | "cloneable-readable": "^1.0.0", 2317 | "remove-trailing-separator": "^1.0.1", 2318 | "replace-ext": "^1.0.0" 2319 | } 2320 | } 2321 | } 2322 | }, 2323 | "vscode": { 2324 | "version": "1.1.30", 2325 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.30.tgz", 2326 | "integrity": "sha512-YDj5w0TGOcS8XLIdekT4q6LlLV6hv1ZvuT2aGT3KJll4gMz6dUPDgo2VVAf0i0E8igbbZthwvmaUGRwW9yPIaw==", 2327 | "dev": true, 2328 | "requires": { 2329 | "glob": "^7.1.2", 2330 | "gulp-chmod": "^2.0.0", 2331 | "gulp-filter": "^5.0.1", 2332 | "gulp-gunzip": "1.0.0", 2333 | "gulp-remote-src-vscode": "^0.5.1", 2334 | "gulp-untar": "^0.0.7", 2335 | "gulp-vinyl-zip": "^2.1.2", 2336 | "mocha": "^4.0.1", 2337 | "request": "^2.88.0", 2338 | "semver": "^5.4.1", 2339 | "source-map-support": "^0.5.0", 2340 | "url-parse": "^1.4.3", 2341 | "vinyl-fs": "^3.0.3", 2342 | "vinyl-source-stream": "^1.1.0" 2343 | } 2344 | }, 2345 | "which": { 2346 | "version": "1.3.1", 2347 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2348 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2349 | "dev": true, 2350 | "requires": { 2351 | "isexe": "^2.0.0" 2352 | } 2353 | }, 2354 | "wrappy": { 2355 | "version": "1.0.2", 2356 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2357 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2358 | }, 2359 | "xtend": { 2360 | "version": "4.0.1", 2361 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2362 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2363 | "dev": true 2364 | }, 2365 | "yallist": { 2366 | "version": "2.1.2", 2367 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2368 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2369 | "dev": true 2370 | }, 2371 | "yauzl": { 2372 | "version": "2.10.0", 2373 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2374 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 2375 | "dev": true, 2376 | "requires": { 2377 | "buffer-crc32": "~0.2.3", 2378 | "fd-slicer": "~1.1.0" 2379 | } 2380 | }, 2381 | "yazl": { 2382 | "version": "2.5.1", 2383 | "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", 2384 | "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", 2385 | "dev": true, 2386 | "requires": { 2387 | "buffer-crc32": "~0.2.3" 2388 | } 2389 | } 2390 | } 2391 | } 2392 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vscode-js-annotations", 3 | "displayName": "JS Parameter Annotations", 4 | "description": "Annotations for parameters in your JS / TS Files to mimic named parameters", 5 | "version": "0.11.0", 6 | "publisher": "lannonbr", 7 | "engines": { 8 | "vscode": "^1.25.0" 9 | }, 10 | "license": "MIT", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/lannonbr/vscode-js-annotations" 14 | }, 15 | "categories": [ 16 | "Other" 17 | ], 18 | "homepage": "https://github.com/lannonbr/vscode-js-annotations", 19 | "bugs": { 20 | "url": "https://github.com/lannonbr/vscode-js-annotations/issues" 21 | }, 22 | "activationEvents": [ 23 | "*" 24 | ], 25 | "main": "./out/extension", 26 | "contributes": { 27 | "commands": [ 28 | { 29 | "command": "jsannotations.toggle", 30 | "title": "JS Annotations: Hide / Show Annotations" 31 | } 32 | ], 33 | "configuration": [ 34 | { 35 | "title": "JS Annotations", 36 | "properties": { 37 | "jsannotations.enabled": { 38 | "type": "boolean", 39 | "description": "Enable JS Annotations", 40 | "default": true 41 | }, 42 | "jsannotations.hideInvalidAnnotation": { 43 | "type": "boolean", 44 | "description": "Hide annotations for invalid params", 45 | "default": true 46 | }, 47 | "jsannotations.hideDiagnostics": { 48 | "type": "boolean", 49 | "description": "Hide red squiggles under invalid parameters", 50 | "default": false 51 | }, 52 | "jsannotations.hideIfEqual": { 53 | "type": "boolean", 54 | "description": "Hide annotation if argument name matches parameter name", 55 | "default": true 56 | }, 57 | "jsannotations.fontWeight": { 58 | "type": "string", 59 | "default": "400", 60 | "enum": [ 61 | "100", 62 | "200", 63 | "300", 64 | "400", 65 | "500", 66 | "600", 67 | "700", 68 | "800", 69 | "900" 70 | ], 71 | "description": "Annotation styling of font-weight CSS property" 72 | }, 73 | "jsannotations.fontStyle": { 74 | "type": "string", 75 | "default": "italic", 76 | "enum": [ 77 | "normal", 78 | "italic" 79 | ], 80 | "description": "Annotation styling of font-style CSS property" 81 | }, 82 | "jsannotations.showFirstSpace": { 83 | "type": "boolean", 84 | "description": "Show leading whitespace for first parameter", 85 | "default": true 86 | } 87 | } 88 | } 89 | ], 90 | "colors": [ 91 | { 92 | "id": "jsannotations.annotationForeground", 93 | "description": "Specifies the foreground color for the annotations", 94 | "defaults": { 95 | "dark": "#ccc", 96 | "light": "#444", 97 | "highContrast": "#444" 98 | } 99 | } 100 | ], 101 | "keybindings": [ 102 | { 103 | "command": "jsannotations.toggle", 104 | "key": "ctrl+k a", 105 | "mac": "cmd+k a" 106 | } 107 | ] 108 | }, 109 | "scripts": { 110 | "vscode:prepublish": "npm run compile", 111 | "compile": "tsc -p ./", 112 | "watch": "tsc -watch -p ./", 113 | "postinstall": "node ./node_modules/vscode/bin/install", 114 | "test": "npm run compile && node ./node_modules/vscode/bin/test", 115 | "test:unit": "MOCHA_GREP=\"@unit\" npm test --silent", 116 | "lint": "node ./node_modules/.bin/tslint --project ." 117 | }, 118 | "devDependencies": { 119 | "@types/mocha": "^5.0.0", 120 | "@types/node": "^7.0.43", 121 | "husky": "^1.0.1", 122 | "typescript": "^3.0.0", 123 | "vscode": "^1.1.30" 124 | }, 125 | "dependencies": { 126 | "babylon": "^7.0.0-beta.47", 127 | "recast": "^0.16.0", 128 | "tslint": "5.12.0" 129 | }, 130 | "husky": { 131 | "hooks": { 132 | "pre-commit": "npm run lint" 133 | } 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base", 4 | ":preserveSemverRanges" 5 | ], 6 | "labels": ["Renovate"] 7 | } 8 | -------------------------------------------------------------------------------- /runTests.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lannonbr/vscode-js-annotations/05fff6eba70b690f7e7dbca0c0e03ab0e18bee33/runTests.png -------------------------------------------------------------------------------- /src/annotationProvider.ts: -------------------------------------------------------------------------------- 1 | import { DecorationInstanceRenderOptions, DecorationOptions, Range, ThemeColor, workspace } from "vscode"; 2 | 3 | export class Annotations { 4 | public static paramAnnotation(message: string, range: Range): DecorationOptions { 5 | 6 | return { 7 | range, 8 | renderOptions: { 9 | before: { 10 | color: new ThemeColor("jsannotations.annotationForeground"), 11 | contentText: message, 12 | fontStyle: workspace.getConfiguration("jsannotations").get("fontStyle"), 13 | fontWeight: workspace.getConfiguration("jsannotations").get("fontWeight"), 14 | } 15 | } as DecorationInstanceRenderOptions 16 | } as DecorationOptions; 17 | } 18 | 19 | public static errorParamAnnotation(range: Range): DecorationOptions { 20 | 21 | return { 22 | range, 23 | renderOptions: { 24 | before: { 25 | color: "red", 26 | contentText: "❗️ Invalid parameter: ", 27 | fontWeight: "800" 28 | } 29 | } as DecorationInstanceRenderOptions 30 | } as DecorationOptions; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/commands.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | 3 | export default class Commands { 4 | 5 | public static registerCommands() { 6 | 7 | // Command to hide / show annotations 8 | vscode.commands.registerCommand("jsannotations.toggle", () => { 9 | const currentState = vscode.workspace.getConfiguration("jsannotations").get("enabled"); 10 | vscode.workspace.getConfiguration("jsannotations").update("enabled", !currentState, true); 11 | }); 12 | 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/decorator.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import { Annotations } from "./annotationProvider"; 3 | import { IFunctionCallObject } from "./functionCallObject"; 4 | import { grabPossibleParameters } from "./paramExtractor"; 5 | 6 | export async function decorateFunctionCall(currentEditor: vscode.TextEditor, documentCache: any, decArray, errDecArray: vscode.DecorationOptions[], fc: IFunctionCallObject, diagnostics: vscode.Diagnostic[]): Promise { 7 | // Check for existence of functionCallObject and a defintion location 8 | if (fc === undefined || fc.definitionLocation === undefined) { 9 | return; 10 | } 11 | 12 | // configs for decorations 13 | const hideIfEqual = vscode.workspace.getConfiguration("jsannotations").get("hideIfEqual"); 14 | const willShowDiagnostics = vscode.workspace.getConfiguration("jsannotations").get("hideDiagnostics") === false; 15 | const willShowErrorAnnotation = vscode.workspace.getConfiguration("jsannotations").get("hideInvalidAnnotation") === false; 16 | 17 | const document = await loadDefinitionDocument(fc.definitionLocation.uri, documentCache); 18 | const definitionLine = document.lineAt(fc.definitionLocation.range.start.line).text; 19 | 20 | let paramList = grabPossibleParameters(fc, definitionLine); 21 | 22 | // Remove first parameter from list if it equals `this` in a TS file 23 | if (currentEditor.document.languageId === "typescript" && paramList[0] === "this") { 24 | paramList = paramList.slice(1); 25 | } 26 | 27 | if (paramList.length > 0) { 28 | const functionCallLine = currentEditor.document.lineAt(fc.lineNumber).text; 29 | 30 | if (shouldntBeDecorated(paramList, fc, functionCallLine, definitionLine)) { 31 | return; 32 | } 33 | 34 | // Look to see if a param is a rest parameter (ex: console.log has a rest parameter called ...optionalParams) 35 | const restParamIdx = paramList.findIndex((item) => item.substr(0, 3) === "..."); 36 | 37 | // If it exists, remove the triple dots at the beginning 38 | if (restParamIdx !== -1) { 39 | paramList[restParamIdx] = paramList[restParamIdx].slice(3); 40 | } 41 | 42 | if (fc.paramLocations && fc.paramNames) { 43 | let counter = 0; 44 | for (const ix in fc.paramLocations) { 45 | if (fc.paramLocations.hasOwnProperty(ix)) { 46 | const idx = parseInt(ix, 10); 47 | 48 | // skip when arg and param match and hideIfEqual config is on 49 | if (hideIfEqual && fc.paramNames[idx] === paramList[idx]) { 50 | counter++; // Still tick the counter even if skipping the annotation 51 | continue; 52 | } 53 | 54 | let decoration: vscode.DecorationOptions; 55 | 56 | const currentArgRange = fc.paramLocations[idx]; 57 | 58 | if (restParamIdx !== -1 && idx >= restParamIdx) { 59 | decoration = Annotations.paramAnnotation(paramList[restParamIdx] + `[${idx - restParamIdx}]: `, currentArgRange); 60 | } else { 61 | if (idx >= paramList.length) { 62 | if (currentEditor.document.languageId === "javascript" && willShowDiagnostics) { 63 | const diag = new vscode.Diagnostic(currentArgRange, "[JS Param Annotations] Invalid parameter", vscode.DiagnosticSeverity.Error); 64 | 65 | if (!diagnostics) { 66 | console.log(arguments); 67 | } 68 | 69 | // If the diagnostic does not exist in the array yet, push it 70 | if (!diagnostics.some((diagnostic) => JSON.stringify(diagnostic) === JSON.stringify(diag))) { 71 | diagnostics.push(diag); 72 | } 73 | } 74 | 75 | if (willShowErrorAnnotation) { 76 | const errorDecoration = Annotations.errorParamAnnotation(currentArgRange); 77 | errDecArray.push(errorDecoration); 78 | } 79 | 80 | continue; 81 | } 82 | 83 | const showFirstSpace = vscode.workspace.getConfiguration("jsannotations").get("showFirstSpace"); 84 | const spacer = (counter === 0 && showFirstSpace) ? " " : ""; 85 | decoration = Annotations.paramAnnotation(spacer + paramList[idx] + ": ", currentArgRange); 86 | } 87 | counter++; 88 | decArray.push(decoration); 89 | } 90 | } 91 | } 92 | } 93 | } 94 | 95 | async function loadDefinitionDocument(uri: vscode.Uri, documentCache: any) { 96 | let document: vscode.TextDocument; 97 | 98 | // Currently index documentCache by the filename (TODO: Figure out better index later) 99 | const pathNameArr = uri.fsPath.split("/"); 100 | const pathName = pathNameArr[pathNameArr.length - 2] + "/" + pathNameArr[pathNameArr.length - 1]; 101 | 102 | // If the document is not present in the cache, load it from the filesystem, otherwise grab from the cache 103 | if (documentCache[pathName] === undefined) { 104 | document = await vscode.workspace.openTextDocument(uri); 105 | documentCache[pathName] = document; 106 | } else { 107 | document = documentCache[pathName]; 108 | } 109 | 110 | return document; 111 | } 112 | 113 | function shouldntBeDecorated(paramList: string[], functionCall: IFunctionCallObject, functionCallLine: string, definitionLine: string): boolean { 114 | // If the functionName is one of the parameters, don't decorate it 115 | if (paramList.some((param) => param === functionCall.functionName)) { 116 | return true; 117 | } 118 | 119 | // If the line that is extracted is a function definition rather than call, continue on without doing anything 120 | if (functionCallLine.includes("function ")) { 121 | return true; 122 | } 123 | 124 | // Don't decorate if the definition is inside a for loop 125 | if (definitionLine.includes("for (") || definitionLine.includes("for (")) { 126 | return true; 127 | } 128 | 129 | return false; 130 | } 131 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import Commands from "./commands"; 3 | import * as decorator from "./decorator"; 4 | import * as parser from "./parser"; 5 | 6 | const decType = vscode.window.createTextEditorDecorationType({}); 7 | const errDecType = vscode.window.createTextEditorDecorationType({ 8 | fontWeight: "800" 9 | }); 10 | 11 | let diagCollection; 12 | let diagnostics: vscode.Diagnostic[]; 13 | let timeoutId; 14 | 15 | export function activate(ctx: vscode.ExtensionContext) { 16 | console.log("extension is now active!"); 17 | 18 | // Update when a file opens 19 | vscode.window.onDidChangeActiveTextEditor((editor) => { 20 | run(ctx, editor); 21 | }); 22 | 23 | // Update when a file saves 24 | vscode.workspace.onWillSaveTextDocument((event) => { 25 | const openEditor = vscode.window.visibleTextEditors.filter((editor) => editor.document.uri === event.document.uri)[0]; 26 | 27 | run(ctx, openEditor); 28 | }); 29 | 30 | vscode.workspace.onDidChangeTextDocument((event) => { 31 | if (timeoutId) { 32 | clearTimeout(timeoutId); 33 | } 34 | 35 | timeoutId = setTimeout(() => { 36 | const openEditor = vscode.window.visibleTextEditors.filter((editor) => editor.document.uri === event.document.uri)[0]; 37 | run(ctx, openEditor); 38 | }, 100); 39 | }); 40 | 41 | // Update if the config was changed 42 | vscode.workspace.onDidChangeConfiguration((event) => { 43 | if (event.affectsConfiguration("jsannotations")) { 44 | run(ctx, vscode.window.activeTextEditor); 45 | } 46 | }); 47 | 48 | Commands.registerCommands(); 49 | } 50 | 51 | export function deactivate() { 52 | console.log("DONE"); 53 | } 54 | 55 | async function run(ctx: vscode.ExtensionContext, editor: vscode.TextEditor | undefined): Promise { 56 | if (!editor) { 57 | return; 58 | } 59 | 60 | const supportedLanguages = ["javascript", "typescript", "javascriptreact", "typescriptreact"]; 61 | 62 | if (supportedLanguages.indexOf(editor.document.languageId) === -1) { 63 | return; 64 | } 65 | 66 | // Setup variables for diagnostics when loading JS file 67 | if (diagCollection === undefined && editor.document.languageId === "javascript") { 68 | diagCollection = vscode.languages.createDiagnosticCollection("js-annot"); 69 | } 70 | 71 | const isEnabled = vscode.workspace.getConfiguration("jsannotations").get("enabled"); 72 | 73 | if (!isEnabled) { 74 | editor.setDecorations(decType, []); 75 | return; 76 | } 77 | 78 | // Get all of the text in said editor 79 | const sourceCode = editor.document.getText(); 80 | 81 | const [decArray, errDecArray] = await createDecorations(editor, sourceCode); 82 | 83 | if (editor.document.languageId === "javascript") { 84 | diagCollection.set(editor.document.uri, diagnostics); 85 | ctx.subscriptions.push(diagCollection); 86 | } 87 | 88 | editor.setDecorations(decType, decArray); 89 | editor.setDecorations(errDecType, errDecArray); 90 | } 91 | 92 | export async function createDecorations(editor: vscode.TextEditor, sourceCode: string): Promise { 93 | diagnostics = []; 94 | 95 | const decArray: vscode.DecorationOptions[] = []; 96 | const errDecArray: vscode.DecorationOptions[] = []; 97 | 98 | // get an array of all said function calls in the file 99 | let fcArray = parser.getFunctionCalls(sourceCode, editor); 100 | 101 | // grab the definitions for any of the function calls which can find a definition 102 | fcArray = await parser.getDefinitions(fcArray, editor.document.uri); 103 | 104 | // cache for documents so they aren't loaded for every single call 105 | const documentCache: any = {}; 106 | 107 | // filter down to function calls which actually have a definition 108 | const callsWithDefinitions = fcArray.filter((item) => item.definitionLocation !== undefined); 109 | 110 | for (const fc of callsWithDefinitions) { 111 | await decorator.decorateFunctionCall(editor, documentCache, decArray, errDecArray, fc, diagnostics); 112 | } 113 | 114 | return [decArray, errDecArray]; 115 | } 116 | 117 | export function getDiagnostics(): vscode.Diagnostic[] { 118 | if (!diagnostics) { 119 | return []; 120 | } 121 | 122 | // Returns a copy 123 | return diagnostics.slice(); 124 | } 125 | -------------------------------------------------------------------------------- /src/functionCallObject.ts: -------------------------------------------------------------------------------- 1 | import { Location, Range } from "vscode"; 2 | 3 | export interface IFunctionCallObject { 4 | functionName: string; 5 | calleeCallee: boolean; 6 | lineNumber: number; 7 | functionRange?: Range; 8 | paramNames?: string[]; 9 | paramLocations?: Range[]; 10 | definitionLocation?: Location; 11 | } 12 | -------------------------------------------------------------------------------- /src/paramExtractor.ts: -------------------------------------------------------------------------------- 1 | import { IFunctionCallObject } from "./functionCallObject"; 2 | 3 | export function grabPossibleParameters(fc: IFunctionCallObject, definitionLine: string): string[] { 4 | let paramList: string[] = []; 5 | 6 | // Grab any params inside the definition line 7 | const defintionParam = grabDefLineParams(definitionLine); 8 | 9 | if (defintionParam !== "") { 10 | if (fc.functionRange === undefined) { 11 | return; 12 | } 13 | 14 | paramList = splitToParamList(defintionParam); 15 | 16 | paramList = paramList.map((param) => { 17 | 18 | param = param.replace(/\.\.\.\s+/, "..."); 19 | 20 | // Extract identifiers 21 | const words = param.trim().split(" "); 22 | 23 | // If there are multiple words and the first word doesn't end with a colon, use the 2nd word as the param 24 | // this will make sure the param name is used and not the access modifier in TS functions 25 | if (words.length > 1 && !words[0].endsWith(":")) { 26 | param = words[1]; 27 | } 28 | 29 | const identifiers = param.match(/([\.a-zA-Z0-9]+):?/); 30 | 31 | if (identifiers && identifiers.length > 1) { 32 | return identifiers[1]; 33 | } 34 | return ""; 35 | }).filter((param) => param !== ""); 36 | } 37 | 38 | return paramList; 39 | } 40 | 41 | // This function will cycle through all of the current strings split by a comma, and combine strings that were split incorrectly 42 | export function splitToParamList(defintionParam: string): string[] { 43 | const paramList = defintionParam.split(/\s*,\s*/); 44 | const newParamList = []; 45 | 46 | let currentStr = ""; 47 | let numToGet = 1; // Always grab 1 string at the beginning 48 | 49 | for (const item of paramList) { 50 | currentStr += item + ", "; 51 | numToGet--; 52 | 53 | // If numToGet is zero, check the difference between '<' and '>' characters 54 | if (numToGet === 0) { 55 | const numOfLessThanBrackets = currentStr.split("<").length - 1; 56 | const numOfGreaterThanBrackets = currentStr.split(">").length - 1; 57 | 58 | const numOfOpenParen = currentStr.split("(").length - 1; 59 | const numOfCloseParen = currentStr.split(")").length - 1; 60 | 61 | const numOfEqualSigns = currentStr.split("=").length - 1; 62 | 63 | // Diff is |num of left brackets ('<') minus the num of solo right brackets (which is the number of '>' minus the num of '=' signs)| 64 | const triBracketDiff = Math.abs(numOfLessThanBrackets - (numOfGreaterThanBrackets - numOfEqualSigns)); 65 | 66 | const parenDiff = Math.abs(numOfOpenParen - numOfCloseParen); 67 | 68 | if (((numOfEqualSigns > 0) && (numOfGreaterThanBrackets - numOfEqualSigns) === numOfLessThanBrackets) || (triBracketDiff === 0 && parenDiff === 0)) { 69 | // If the difference is zero, we have a full param, push it to the new params, and start over at the next string 70 | // Also, do this if there is equal signs in the params which exist with arrow functions. 71 | currentStr = currentStr.substr(0, currentStr.length - 2); 72 | 73 | newParamList.push(currentStr); 74 | currentStr = ""; 75 | numToGet = 1; 76 | } else { 77 | // Otherwise, set the number of strings to grab to the diff 78 | numToGet = triBracketDiff + parenDiff; 79 | } 80 | } 81 | } 82 | 83 | return newParamList; 84 | } 85 | 86 | function grabDefLineParams(definitionLine: string): string { 87 | let startIdx; 88 | let endIdx; 89 | 90 | startIdx = definitionLine.indexOf("("); 91 | 92 | if (startIdx === -1) { 93 | if (definitionLine.includes("=>")) { 94 | return /=?\s*(\w+)\s*=>/.exec(definitionLine)[1] || ""; 95 | } else { 96 | return ""; 97 | } 98 | } else { 99 | startIdx++; 100 | } 101 | 102 | let depth = 1; 103 | 104 | for (let i = startIdx; i < definitionLine.length; i++) { 105 | if (definitionLine[i] === "(") { 106 | depth++; 107 | } else if (definitionLine[i] === ")") { 108 | depth--; 109 | if (depth === 0) { 110 | endIdx = i; 111 | break; 112 | } 113 | } 114 | } 115 | 116 | if (endIdx === undefined) { 117 | return ""; 118 | } 119 | 120 | return definitionLine.substring(startIdx, endIdx); 121 | } 122 | -------------------------------------------------------------------------------- /src/parser.ts: -------------------------------------------------------------------------------- 1 | import * as recast from "recast"; 2 | import * as vscode from "vscode"; 3 | import { IFunctionCallObject } from "./functionCallObject"; 4 | 5 | export function getFunctionCalls(sourceCode: string, editor: vscode.TextEditor): IFunctionCallObject[] { 6 | let fcArray: IFunctionCallObject[] = []; 7 | 8 | const options = { parser: null }; 9 | 10 | if (editor.document.languageId === "javascript") { 11 | options.parser = require("recast/parsers/esprima"); 12 | } else if (editor.document.languageId === "typescript") { 13 | options.parser = require("recast/parsers/typescript"); 14 | } else if (editor.document.languageId === "javascriptreact") { 15 | options.parser = require("recast/parsers/babel"); 16 | } else if (editor.document.languageId === "typescriptreact") { 17 | options.parser = { 18 | parse(source) { 19 | const babelParser = require("recast/parsers/babel").parser; 20 | const opts = { 21 | allowImportExportEverywhere: true, 22 | allowReturnOutsideFunction: true, 23 | plugins: [ 24 | "asyncGenerators", 25 | "bigInt", 26 | "classPrivateMethods", 27 | "classPrivateProperties", 28 | "classProperties", 29 | "decorators-legacy", 30 | "doExpressions", 31 | "dynamicImport", 32 | "exportDefaultFrom", 33 | "exportExtensions", 34 | "exportNamespaceFrom", 35 | "functionBind", 36 | "functionSent", 37 | "importMeta", 38 | "nullishCoalescingOperator", 39 | "numericSeparator", 40 | "objectRestSpread", 41 | "optionalCatchBinding", 42 | "optionalChaining", 43 | ["pipelineOperator", { proposal: "minimal" }], 44 | "throwExpressions", 45 | "typescript", 46 | "jsx" 47 | ], 48 | sourceType: "unambiguous", 49 | startLine: 1, 50 | strictMode: false, 51 | tokens: true 52 | }; 53 | 54 | return babelParser.parse(source, opts); 55 | } 56 | }; 57 | } 58 | 59 | sourceCode = removeShebang(sourceCode); 60 | 61 | let ast; 62 | 63 | try { 64 | ast = recast.parse(sourceCode, options); 65 | } catch (err) { 66 | console.log(err.message); 67 | } 68 | 69 | fcArray = lookForFunctionCalls(editor, fcArray, ast.program.body); 70 | 71 | return fcArray; 72 | } 73 | 74 | function removeShebang(sourceCode: string): string { 75 | const sourceCodeArr = sourceCode.split("\n"); 76 | if (sourceCodeArr[0].substr(0, 2) === "#!") { 77 | sourceCodeArr[0] = ""; 78 | } 79 | return sourceCodeArr.join("\n"); 80 | } 81 | 82 | function lookForFunctionCalls(editor: vscode.TextEditor, fcArray: IFunctionCallObject[], body: any): IFunctionCallObject[] { 83 | let arr = []; 84 | 85 | function getNodes(astNode, nodeArr) { 86 | // Loop through all keys in the current node 87 | for (const key in astNode) { 88 | if (astNode.hasOwnProperty(key)) { 89 | const item = astNode[key]; 90 | 91 | if (item === undefined || item === null) { 92 | continue; 93 | } 94 | 95 | if (Array.isArray(item)) { 96 | // If the current node is an array of nodes, loop through each 97 | item.forEach((subItem) => nodeArr = getNodes(subItem, nodeArr)); 98 | } else if (item.loc !== undefined) { 99 | // If is a proper node and has a location in the source, push it into the array and recurse on that for nodes inside this node 100 | nodeArr.push(item); 101 | nodeArr = getNodes(item, nodeArr); 102 | } 103 | } 104 | } 105 | 106 | return nodeArr; 107 | } 108 | 109 | arr = getNodes(body, arr); 110 | 111 | const nodes = arr.filter((node) => node.type === "CallExpression" || node.type === "NewExpression"); 112 | 113 | const calls = []; 114 | 115 | nodes.forEach((node) => { 116 | if (node.type === "NewExpression") { 117 | calls.push(node, ...node.arguments); 118 | } else { 119 | calls.push(node); 120 | } 121 | }); 122 | 123 | for (const call of calls) { 124 | if (call.callee && call.callee.loc) { 125 | 126 | let startArr; 127 | let endArr; 128 | 129 | if (call.callee.type === "MemberExpression" && call.callee.property.loc) { 130 | const { start, end } = call.callee.property.loc; 131 | 132 | startArr = [start.line - 1, start.column]; 133 | endArr = [end.line - 1, end.column]; 134 | } else if (call.callee.type === "CallExpression") { 135 | const { start, end } = call.callee.arguments[0].loc; 136 | 137 | startArr = [start.line - 1, start.column]; 138 | endArr = [end.line - 1, end.column]; 139 | } else { 140 | const { start, end } = call.callee.loc; 141 | 142 | startArr = [start.line - 1, start.column]; 143 | endArr = [end.line - 1, end.column]; 144 | } 145 | 146 | const startPos = new vscode.Position(startArr[0], startArr[1]); 147 | const endPos = new vscode.Position(endArr[0], endArr[1]); 148 | 149 | let calleeName; 150 | 151 | if (call.callee.type === "MemberExpression") { 152 | calleeName = call.callee.property.name; 153 | } else if (call.callee.type === "Identifier") { 154 | calleeName = call.callee.name; 155 | } 156 | 157 | const newFunctionCallObject: IFunctionCallObject = { 158 | calleeCallee: call.callee.type === "CallExpression", 159 | functionName: calleeName, 160 | functionRange: new vscode.Range(startPos, endPos), 161 | lineNumber: startPos.line 162 | }; 163 | 164 | if (call.arguments) { 165 | const paramObj = parseParams(call.arguments, editor); 166 | 167 | newFunctionCallObject.paramLocations = paramObj.paramLocationsArr; 168 | newFunctionCallObject.paramNames = paramObj.paramNamesArr; 169 | } 170 | 171 | fcArray.push(newFunctionCallObject); 172 | } 173 | } 174 | 175 | return fcArray; 176 | } 177 | 178 | function parseParams(args: any, editor: vscode.TextEditor): any { 179 | const paramLocationsArr: vscode.Range[] = []; 180 | const paramNamesArr: string[] = []; 181 | 182 | args.forEach((arg) => { 183 | if (arg.loc) { 184 | const { start, end } = arg.loc; 185 | 186 | const startArr = [start.line - 1, start.column]; 187 | const endArr = [end.line - 1, end.column]; 188 | 189 | // TSTypeAssertions are off by one for some reason so subtract the column by one. 190 | if (arg.type === "TSTypeAssertion") { 191 | startArr[1] -= 1; 192 | } 193 | 194 | const line = editor.document.lineAt(startArr[0]); 195 | 196 | let offset; 197 | 198 | if (editor.options.insertSpaces) { 199 | offset = 0; 200 | } else { 201 | offset = line.firstNonWhitespaceCharacterIndex * 3; 202 | } 203 | 204 | const argRange = new vscode.Range( 205 | new vscode.Position(startArr[0], startArr[1] - offset), 206 | new vscode.Position(endArr[0], endArr[1] - offset) 207 | ); 208 | 209 | if (arg.type === "MemberExpression") { 210 | // Array access and item access (foo.bar, baz[3]) 211 | if (arg.object.name !== undefined) { 212 | // Single depth access & array 213 | paramNamesArr.push(arg.object.name); 214 | } else { 215 | // multi-depth access 216 | paramNamesArr.push(arg.property.name); 217 | } 218 | } else if (arg.value !== undefined) { 219 | // Literals (false, 4, "foobar") 220 | paramNamesArr.push(arg.value); 221 | } else { 222 | // variables (isTrue, str) 223 | paramNamesArr.push(arg.name); 224 | } 225 | 226 | paramLocationsArr.push(argRange); 227 | } 228 | }); 229 | 230 | return { paramLocationsArr, paramNamesArr }; 231 | } 232 | 233 | export async function getDefinitions(fcArray: IFunctionCallObject[], uri: vscode.Uri): Promise { 234 | return new Promise(async (resolve) => { 235 | for (const fc of fcArray) { 236 | if (fc.functionRange === undefined) { 237 | continue; 238 | } 239 | 240 | // grab an array of locations for the definitions of a function call 241 | const locations = await vscode.commands.executeCommand("vscode.executeDefinitionProvider", uri, fc.functionRange.start); 242 | 243 | if (locations !== undefined && locations.length > 0) { 244 | // If one location, only return if it has some function definition of some sort 245 | if (locations.length === 1) { 246 | const document = await vscode.workspace.openTextDocument(locations[0].uri); 247 | let line; 248 | 249 | if (fc.calleeCallee) { 250 | const text = document.getText().split("\n"); 251 | 252 | let num; 253 | for (num = 0; num < text.length; num++) { 254 | if (text[num].includes("module.exports") && (text[num].includes("=>") || text[num].includes("function"))) { 255 | line = document.lineAt(num).text; 256 | break; 257 | } 258 | } 259 | 260 | const defLocation = new vscode.Location(locations[0].uri, new vscode.Position(num, 0)); 261 | fc.definitionLocation = defLocation; 262 | continue; 263 | } else { 264 | line = document.lineAt(locations[0].range.start).text; 265 | } 266 | 267 | if (line.includes("constructor")) { 268 | fc.definitionLocation = locations[0]; 269 | continue; 270 | } 271 | 272 | if (line.includes("function ") || line.includes("=>") || (line.includes("(") && line.includes(")") && !line.includes("require"))) { 273 | fc.definitionLocation = locations[0]; 274 | } 275 | continue; 276 | } 277 | 278 | // Otherwise, look through each location and find one with a function definition 279 | for (const location of locations) { 280 | const document = await vscode.workspace.openTextDocument(location.uri); 281 | const line = document.lineAt(location.range.start).text; 282 | 283 | if (line.includes("constructor")) { 284 | fc.definitionLocation = locations[0]; 285 | break; 286 | } 287 | 288 | if (line.includes("function ") || line.includes("=>") || (line.includes("(") && line.includes(")") && !line.includes("require"))) { 289 | fc.definitionLocation = location; 290 | break; 291 | } 292 | } 293 | } 294 | } 295 | 296 | resolve(fcArray); 297 | }); 298 | } 299 | -------------------------------------------------------------------------------- /src/test/e2e/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from "assert"; 2 | import * as path from "path"; 3 | import * as vscode from "vscode"; 4 | import * as Extension from "../../extension"; 5 | 6 | const testFolderLocation = "/../../../src/test/examples/"; 7 | 8 | suite("js annotations", () => { 9 | test("should annotate function with parameters", async () => { 10 | const [decArray, errDecArray] = await getDecorationsFromExample("normalParams.js"); 11 | 12 | assert.deepEqual(decArray.length, 1); 13 | assert.deepEqual(errDecArray.length, 0); 14 | 15 | vscode.commands.executeCommand("workbench.action.closeActiveEditor"); 16 | }); 17 | 18 | test("should not annotate function with no parameters", async () => { 19 | const [decArray, errDecArray] = await getDecorationsFromExample("noParams.js"); 20 | 21 | assert.deepEqual(decArray.length, 0); 22 | assert.deepEqual(errDecArray.length, 0); 23 | 24 | vscode.commands.executeCommand("workbench.action.closeActiveEditor"); 25 | }); 26 | 27 | test("should decorate with error decoration if more args than params", async () => { 28 | const [decArray, errDecArray] = await getDecorationsFromExample("moreArgs.js"); 29 | 30 | assert.deepEqual(decArray.length, 1); 31 | assert.deepEqual(errDecArray.length, 0); 32 | assert.deepEqual(Extension.getDiagnostics().length, 1); 33 | 34 | vscode.commands.executeCommand("workbench.action.closeActiveEditor"); 35 | }); 36 | 37 | test("should decorate with rest params", async () => { 38 | const [decArray, errDecArray] = await getDecorationsFromExample("rest.js"); 39 | 40 | assert.deepEqual(decArray.length, 3); 41 | assert.deepEqual(errDecArray.length, 0); 42 | 43 | vscode.commands.executeCommand("workbench.action.closeActiveEditor"); 44 | }); 45 | 46 | test("should decorate function call with multiple lines", async () => { 47 | const [decArray, errDecArray] = await getDecorationsFromExample("multipleLines.js"); 48 | 49 | assert.deepEqual(decArray.length, 2); 50 | assert.deepEqual(errDecArray.length, 0); 51 | 52 | vscode.commands.executeCommand("workbench.action.closeActiveEditor"); 53 | }); 54 | 55 | test("should decorate with nested function calls", async () => { 56 | const [decArray, errDecArray] = await getDecorationsFromExample("nested.ts"); 57 | 58 | assert.deepEqual(decArray.length, 6); 59 | assert.deepEqual(errDecArray.length, 0); 60 | 61 | vscode.commands.executeCommand("workbench.action.closeActiveEditor"); 62 | }); 63 | 64 | test("should not annotate with call that has no definition", async () => { 65 | const [decArray, errDecArray] = await getDecorationsFromExample("noDefinition.js"); 66 | 67 | assert.deepEqual(decArray.length, 0); 68 | assert.deepEqual(errDecArray.length, 0); 69 | 70 | vscode.commands.executeCommand("workbench.action.closeActiveEditor"); 71 | }); 72 | 73 | test("Should remove `this` from typescript files", async () => { 74 | const [decArray, errDecArray] = await getDecorationsFromExample("this.ts"); 75 | 76 | assert.deepEqual(decArray.length, 1); 77 | assert.strictEqual(decArray[0].renderOptions.before.contentText, " str: "); 78 | assert.deepEqual(errDecArray.length, 0); 79 | }); 80 | 81 | test("Should work for JSX files", async () => { 82 | const [decArray, errDecArray] = await getDecorationsFromExample("react.jsx"); 83 | assert.deepEqual(decArray.length, 1); 84 | assert.deepEqual(errDecArray.length, 0); 85 | }); 86 | }); 87 | 88 | function sleep(ms: number): Promise { 89 | return new Promise((resolve) => { 90 | setTimeout(resolve, ms); 91 | }); 92 | } 93 | 94 | async function getDecorationsFromExample(exampleName: string): Promise { 95 | const uri = vscode.Uri.file(path.join(__dirname + testFolderLocation + exampleName)); 96 | const document = await vscode.workspace.openTextDocument(uri); 97 | const editor = await vscode.window.showTextDocument(document); 98 | await sleep(500); 99 | const decorations = await Extension.createDecorations(editor, editor.document.getText()); 100 | 101 | return decorations; 102 | } 103 | -------------------------------------------------------------------------------- /src/test/examples/moreArgs.js: -------------------------------------------------------------------------------- 1 | document.getElementById("foo", "bar"); -------------------------------------------------------------------------------- /src/test/examples/multipleLines.js: -------------------------------------------------------------------------------- 1 | console.log({ 2 | a: 2, 3 | b: 3 4 | }, "fork"); -------------------------------------------------------------------------------- /src/test/examples/nested.ts: -------------------------------------------------------------------------------- 1 | import { Position, Range } from "vscode"; 2 | 3 | const newRange = new Range( 4 | new Position(3, 4), 5 | new Position(5, 6) 6 | ); 7 | -------------------------------------------------------------------------------- /src/test/examples/noDefinition.js: -------------------------------------------------------------------------------- 1 | eat(4, 3); -------------------------------------------------------------------------------- /src/test/examples/noParams.js: -------------------------------------------------------------------------------- 1 | console.log(); -------------------------------------------------------------------------------- /src/test/examples/normalParams.js: -------------------------------------------------------------------------------- 1 | const foo = document.getElementById("top"); -------------------------------------------------------------------------------- /src/test/examples/react.jsx: -------------------------------------------------------------------------------- 1 | function jsxComponent(text) { 2 | return ( 3 |
{text}
4 | ) 5 | } 6 | 7 | jsxComponent("Hello World") 8 | -------------------------------------------------------------------------------- /src/test/examples/rest.js: -------------------------------------------------------------------------------- 1 | console.log("a", "b", "c"); -------------------------------------------------------------------------------- /src/test/examples/this.ts: -------------------------------------------------------------------------------- 1 | function doThings(this: void, str: string) { 2 | return str; 3 | } 4 | 5 | doThings("what?"); 6 | -------------------------------------------------------------------------------- /src/test/index.ts: -------------------------------------------------------------------------------- 1 | import * as testRunner from "vscode/lib/testrunner"; 2 | 3 | testRunner.configure({ 4 | timeout: 10000, 5 | ui: "tdd", 6 | useColors: true 7 | }); 8 | 9 | module.exports = testRunner; 10 | -------------------------------------------------------------------------------- /src/test/unit/paramExtractor.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from "assert"; 2 | import { splitToParamList } from "../../paramExtractor"; 3 | 4 | suite("splitToParamList tests", () => { 5 | test("should properly split simple parameter def with generic type @unit", () => { 6 | const paramDef = "op1: Opt"; 7 | const expectedList = ["op1: Opt"]; 8 | const paramList = splitToParamList(paramDef); 9 | 10 | assert.deepEqual(paramList, expectedList); 11 | }); 12 | 13 | test("should properly split parameter def with nested generic type @unit", () => { 14 | const paramDef = "op1: Opt, D>"; 15 | const expectedList = ["op1: Opt, D>"]; 16 | const paramList = splitToParamList(paramDef); 17 | 18 | assert.deepEqual(paramList, expectedList); 19 | }); 20 | 21 | test("should work with parameter def with arrow functions @unit", () => { 22 | const paramDef = "fn: (num: number, str: string) => string, opts: any"; 23 | const expectedList = ["fn: (num: number, str: string) => string", "opts: any"]; 24 | const paramList = splitToParamList(paramDef); 25 | 26 | assert.deepEqual(paramList, expectedList); 27 | }); 28 | 29 | test("should work with parameter def with arrow functions and generic return type @unit", () => { 30 | const paramDef = "fn: (num: number, str: string) => Opt, opts: any"; 31 | const expectedList = ["fn: (num: number, str: string) => Opt", "opts: any"]; 32 | const paramList = splitToParamList(paramDef); 33 | 34 | assert.deepEqual(paramList, expectedList); 35 | }); 36 | 37 | test("should work with complex parameter def with arrow functions and generic return type @unit", () => { 38 | const paramDef = "fn: (num: number, strOpt: Opt) => Opt, opts: any"; 39 | const expectedList = ["fn: (num: number, strOpt: Opt) => Opt", "opts: any"]; 40 | const paramList = splitToParamList(paramDef); 41 | 42 | assert.deepEqual(paramList, expectedList); 43 | }); 44 | 45 | test("should be fine with primitive types @unit", () => { 46 | const paramDef = "str: string, opts: any"; 47 | const expectedList = ["str: string", "opts: any"]; 48 | const paramList = splitToParamList(paramDef); 49 | 50 | assert.deepEqual(paramList, expectedList); 51 | }); 52 | 53 | test("should be fine with rest params @unit", () => { 54 | const paramDef = "cats: number, ...rest: string[]"; 55 | const expectedList = ["cats: number", "...rest: string[]"]; 56 | const paramList = splitToParamList(paramDef); 57 | 58 | assert.deepEqual(paramList, expectedList); 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": ["es6"], 7 | "sourceMap": true, 8 | "rootDir": "src" 9 | }, 10 | "exclude": ["node_modules", ".vscode-test"] 11 | } 12 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "max-line-length": false, 9 | "no-console": false, 10 | "trailing-comma": false 11 | }, 12 | "rulesDirectory": [] 13 | } --------------------------------------------------------------------------------