From 6d0f075c3819525b732e0d26f850ad7bec99ec0f Mon Sep 17 00:00:00 2001 From: Aleksey Okhrimenko Date: Tue, 18 Aug 2020 03:25:04 +0300 Subject: [PATCH] Initial Commit --- .editorconfig | 8 + .eslintrc.json | 19 + .gitignore | 5 + .vscode/extensions.json | 7 + .vscode/launch.json | 36 + .vscode/settings.json | 11 + .vscode/tasks.json | 20 + .vscodeignore | 11 + CHANGELOG.md | 9 + LICENCE | 21 + README.md | 62 + assets/github_logo.png | Bin 0 -> 65379 bytes assets/icon.png | Bin 0 -> 14221 bytes package-lock.json | 2224 +++++++++++++++++++++ package.json | 66 + src/code-actions.ts | 28 + src/directories-picker.ts | 51 + src/editor.ts | 106 + src/extension.ts | 53 + src/file-picker.ts | 36 + src/file-system.ts | 95 + src/modules/extract-to-folder-template.ts | 56 + src/modules/extract-to-folder.ts | 122 ++ src/template-parser.ts | 160 ++ src/test/runTest.ts | 23 + src/test/suite/extension.test.ts | 15 + src/test/suite/index.ts | 38 + tsconfig.json | 24 + 28 files changed, 3306 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 CHANGELOG.md create mode 100644 LICENCE create mode 100644 README.md create mode 100644 assets/github_logo.png create mode 100644 assets/icon.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/code-actions.ts create mode 100644 src/directories-picker.ts create mode 100644 src/editor.ts create mode 100644 src/extension.ts create mode 100644 src/file-picker.ts create mode 100644 src/file-system.ts create mode 100644 src/modules/extract-to-folder-template.ts create mode 100644 src/modules/extract-to-folder.ts create mode 100644 src/template-parser.ts create mode 100644 src/test/runTest.ts create mode 100644 src/test/suite/extension.test.ts create mode 100644 src/test/suite/index.ts create mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..db87e1f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..83479e8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/class-name-casing": "warn", + "@typescript-eslint/semi": "warn", + "curly": "warn", + "eqeqeq": "warn", + "no-throw-literal": "warn", + "semi": "off" + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a54a3a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +out +node_modules +.vscode-test/ +*.vsix +.idea \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..3ac9aeb --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "dbaeumer.vscode-eslint" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..b1fbaf5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,36 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": [ + "${workspaceFolder}/out/test/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..30bf8c2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false // set this to true to hide the "out" folder with the compiled JS files + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..3b17e53 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,20 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..1c0af50 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,11 @@ +.vscode/** +.vscode-test/** +out/test/** +src/** +.gitignore +vsc-extension-quickstart.md +**/tsconfig.json +**/.eslintrc.json +**/*.map +**/*.ts +.idea/** \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..92d9c5a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "arrr" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## 0.0.1 + +- Initial release \ No newline at end of file diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..8936000 --- /dev/null +++ b/LICENCE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 obenjiro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f9d5e8f --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +

+ +

+ +# arrr - VSCode extension + +First extension that provides refactoring tools for your Angular codebase: extract HTML into a new component with ease! + +## Highlights + +- Allows extracting HTML into new component +- Automatic Modules Updates +- Generates HTML, CSS, TS and spec files + +## Installation + +Go to the link below and click `Install`. + +[Visual Studio Code Market Place: arrr](https://marketplace.visualstudio.com/items?itemName=obenjiro.arrr) + +## Features + +### Extracting HTML into a new Component + +arrr allows easy extraction of HTML into new Angular components (in the same or other file). Just select the HTML to extract, and arrr will handle all the rest: + +- It will identify all inputs to the newly created component. +- Replace extracted HTML with newly created component, while providing it with all the props. + +![Example of HTML extraction](https://github.com/obenjiro/vscode-arrr/blob/master/assets/extract-to-dir.gif?raw=true) + +## Contribute + +Feel free to open issues or PRs! + +### Getting started + +In order to start working all you need to do is: + +```sh +$ git clone git@github.com:obenjiro/vscode-arrr.git +$ cd vscode-arrr +$ npm install +$ code . +``` + +### Running Extension + +- Go to VSCode debug sidebar +- Select `Extension` from the dropdown +- Hit `F5` + +### Running Tests + +- Go to VSCode debug sidebar +- Select `Extension Tests` from the dropdown +- Hit `F5` + +### Commit messages + +Please refer to to the following [guide](https://marketplace.visualstudio.com/items?itemName=obenjiro.arrr). + diff --git a/assets/github_logo.png b/assets/github_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5ae8b24cc7a059c6cf1d9a450e44a4e7f1def7 GIT binary patch literal 65379 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 literal 0 HcmV?d00001 diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e749a52be4ff24e26b64d21d108f9e8b53fbc00b GIT binary patch literal 14221 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 Qf0y1QMdd`Qh4cgd7k=?-p#T5? literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..59a165d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2224 @@ +{ + "name": "arrr", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular/compiler": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.7.tgz", + "integrity": "sha512-ut4aq7G0OwpRM2jhWjqN7RR02z9ybwFlP8j+2cr+6wwxZLUB+Gwe+O8iuz6h98O7F9yZx8Lbr5bQ07xbiHgdag==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mkdirp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", + "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/node": { + "version": "13.13.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.15.tgz", + "integrity": "sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw==" + }, + "@types/vscode": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.47.0.tgz", + "integrity": "sha512-nJA37ykkz9FYA0ZOQUSc3OZnhuzEW2vUhUEo4MiduUo82jGwwcLfyvmgd/Q7b0WrZAAceojGhZybg319L24bTA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capital-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.3.tgz", + "integrity": "sha512-OlUSJpUr7SY0uZFOxcwnDOU7/MpHlKTZx2mqnDYQFrDudXLFm0JJ9wr/l4csB+rh2Ug0OPuoSO53PqiZBqno9A==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0", + "upper-case-first": "^2.0.1" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "change-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.1.tgz", + "integrity": "sha512-qRlUWn/hXnX1R1LBDF/RelJLiqNjKjUqlmuBVSEIyye8kq49CXqkZWKmi8XeUAdDXWFOcGLUMZ+aHn3Q5lzUXw==", + "requires": { + "camel-case": "^4.1.1", + "capital-case": "^1.0.3", + "constant-case": "^3.0.3", + "dot-case": "^3.0.3", + "header-case": "^2.0.3", + "no-case": "^3.0.3", + "param-case": "^3.0.3", + "pascal-case": "^3.1.1", + "path-case": "^3.0.3", + "sentence-case": "^3.0.3", + "snake-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "constant-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.3.tgz", + "integrity": "sha512-FXtsSnnrFYpzDmvwDGQW+l8XK3GV1coLyBN0eBz16ZUzGaZcT2ANVCJmLeuw2GQgxKHQIe9e0w2dzkSfaRlUmA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0", + "upper-case": "^2.0.1" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "gitignore-to-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz", + "integrity": "sha1-WfMqs9m2bOUCmcPtJMsO9CoJTOs=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "header-case": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.3.tgz", + "integrity": "sha512-LChe/V32mnUQnTwTxd3aAlNMk8ia9tjCDb/LjYtoMrdAPApxLB+azejUk5ERZIZdIqvinwv6BAUuFXH/tQPdZA==", + "requires": { + "capital-case": "^1.0.3", + "tslib": "^1.10.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.1.tgz", + "integrity": "sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "param-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "path-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.3.tgz", + "integrity": "sha512-UMFU6UETFpCNWbIWNczshPrnK/7JAXBP2NYw80ojElbQ2+JYxdqWDBkvvqM93u4u6oLmuJ/tPOf2tM8KtXv4eg==", + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "sentence-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.3.tgz", + "integrity": "sha512-ZPr4dgTcNkEfcGOMFQyDdJrTU9uQO1nb1cjf+nuzb6FxgMDgKddZOM29qEsB7jvsZSMruLRcL2KfM4ypKpa0LA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0", + "upper-case-first": "^2.0.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "snake-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.3.tgz", + "integrity": "sha512-WM1sIXEO+rsAHBKjGf/6R1HBBcgbncKS08d2Aqec/mrDSpU80SiOU41hO7ny6DToHSyrlwTYzQBIK1FPSx4Y3Q==", + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true + }, + "upper-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.1.tgz", + "integrity": "sha512-laAsbea9SY5osxrv7S99vH9xAaJKrw5Qpdh4ENRLcaxipjKsiaBwiAsxfa8X5mObKNTQPsupSq0J/VIxsSJe3A==", + "requires": { + "tslib": "^1.10.0" + } + }, + "upper-case-first": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.1.tgz", + "integrity": "sha512-105J8XqQ+9RxW3l9gHZtgve5oaiR9TIwvmZAMAIZWRHe00T21cdvewKORTlOJf/zXW6VukuTshM+HXZNWz7N5w==", + "requires": { + "tslib": "^1.10.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "vscode-test": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz", + "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==", + "dev": true, + "requires": { + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.4", + "rimraf": "^2.6.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..db19c67 --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "name": "arrr", + "displayName": "arrr", + "description": "The extension provides refactoring tools for your Angular codebase", + "version": "0.0.1", + "publisher": "obenjiro", + "engines": { + "vscode": "^1.47.0" + }, + "categories": [ + "Programming Languages" + ], + "keywords": [ + "javascript", + "angular", + "refactoring", + "typescript", + "cleancode" + ], + "activationEvents": [ + "onLanguage:html", + "onCommand:arrr.extract-to-folder" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "arrr.extract-to-folder", + "title": "Extract Angular component to folder" + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "lint": "eslint src --ext ts", + "watch": "tsc -watch -p ./", + "pretest": "npm run compile && npm run lint", + "test": "node ./out/test/runTest.js" + }, + "devDependencies": { + "@types/glob": "^7.1.1", + "@types/mocha": "^7.0.2", + "@types/node": "^13.11.0", + "@types/vscode": "^1.47.0", + "@typescript-eslint/eslint-plugin": "^2.30.0", + "@typescript-eslint/parser": "^2.30.0", + "eslint": "^6.8.0", + "glob": "^7.1.6", + "mocha": "^7.1.2", + "typescript": "^3.8.3", + "vscode-test": "^1.3.0" + }, + "dependencies": { + "@angular/compiler": "^10.0.7", + "@types/mkdirp": "^1.0.1", + "change-case": "^4.1.1", + "gitignore-to-glob": "^0.3.0", + "mkdirp": "^1.0.4" + }, + "icon": "assets/icon.png", + "repository": { + "type": "git", + "url": "https://github.com/obenjiro/vscode-arrr.git" + } +} diff --git a/src/code-actions.ts b/src/code-actions.ts new file mode 100644 index 0000000..f7272b2 --- /dev/null +++ b/src/code-actions.ts @@ -0,0 +1,28 @@ +import {activeFileName, openFile, selectedTextStart, selectedTextEnd, showErrorMessage} from "./editor"; +// import { shouldSwitchToTarget } from "./settings"; +import { + replaceTextInFile, + appendTextToFile, + prependTextToFile, + removeContentFromFileAtLineAndColumn +} from "./file-system"; + +export async function switchToDestinationFileIfRequired(destinationFilePath: any) { + // if (shouldSwitchToTarget()) { + if (false) { + await openFile(destinationFilePath); + } +} + +export function replaceSelectionWith(text: string) { + return replaceTextInFile(text, selectedTextStart() as any, selectedTextEnd() as any, activeFileName()); +} + +export const appendSelectedTextToFile = ({ + text: selection + }, destinationPath) => { + let text; + text = selection; + + return appendTextToFile(`${text}`, destinationPath); +}; diff --git a/src/directories-picker.ts b/src/directories-picker.ts new file mode 100644 index 0000000..6a55b6d --- /dev/null +++ b/src/directories-picker.ts @@ -0,0 +1,51 @@ +import { + toQuickPick, + currentEditorPath, + workspaceRoot, + extractQuickPickValue, + showQuickPicksList, + toQuickPicksList, +} from './editor'; +import {subfoldersListOf, gitIgnoreFolders} from './file-system'; + +function getWorkspaceFolderStructure(): Promise { + return new Promise((resolveWith, reject) => { + const findDirectories = () => { + try { + resolveWith(subfoldersListOf(workspaceRoot(), gitIgnoreFolders())); + } catch (error) { + reject(error); + } + }; + + const delayToAllowVSCodeToRender = 1; + setTimeout(findDirectories, delayToAllowVSCodeToRender); + }); +} + +const prependQuickpickForCurrentFileFolder = (quickPicksList) => { + return [ + toQuickPick(currentEditorPath(), 'current file directory'), + ...quickPicksList, + ]; +}; + +const getQuickPicksForWorkspaceFolderStructure = () => { + if (!workspaceRoot()) { + return Promise.resolve([]); + } + return getWorkspaceFolderStructure().then(toQuickPicksList); +}; + +export function showDirectoryPicker(): any { + return getQuickPicksForWorkspaceFolderStructure() + .then(prependQuickpickForCurrentFileFolder) + .then((choices) => + showQuickPicksList(choices, 'Pick directory that contains the file') + ) + .then(extractQuickPickValue) + .then(cancelActionIfNeeded); +} + +const cancelActionIfNeeded = (value: any) => + value ? value : Promise.reject(false); diff --git a/src/editor.ts b/src/editor.ts new file mode 100644 index 0000000..35b9350 --- /dev/null +++ b/src/editor.ts @@ -0,0 +1,106 @@ +import * as vscode from 'vscode'; +import {QuickPickItem} from 'vscode'; +import * as path from 'path'; + +export const workspaceRoot = () => vscode.workspace.rootPath as string; + +export const activeURI = () => + vscode.window.activeTextEditor?.document.uri as vscode.Uri; +export const activeFileName = () => + vscode.window.activeTextEditor?.document.fileName; + +export const selectedTextStart = () => + vscode.window.activeTextEditor?.selection.start; +export const selectedTextEnd = () => + vscode.window.activeTextEditor?.selection.end; + +export const config = () => vscode.workspace.getConfiguration('arrr'); + +export function currentEditorPath(): string { + const activeEditor = vscode.window.activeTextEditor; + if (activeEditor) { + const currentFilePath = path.dirname(activeEditor.document.fileName); + const rootMatcher = new RegExp(`^${workspaceRoot()}`); + return currentFilePath.replace(rootMatcher, ''); + } + return ''; +} + +export function openFile(absolutePath: string): PromiseLike { + return vscode.workspace + .openTextDocument(absolutePath) + .then((textDocument) => { + if (textDocument) { + vscode.window.showTextDocument(textDocument); + return absolutePath; + } else { + throw Error('Could not open document'); + } + }); +} + +export function getSelectedText() { + const editor = vscode.window.activeTextEditor; + if (editor) { + const selection = editor.selection; + return editor.document.getText(selection); + } else { + return null; + } +} + +export function getSelectionOffsetRange() { + const editor = vscode.window.activeTextEditor; + if (editor) { + return { + start: editor.document.offsetAt(editor.selection.start), + end: editor.document.offsetAt(editor.selection.end), + }; + } else { + return {}; + } +} + +export function showInputBox(defaultValue: string, placeHolder: string) { + return vscode.window.showInputBox({ + value: defaultValue, + placeHolder, + }); +} + +export function showQuickPicksList(choices: QuickPickItem[], placeHolder = '') { + // return vscode.window.showInputBox(); + return vscode.window.showQuickPick(choices, { + placeHolder, + }); +} + +export const convertRelativeToFullPath = (relativePath: string) => { + const root = workspaceRoot(); + return root ? path.join(root, relativePath) : relativePath; +}; + +export const extractQuickPickValue = (selection: any) => { + if (!selection) { + return; + } + return selection.label; +}; + +export const toQuickPick = (label: string, description?: string) => ({ + label, + description, +}); + +export const toQuickPicksList = (choices: string[]) => + choices.map((item) => toQuickPick(item)); + +export const showErrorMessage = (message: string) => + vscode.window.showErrorMessage(message); + +export const importMissingDependencies = (targetFile: string) => + vscode.commands.executeCommand( + '_typescript.applyFixAllCodeAction', + targetFile, + {fixId: 'fixMissingImport'} + ); diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..d750b07 --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,53 @@ +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below +import * as vscode from 'vscode'; + +import {extractToFolder} from './modules/extract-to-folder'; +import {templateParser} from './template-parser'; +import {getSelectedText} from './editor'; + +export class CompleteActionProvider implements vscode.CodeActionProvider { + public provideCodeActions(): vscode.ProviderResult { + const text = getSelectedText(); + + // try parse text with parser + if (text) { + try { + const output = templateParser.parse(text); + if (!output.errors) { + return [ + { + command: 'extension.arrr.extract-to-folder', + title: 'Extract Angular Component', + }, + ]; + } + } catch (err) { + } + } + + return []; + } +} + +// this method is called when your extension is activated +// your extension is activated the very first time the command is executed +export function activate(context: vscode.ExtensionContext) { + context.subscriptions.push( + vscode.commands.registerCommand( + 'extension.arrr.extract-to-folder', + extractToFolder + ) + ); + + context.subscriptions.push( + vscode.languages.registerCodeActionsProvider( + {pattern: '**/*.*'}, + new CompleteActionProvider() + ) + ); +} + +// this method is called when your extension is deactivated +export function deactivate() { +} diff --git a/src/file-picker.ts b/src/file-picker.ts new file mode 100644 index 0000000..0e74f4f --- /dev/null +++ b/src/file-picker.ts @@ -0,0 +1,36 @@ +import { + convertRelativeToFullPath, + showInputBox, + workspaceRoot, +} from './editor'; +import {createFileIfDoesntExist} from './file-system'; +import * as vscode from 'vscode'; + +function completeToFullFilePath(file, folder) { + if (file === NEW_FILE_OPTION) { + return promptFileNameInput(folder).then(createFileIfDoesntExist as any); + } else { + const root = workspaceRoot(); + return `${root || ''}${folder}/${file}`; + } +} + +export function promptFileNameInput(directory) { + return showInputBox(directory, 'Filename or relative path to a file').then( + convertRelativeToFullPath as any + ); +} + +const NEW_FILE_OPTION: string = 'Enter Folder Name'; + +export function showFilePicker(directory) { + return ( + vscode.window + .showInputBox() + .then(cancelActionIfNeeded) + .then((file) => completeToFullFilePath(file, directory)) + ); +} + +const cancelActionIfNeeded = (value: any) => + value ? value : Promise.reject(false); diff --git a/src/file-system.ts b/src/file-system.ts new file mode 100644 index 0000000..fd5a24b --- /dev/null +++ b/src/file-system.ts @@ -0,0 +1,95 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as mkdirp from 'mkdirp'; +import {sync as globSync} from 'glob'; +import * as gitignoreToGlob from 'gitignore-to-glob'; +import {workspaceRoot, activeURI} from './editor'; +import * as vscode from 'vscode'; +import {Position, Uri} from 'vscode'; + +export function createFileIfDoesntExist(absolutePath: string): string { + let directoryToFile = path.dirname(absolutePath); + if (!fs.existsSync(absolutePath)) { + mkdirp.sync(directoryToFile); + fs.appendFileSync(absolutePath, ''); + } + + return absolutePath; +} + +export function subfoldersListOf(root: string, ignoreList: string[]): string[] { + if (!root) { + return []; + } + + const results = globSync('**', {cwd: root, ignore: ignoreList}) + .filter((f) => fs.statSync(path.join(root, f)).isDirectory()) + .map((f) => '/' + f); + + return results; +} + +export const replaceTextInFile = ( + text, + start: vscode.Position, + end: vscode.Position, + path +) => (edit) => edit.replace(Uri.file(path), new vscode.Range(start, end), text); + +export async function appendTextToFile(text, absolutePath) { + const edit = new vscode.WorkspaceEdit(); + const linesInFile = await countLineInFile(absolutePath); + + edit.insert(Uri.file(absolutePath), new Position(linesInFile, 0), text); + return vscode.workspace.applyEdit(edit); +} + +export function persistFileSystemChanges(...changes) { + const accumulatedEdit = new vscode.WorkspaceEdit(); + changes.forEach((addChangeTo) => addChangeTo(accumulatedEdit)); + return vscode.workspace.applyEdit(accumulatedEdit); +} + +export function prependTextToFile(text, absolutePath) { + const edit = new vscode.WorkspaceEdit(); + edit.insert(Uri.file(absolutePath), new vscode.Position(0, 0), text); + return vscode.workspace.applyEdit(edit); +} + +const invertGlob = (pattern) => pattern.replace(/^!/, ''); + +export const gitIgnoreFolders = () => { + const pathToLocalGitIgnore = workspaceRoot() + '/.gitignore'; + return fs.existsSync(pathToLocalGitIgnore) + ? gitignoreToGlob(pathToLocalGitIgnore).map(invertGlob) + : []; +}; + +export function removeContentFromFileAtLineAndColumn( + start, + end, + path, + replacement +) { + let edit = new vscode.WorkspaceEdit(); + edit.delete(activeURI(), new vscode.Range(start, end)); + return vscode.workspace.applyEdit(edit); +} + +function countLineInFile(file): Promise { + return new Promise((reoslve) => { + let i; + let count = 0; + fs.createReadStream(file) + .on('data', function (chunk) { + for (i = 0; i < chunk.length; ++i) { + if (chunk[i] === 10) { + count++; + } + } + }) + .on('end', function () { + reoslve(count); + }); + }); +} diff --git a/src/modules/extract-to-folder-template.ts b/src/modules/extract-to-folder-template.ts new file mode 100644 index 0000000..30f2e91 --- /dev/null +++ b/src/modules/extract-to-folder-template.ts @@ -0,0 +1,56 @@ +import {pascalCase} from "change-case"; + +export function getSpecText(componentName: string): any { + return `import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ${pascalCase( + componentName + )}Component } from './${componentName}.component'; + +describe('${pascalCase(componentName)}Component', () => { + let component: ${pascalCase(componentName)}Component; + let fixture: ComponentFixture<${pascalCase(componentName)}Component>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ${pascalCase(componentName)}Component ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(${pascalCase( + componentName + )}Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +});`; +} + +export function getComponentText(componentName: string, targets: string[]): string { + return `import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'app-${componentName}', + templateUrl: './${componentName}.component.html', + styleUrls: ['./${componentName}.component.css'] +}) +export class ${pascalCase(componentName)}Component { + constructor () {} + ${targets.map((target) => `@Input() ${target}`).join('\n')} +}`; +} + +export function getComponentInstance( + componentName: string, + targets: string[] +): string { + return ` `[${target}]="${target}"`) + .join(' ')}>`; +} diff --git a/src/modules/extract-to-folder.ts b/src/modules/extract-to-folder.ts new file mode 100644 index 0000000..d3ec73d --- /dev/null +++ b/src/modules/extract-to-folder.ts @@ -0,0 +1,122 @@ +import * as vscode from "vscode"; +import {activeFileName, getSelectedText, getSelectionOffsetRange, importMissingDependencies,} from "../editor"; +import {getAllTargets,} from "../template-parser"; +import {showFilePicker} from "../file-picker"; +import {createFileIfDoesntExist, persistFileSystemChanges, replaceTextInFile,} from "../file-system"; +import {pascalCase} from "change-case"; +import {appendSelectedTextToFile, replaceSelectionWith,} from "../code-actions"; +import {showDirectoryPicker} from "../directories-picker"; +import {getComponentInstance, getComponentText, getSpecText,} from "./extract-to-folder-template"; + +const fs = require("fs"); +const path = require("path"); + +export async function extractToFolder() { + const {start, end} = getSelectionOffsetRange(); + + if (start && end) { + try { + const text = getSelectedText() || ""; + const sourceComponentName = await getComponentNameFromHtmlFile( + activeFileName() + ); + + const targets = getAllTargets(text); + + try { + const folderPath = await showDirectoryPicker(); + const filePath = (await showFilePicker(folderPath)) as string; + + const parts = filePath.split("/"); + + const componentName = parts[parts.length - 1]; + + + const htmlFilePath = `${filePath}/${componentName}.component.html`; + const cssFilePath = `${filePath}/${componentName}.component.css`; + const tsFilePath = `${filePath}/${componentName}.component.ts`; + const specFilePath = `${filePath}/${componentName}.component.spec.ts`; + + await createFileIfDoesntExist(htmlFilePath); + await createFileIfDoesntExist(cssFilePath); + await createFileIfDoesntExist(tsFilePath); + await createFileIfDoesntExist(specFilePath); + + await appendSelectedTextToFile({text}, htmlFilePath); + await appendSelectedTextToFile({text: ``}, cssFilePath); + await appendSelectedTextToFile( + {text: getComponentText(componentName, targets)}, + tsFilePath + ); + await appendSelectedTextToFile( + {text: getSpecText(componentName)}, + specFilePath + ); + + const componentInstance = getComponentInstance(componentName, targets); + await persistFileSystemChanges(replaceSelectionWith(componentInstance)); + + const moduleUris = await vscode.workspace.findFiles( + "**/*.module.ts", + "**/node_modules/**" + ); + const moduleDocuments = await Promise.all( + moduleUris.map((uri) => vscode.workspace.openTextDocument(uri)) + ); + + const targetModuleDocuments = moduleDocuments.filter( + (moduleDocument) => { + const allText = moduleDocument.getText(); + return new RegExp(`\\b${sourceComponentName}\\b`).test(allText); + } + ); + + const changes = await Promise.all( + targetModuleDocuments.map((moduleDocument) => { + const allText = moduleDocument.getText(); + const matches = allText.match(/declarations\s*:\s*\[/) || []; + + const idx = matches.index || 0; + const startOffset = idx; + const endOffset = idx + matches[0].length; + + const start = moduleDocument.positionAt(startOffset); + const end = moduleDocument.positionAt(endOffset); + const targetText = `${matches[0]}\n ${pascalCase( + componentName + )}Component,`; + + return replaceTextInFile( + targetText, + start, + end, + moduleDocument.fileName + ); + }) + ); + + await persistFileSystemChanges(...changes); + await Promise.all( + targetModuleDocuments.map((moduleDocument) => { + return importMissingDependencies(moduleDocument.fileName); + }) + ); + } catch (e) { + vscode.window.showErrorMessage(e.message); + } + } catch (err) { + console.error(err); + } + } +} + +async function getComponentNameFromHtmlFile(filePath) { + const name = path.basename(filePath); + const dir = path.dirname(filePath); + + const tsPath = path.join(dir, name.replace(".html", ".ts")); + const tsContent = fs.readFileSync(tsPath, "utf-8"); + + return (tsContent.match(/export class\s+([\w_]+)/) || [])[1]; +} + diff --git a/src/template-parser.ts b/src/template-parser.ts new file mode 100644 index 0000000..264076c --- /dev/null +++ b/src/template-parser.ts @@ -0,0 +1,160 @@ +import * as ng from '@angular/compiler'; + +export const templateParser = { + locationProps: new Set([ + 'span', + 'sourceSpan', + 'startSourceSpan', + 'endSourceSpan', + ]), + typeProps: new Set(['name']), + + parse(code: string, options?: ng.ParseTemplateOptions) { + const ast = ng.parseTemplate(code, 'astexplorer.html', options); + fixSpan(ast, code); + return ast; + }, + + nodeToRange(node: any) { + if (node.startSourceSpan) { + if (node.endSourceSpan) { + return [ + node.startSourceSpan.start.offset, + node.endSourceSpan.end.offset, + ]; + } + return [ + node.startSourceSpan.start.offset, + node.startSourceSpan.end.offset, + ]; + } + if (node.sourceSpan) { + return [node.sourceSpan.start.offset, node.sourceSpan.end.offset]; + } + if (node.span) { + return [node.span.start, node.span.end]; + } + }, + + getNodeName(node: { name: any }) { + let name = getNodeCtor(node); + if (node.name) { + name += `(${node.name})`; + } + return name; + }, + + getDefaultOptions() { + return { + preserveWhitespaces: false, + }; + }, +}; + +export function getNodeCtor(node: { + name?: any; + sourceSpan?: { start: { offset: any } }; + constructor?: any; +}) { + return node.constructor && node.constructor.name; +} + +/** + * Locations from sub AST are counted from that part of string, + * we need to fix them to make autofocus work. + * + * Before: + * + * + * ^^^^^^^^^^ sub AST { start: 0, end: 10 } + * + * After: + * + * + * ^^^^^^^^^^ sub AST { start: 13, end: 23 } + */ +function fixSpan(ast: any, code: string) { + function getBaseStart(parent: { sourceSpan: { start: { offset: any } } }) { + const nodeName = getNodeCtor(parent); + switch (nodeName) { + case 'BoundAttribute': + case 'BoundEvent': { + let offset = parent.sourceSpan.start.offset; + while (code[offset++] !== '=') {} + if (code[offset] === "'" || code[offset] === '"') { + offset++; + } + return offset; + } + case 'BoundText': + return parent.sourceSpan.start.offset; + default: + throw new Error(`Unexpected node ${nodeName}`); + } + } + + visitTarget( + ast, + (value: any) => getNodeCtor(value) === 'ASTWithSource', + (node: any, parent: any) => { + const baseStart = getBaseStart(parent); + visitTarget( + node, + (value: any) => value.span, + (node: any) => { + node.span.start += baseStart; + node.span.end += baseStart; + return KEEP_VISIT; + } + ); + } + ); +} + +export const KEEP_VISIT = 1; + +export function visitTarget( + value: any, + isTarget: Function, + fn: Function, + parent?: any +) { + if (value !== null && typeof value === 'object') { + if (isTarget(value)) { + if (fn(value, parent) !== KEEP_VISIT) { + return; + } + } + if (Array.isArray(value)) { + value.forEach((subValue) => visitTarget(subValue, isTarget, fn, value)); + } else { + for (const key in value) { + visitTarget(value[key], isTarget, fn, value); + } + } + } +} + +export function getAllTargets(text) { + const output = templateParser.parse(text); + const ast = output.nodes; + const targets: string[] = []; + + visitTarget( + ast, + (value: any) => { + return ( + (getNodeCtor(value) === "PropertyRead" && + getNodeCtor(value.receiver) === "ImplicitReceiver") || + (getNodeCtor(value) === "MethodCall" && + getNodeCtor(value.receiver) === "ImplicitReceiver") + ); + }, + (node: any, parent: any) => { + targets.push(node.name); + return KEEP_VISIT; + } + ); + + return targets; +} \ No newline at end of file diff --git a/src/test/runTest.ts b/src/test/runTest.ts new file mode 100644 index 0000000..1eabfa3 --- /dev/null +++ b/src/test/runTest.ts @@ -0,0 +1,23 @@ +import * as path from 'path'; + +import { runTests } from 'vscode-test'; + +async function main() { + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); + + // The path to test runner + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, './suite/index'); + + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error('Failed to run tests'); + process.exit(1); + } +} + +main(); diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts new file mode 100644 index 0000000..08a6f78 --- /dev/null +++ b/src/test/suite/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.equal(-1, [1, 2, 3].indexOf(5)); + assert.equal(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts new file mode 100644 index 0000000..7029e38 --- /dev/null +++ b/src/test/suite/index.ts @@ -0,0 +1,38 @@ +import * as path from 'path'; +import * as Mocha from 'mocha'; +import * as glob from 'glob'; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + color: true + }); + + const testsRoot = path.resolve(__dirname, '..'); + + return new Promise((c, e) => { + glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + console.error(err); + e(err); + } + }); + }); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..018e9b1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": [ + "es6" + ], + "sourceMap": true, + "rootDir": "src", + "allowJs": true, + "strict": true, /* enable all strict type-checking options */ + "noImplicitAny": false + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + }, + "exclude": [ + "out", + "node_modules", + ".vscode-test" + ] +}