├── .github ├── dependabot.yml └── workflows │ ├── codeql-analysis.yml │ └── nodejs.yml ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── CONTRIBUTING.MD ├── LICENSE ├── README.md ├── images ├── demo-coffee.gif ├── demo-js.gif └── icon.png ├── package-lock.json ├── package.json ├── src ├── adapters │ ├── adapterFactory.ts │ ├── coffeeScriptAdapter.ts │ ├── javaScriptAdapter.ts │ └── tsAdapterInterface.d.ts ├── configUtils.ts ├── extension.ts ├── test │ ├── e2e │ │ ├── code-fixes │ │ │ ├── addMissingMember.test.ts │ │ │ ├── convertToAsyncFunction.test.ts │ │ │ ├── fixAwaitInSyncFunction.test.ts │ │ │ ├── fixExpectedComma.test.ts │ │ │ ├── fixUnreachableCode.test.ts │ │ │ ├── fixUnusedLabel.test.ts │ │ │ ├── forgottenThisPropertyAccess.test.ts │ │ │ ├── inferFromUsage.test.ts │ │ │ └── requireInTs.test.ts │ │ ├── examples │ │ │ ├── addMissingMember.js │ │ │ ├── convertToAsyncFunction.js │ │ │ ├── fixAwaitInSyncFunction.js │ │ │ ├── fixExpectedComma.js │ │ │ ├── fixUnreachableCode.js │ │ │ ├── fixUnusedLabel.js │ │ │ ├── forgottenThisPropertyAccess.js │ │ │ ├── inferFromUsage.js │ │ │ ├── requireInTs.js │ │ │ ├── testFile.coffee │ │ │ └── testFile.js │ │ └── file-formats │ │ │ └── fileFormats.test.ts │ ├── runTest.ts │ ├── suite │ │ └── index.ts │ ├── support.ts │ └── unit │ │ ├── adapters │ │ └── adapterFactory.test.ts │ │ └── configUtils.test.ts └── tsFile.ts ├── tsconfig.json └── tslint.json /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | time: "10:00" 8 | open-pull-requests-limit: 10 9 | ignore: 10 | - dependency-name: y18n 11 | versions: 12 | - 4.0.1 13 | - dependency-name: "@types/node" 14 | versions: 15 | - 14.14.22 16 | - 14.14.25 17 | - 14.14.28 18 | - 14.14.31 19 | - 14.14.32 20 | - 14.14.34 21 | - 14.14.35 22 | - 14.14.37 23 | - dependency-name: "@types/prettier" 24 | versions: 25 | - 2.2.0 26 | - 2.2.1 27 | - 2.2.2 28 | - dependency-name: mocha 29 | versions: 30 | - 8.3.0 31 | - 8.3.1 32 | - dependency-name: chai 33 | versions: 34 | - 4.3.0 35 | - 4.3.3 36 | - dependency-name: typescript 37 | versions: 38 | - 4.1.5 39 | - 4.2.2 40 | - 4.2.3 41 | - dependency-name: "@types/vscode" 42 | versions: 43 | - 1.53.0 44 | - 1.54.0 45 | - dependency-name: ts-morph 46 | versions: 47 | - 10.0.1 48 | - dependency-name: "@types/mocha" 49 | versions: 50 | - 8.2.1 51 | - dependency-name: vscode-test 52 | versions: 53 | - 1.5.0 54 | - 1.5.1 55 | - dependency-name: "@types/chai" 56 | versions: 57 | - 4.2.15 58 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | name: "CodeQL" 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | # The branches below must be a subset of the branches above 8 | branches: [ master ] 9 | schedule: 10 | - cron: '26 18 * * 3' 11 | 12 | jobs: 13 | analyze: 14 | name: Analyze 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | fail-fast: false 19 | matrix: 20 | language: [ 'javascript' ] 21 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 22 | # Learn more: 23 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 24 | 25 | steps: 26 | - name: Checkout repository 27 | uses: actions/checkout@v2 28 | 29 | # Initializes the CodeQL tools for scanning. 30 | - name: Initialize CodeQL 31 | uses: github/codeql-action/init@v1 32 | with: 33 | languages: ${{ matrix.language }} 34 | # If you wish to specify custom queries, you can do so here or in a config file. 35 | # By default, queries listed here will override any specified in a config file. 36 | # Prefix the list here with "+" to use these queries and those in the config file. 37 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 38 | 39 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 40 | # If this step fails, then you should remove it and run the build manually (see below) 41 | - name: Autobuild 42 | uses: github/codeql-action/autobuild@v1 43 | 44 | # ℹ️ Command-line programs to run using the OS shell. 45 | # 📚 https://git.io/JvXDl 46 | 47 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 48 | # and modify them (or add more) to build your code if your project 49 | # uses a compiled language 50 | 51 | #- run: | 52 | # make bootstrap 53 | # make release 54 | 55 | - name: Perform CodeQL Analysis 56 | uses: github/codeql-action/analyze@v1 57 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: GitHub Actions CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | build: 13 | runs-on: ${{ matrix.os }} 14 | strategy: 15 | matrix: 16 | os: [macOS-latest, windows-latest] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Use Node.js 12.x 21 | uses: actions/setup-node@v1 22 | with: 23 | node-version: 12.x 24 | - run: npm ci 25 | - run: npm run compile 26 | - run: npm test 27 | env: 28 | CI: true 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "ms-vscode.vscode-typescript-tslint-plugin" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "npm: watch" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "--disable-extensions", 28 | "--extensionDevelopmentPath=${workspaceFolder}", 29 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 30 | ], 31 | "outFiles": ["${workspaceFolder}/out/test/**/*.js"] 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off", 11 | "typescript.tsdk": "node_modules/typescript/lib", 12 | "javascript.validate.enable": false 13 | } 14 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | src/** 5 | .gitignore 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/tslint.json 9 | **/*.map 10 | **/*.ts -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 0.3.0 4 | 5 | - Include all relevant `decaffeinate` config flags in extension settings (https://github.com/alecclarke/to-typescript/pull/255) 6 | 7 | ## 0.2.3 8 | 9 | - Update dependencies 10 | 11 | ## 0.2.2 12 | 13 | - Update dependencies 14 | 15 | ## 0.2.1 16 | 17 | - Update dependencies 18 | 19 | ## 0.2.0 20 | 21 | - Update dependencies 22 | 23 | - Add the "Fix Expected Comma" codefix to list of refactors 24 | 25 | - Bump vscode extension compatibility version to `^1.47.0` 26 | 27 | ## 0.1.2 28 | 29 | - Update dependencies 30 | 31 | ## 0.1.1 32 | 33 | - Update dependencies 34 | 35 | ## 0.1.0 36 | 37 | - Initial release 38 | -------------------------------------------------------------------------------- /CONTRIBUTING.MD: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | :+1::tada: First off, thanks for taking the time to contribute! :tada::+1: 4 | 5 | When contributing to this repository, please first discuss the change you wish to make via an [issue](https://github.com/alecclarke/to-typescript/issues/new). 6 | 7 | ## Pull Request Process 8 | 9 | 1. Fork the repo 10 | 2. Clone the repo 11 | ``` 12 | $ git clone https://github.com//to-typescript.git 13 | ``` 14 | 3. Create a new branch for your intended changes 15 | ``` 16 | $ cd to-typescript 17 | $ git checkout -b my-new-branch 18 | ``` 19 | 4. Make your changes 20 | 5. Test your changes 21 | 6. Commit your changes 22 | 7. Open a pull request 23 | 24 | ## Commit messages 25 | 26 | Refrenced from http://chris.beams.io/posts/git-commit/, when writing commit messages for your change, use the following guidelines to do so: 27 | 28 | 1. Separate subject from body with a blank line 29 | 2. Limit the subject line to 50 characters 30 | 3. Capitalize the subject line 31 | 4. Do not end the subject line with a period 32 | 5. Use the imperative mood in the subject line 33 | 6. Wrap the body at 72 characters 34 | 35 | ## Testing 36 | `to-typescript` includes to test suites: 37 | - [e2e tests](https://github.com/alecclarke/to-typescript/tree/master/src/test/e2e) for testing the entire extension workflow. Typically there's an e2e test for each codefix and each language being converted. 38 | - [unit tests](https://github.com/alecclarke/to-typescript/tree/master/src/test/unit) for testing common uitilities and services used by the other components in the extension. 39 | 40 | Tests are run via the [VS Code debug launch](https://code.visualstudio.com/api/working-with-extensions/testing-extension#debugging-the-tests) with the "Extension Tests" config. 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Alec Clarke 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VS Code toTypeScript() 2 | 3 | Convert JavaScript/CoffeeScript to TypeScript! 4 | 5 | When `toTypeScript()` is run on JavaScript or CoffeeScript files, a TypeScript version of the file is created with TypeScript [Quick Fixes](https://code.visualstudio.com/docs/languages/typescript#_quick-fixes) applied to the newly created source. 6 | 7 | ## Usage 8 | Converting JavaScript 9 | ![JavaScript demo](images/demo-js.gif) 10 | 11 | Converting CoffeeScript 12 | ![CoffeeScript demo](images/demo-coffee.gif) 13 | 14 | **Note:** When `toTypeScript()` is run for CoffeeScript, the source is initially converted to JavaScript using [decaffeinate](https://github.com/decaffeinate/decaffeinate), then converted to TypeScript. 15 | 16 | ## toTypeScript() Settings 17 | 18 | toTypeScript provides the following configurations representing TypeScript [Quick Fixes](https://code.visualstudio.com/docs/languages/typescript#_quick-fixes) that will be run when converting files to TypeScript: 19 | 20 | | Setting name | Description | 21 | | --- | --- | 22 | | `toTypeScript.inferFromUsage` | Infer variable type from usage - default: `true` | 23 | | `toTypeScript.convertToAsyncFunction` | Rewrite functions that use `.then` Promise chaining to use `async` and `await` - default: `true` | 24 | | `toTypeScript.addMissingMember` | Declare missing class members - default: `true`| 25 | | `toTypeScript.forgottenThisPropertyAccess` | Add `this.` to unresolved variables - default: `true` | 26 | | `toTypeScript.fixAwaitInSyncFunction` | Add `async` modifier to containing functions using `await` - default: `true` | 27 | | `toTypeScript.fixExpectedComma` | Replace `;` to `,` within a list. - default: `true` | 28 | | `toTypeScript.requireInTs` | Convert `require` to `import` - default: `true` | 29 | | `toTypeScript.fixUnreachableCode` | Remove unreachable code - default: `true` | 30 | | `toTypeScript.fixUnusedLabel` | Remove unused labels - default: `true` | 31 | 32 | 33 | ## Release Notes 34 | 35 | ### 0.3.0 36 | 37 | - Include all relevant `decaffeinate` config flags in extension settings (https://github.com/alecclarke/to-typescript/pull/255) 38 | ### 0.2.3 39 | 40 | - Update dependencies. 41 | ### 0.2.2 42 | 43 | - Update dependencies. 44 | 45 | ### 0.2.1 46 | 47 | - Update dependencies. 48 | 49 | ### 0.2.0 50 | 51 | - Update dependencies 52 | 53 | - Add the "Fix Expected Comma" codefix to list of refactors 54 | 55 | - Bump vscode extension compatibility version to `^1.47.0` 56 | 57 | 58 | ### 0.1.2 59 | 60 | - Update dependencies. 61 | 62 | ### 0.1.1 63 | 64 | - Update dependencies. 65 | 66 | ### 0.1.0 67 | 68 | - Initial release. 69 | -------------------------------------------------------------------------------- /images/demo-coffee.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alecclarke/to-typescript/917e55bd9e56bdb313a4a69f20483931a2c3dd02/images/demo-coffee.gif -------------------------------------------------------------------------------- /images/demo-js.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alecclarke/to-typescript/917e55bd9e56bdb313a4a69f20483931a2c3dd02/images/demo-js.gif -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alecclarke/to-typescript/917e55bd9e56bdb313a4a69f20483931a2c3dd02/images/icon.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "to-typescript", 3 | "version": "0.3.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.14.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 10 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 11 | "requires": { 12 | "@babel/highlight": "^7.14.5" 13 | } 14 | }, 15 | "@babel/compat-data": { 16 | "version": "7.15.0", 17 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", 18 | "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" 19 | }, 20 | "@babel/core": { 21 | "version": "7.15.0", 22 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", 23 | "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", 24 | "requires": { 25 | "@babel/code-frame": "^7.14.5", 26 | "@babel/generator": "^7.15.0", 27 | "@babel/helper-compilation-targets": "^7.15.0", 28 | "@babel/helper-module-transforms": "^7.15.0", 29 | "@babel/helpers": "^7.14.8", 30 | "@babel/parser": "^7.15.0", 31 | "@babel/template": "^7.14.5", 32 | "@babel/traverse": "^7.15.0", 33 | "@babel/types": "^7.15.0", 34 | "convert-source-map": "^1.7.0", 35 | "debug": "^4.1.0", 36 | "gensync": "^1.0.0-beta.2", 37 | "json5": "^2.1.2", 38 | "semver": "^6.3.0", 39 | "source-map": "^0.5.0" 40 | } 41 | }, 42 | "@babel/generator": { 43 | "version": "7.15.0", 44 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", 45 | "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", 46 | "requires": { 47 | "@babel/types": "^7.15.0", 48 | "jsesc": "^2.5.1", 49 | "source-map": "^0.5.0" 50 | } 51 | }, 52 | "@babel/helper-compilation-targets": { 53 | "version": "7.15.0", 54 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", 55 | "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", 56 | "requires": { 57 | "@babel/compat-data": "^7.15.0", 58 | "@babel/helper-validator-option": "^7.14.5", 59 | "browserslist": "^4.16.6", 60 | "semver": "^6.3.0" 61 | } 62 | }, 63 | "@babel/helper-function-name": { 64 | "version": "7.14.5", 65 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", 66 | "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", 67 | "requires": { 68 | "@babel/helper-get-function-arity": "^7.14.5", 69 | "@babel/template": "^7.14.5", 70 | "@babel/types": "^7.14.5" 71 | } 72 | }, 73 | "@babel/helper-get-function-arity": { 74 | "version": "7.14.5", 75 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", 76 | "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", 77 | "requires": { 78 | "@babel/types": "^7.14.5" 79 | } 80 | }, 81 | "@babel/helper-hoist-variables": { 82 | "version": "7.14.5", 83 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", 84 | "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", 85 | "requires": { 86 | "@babel/types": "^7.14.5" 87 | } 88 | }, 89 | "@babel/helper-member-expression-to-functions": { 90 | "version": "7.15.0", 91 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", 92 | "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", 93 | "requires": { 94 | "@babel/types": "^7.15.0" 95 | } 96 | }, 97 | "@babel/helper-module-imports": { 98 | "version": "7.14.5", 99 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", 100 | "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", 101 | "requires": { 102 | "@babel/types": "^7.14.5" 103 | } 104 | }, 105 | "@babel/helper-module-transforms": { 106 | "version": "7.15.0", 107 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", 108 | "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", 109 | "requires": { 110 | "@babel/helper-module-imports": "^7.14.5", 111 | "@babel/helper-replace-supers": "^7.15.0", 112 | "@babel/helper-simple-access": "^7.14.8", 113 | "@babel/helper-split-export-declaration": "^7.14.5", 114 | "@babel/helper-validator-identifier": "^7.14.9", 115 | "@babel/template": "^7.14.5", 116 | "@babel/traverse": "^7.15.0", 117 | "@babel/types": "^7.15.0" 118 | } 119 | }, 120 | "@babel/helper-optimise-call-expression": { 121 | "version": "7.14.5", 122 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", 123 | "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", 124 | "requires": { 125 | "@babel/types": "^7.14.5" 126 | } 127 | }, 128 | "@babel/helper-replace-supers": { 129 | "version": "7.15.0", 130 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", 131 | "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", 132 | "requires": { 133 | "@babel/helper-member-expression-to-functions": "^7.15.0", 134 | "@babel/helper-optimise-call-expression": "^7.14.5", 135 | "@babel/traverse": "^7.15.0", 136 | "@babel/types": "^7.15.0" 137 | } 138 | }, 139 | "@babel/helper-simple-access": { 140 | "version": "7.14.8", 141 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", 142 | "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", 143 | "requires": { 144 | "@babel/types": "^7.14.8" 145 | } 146 | }, 147 | "@babel/helper-split-export-declaration": { 148 | "version": "7.14.5", 149 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", 150 | "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", 151 | "requires": { 152 | "@babel/types": "^7.14.5" 153 | } 154 | }, 155 | "@babel/helper-validator-identifier": { 156 | "version": "7.14.9", 157 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", 158 | "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" 159 | }, 160 | "@babel/helper-validator-option": { 161 | "version": "7.14.5", 162 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", 163 | "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" 164 | }, 165 | "@babel/helpers": { 166 | "version": "7.15.3", 167 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", 168 | "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", 169 | "requires": { 170 | "@babel/template": "^7.14.5", 171 | "@babel/traverse": "^7.15.0", 172 | "@babel/types": "^7.15.0" 173 | } 174 | }, 175 | "@babel/highlight": { 176 | "version": "7.14.5", 177 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 178 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 179 | "requires": { 180 | "@babel/helper-validator-identifier": "^7.14.5", 181 | "chalk": "^2.0.0", 182 | "js-tokens": "^4.0.0" 183 | } 184 | }, 185 | "@babel/parser": { 186 | "version": "7.15.3", 187 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", 188 | "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==" 189 | }, 190 | "@babel/template": { 191 | "version": "7.14.5", 192 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", 193 | "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", 194 | "requires": { 195 | "@babel/code-frame": "^7.14.5", 196 | "@babel/parser": "^7.14.5", 197 | "@babel/types": "^7.14.5" 198 | } 199 | }, 200 | "@babel/traverse": { 201 | "version": "7.15.0", 202 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", 203 | "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", 204 | "requires": { 205 | "@babel/code-frame": "^7.14.5", 206 | "@babel/generator": "^7.15.0", 207 | "@babel/helper-function-name": "^7.14.5", 208 | "@babel/helper-hoist-variables": "^7.14.5", 209 | "@babel/helper-split-export-declaration": "^7.14.5", 210 | "@babel/parser": "^7.15.0", 211 | "@babel/types": "^7.15.0", 212 | "debug": "^4.1.0", 213 | "globals": "^11.1.0" 214 | } 215 | }, 216 | "@babel/types": { 217 | "version": "7.15.0", 218 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", 219 | "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", 220 | "requires": { 221 | "@babel/helper-validator-identifier": "^7.14.9", 222 | "to-fast-properties": "^2.0.0" 223 | } 224 | }, 225 | "@codemod/core": { 226 | "version": "1.1.1", 227 | "resolved": "https://registry.npmjs.org/@codemod/core/-/core-1.1.1.tgz", 228 | "integrity": "sha512-NxoDLIBbNDP4PcnHfkLkjWind6Ma7GEGoaTsxUwDOPbau2m+7i0Zjg7aPcIps8JTc/Q7/fagGee7JqjYrmdv5w==", 229 | "requires": { 230 | "@babel/core": "^7.15.0", 231 | "@babel/generator": "^7.15.0", 232 | "@codemod/parser": "^1.1.1", 233 | "recast": "^0.19.0", 234 | "resolve": "^1.12.0" 235 | } 236 | }, 237 | "@codemod/parser": { 238 | "version": "1.1.1", 239 | "resolved": "https://registry.npmjs.org/@codemod/parser/-/parser-1.1.1.tgz", 240 | "integrity": "sha512-1emGy2cJ1xH1fouV0tDDwz2vpXHNmMCo54BWfcuLYGVErjWb+0YPCDsGvFA9aP6nHkSQYRLVNx1IThmLOb9zRQ==", 241 | "requires": { 242 | "@babel/parser": "^7.15.3" 243 | } 244 | }, 245 | "@dsherret/to-absolute-glob": { 246 | "version": "2.0.2", 247 | "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 248 | "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", 249 | "requires": { 250 | "is-absolute": "^1.0.0", 251 | "is-negated-glob": "^1.0.0" 252 | } 253 | }, 254 | "@nodelib/fs.scandir": { 255 | "version": "2.1.4", 256 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", 257 | "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", 258 | "requires": { 259 | "@nodelib/fs.stat": "2.0.4", 260 | "run-parallel": "^1.1.9" 261 | } 262 | }, 263 | "@nodelib/fs.stat": { 264 | "version": "2.0.4", 265 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", 266 | "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" 267 | }, 268 | "@nodelib/fs.walk": { 269 | "version": "1.2.6", 270 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", 271 | "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", 272 | "requires": { 273 | "@nodelib/fs.scandir": "2.1.4", 274 | "fastq": "^1.6.0" 275 | } 276 | }, 277 | "@resugar/codemod-declarations-block-scope": { 278 | "version": "1.0.3", 279 | "resolved": "https://registry.npmjs.org/@resugar/codemod-declarations-block-scope/-/codemod-declarations-block-scope-1.0.3.tgz", 280 | "integrity": "sha512-jnoNiz/PY4zZXPaLIeiKkGX6xau83Vn2lJRffIKuTPRMRTegFD2G7MmjxgZx9htJ/H9huqKJIhhqfj4VbuaDbA==" 281 | }, 282 | "@resugar/codemod-functions-arrow": { 283 | "version": "1.0.2", 284 | "resolved": "https://registry.npmjs.org/@resugar/codemod-functions-arrow/-/codemod-functions-arrow-1.0.2.tgz", 285 | "integrity": "sha512-6dfHOEIxZw6sc0auiDpELDRYGFfVhrJwc6xN4JxpGE9vc3Hg954svu8MhedSV7VTVSClLv4CE0RvUOD+09DAuw==", 286 | "requires": { 287 | "@resugar/helper-comments": "^1.0.0" 288 | } 289 | }, 290 | "@resugar/codemod-modules-commonjs": { 291 | "version": "1.0.5", 292 | "resolved": "https://registry.npmjs.org/@resugar/codemod-modules-commonjs/-/codemod-modules-commonjs-1.0.5.tgz", 293 | "integrity": "sha512-A1lBMZWNEUFpmSGgTRzEaRUOWxZ/aNjil2ekCfjiITRJ3UrvsSF7PIPgv5waKzsgimtiQ0Wm+fcqFko0itZ21A==", 294 | "requires": { 295 | "@resugar/helper-comments": "^1.0.0" 296 | } 297 | }, 298 | "@resugar/codemod-objects-concise": { 299 | "version": "1.0.2", 300 | "resolved": "https://registry.npmjs.org/@resugar/codemod-objects-concise/-/codemod-objects-concise-1.0.2.tgz", 301 | "integrity": "sha512-Qf/zKkBzfGg1Q+2HSrssPllKYrwLxuDF/p39pz10keJtAhkYEcCbWcaHJRr5TgV9Pl9qnzzMImP9TG6KBwx7eA==" 302 | }, 303 | "@resugar/codemod-objects-destructuring": { 304 | "version": "1.0.1", 305 | "resolved": "https://registry.npmjs.org/@resugar/codemod-objects-destructuring/-/codemod-objects-destructuring-1.0.1.tgz", 306 | "integrity": "sha512-xvJ1YAsV3/eSgL7BaSXRNnnz3B8f+dv+KNpi/07RF46L5ah3E8TLb2Ge/IgJB9lz/mhTDfB+pmFem9J3ndfN6w==" 307 | }, 308 | "@resugar/codemod-objects-shorthand": { 309 | "version": "1.0.1", 310 | "resolved": "https://registry.npmjs.org/@resugar/codemod-objects-shorthand/-/codemod-objects-shorthand-1.0.1.tgz", 311 | "integrity": "sha512-1QZxpc2cX1DgxAWPDrp4l9VD1d+RZrqOXcXuckQmEIHr5TeSOhdBs2r3zFEbijxCTKD7fWsFgkas7LKh+KqGvQ==", 312 | "requires": { 313 | "@resugar/helper-comments": "^1.0.0" 314 | } 315 | }, 316 | "@resugar/codemod-strings-template": { 317 | "version": "1.0.1", 318 | "resolved": "https://registry.npmjs.org/@resugar/codemod-strings-template/-/codemod-strings-template-1.0.1.tgz", 319 | "integrity": "sha512-ruVwOE67lmFGiyVr8I60l5lEDi0xKk1FYXyTGKMZdiiM2+W+L/qquOEqZmxOPA/xDNc5JG9VZXQ+4TZH9HqYxw==" 320 | }, 321 | "@resugar/helper-comments": { 322 | "version": "1.0.2", 323 | "resolved": "https://registry.npmjs.org/@resugar/helper-comments/-/helper-comments-1.0.2.tgz", 324 | "integrity": "sha512-AXXKDyRcTN3naXhfvu/2mWX5OTc4RqlJIERCfnFs+M2VrawqoZU+oFS3L4ZsdP+/4rcofMCs9CMsYKc4S40PPQ==" 325 | }, 326 | "@ts-morph/common": { 327 | "version": "0.7.2", 328 | "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.7.2.tgz", 329 | "integrity": "sha512-XyUPLf1UHtteP5C5FEgVJqgIEOcmaSEoJyU/jQ1gTBKlz/lb1Uss4ix+D2e5qRwPFiBMqM/jwJpna0yVDE5V/g==", 330 | "requires": { 331 | "@dsherret/to-absolute-glob": "^2.0.2", 332 | "fast-glob": "^3.2.4", 333 | "is-negated-glob": "^1.0.0", 334 | "mkdirp": "^1.0.4", 335 | "multimatch": "^5.0.0", 336 | "typescript": "~4.1.2" 337 | }, 338 | "dependencies": { 339 | "typescript": { 340 | "version": "4.1.3", 341 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", 342 | "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==" 343 | } 344 | } 345 | }, 346 | "@types/chai": { 347 | "version": "4.2.11", 348 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", 349 | "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", 350 | "dev": true 351 | }, 352 | "@types/glob": { 353 | "version": "7.1.2", 354 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", 355 | "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", 356 | "dev": true, 357 | "requires": { 358 | "@types/minimatch": "*", 359 | "@types/node": "*" 360 | } 361 | }, 362 | "@types/minimatch": { 363 | "version": "3.0.3", 364 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", 365 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" 366 | }, 367 | "@types/mocha": { 368 | "version": "9.1.0", 369 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", 370 | "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", 371 | "dev": true 372 | }, 373 | "@types/node": { 374 | "version": "13.13.0", 375 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.0.tgz", 376 | "integrity": "sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==", 377 | "dev": true 378 | }, 379 | "@types/prettier": { 380 | "version": "2.0.1", 381 | "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", 382 | "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==", 383 | "dev": true 384 | }, 385 | "@types/vscode": { 386 | "version": "1.47.0", 387 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.47.0.tgz", 388 | "integrity": "sha512-nJA37ykkz9FYA0ZOQUSc3OZnhuzEW2vUhUEo4MiduUo82jGwwcLfyvmgd/Q7b0WrZAAceojGhZybg319L24bTA==", 389 | "dev": true 390 | }, 391 | "@ungap/promise-all-settled": { 392 | "version": "1.1.2", 393 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 394 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 395 | "dev": true 396 | }, 397 | "add-variable-declarations": { 398 | "version": "4.0.7", 399 | "resolved": "https://registry.npmjs.org/add-variable-declarations/-/add-variable-declarations-4.0.7.tgz", 400 | "integrity": "sha512-SMjwvYGKrpk8CIN5K4LYpR54k9XpNmUdZLXOCvQvSvYnYTsvprouAuktct+ysSn1v2YVjQy4Du6JxwGhRV7Y1g==", 401 | "requires": { 402 | "@babel/traverse": "^7.6.2", 403 | "@babel/types": "^7.6.1", 404 | "@codemod/parser": "^1.0.3", 405 | "magic-string": "^0.25.3" 406 | } 407 | }, 408 | "agent-base": { 409 | "version": "4.3.0", 410 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 411 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 412 | "dev": true, 413 | "requires": { 414 | "es6-promisify": "^5.0.0" 415 | } 416 | }, 417 | "ansi-colors": { 418 | "version": "4.1.1", 419 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 420 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 421 | "dev": true 422 | }, 423 | "ansi-regex": { 424 | "version": "5.0.1", 425 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 426 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 427 | "dev": true 428 | }, 429 | "ansi-styles": { 430 | "version": "3.2.1", 431 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 432 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 433 | "requires": { 434 | "color-convert": "^1.9.0" 435 | } 436 | }, 437 | "any-promise": { 438 | "version": "1.3.0", 439 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 440 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 441 | }, 442 | "anymatch": { 443 | "version": "3.1.3", 444 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 445 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 446 | "dev": true, 447 | "requires": { 448 | "normalize-path": "^3.0.0", 449 | "picomatch": "^2.0.4" 450 | } 451 | }, 452 | "argparse": { 453 | "version": "2.0.1", 454 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 455 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 456 | "dev": true 457 | }, 458 | "array-differ": { 459 | "version": "3.0.0", 460 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", 461 | "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==" 462 | }, 463 | "array-union": { 464 | "version": "2.1.0", 465 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 466 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" 467 | }, 468 | "arrify": { 469 | "version": "2.0.1", 470 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 471 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" 472 | }, 473 | "assertion-error": { 474 | "version": "1.1.0", 475 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 476 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 477 | "dev": true 478 | }, 479 | "ast-types": { 480 | "version": "0.13.3", 481 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz", 482 | "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==" 483 | }, 484 | "automatic-semicolon-insertion": { 485 | "version": "2.0.6", 486 | "resolved": "https://registry.npmjs.org/automatic-semicolon-insertion/-/automatic-semicolon-insertion-2.0.6.tgz", 487 | "integrity": "sha512-A06m1ZlU+Dg817Z13ZcztQnuygkvj+Zg/+hXwthV0WfVsjEu44LEmQMxo+YNf+c6TJB7Pf5lzYtWBG+JALe5/w==", 488 | "requires": { 489 | "@babel/traverse": "^7.15.0", 490 | "@babel/types": "^7.15.0" 491 | } 492 | }, 493 | "balanced-match": { 494 | "version": "1.0.0", 495 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 496 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 497 | }, 498 | "binary-extensions": { 499 | "version": "2.2.0", 500 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 501 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 502 | "dev": true 503 | }, 504 | "brace-expansion": { 505 | "version": "1.1.11", 506 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 507 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 508 | "requires": { 509 | "balanced-match": "^1.0.0", 510 | "concat-map": "0.0.1" 511 | } 512 | }, 513 | "braces": { 514 | "version": "3.0.2", 515 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 516 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 517 | "requires": { 518 | "fill-range": "^7.0.1" 519 | } 520 | }, 521 | "browser-stdout": { 522 | "version": "1.3.1", 523 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 524 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 525 | "dev": true 526 | }, 527 | "browserslist": { 528 | "version": "4.16.8", 529 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", 530 | "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", 531 | "requires": { 532 | "caniuse-lite": "^1.0.30001251", 533 | "colorette": "^1.3.0", 534 | "electron-to-chromium": "^1.3.811", 535 | "escalade": "^3.1.1", 536 | "node-releases": "^1.1.75" 537 | } 538 | }, 539 | "camelcase": { 540 | "version": "6.3.0", 541 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 542 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 543 | "dev": true 544 | }, 545 | "caniuse-lite": { 546 | "version": "1.0.30001251", 547 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", 548 | "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==" 549 | }, 550 | "chai": { 551 | "version": "4.2.0", 552 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 553 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 554 | "dev": true, 555 | "requires": { 556 | "assertion-error": "^1.1.0", 557 | "check-error": "^1.0.2", 558 | "deep-eql": "^3.0.1", 559 | "get-func-name": "^2.0.0", 560 | "pathval": "^1.1.0", 561 | "type-detect": "^4.0.5" 562 | } 563 | }, 564 | "chalk": { 565 | "version": "2.4.2", 566 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 567 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 568 | "requires": { 569 | "ansi-styles": "^3.2.1", 570 | "escape-string-regexp": "^1.0.5", 571 | "supports-color": "^5.3.0" 572 | } 573 | }, 574 | "check-error": { 575 | "version": "1.0.2", 576 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 577 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 578 | "dev": true 579 | }, 580 | "chokidar": { 581 | "version": "3.5.3", 582 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 583 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 584 | "dev": true, 585 | "requires": { 586 | "anymatch": "~3.1.2", 587 | "braces": "~3.0.2", 588 | "fsevents": "~2.3.2", 589 | "glob-parent": "~5.1.2", 590 | "is-binary-path": "~2.1.0", 591 | "is-glob": "~4.0.1", 592 | "normalize-path": "~3.0.0", 593 | "readdirp": "~3.6.0" 594 | } 595 | }, 596 | "cliui": { 597 | "version": "7.0.4", 598 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 599 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 600 | "dev": true, 601 | "requires": { 602 | "string-width": "^4.2.0", 603 | "strip-ansi": "^6.0.0", 604 | "wrap-ansi": "^7.0.0" 605 | } 606 | }, 607 | "code-block-writer": { 608 | "version": "10.1.1", 609 | "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", 610 | "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==" 611 | }, 612 | "coffee-lex": { 613 | "version": "9.1.5", 614 | "resolved": "https://registry.npmjs.org/coffee-lex/-/coffee-lex-9.1.5.tgz", 615 | "integrity": "sha512-94lUMjs1vhlV86vnbCCnnIYzR4oszuO4qJzKUuKOLidiksh/UyQFOzPusjmLJt6vy5CNB0d/KtaceqV84zr46g==" 616 | }, 617 | "color-convert": { 618 | "version": "1.9.3", 619 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 620 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 621 | "requires": { 622 | "color-name": "1.1.3" 623 | } 624 | }, 625 | "color-name": { 626 | "version": "1.1.3", 627 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 628 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 629 | }, 630 | "colorette": { 631 | "version": "1.3.0", 632 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", 633 | "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" 634 | }, 635 | "concat-map": { 636 | "version": "0.0.1", 637 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 638 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 639 | }, 640 | "convert-source-map": { 641 | "version": "1.8.0", 642 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 643 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 644 | "requires": { 645 | "safe-buffer": "~5.1.1" 646 | } 647 | }, 648 | "debug": { 649 | "version": "4.3.2", 650 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 651 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 652 | "requires": { 653 | "ms": "2.1.2" 654 | } 655 | }, 656 | "decaffeinate": { 657 | "version": "6.1.9", 658 | "resolved": "https://registry.npmjs.org/decaffeinate/-/decaffeinate-6.1.9.tgz", 659 | "integrity": "sha512-mJeA5Io6TR3XfOVLoHO77YWeJ254X5IGMnAHR7JxOIL19E8KvMMwnYf6HXvxIQ1+GzFJ21BJIThNNtv/KYNYtA==", 660 | "requires": { 661 | "@codemod/core": "^1.1.0", 662 | "@codemod/parser": "^1.1.0", 663 | "@resugar/codemod-declarations-block-scope": "^1.0.2", 664 | "@resugar/codemod-functions-arrow": "^1.0.2", 665 | "@resugar/codemod-modules-commonjs": "^1.0.4", 666 | "@resugar/codemod-objects-concise": "^1.0.2", 667 | "@resugar/codemod-objects-destructuring": "^1.0.1", 668 | "@resugar/codemod-objects-shorthand": "^1.0.1", 669 | "@resugar/codemod-strings-template": "^1.0.1", 670 | "add-variable-declarations": "^4.0.7", 671 | "automatic-semicolon-insertion": "^2.0.5", 672 | "coffee-lex": "^9.1.5", 673 | "decaffeinate-coffeescript": "1.12.7-patch.3", 674 | "decaffeinate-coffeescript2": "2.2.1-patch.5", 675 | "decaffeinate-parser": "^22.5.15", 676 | "detect-indent": "^4.0.0", 677 | "lines-and-columns": "^1.1.6", 678 | "magic-string": "^0.25.7", 679 | "mz": "^2.7.0", 680 | "tslib": "^2.1.0" 681 | }, 682 | "dependencies": { 683 | "decaffeinate-coffeescript2": { 684 | "version": "2.2.1-patch.5", 685 | "resolved": "https://registry.npmjs.org/decaffeinate-coffeescript2/-/decaffeinate-coffeescript2-2.2.1-patch.5.tgz", 686 | "integrity": "sha512-VlI2TQNRj9U/wifgs2kB+LzzfhMkrJAW7RlLWY8yZSafM3O2HaTHzpZE4mDRfEnioAaD/SV/FCuCQ73vCJnrVw==" 687 | } 688 | } 689 | }, 690 | "decaffeinate-coffeescript": { 691 | "version": "1.12.7-patch.3", 692 | "resolved": "https://registry.npmjs.org/decaffeinate-coffeescript/-/decaffeinate-coffeescript-1.12.7-patch.3.tgz", 693 | "integrity": "sha512-4NshbupYgQsVm/jOosp/nen1MWi43i1/z0I+F1JQQ8sNpS6SvvJWYwMayfuYkE/c/5mK3ISWu2H9OyPZYwtMLg==" 694 | }, 695 | "decaffeinate-parser": { 696 | "version": "22.5.15", 697 | "resolved": "https://registry.npmjs.org/decaffeinate-parser/-/decaffeinate-parser-22.5.15.tgz", 698 | "integrity": "sha512-c7cqxeL77vAUZOBVQ4MzpESMqOCfNvYtJ7vW7wpKWGc4ux3L2QI/CcpR5VWt/ovMDz9CfhycTIgXqC2+GmjG2A==", 699 | "requires": { 700 | "@babel/types": "^7.6.1", 701 | "@codemod/parser": "^1.0.3", 702 | "coffee-lex": "^9.1.5", 703 | "decaffeinate-coffeescript": "1.12.7-patch.3", 704 | "decaffeinate-coffeescript2": "2.2.1-patch.5", 705 | "lines-and-columns": "^1.1.6" 706 | }, 707 | "dependencies": { 708 | "decaffeinate-coffeescript2": { 709 | "version": "2.2.1-patch.5", 710 | "resolved": "https://registry.npmjs.org/decaffeinate-coffeescript2/-/decaffeinate-coffeescript2-2.2.1-patch.5.tgz", 711 | "integrity": "sha512-VlI2TQNRj9U/wifgs2kB+LzzfhMkrJAW7RlLWY8yZSafM3O2HaTHzpZE4mDRfEnioAaD/SV/FCuCQ73vCJnrVw==" 712 | } 713 | } 714 | }, 715 | "decamelize": { 716 | "version": "4.0.0", 717 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 718 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 719 | "dev": true 720 | }, 721 | "deep-eql": { 722 | "version": "3.0.1", 723 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 724 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 725 | "dev": true, 726 | "requires": { 727 | "type-detect": "^4.0.0" 728 | } 729 | }, 730 | "detect-indent": { 731 | "version": "4.0.0", 732 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", 733 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", 734 | "requires": { 735 | "repeating": "^2.0.0" 736 | } 737 | }, 738 | "diff": { 739 | "version": "5.0.0", 740 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 741 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 742 | "dev": true 743 | }, 744 | "electron-to-chromium": { 745 | "version": "1.3.814", 746 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.814.tgz", 747 | "integrity": "sha512-0mH03cyjh6OzMlmjauGg0TLd87ErIJqWiYxMcOLKf5w6p0YEOl7DJAj7BDlXEFmCguY5CQaKVOiMjAMODO2XDw==" 748 | }, 749 | "emoji-regex": { 750 | "version": "8.0.0", 751 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 752 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 753 | "dev": true 754 | }, 755 | "es6-promise": { 756 | "version": "4.2.8", 757 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 758 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 759 | "dev": true 760 | }, 761 | "es6-promisify": { 762 | "version": "5.0.0", 763 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 764 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 765 | "dev": true, 766 | "requires": { 767 | "es6-promise": "^4.0.3" 768 | } 769 | }, 770 | "escalade": { 771 | "version": "3.1.1", 772 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 773 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 774 | }, 775 | "escape-string-regexp": { 776 | "version": "1.0.5", 777 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 778 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 779 | }, 780 | "esprima": { 781 | "version": "4.0.1", 782 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 783 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 784 | }, 785 | "fast-glob": { 786 | "version": "3.2.4", 787 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", 788 | "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", 789 | "requires": { 790 | "@nodelib/fs.stat": "^2.0.2", 791 | "@nodelib/fs.walk": "^1.2.3", 792 | "glob-parent": "^5.1.0", 793 | "merge2": "^1.3.0", 794 | "micromatch": "^4.0.2", 795 | "picomatch": "^2.2.1" 796 | } 797 | }, 798 | "fastq": { 799 | "version": "1.10.0", 800 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", 801 | "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", 802 | "requires": { 803 | "reusify": "^1.0.4" 804 | } 805 | }, 806 | "fill-range": { 807 | "version": "7.0.1", 808 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 809 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 810 | "requires": { 811 | "to-regex-range": "^5.0.1" 812 | } 813 | }, 814 | "find-up": { 815 | "version": "5.0.0", 816 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 817 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 818 | "dev": true, 819 | "requires": { 820 | "locate-path": "^6.0.0", 821 | "path-exists": "^4.0.0" 822 | } 823 | }, 824 | "flat": { 825 | "version": "5.0.2", 826 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 827 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 828 | "dev": true 829 | }, 830 | "fs.realpath": { 831 | "version": "1.0.0", 832 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 833 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 834 | "dev": true 835 | }, 836 | "fsevents": { 837 | "version": "2.3.2", 838 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 839 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 840 | "dev": true, 841 | "optional": true 842 | }, 843 | "function-bind": { 844 | "version": "1.1.1", 845 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 846 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 847 | }, 848 | "gensync": { 849 | "version": "1.0.0-beta.2", 850 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 851 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" 852 | }, 853 | "get-caller-file": { 854 | "version": "2.0.5", 855 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 856 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 857 | "dev": true 858 | }, 859 | "get-func-name": { 860 | "version": "2.0.0", 861 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 862 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 863 | "dev": true 864 | }, 865 | "glob": { 866 | "version": "7.1.6", 867 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 868 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 869 | "dev": true, 870 | "requires": { 871 | "fs.realpath": "^1.0.0", 872 | "inflight": "^1.0.4", 873 | "inherits": "2", 874 | "minimatch": "^3.0.4", 875 | "once": "^1.3.0", 876 | "path-is-absolute": "^1.0.0" 877 | } 878 | }, 879 | "glob-parent": { 880 | "version": "5.1.2", 881 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 882 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 883 | "requires": { 884 | "is-glob": "^4.0.1" 885 | } 886 | }, 887 | "globals": { 888 | "version": "11.12.0", 889 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 890 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" 891 | }, 892 | "growl": { 893 | "version": "1.10.5", 894 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 895 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 896 | "dev": true 897 | }, 898 | "has": { 899 | "version": "1.0.3", 900 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 901 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 902 | "requires": { 903 | "function-bind": "^1.1.1" 904 | } 905 | }, 906 | "has-flag": { 907 | "version": "3.0.0", 908 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 909 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 910 | }, 911 | "he": { 912 | "version": "1.2.0", 913 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 914 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 915 | "dev": true 916 | }, 917 | "http-proxy-agent": { 918 | "version": "2.1.0", 919 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 920 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 921 | "dev": true, 922 | "requires": { 923 | "agent-base": "4", 924 | "debug": "3.1.0" 925 | }, 926 | "dependencies": { 927 | "debug": { 928 | "version": "3.1.0", 929 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 930 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 931 | "dev": true, 932 | "requires": { 933 | "ms": "2.0.0" 934 | } 935 | }, 936 | "ms": { 937 | "version": "2.0.0", 938 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 939 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 940 | "dev": true 941 | } 942 | } 943 | }, 944 | "https-proxy-agent": { 945 | "version": "2.2.4", 946 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 947 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 948 | "dev": true, 949 | "requires": { 950 | "agent-base": "^4.3.0", 951 | "debug": "^3.1.0" 952 | }, 953 | "dependencies": { 954 | "debug": { 955 | "version": "3.2.6", 956 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 957 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 958 | "dev": true, 959 | "requires": { 960 | "ms": "^2.1.1" 961 | } 962 | } 963 | } 964 | }, 965 | "inflight": { 966 | "version": "1.0.6", 967 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 968 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 969 | "dev": true, 970 | "requires": { 971 | "once": "^1.3.0", 972 | "wrappy": "1" 973 | } 974 | }, 975 | "inherits": { 976 | "version": "2.0.4", 977 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 978 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 979 | "dev": true 980 | }, 981 | "is-absolute": { 982 | "version": "1.0.0", 983 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 984 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 985 | "requires": { 986 | "is-relative": "^1.0.0", 987 | "is-windows": "^1.0.1" 988 | } 989 | }, 990 | "is-binary-path": { 991 | "version": "2.1.0", 992 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 993 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 994 | "dev": true, 995 | "requires": { 996 | "binary-extensions": "^2.0.0" 997 | } 998 | }, 999 | "is-core-module": { 1000 | "version": "2.6.0", 1001 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", 1002 | "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", 1003 | "requires": { 1004 | "has": "^1.0.3" 1005 | } 1006 | }, 1007 | "is-extglob": { 1008 | "version": "2.1.1", 1009 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1010 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1011 | }, 1012 | "is-finite": { 1013 | "version": "1.1.0", 1014 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", 1015 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" 1016 | }, 1017 | "is-fullwidth-code-point": { 1018 | "version": "3.0.0", 1019 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1020 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1021 | "dev": true 1022 | }, 1023 | "is-glob": { 1024 | "version": "4.0.1", 1025 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1026 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1027 | "requires": { 1028 | "is-extglob": "^2.1.1" 1029 | } 1030 | }, 1031 | "is-negated-glob": { 1032 | "version": "1.0.0", 1033 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 1034 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" 1035 | }, 1036 | "is-number": { 1037 | "version": "7.0.0", 1038 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1039 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1040 | }, 1041 | "is-plain-obj": { 1042 | "version": "2.1.0", 1043 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1044 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1045 | "dev": true 1046 | }, 1047 | "is-relative": { 1048 | "version": "1.0.0", 1049 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1050 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1051 | "requires": { 1052 | "is-unc-path": "^1.0.0" 1053 | } 1054 | }, 1055 | "is-unc-path": { 1056 | "version": "1.0.0", 1057 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1058 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1059 | "requires": { 1060 | "unc-path-regex": "^0.1.2" 1061 | } 1062 | }, 1063 | "is-unicode-supported": { 1064 | "version": "0.1.0", 1065 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1066 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1067 | "dev": true 1068 | }, 1069 | "is-windows": { 1070 | "version": "1.0.2", 1071 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1072 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1073 | }, 1074 | "isexe": { 1075 | "version": "2.0.0", 1076 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1077 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1078 | "dev": true 1079 | }, 1080 | "js-tokens": { 1081 | "version": "4.0.0", 1082 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1083 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1084 | }, 1085 | "js-yaml": { 1086 | "version": "4.1.0", 1087 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1088 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1089 | "dev": true, 1090 | "requires": { 1091 | "argparse": "^2.0.1" 1092 | } 1093 | }, 1094 | "jsesc": { 1095 | "version": "2.5.2", 1096 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1097 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" 1098 | }, 1099 | "json5": { 1100 | "version": "2.2.3", 1101 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1102 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" 1103 | }, 1104 | "lines-and-columns": { 1105 | "version": "1.1.6", 1106 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", 1107 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" 1108 | }, 1109 | "locate-path": { 1110 | "version": "6.0.0", 1111 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1112 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1113 | "dev": true, 1114 | "requires": { 1115 | "p-locate": "^5.0.0" 1116 | } 1117 | }, 1118 | "log-symbols": { 1119 | "version": "4.1.0", 1120 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1121 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1122 | "dev": true, 1123 | "requires": { 1124 | "chalk": "^4.1.0", 1125 | "is-unicode-supported": "^0.1.0" 1126 | }, 1127 | "dependencies": { 1128 | "ansi-styles": { 1129 | "version": "4.3.0", 1130 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1131 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1132 | "dev": true, 1133 | "requires": { 1134 | "color-convert": "^2.0.1" 1135 | } 1136 | }, 1137 | "chalk": { 1138 | "version": "4.1.2", 1139 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1140 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1141 | "dev": true, 1142 | "requires": { 1143 | "ansi-styles": "^4.1.0", 1144 | "supports-color": "^7.1.0" 1145 | } 1146 | }, 1147 | "color-convert": { 1148 | "version": "2.0.1", 1149 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1150 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1151 | "dev": true, 1152 | "requires": { 1153 | "color-name": "~1.1.4" 1154 | } 1155 | }, 1156 | "color-name": { 1157 | "version": "1.1.4", 1158 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1159 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1160 | "dev": true 1161 | }, 1162 | "has-flag": { 1163 | "version": "4.0.0", 1164 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1165 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1166 | "dev": true 1167 | }, 1168 | "supports-color": { 1169 | "version": "7.2.0", 1170 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1171 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1172 | "dev": true, 1173 | "requires": { 1174 | "has-flag": "^4.0.0" 1175 | } 1176 | } 1177 | } 1178 | }, 1179 | "magic-string": { 1180 | "version": "0.25.7", 1181 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 1182 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 1183 | "requires": { 1184 | "sourcemap-codec": "^1.4.4" 1185 | } 1186 | }, 1187 | "merge2": { 1188 | "version": "1.4.1", 1189 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1190 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 1191 | }, 1192 | "micromatch": { 1193 | "version": "4.0.2", 1194 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 1195 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 1196 | "requires": { 1197 | "braces": "^3.0.1", 1198 | "picomatch": "^2.0.5" 1199 | } 1200 | }, 1201 | "minimatch": { 1202 | "version": "3.1.2", 1203 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1204 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1205 | "requires": { 1206 | "brace-expansion": "^1.1.7" 1207 | } 1208 | }, 1209 | "mkdirp": { 1210 | "version": "1.0.4", 1211 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1212 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 1213 | }, 1214 | "mocha": { 1215 | "version": "9.2.2", 1216 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", 1217 | "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", 1218 | "dev": true, 1219 | "requires": { 1220 | "@ungap/promise-all-settled": "1.1.2", 1221 | "ansi-colors": "4.1.1", 1222 | "browser-stdout": "1.3.1", 1223 | "chokidar": "3.5.3", 1224 | "debug": "4.3.3", 1225 | "diff": "5.0.0", 1226 | "escape-string-regexp": "4.0.0", 1227 | "find-up": "5.0.0", 1228 | "glob": "7.2.0", 1229 | "growl": "1.10.5", 1230 | "he": "1.2.0", 1231 | "js-yaml": "4.1.0", 1232 | "log-symbols": "4.1.0", 1233 | "minimatch": "4.2.1", 1234 | "ms": "2.1.3", 1235 | "nanoid": "3.3.1", 1236 | "serialize-javascript": "6.0.0", 1237 | "strip-json-comments": "3.1.1", 1238 | "supports-color": "8.1.1", 1239 | "which": "2.0.2", 1240 | "workerpool": "6.2.0", 1241 | "yargs": "16.2.0", 1242 | "yargs-parser": "20.2.4", 1243 | "yargs-unparser": "2.0.0" 1244 | }, 1245 | "dependencies": { 1246 | "debug": { 1247 | "version": "4.3.3", 1248 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 1249 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 1250 | "dev": true, 1251 | "requires": { 1252 | "ms": "2.1.2" 1253 | }, 1254 | "dependencies": { 1255 | "ms": { 1256 | "version": "2.1.2", 1257 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1258 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1259 | "dev": true 1260 | } 1261 | } 1262 | }, 1263 | "escape-string-regexp": { 1264 | "version": "4.0.0", 1265 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1266 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1267 | "dev": true 1268 | }, 1269 | "glob": { 1270 | "version": "7.2.0", 1271 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 1272 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 1273 | "dev": true, 1274 | "requires": { 1275 | "fs.realpath": "^1.0.0", 1276 | "inflight": "^1.0.4", 1277 | "inherits": "2", 1278 | "minimatch": "^3.0.4", 1279 | "once": "^1.3.0", 1280 | "path-is-absolute": "^1.0.0" 1281 | }, 1282 | "dependencies": { 1283 | "minimatch": { 1284 | "version": "3.1.2", 1285 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1286 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1287 | "dev": true, 1288 | "requires": { 1289 | "brace-expansion": "^1.1.7" 1290 | } 1291 | } 1292 | } 1293 | }, 1294 | "has-flag": { 1295 | "version": "4.0.0", 1296 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1297 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1298 | "dev": true 1299 | }, 1300 | "minimatch": { 1301 | "version": "4.2.1", 1302 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", 1303 | "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", 1304 | "dev": true, 1305 | "requires": { 1306 | "brace-expansion": "^1.1.7" 1307 | } 1308 | }, 1309 | "ms": { 1310 | "version": "2.1.3", 1311 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1312 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1313 | "dev": true 1314 | }, 1315 | "supports-color": { 1316 | "version": "8.1.1", 1317 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1318 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1319 | "dev": true, 1320 | "requires": { 1321 | "has-flag": "^4.0.0" 1322 | } 1323 | } 1324 | } 1325 | }, 1326 | "ms": { 1327 | "version": "2.1.2", 1328 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1329 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1330 | }, 1331 | "multimatch": { 1332 | "version": "5.0.0", 1333 | "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", 1334 | "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", 1335 | "requires": { 1336 | "@types/minimatch": "^3.0.3", 1337 | "array-differ": "^3.0.0", 1338 | "array-union": "^2.1.0", 1339 | "arrify": "^2.0.1", 1340 | "minimatch": "^3.0.4" 1341 | } 1342 | }, 1343 | "mz": { 1344 | "version": "2.7.0", 1345 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1346 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1347 | "requires": { 1348 | "any-promise": "^1.0.0", 1349 | "object-assign": "^4.0.1", 1350 | "thenify-all": "^1.0.0" 1351 | } 1352 | }, 1353 | "nanoid": { 1354 | "version": "3.3.1", 1355 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", 1356 | "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", 1357 | "dev": true 1358 | }, 1359 | "node-releases": { 1360 | "version": "1.1.75", 1361 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", 1362 | "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" 1363 | }, 1364 | "normalize-path": { 1365 | "version": "3.0.0", 1366 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1367 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1368 | "dev": true 1369 | }, 1370 | "object-assign": { 1371 | "version": "4.1.1", 1372 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1373 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1374 | }, 1375 | "once": { 1376 | "version": "1.4.0", 1377 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1378 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1379 | "dev": true, 1380 | "requires": { 1381 | "wrappy": "1" 1382 | } 1383 | }, 1384 | "p-limit": { 1385 | "version": "3.1.0", 1386 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1387 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1388 | "dev": true, 1389 | "requires": { 1390 | "yocto-queue": "^0.1.0" 1391 | } 1392 | }, 1393 | "p-locate": { 1394 | "version": "5.0.0", 1395 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1396 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1397 | "dev": true, 1398 | "requires": { 1399 | "p-limit": "^3.0.2" 1400 | } 1401 | }, 1402 | "path-exists": { 1403 | "version": "4.0.0", 1404 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1405 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1406 | "dev": true 1407 | }, 1408 | "path-is-absolute": { 1409 | "version": "1.0.1", 1410 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1411 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1412 | "dev": true 1413 | }, 1414 | "path-parse": { 1415 | "version": "1.0.7", 1416 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1417 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1418 | }, 1419 | "pathval": { 1420 | "version": "1.1.1", 1421 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1422 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1423 | "dev": true 1424 | }, 1425 | "picomatch": { 1426 | "version": "2.2.1", 1427 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", 1428 | "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" 1429 | }, 1430 | "prettier": { 1431 | "version": "1.19.1", 1432 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", 1433 | "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", 1434 | "dev": true 1435 | }, 1436 | "private": { 1437 | "version": "0.1.8", 1438 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 1439 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" 1440 | }, 1441 | "randombytes": { 1442 | "version": "2.1.0", 1443 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1444 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1445 | "dev": true, 1446 | "requires": { 1447 | "safe-buffer": "^5.1.0" 1448 | } 1449 | }, 1450 | "readdirp": { 1451 | "version": "3.6.0", 1452 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1453 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1454 | "dev": true, 1455 | "requires": { 1456 | "picomatch": "^2.2.1" 1457 | } 1458 | }, 1459 | "recast": { 1460 | "version": "0.19.1", 1461 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.19.1.tgz", 1462 | "integrity": "sha512-8FCjrBxjeEU2O6I+2hyHyBFH1siJbMBLwIRvVr1T3FD2cL754sOaJDsJ/8h3xYltasbJ8jqWRIhMuDGBSiSbjw==", 1463 | "requires": { 1464 | "ast-types": "0.13.3", 1465 | "esprima": "~4.0.0", 1466 | "private": "^0.1.8", 1467 | "source-map": "~0.6.1" 1468 | }, 1469 | "dependencies": { 1470 | "source-map": { 1471 | "version": "0.6.1", 1472 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1473 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1474 | } 1475 | } 1476 | }, 1477 | "repeating": { 1478 | "version": "2.0.1", 1479 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1480 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 1481 | "requires": { 1482 | "is-finite": "^1.0.0" 1483 | } 1484 | }, 1485 | "require-directory": { 1486 | "version": "2.1.1", 1487 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1488 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1489 | "dev": true 1490 | }, 1491 | "resolve": { 1492 | "version": "1.20.0", 1493 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 1494 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 1495 | "requires": { 1496 | "is-core-module": "^2.2.0", 1497 | "path-parse": "^1.0.6" 1498 | } 1499 | }, 1500 | "reusify": { 1501 | "version": "1.0.4", 1502 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1503 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 1504 | }, 1505 | "rimraf": { 1506 | "version": "2.7.1", 1507 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1508 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1509 | "dev": true, 1510 | "requires": { 1511 | "glob": "^7.1.3" 1512 | } 1513 | }, 1514 | "run-parallel": { 1515 | "version": "1.1.10", 1516 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", 1517 | "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" 1518 | }, 1519 | "safe-buffer": { 1520 | "version": "5.1.2", 1521 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1522 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1523 | }, 1524 | "semver": { 1525 | "version": "6.3.0", 1526 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1527 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1528 | }, 1529 | "serialize-javascript": { 1530 | "version": "6.0.0", 1531 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1532 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1533 | "dev": true, 1534 | "requires": { 1535 | "randombytes": "^2.1.0" 1536 | } 1537 | }, 1538 | "source-map": { 1539 | "version": "0.5.7", 1540 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1541 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1542 | }, 1543 | "sourcemap-codec": { 1544 | "version": "1.4.8", 1545 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1546 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 1547 | }, 1548 | "string-width": { 1549 | "version": "4.2.3", 1550 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1551 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1552 | "dev": true, 1553 | "requires": { 1554 | "emoji-regex": "^8.0.0", 1555 | "is-fullwidth-code-point": "^3.0.0", 1556 | "strip-ansi": "^6.0.1" 1557 | } 1558 | }, 1559 | "strip-ansi": { 1560 | "version": "6.0.1", 1561 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1562 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1563 | "dev": true, 1564 | "requires": { 1565 | "ansi-regex": "^5.0.1" 1566 | } 1567 | }, 1568 | "strip-json-comments": { 1569 | "version": "3.1.1", 1570 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1571 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1572 | "dev": true 1573 | }, 1574 | "supports-color": { 1575 | "version": "5.5.0", 1576 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1577 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1578 | "requires": { 1579 | "has-flag": "^3.0.0" 1580 | } 1581 | }, 1582 | "thenify": { 1583 | "version": "3.3.1", 1584 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1585 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1586 | "requires": { 1587 | "any-promise": "^1.0.0" 1588 | } 1589 | }, 1590 | "thenify-all": { 1591 | "version": "1.6.0", 1592 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1593 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", 1594 | "requires": { 1595 | "thenify": ">= 3.1.0 < 4" 1596 | } 1597 | }, 1598 | "to-fast-properties": { 1599 | "version": "2.0.0", 1600 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1601 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 1602 | }, 1603 | "to-regex-range": { 1604 | "version": "5.0.1", 1605 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1606 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1607 | "requires": { 1608 | "is-number": "^7.0.0" 1609 | } 1610 | }, 1611 | "ts-morph": { 1612 | "version": "9.1.0", 1613 | "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-9.1.0.tgz", 1614 | "integrity": "sha512-sei4u651MBenr27sD6qLDXN3gZ4thiX71E3qV7SuVtDas0uvK2LtgZkIYUf9DKm/fLJ6AB/+yhRJ1vpEBJgy7Q==", 1615 | "requires": { 1616 | "@dsherret/to-absolute-glob": "^2.0.2", 1617 | "@ts-morph/common": "~0.7.0", 1618 | "code-block-writer": "^10.1.1" 1619 | } 1620 | }, 1621 | "tslib": { 1622 | "version": "2.3.1", 1623 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1624 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1625 | }, 1626 | "type-detect": { 1627 | "version": "4.0.8", 1628 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1629 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1630 | "dev": true 1631 | }, 1632 | "typescript": { 1633 | "version": "4.3.4", 1634 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", 1635 | "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", 1636 | "dev": true 1637 | }, 1638 | "unc-path-regex": { 1639 | "version": "0.1.2", 1640 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 1641 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" 1642 | }, 1643 | "vscode-test": { 1644 | "version": "1.4.1", 1645 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.1.tgz", 1646 | "integrity": "sha512-Ls7+JyC06cUCuomlTYk4aNJI00Rri09hgtkNl3zfQ1bj6meXglpSPpuzJ/RPNetlUHFMm4eGs0Xr/H5pFPVwfQ==", 1647 | "dev": true, 1648 | "requires": { 1649 | "http-proxy-agent": "^2.1.0", 1650 | "https-proxy-agent": "^2.2.4", 1651 | "rimraf": "^2.6.3" 1652 | } 1653 | }, 1654 | "which": { 1655 | "version": "2.0.2", 1656 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1657 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1658 | "dev": true, 1659 | "requires": { 1660 | "isexe": "^2.0.0" 1661 | } 1662 | }, 1663 | "workerpool": { 1664 | "version": "6.2.0", 1665 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", 1666 | "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", 1667 | "dev": true 1668 | }, 1669 | "wrap-ansi": { 1670 | "version": "7.0.0", 1671 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1672 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1673 | "dev": true, 1674 | "requires": { 1675 | "ansi-styles": "^4.0.0", 1676 | "string-width": "^4.1.0", 1677 | "strip-ansi": "^6.0.0" 1678 | }, 1679 | "dependencies": { 1680 | "ansi-styles": { 1681 | "version": "4.3.0", 1682 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1683 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1684 | "dev": true, 1685 | "requires": { 1686 | "color-convert": "^2.0.1" 1687 | } 1688 | }, 1689 | "color-convert": { 1690 | "version": "2.0.1", 1691 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1692 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1693 | "dev": true, 1694 | "requires": { 1695 | "color-name": "~1.1.4" 1696 | } 1697 | }, 1698 | "color-name": { 1699 | "version": "1.1.4", 1700 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1701 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1702 | "dev": true 1703 | } 1704 | } 1705 | }, 1706 | "wrappy": { 1707 | "version": "1.0.2", 1708 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1709 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1710 | "dev": true 1711 | }, 1712 | "y18n": { 1713 | "version": "5.0.8", 1714 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1715 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1716 | "dev": true 1717 | }, 1718 | "yargs": { 1719 | "version": "16.2.0", 1720 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1721 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1722 | "dev": true, 1723 | "requires": { 1724 | "cliui": "^7.0.2", 1725 | "escalade": "^3.1.1", 1726 | "get-caller-file": "^2.0.5", 1727 | "require-directory": "^2.1.1", 1728 | "string-width": "^4.2.0", 1729 | "y18n": "^5.0.5", 1730 | "yargs-parser": "^20.2.2" 1731 | } 1732 | }, 1733 | "yargs-parser": { 1734 | "version": "20.2.4", 1735 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1736 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1737 | "dev": true 1738 | }, 1739 | "yargs-unparser": { 1740 | "version": "2.0.0", 1741 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1742 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1743 | "dev": true, 1744 | "requires": { 1745 | "camelcase": "^6.0.0", 1746 | "decamelize": "^4.0.0", 1747 | "flat": "^5.0.2", 1748 | "is-plain-obj": "^2.1.0" 1749 | } 1750 | }, 1751 | "yocto-queue": { 1752 | "version": "0.1.0", 1753 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1754 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1755 | "dev": true 1756 | } 1757 | } 1758 | } 1759 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "to-typescript", 3 | "displayName": "toTypeScript()", 4 | "description": "Converts JavaScript and CoffeeScript to TypeScript", 5 | "author": "Alec Clarke", 6 | "publisher": "alecclarkedev", 7 | "version": "0.3.0", 8 | "license": "MIT", 9 | "engines": { 10 | "vscode": "^1.47.0" 11 | }, 12 | "icon": "images/icon.png", 13 | "homepage": "https://github.com/alecclarke/to-typescript", 14 | "bugs": { 15 | "url": "https://github.com/alecclarke/to-typescript/issues" 16 | }, 17 | "repository": { 18 | "url": "https://github.com/alecclarke/to-typescript" 19 | }, 20 | "categories": [ 21 | "Programming Languages", 22 | "Formatters", 23 | "Other" 24 | ], 25 | "keywords": [ 26 | "typescript", 27 | "coffeescript", 28 | "javascript", 29 | "code fix", 30 | "code refactor" 31 | ], 32 | "activationEvents": [ 33 | "onCommand:extension.toTypeScript" 34 | ], 35 | "main": "./out/extension.js", 36 | "contributes": { 37 | "commands": [ 38 | { 39 | "command": "extension.toTypeScript", 40 | "title": "toTypeScript()" 41 | } 42 | ], 43 | "configuration": { 44 | "type": "object", 45 | "title": "toTypeScript configuration", 46 | "properties": { 47 | "toTypeScript.inferFromUsage": { 48 | "type": "boolean", 49 | "default": true, 50 | "description": "" 51 | }, 52 | "toTypeScript.convertToAsyncFunction": { 53 | "type": "boolean", 54 | "default": true, 55 | "description": "" 56 | }, 57 | "toTypeScript.addMissingMember": { 58 | "type": "boolean", 59 | "default": true, 60 | "description": "" 61 | }, 62 | "toTypeScript.forgottenThisPropertyAccess": { 63 | "type": "boolean", 64 | "default": true, 65 | "description": "" 66 | }, 67 | "toTypeScript.fixAwaitInSyncFunction": { 68 | "type": "boolean", 69 | "default": true, 70 | "description": "" 71 | }, 72 | "toTypeScript.fixExpectedComma": { 73 | "type": "boolean", 74 | "default": true, 75 | "description": "" 76 | }, 77 | "toTypeScript.fixUnreachableCode": { 78 | "type": "boolean", 79 | "default": true, 80 | "description": "" 81 | }, 82 | "toTypeScript.fixUnusedLabel": { 83 | "type": "boolean", 84 | "default": true, 85 | "description": "" 86 | }, 87 | "toTypeScript.requireInTs": { 88 | "type": "boolean", 89 | "default": true, 90 | "description": "" 91 | }, 92 | "toTypeScript.coffeescript.useCS2": { 93 | "type": [ 94 | "boolean", 95 | "null" 96 | ], 97 | "default": null, 98 | "description": "" 99 | }, 100 | "toTypeScript.coffeescript.literate": { 101 | "type": [ 102 | "boolean", 103 | "null" 104 | ], 105 | "default": null, 106 | "description": "" 107 | }, 108 | "toTypeScript.coffeescript.disableSuggestionComment": { 109 | "type": [ 110 | "boolean", 111 | "null" 112 | ], 113 | "default": true, 114 | "description": "" 115 | }, 116 | "toTypeScript.coffeescript.noArrayIncludes": { 117 | "type": [ 118 | "boolean", 119 | "null" 120 | ], 121 | "default": null, 122 | "description": "" 123 | }, 124 | "toTypeScript.coffeescript.useJSModules": { 125 | "type": [ 126 | "boolean", 127 | "null" 128 | ], 129 | "default": null, 130 | "description": "" 131 | }, 132 | "toTypeScript.coffeescript.looseJSModules": { 133 | "type": [ 134 | "boolean", 135 | "null" 136 | ], 137 | "default": null, 138 | "description": "" 139 | }, 140 | "toTypeScript.coffeescript.safeImportFunctionIdentifiers": { 141 | "type": [ 142 | "boolean", 143 | "null" 144 | ], 145 | "default": null, 146 | "description": "" 147 | }, 148 | "toTypeScript.coffeescript.preferLet": { 149 | "type": [ 150 | "boolean", 151 | "null" 152 | ], 153 | "default": null, 154 | "description": "" 155 | }, 156 | "toTypeScript.coffeescript.loose": { 157 | "type": [ 158 | "boolean", 159 | "null" 160 | ], 161 | "default": null, 162 | "description": "" 163 | }, 164 | "toTypeScript.coffeescript.looseDefaultParams": { 165 | "type": [ 166 | "boolean", 167 | "null" 168 | ], 169 | "default": null, 170 | "description": "" 171 | }, 172 | "toTypeScript.coffeescript.looseForExpressions": { 173 | "type": [ 174 | "boolean", 175 | "null" 176 | ], 177 | "default": null, 178 | "description": "" 179 | }, 180 | "toTypeScript.coffeescript.looseForOf": { 181 | "type": [ 182 | "boolean", 183 | "null" 184 | ], 185 | "default": null, 186 | "description": "" 187 | }, 188 | "toTypeScript.coffeescript.looseIncludes": { 189 | "type": [ 190 | "boolean", 191 | "null" 192 | ], 193 | "default": null, 194 | "description": "" 195 | }, 196 | "toTypeScript.coffeescript.looseComparisonNegation": { 197 | "type": [ 198 | "boolean", 199 | "null" 200 | ], 201 | "default": null, 202 | "description": "" 203 | }, 204 | "toTypeScript.coffeescript.disallowInvalidConstructors": { 205 | "type": [ 206 | "boolean", 207 | "null" 208 | ], 209 | "default": null, 210 | "description": "" 211 | }, 212 | "toTypeScript.coffeescript.optionalChaining": { 213 | "type": [ 214 | "boolean", 215 | "null" 216 | ], 217 | "default": null, 218 | "description": "" 219 | } 220 | } 221 | } 222 | }, 223 | "scripts": { 224 | "vscode:prepublish": "npm run compile", 225 | "compile": "tsc -p ./", 226 | "watch": "tsc -watch -p ./", 227 | "test": "node ./out/test/runTest.js" 228 | }, 229 | "devDependencies": { 230 | "@types/chai": "^4.2.11", 231 | "@types/glob": "^7.1.2", 232 | "@types/mocha": "^9.1.0", 233 | "@types/node": "^13.13.0", 234 | "@types/prettier": "^2.0.1", 235 | "@types/vscode": "^1.47.0", 236 | "chai": "^4.2.0", 237 | "mocha": "^9.2.2", 238 | "prettier": "1.19.1", 239 | "typescript": "^4.3.4", 240 | "vscode-test": "^1.4.1" 241 | }, 242 | "dependencies": { 243 | "decaffeinate": "^6.1.9", 244 | "ts-morph": "^9.1.0" 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /src/adapters/adapterFactory.ts: -------------------------------------------------------------------------------- 1 | import { TSAdapter } from "./tsAdapterInterface"; 2 | import { CoffeeScriptAdapter } from "./coffeeScriptAdapter"; 3 | import { JavaScriptAdapter } from "./javaScriptAdapter"; 4 | import { TextDocument } from "vscode"; 5 | 6 | export function tsAdapterFor(document: TextDocument): TSAdapter { 7 | switch (document.languageId) { 8 | case "coffeescript": 9 | return new CoffeeScriptAdapter(document); 10 | case "javascript": 11 | return new JavaScriptAdapter(document); 12 | default: 13 | throw new Error(`toTypeScript(): No adapter for ${document.languageId}`); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/adapters/coffeeScriptAdapter.ts: -------------------------------------------------------------------------------- 1 | import { convert } from 'decaffeinate'; 2 | import { TextDocument } from 'vscode'; 3 | import { TSAdapter } from './tsAdapterInterface'; 4 | import { getCoffeescriptConfig } from '../configUtils'; 5 | 6 | export class CoffeeScriptAdapter implements TSAdapter { 7 | private document: TextDocument; 8 | 9 | constructor (document: TextDocument) { 10 | this.document = document; 11 | } 12 | 13 | public getFileContent(): string { 14 | const coffeeScriptContent = this.document.getText(); 15 | const options = getCoffeescriptConfig(); 16 | return convert(coffeeScriptContent, options).code; 17 | } 18 | 19 | public getFileName(): string { 20 | const originalFileName = this.document.fileName; 21 | return originalFileName.replace(/\.coffee/, '.ts'); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/adapters/javaScriptAdapter.ts: -------------------------------------------------------------------------------- 1 | import { TextDocument } from 'vscode'; 2 | import { TSAdapter } from './tsAdapterInterface'; 3 | 4 | export class JavaScriptAdapter implements TSAdapter { 5 | private document: TextDocument; 6 | 7 | constructor (document: TextDocument) { 8 | this.document = document; 9 | } 10 | 11 | public getFileContent(): string { 12 | return this.document.getText(); 13 | } 14 | 15 | public getFileName(): string { 16 | const originalFileName = this.document.fileName; 17 | return originalFileName.replace(/\.js/, '.ts'); 18 | } 19 | } -------------------------------------------------------------------------------- /src/adapters/tsAdapterInterface.d.ts: -------------------------------------------------------------------------------- 1 | export interface TSAdapter { 2 | getFileContent(): string; 3 | getFileName(): string; 4 | } 5 | -------------------------------------------------------------------------------- /src/configUtils.ts: -------------------------------------------------------------------------------- 1 | import { workspace, Uri } from 'vscode'; 2 | import { FormatCodeSettings } from 'typescript'; 3 | 4 | const tsFixIds = [ 5 | "inferFromUsage", 6 | "convertToAsyncFunction", 7 | "addMissingMember", 8 | "forgottenThisPropertyAccess", 9 | "fixUnreachableCode", 10 | "fixUnusedLabel", 11 | "fixAwaitInSyncFunction", 12 | "fixExpectedComma", 13 | "requireInTs", 14 | ]; 15 | 16 | export function buildTSFixIds(): string[] { 17 | const settings = workspace.getConfiguration("toTypeScript"); 18 | const fixIds = tsFixIds.filter((fixId: string) => settings[fixId]); 19 | return fixIds; 20 | } 21 | 22 | export function getEditorConfig(configUri: Uri): FormatCodeSettings { 23 | const indentSize = workspace.getConfiguration("editor", configUri).get("tabSize", 2); 24 | 25 | return { 26 | indentSize, 27 | }; 28 | } 29 | 30 | export function getCoffeescriptConfig() { 31 | const config = workspace.getConfiguration("toTypeScript.coffeescript"); 32 | return Object.keys(config).reduce((result, key) => { 33 | const value = config.get(key); 34 | return typeof value === 'boolean' ? { ...result, [key]: value } : result; 35 | }, {}); 36 | } 37 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ExtensionContext, 3 | ViewColumn, 4 | commands, 5 | window, 6 | } from 'vscode'; 7 | import { TSFile } from "./tsFile"; 8 | 9 | export function activate(context: ExtensionContext) { 10 | const disposable = commands.registerCommand('extension.toTypeScript', async () => { 11 | if (window.activeTextEditor) { 12 | const tsFile = new TSFile(window.activeTextEditor.document); 13 | await tsFile.toTypeScript(); 14 | return commands.executeCommand("vscode.open", tsFile.getFileUri(), ViewColumn.Beside); 15 | } 16 | }); 17 | 18 | context.subscriptions.push(disposable); 19 | } 20 | 21 | export function deactivate() {} 22 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/addMissingMember.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { normalizeTextFormat, openEditorForTestFile, testFolderPath } from "../../support"; 6 | 7 | describe("addMissingMember", function () { 8 | const tsFileName = "addMissingMember.ts"; 9 | const jsFileName = "addMissingMember.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies addMissingMember code fix to converted file", async function() { 16 | this.timeout(10000) 17 | await openEditorForTestFile(jsFileName); 18 | await commands.executeCommand("extension.toTypeScript"); 19 | const currentEditor = window.activeTextEditor as TextEditor; 20 | const convertedContent = 21 | `class MissingMember {\n x: any;\n constructor() {}\n\n method() {\n this.x;\n this.y();\n }\n y() {\n throw new Error("Method not implemented.");\n }\n}\n`; 22 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 23 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 24 | expect(actualContent).to.equal(convertedContent); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/convertToAsyncFunction.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("convertToAsyncFunction", function () { 8 | const tsFileName = "convertToAsyncFunction.ts"; 9 | const jsFileName = "convertToAsyncFunction.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies convertToAsyncFunction code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `async () => {\n const result = await fetch("https://example.com");\n return console.log(result);\n};\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/fixAwaitInSyncFunction.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("fixAwaitInSyncFunction", function () { 8 | const tsFileName = "fixAwaitInSyncFunction.ts"; 9 | const jsFileName = "fixAwaitInSyncFunction.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies fixAwaitInSyncFunction code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `async () => {\n await fetch("https://example.com");\n};\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/fixExpectedComma.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("fixExpectedComma", function () { 8 | const tsFileName = "fixExpectedComma.ts"; 9 | const jsFileName = "fixExpectedComma.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies fixExpectedComma code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `const example = { a: "one", c: "two" };\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/fixUnreachableCode.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("fixUnreachableCode", function () { 8 | const tsFileName = "fixUnreachableCode.ts"; 9 | const jsFileName = "fixUnreachableCode.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies fixUnreachableCode code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `() => {\n return 1;\n};\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/fixUnusedLabel.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("fixUnusedLabel", function () { 8 | const tsFileName = "fixUnusedLabel.ts"; 9 | const jsFileName = "fixUnusedLabel.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies fixUnusedLabel code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `for (var i = 0; i < 5; i++) {\n console.log(i);\n}\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/forgottenThisPropertyAccess.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("forgottenThisPropertyAccess", function () { 8 | const tsFileName = "forgottenThisPropertyAccess.ts"; 9 | const jsFileName = "forgottenThisPropertyAccess.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies forgottenThisPropertyAccess code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `class MissingThis {\n x: any;\n y() {\n this.x;\n }\n}\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/inferFromUsage.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("inferFromUsage", function () { 8 | const tsFileName = "inferFromUsage.ts"; 9 | const jsFileName = "inferFromUsage.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies inferFromUsage code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `const square = function(x: number) {\n return x * x;\n};\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/code-fixes/requireInTs.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("requireInTs", function () { 8 | const tsFileName = "requireInTs.ts"; 9 | const jsFileName = "requireInTs.js"; 10 | 11 | afterEach(function() { 12 | unlinkSync(path.join(testFolderPath + tsFileName)); 13 | }); 14 | 15 | it("applies requireInTs code fix to converted file", async function() { 16 | await openEditorForTestFile(jsFileName); 17 | await commands.executeCommand("extension.toTypeScript"); 18 | const currentEditor = window.activeTextEditor as TextEditor; 19 | const convertedContent = `import x = require("y");\n`; 20 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 21 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + tsFileName)); 22 | expect(actualContent).to.equal(convertedContent); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/test/e2e/examples/addMissingMember.js: -------------------------------------------------------------------------------- 1 | class MissingMember { 2 | constructor() {} 3 | 4 | method() { 5 | this.x; 6 | this.y(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/test/e2e/examples/convertToAsyncFunction.js: -------------------------------------------------------------------------------- 1 | () => { 2 | return fetch("https://example.com").then(result => console.log(result)); 3 | } 4 | -------------------------------------------------------------------------------- /src/test/e2e/examples/fixAwaitInSyncFunction.js: -------------------------------------------------------------------------------- 1 | () => { 2 | await fetch("https://example.com"); 3 | } 4 | -------------------------------------------------------------------------------- /src/test/e2e/examples/fixExpectedComma.js: -------------------------------------------------------------------------------- 1 | const example = { a : "one"; c : "two"}; 2 | -------------------------------------------------------------------------------- /src/test/e2e/examples/fixUnreachableCode.js: -------------------------------------------------------------------------------- 1 | () => { 2 | return 1; 3 | const unreachable = 2; 4 | } 5 | -------------------------------------------------------------------------------- /src/test/e2e/examples/fixUnusedLabel.js: -------------------------------------------------------------------------------- 1 | loop1: 2 | for (var i = 0; i < 5; i++) { 3 | console.log(i); 4 | } 5 | -------------------------------------------------------------------------------- /src/test/e2e/examples/forgottenThisPropertyAccess.js: -------------------------------------------------------------------------------- 1 | class MissingThis { 2 | x; 3 | y() { 4 | x; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/test/e2e/examples/inferFromUsage.js: -------------------------------------------------------------------------------- 1 | const square = function(x) { 2 | return x * x; 3 | }; 4 | -------------------------------------------------------------------------------- /src/test/e2e/examples/requireInTs.js: -------------------------------------------------------------------------------- 1 | const x = require("y"); -------------------------------------------------------------------------------- /src/test/e2e/examples/testFile.coffee: -------------------------------------------------------------------------------- 1 | square = (x) -> x * x 2 | -------------------------------------------------------------------------------- /src/test/e2e/examples/testFile.js: -------------------------------------------------------------------------------- 1 | const square = function(x) { 2 | return x * x; 3 | }; 4 | -------------------------------------------------------------------------------- /src/test/e2e/file-formats/fileFormats.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { commands, window, TextEditor } from "vscode"; 3 | import * as path from "path"; 4 | import { unlinkSync } from "fs"; 5 | import { openEditorForTestFile, testFolderPath, normalizeTextFormat } from "../../support"; 6 | 7 | describe("running toTypeScript in the open editor", function () { 8 | afterEach(function() { 9 | unlinkSync(path.join(testFolderPath + "testFile.ts")); 10 | }); 11 | 12 | it("converts CoffeeScript files to ts and opens the new file", async function() { 13 | await openEditorForTestFile("testFile.coffee"); 14 | await commands.executeCommand("extension.toTypeScript"); 15 | const currentEditor = window.activeTextEditor as TextEditor; 16 | const convertedContent = `const square = (x: number) => x * x;\n`; 17 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 18 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + "testFile.ts")); 19 | expect(actualContent).to.equal(convertedContent); 20 | }); 21 | 22 | it("converts JavaScript files to ts and opens the new file", async function() { 23 | await openEditorForTestFile("testFile.js"); 24 | await commands.executeCommand("extension.toTypeScript"); 25 | const currentEditor = window.activeTextEditor as TextEditor; 26 | const convertedContent = `const square = function(x: number) {\n return x * x;\n};\n`; 27 | const actualContent = normalizeTextFormat(currentEditor.document.getText()); 28 | expect(currentEditor.document.fileName).to.equal(path.join(testFolderPath + "testFile.ts")); 29 | expect(actualContent).to.equal(convertedContent); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | 2 | import * as path from 'path'; 3 | 4 | import { runTests } from 'vscode-test'; 5 | 6 | async function main() { 7 | try { 8 | // The folder containing the Extension Manifest package.json 9 | // Passed to `--extensionDevelopmentPath` 10 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 11 | 12 | // The path to the extension test script 13 | // Passed to --extensionTestsPath 14 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 15 | 16 | // Download VS Code, unzip it and run the integration test 17 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 18 | } catch (err) { 19 | console.error('Failed to run tests'); 20 | process.exit(1); 21 | } 22 | } 23 | 24 | main(); 25 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as Mocha from 'mocha'; 3 | import * as glob from 'glob'; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | timeout: 6000, 9 | ui: 'bdd', 10 | }); 11 | 12 | const testsRoot = path.resolve(__dirname, '..'); 13 | 14 | return new Promise((c, e) => { 15 | glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { 16 | if (err) { 17 | return e(err); 18 | } 19 | 20 | // Add files to the test suite 21 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 22 | 23 | try { 24 | // Run the mocha test 25 | mocha.run(failures => { 26 | if (failures > 0) { 27 | e(new Error(`${failures} tests failed.`)); 28 | } else { 29 | c(); 30 | } 31 | }); 32 | } catch (err) { 33 | console.error(err); 34 | e(err); 35 | } 36 | }); 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /src/test/support.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Uri, 3 | workspace, 4 | window, 5 | TextEditor, 6 | } from 'vscode'; 7 | import * as path from "path"; 8 | import { format } from 'prettier'; 9 | 10 | export const testFolderPath = path.join(__dirname + "/../../src/test/e2e/examples/"); 11 | 12 | export async function openEditorForTestFile(testFileName: string): Promise { 13 | const uri = Uri.file(path.join(testFolderPath + testFileName)); 14 | const document = await workspace.openTextDocument(uri); 15 | return window.showTextDocument(document); 16 | } 17 | 18 | export function normalizeTextFormat(text: string): string { 19 | return format( 20 | text, 21 | { 22 | endOfLine: "lf", 23 | tabWidth: 2, 24 | parser: "typescript", 25 | } 26 | ) 27 | } 28 | -------------------------------------------------------------------------------- /src/test/unit/adapters/adapterFactory.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { TextDocument } from 'vscode'; 3 | import { tsAdapterFor } from '../../../adapters/adapterFactory'; 4 | import { CoffeeScriptAdapter } from '../../../adapters/coffeeScriptAdapter'; 5 | import { JavaScriptAdapter } from '../../../adapters/javaScriptAdapter'; 6 | 7 | describe("tsAdapterFor", function () { 8 | it("returns a CoffeeScriptAdapter when the document is CoffeeScript", function() { 9 | const document = { 10 | languageId: "coffeescript", 11 | } as TextDocument; 12 | 13 | expect(tsAdapterFor(document)).to.be.an.instanceOf(CoffeeScriptAdapter); 14 | }); 15 | 16 | it("returns a JavaScriptAdapter when the document is JavaScript", function() { 17 | const document = { 18 | languageId: "javascript", 19 | } as TextDocument; 20 | 21 | expect(tsAdapterFor(document)).to.be.an.instanceOf(JavaScriptAdapter); 22 | }); 23 | 24 | it("throws an error when the document type doesn't have a supported adapter", function() { 25 | const document = { 26 | languageId: "unknown", 27 | } as TextDocument; 28 | 29 | expect(() => tsAdapterFor(document)).to.throw(/toTypeScript\(\)\: No adapter for unknown/); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /src/test/unit/configUtils.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { buildTSFixIds, getCoffeescriptConfig } from '../../configUtils'; 3 | 4 | describe("buildTSFixIds", function () { 5 | it("returns the fixIds defined in the settings", function() { 6 | const defaultFixIds = [ 7 | "inferFromUsage", 8 | "convertToAsyncFunction", 9 | "addMissingMember", 10 | "forgottenThisPropertyAccess", 11 | "fixUnreachableCode", 12 | "fixUnusedLabel", 13 | "fixAwaitInSyncFunction", 14 | "fixExpectedComma", 15 | "requireInTs", 16 | ]; 17 | 18 | expect(defaultFixIds).to.eql(buildTSFixIds()); 19 | }); 20 | }); 21 | 22 | describe("getCoffeescriptConfig", function () { 23 | it("returns the default coffeescript config", async function() { 24 | const expected = {disableSuggestionComment: true}; 25 | expect(expected).to.eql(getCoffeescriptConfig()); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /src/tsFile.ts: -------------------------------------------------------------------------------- 1 | import { buildTSFixIds, getEditorConfig } from './configUtils'; 2 | import { FileTextChanges, Project, SourceFile, FormatCodeSettings} from 'ts-morph'; 3 | import { Uri, TextDocument } from 'vscode'; 4 | import { TSAdapter } from './adapters/tsAdapterInterface'; 5 | import { tsAdapterFor } from './adapters/adapterFactory'; 6 | 7 | export class TSFile { 8 | private adapter: TSAdapter; 9 | private project: Project; 10 | private sourceFile: SourceFile; 11 | 12 | constructor (document: TextDocument) { 13 | this.adapter = tsAdapterFor(document); 14 | this.project = new Project(); 15 | this.sourceFile = this.buildSourceFile(); 16 | } 17 | 18 | public getFileUri(): Uri { 19 | return Uri.file(this.adapter.getFileName()); 20 | } 21 | 22 | public toTypeScript(): Promise { 23 | const fixIds = buildTSFixIds(); 24 | const editorConfig = getEditorConfig(this.getFileUri()); 25 | 26 | fixIds.forEach((fixId: string) => { 27 | const fixes = this.project.getLanguageService().getCombinedCodeFix(this.sourceFile, fixId, editorConfig); 28 | fixes.getChanges().forEach((change: FileTextChanges) => change.applyChanges({ overwrite: true })); 29 | }); 30 | 31 | return this.sourceFile.save(); 32 | } 33 | 34 | private buildSourceFile(): SourceFile { 35 | return this.project.createSourceFile( 36 | this.adapter.getFileName(), 37 | this.adapter.getFileContent() 38 | ); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | "strict": true /* enable all strict type-checking options */ 12 | /* Additional Checks */ 13 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 14 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 15 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 16 | }, 17 | "exclude": [ 18 | "node_modules", 19 | ".vscode-test" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-string-throw": true, 4 | "no-unused-expression": true, 5 | "no-duplicate-variable": true, 6 | "curly": true, 7 | "class-name": true, 8 | "semicolon": [ 9 | true, 10 | "always" 11 | ], 12 | "triple-equals": true 13 | }, 14 | "defaultSeverity": "warning" 15 | } 16 | --------------------------------------------------------------------------------