├── .eslintrc.json ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── icon.png ├── package-lock.json ├── package.json ├── src ├── @types │ └── git.d.ts ├── commands │ ├── createCommandConfigs.ts │ └── createCommandGenerateGitCommitMessage.ts ├── extension.ts ├── test │ ├── runTest.ts │ └── suite │ │ ├── extension.test.ts │ │ └── index.ts └── utils.ts ├── tsconfig.json └── vscode-gptcommit.gif /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | "@typescript-eslint/naming-convention": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "curly": "warn", 15 | "eqeqeq": "warn", 16 | "no-throw-literal": "warn", 17 | "semi": "off" 18 | }, 19 | "ignorePatterns": [ 20 | "out", 21 | "dist", 22 | "**/*.d.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | node_modules 4 | .vscode-test/ 5 | *.vsix 6 | -------------------------------------------------------------------------------- /.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 | "dbaeumer.vscode-eslint" 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 | "args": [ 13 | "/home/pwwang/github/pipen", 14 | "--disable-extensions", 15 | "--extensionDevelopmentPath=${workspaceFolder}" 16 | ], 17 | "outFiles": [ 18 | "${workspaceFolder}/out/**/*.js" 19 | ], 20 | "preLaunchTask": "${defaultBuildTask}" 21 | }, 22 | { 23 | "name": "Extension Tests", 24 | "type": "extensionHost", 25 | "request": "launch", 26 | "args": [ 27 | "--extensionDevelopmentPath=${workspaceFolder}", 28 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 29 | ], 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | "preLaunchTask": "${defaultBuildTask}" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /.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 | } -------------------------------------------------------------------------------- /.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 | src/** 4 | .gitignore 5 | .yarnrc 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/.eslintrc.json 9 | **/*.map 10 | **/*.ts 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 0.1.0 4 | 5 | - 🐛 Fix failure on Windows (#1) 6 | 7 | ## 0.0.3 8 | 9 | - 🚸 Make better notification when failed to generate message 10 | - 🍱 Use new icon 11 | - 🔧 Add keywords in package.json 12 | - 📝 Add advanced configuration in README.md 13 | 14 | ## 0.0.2 15 | 16 | - Add outputChannel to log the command and output 17 | 18 | ## 0.0.1 19 | 20 | - Initial release 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2023 pwwang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vscode-gptcommit 2 | 3 | Automated git commit messages using GPT models via [gptcommit][1] for VS Code. 4 | 5 | ![vscode-gptcommit][2] 6 | 7 | ## Installation 8 | 9 | - Install the extension from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=pwwang.gptcommit) 10 | - Install the [gptcommit][1] 11 | 12 | Note: Do NOT install `gptcommit` hook via `gptcommit install` under the root of your git repo. 13 | 14 | ## Supported Versions 15 | 16 | | Extension Version | VS Code Version | gptcommit Version | 17 | | ----------------- | --------------- | ----------------- | 18 | | < 0.1.0 | 1.75+ | 0.1.16 | 19 | | 0.1.x | 1.70+ | 0.1.16 | 20 | | 0.2.x | 1.70+ | 0.3.0 | 21 | | 0.3.x | 1.70+ | 0.5.x | 22 | 23 | ## Commands 24 | 25 | Run via `Ctrl+Shift+P` or `Cmd+Shift+P`: 26 | 27 | - `GPTCommit: Generate Git Commit Message` 28 | Generate the commit message 29 | 30 | - `GPTCommit: Setup OpenAI API Key` 31 | Setup the OpenAI API Key. You can get the API key from [OpenAI][3] 32 | 33 | - `GPTCommit: Use a different OpenAI model` 34 | Use a different OpenAI model. For a list of public OpenAI models, checkout the [OpenAI docs][4]. Default is now `gpt-3.5-turbo`. 35 | 36 | - `GPTCommit: Set output language` 37 | Set the output language. Default is `en`. 38 | 39 | - `GPTCommit: Show per-file summary` 40 | Enable "show per-file summary"? It's disabled by default. 41 | 42 | - `GPTCommit: Disable conventional commit` 43 | Disable "conventional commit"? It's enabled by default. 44 | 45 | - `GPTCommit: Open gptcommit configuration file` 46 | Open the local gptcommit configuration file (~/.git/gptcommit.toml) 47 | 48 | ## Extension Settings 49 | 50 | - `ExpressMode`: If true, generated message will be filled into the Source Control commit message input box directly, instead of opening a new editor. 51 | - `ExpressModeContent`: Content of the message to fill in the express mode. 52 | - Note that to show per-file summary, you need to enable "show per-file summary" by running the `GPTCommit: Show per-file summary` command. 53 | - `GptcommitPath`: Path to the `gptcommit` executable. 54 | - `OnFiles`: Diff of files to use for generating the commit message. 55 | - `staged`: Use staged files 56 | - `unstaged`: Use unstaged files 57 | - `tryStagedThenUnstaged`: Try staged files first, then try unstaged files if no staged files are found 58 | 59 | ## Advanced configuration 60 | 61 | Note that now all the configuration via the extension is saved in the `.git/gptcommit.toml` file. If you have to change advanced configuration, you can edit the `.git/gptcommit.toml` file directly, but make sure you know what you are doing. You can also use the `GPTCommit: Open gptcommit configuration file` command to open the configuration file. 62 | 63 | If you want to use the configuration globally, you can copy the `.git/gptcommit.toml` file to `~/.config/gptcommit/config.toml`, or just the sections of the configuration you want to be used globally. 64 | 65 | Also refer to the [gptcommit][1] documentation for more information. 66 | 67 | [1]: https://github.com/zurawiki/gptcommit 68 | [2]: https://raw.githubusercontent.com/pwwang/vscode-gptcommit/master/vscode-gptcommit.gif 69 | [3]: https://openai.com/api/ 70 | [4]: https://beta.openai.com/docs/models/overview 71 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwwang/vscode-gptcommit/8e3da84622869d0ba52e3bfd999d2b32f5c4d7c0/icon.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gptcommit", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "gptcommit", 9 | "version": "0.1.0", 10 | "devDependencies": { 11 | "@types/glob": "^8.0.1", 12 | "@types/mocha": "^10.0.1", 13 | "@types/node": "16.x", 14 | "@types/vscode": "^1.70.0", 15 | "@typescript-eslint/eslint-plugin": "^5.49.0", 16 | "@typescript-eslint/parser": "^5.49.0", 17 | "@vscode/test-electron": "^2.2.2", 18 | "eslint": "^8.33.0", 19 | "glob": "^8.1.0", 20 | "mocha": "^10.1.0", 21 | "typescript": "^4.9.4" 22 | }, 23 | "engines": { 24 | "vscode": "^1.70.0" 25 | } 26 | }, 27 | "node_modules/@eslint/eslintrc": { 28 | "version": "2.0.0", 29 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", 30 | "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", 31 | "dev": true, 32 | "dependencies": { 33 | "ajv": "^6.12.4", 34 | "debug": "^4.3.2", 35 | "espree": "^9.4.0", 36 | "globals": "^13.19.0", 37 | "ignore": "^5.2.0", 38 | "import-fresh": "^3.2.1", 39 | "js-yaml": "^4.1.0", 40 | "minimatch": "^3.1.2", 41 | "strip-json-comments": "^3.1.1" 42 | }, 43 | "engines": { 44 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 45 | }, 46 | "funding": { 47 | "url": "https://opencollective.com/eslint" 48 | } 49 | }, 50 | "node_modules/@eslint/js": { 51 | "version": "8.35.0", 52 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", 53 | "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", 54 | "dev": true, 55 | "engines": { 56 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 57 | } 58 | }, 59 | "node_modules/@humanwhocodes/config-array": { 60 | "version": "0.11.8", 61 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", 62 | "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", 63 | "dev": true, 64 | "dependencies": { 65 | "@humanwhocodes/object-schema": "^1.2.1", 66 | "debug": "^4.1.1", 67 | "minimatch": "^3.0.5" 68 | }, 69 | "engines": { 70 | "node": ">=10.10.0" 71 | } 72 | }, 73 | "node_modules/@humanwhocodes/module-importer": { 74 | "version": "1.0.1", 75 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 76 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 77 | "dev": true, 78 | "engines": { 79 | "node": ">=12.22" 80 | }, 81 | "funding": { 82 | "type": "github", 83 | "url": "https://github.com/sponsors/nzakas" 84 | } 85 | }, 86 | "node_modules/@humanwhocodes/object-schema": { 87 | "version": "1.2.1", 88 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 89 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 90 | "dev": true 91 | }, 92 | "node_modules/@nodelib/fs.scandir": { 93 | "version": "2.1.5", 94 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 95 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 96 | "dev": true, 97 | "dependencies": { 98 | "@nodelib/fs.stat": "2.0.5", 99 | "run-parallel": "^1.1.9" 100 | }, 101 | "engines": { 102 | "node": ">= 8" 103 | } 104 | }, 105 | "node_modules/@nodelib/fs.stat": { 106 | "version": "2.0.5", 107 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 108 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 109 | "dev": true, 110 | "engines": { 111 | "node": ">= 8" 112 | } 113 | }, 114 | "node_modules/@nodelib/fs.walk": { 115 | "version": "1.2.8", 116 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 117 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 118 | "dev": true, 119 | "dependencies": { 120 | "@nodelib/fs.scandir": "2.1.5", 121 | "fastq": "^1.6.0" 122 | }, 123 | "engines": { 124 | "node": ">= 8" 125 | } 126 | }, 127 | "node_modules/@tootallnate/once": { 128 | "version": "1.1.2", 129 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 130 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 131 | "dev": true, 132 | "engines": { 133 | "node": ">= 6" 134 | } 135 | }, 136 | "node_modules/@types/glob": { 137 | "version": "8.1.0", 138 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", 139 | "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", 140 | "dev": true, 141 | "dependencies": { 142 | "@types/minimatch": "^5.1.2", 143 | "@types/node": "*" 144 | } 145 | }, 146 | "node_modules/@types/json-schema": { 147 | "version": "7.0.11", 148 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 149 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 150 | "dev": true 151 | }, 152 | "node_modules/@types/minimatch": { 153 | "version": "5.1.2", 154 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", 155 | "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", 156 | "dev": true 157 | }, 158 | "node_modules/@types/mocha": { 159 | "version": "10.0.1", 160 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", 161 | "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", 162 | "dev": true 163 | }, 164 | "node_modules/@types/node": { 165 | "version": "16.18.14", 166 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.14.tgz", 167 | "integrity": "sha512-wvzClDGQXOCVNU4APPopC2KtMYukaF1MN/W3xAmslx22Z4/IF1/izDMekuyoUlwfnDHYCIZGaj7jMwnJKBTxKw==", 168 | "dev": true 169 | }, 170 | "node_modules/@types/semver": { 171 | "version": "7.3.13", 172 | "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", 173 | "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", 174 | "dev": true 175 | }, 176 | "node_modules/@types/vscode": { 177 | "version": "1.76.0", 178 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.76.0.tgz", 179 | "integrity": "sha512-CQcY3+Fe5hNewHnOEAVYj4dd1do/QHliXaknAEYSXx2KEHUzFibDZSKptCon+HPgK55xx20pR+PBJjf0MomnBA==", 180 | "dev": true 181 | }, 182 | "node_modules/@typescript-eslint/eslint-plugin": { 183 | "version": "5.54.1", 184 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", 185 | "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", 186 | "dev": true, 187 | "dependencies": { 188 | "@typescript-eslint/scope-manager": "5.54.1", 189 | "@typescript-eslint/type-utils": "5.54.1", 190 | "@typescript-eslint/utils": "5.54.1", 191 | "debug": "^4.3.4", 192 | "grapheme-splitter": "^1.0.4", 193 | "ignore": "^5.2.0", 194 | "natural-compare-lite": "^1.4.0", 195 | "regexpp": "^3.2.0", 196 | "semver": "^7.3.7", 197 | "tsutils": "^3.21.0" 198 | }, 199 | "engines": { 200 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 201 | }, 202 | "funding": { 203 | "type": "opencollective", 204 | "url": "https://opencollective.com/typescript-eslint" 205 | }, 206 | "peerDependencies": { 207 | "@typescript-eslint/parser": "^5.0.0", 208 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 209 | }, 210 | "peerDependenciesMeta": { 211 | "typescript": { 212 | "optional": true 213 | } 214 | } 215 | }, 216 | "node_modules/@typescript-eslint/parser": { 217 | "version": "5.54.1", 218 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", 219 | "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", 220 | "dev": true, 221 | "dependencies": { 222 | "@typescript-eslint/scope-manager": "5.54.1", 223 | "@typescript-eslint/types": "5.54.1", 224 | "@typescript-eslint/typescript-estree": "5.54.1", 225 | "debug": "^4.3.4" 226 | }, 227 | "engines": { 228 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 229 | }, 230 | "funding": { 231 | "type": "opencollective", 232 | "url": "https://opencollective.com/typescript-eslint" 233 | }, 234 | "peerDependencies": { 235 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 236 | }, 237 | "peerDependenciesMeta": { 238 | "typescript": { 239 | "optional": true 240 | } 241 | } 242 | }, 243 | "node_modules/@typescript-eslint/scope-manager": { 244 | "version": "5.54.1", 245 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", 246 | "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", 247 | "dev": true, 248 | "dependencies": { 249 | "@typescript-eslint/types": "5.54.1", 250 | "@typescript-eslint/visitor-keys": "5.54.1" 251 | }, 252 | "engines": { 253 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 254 | }, 255 | "funding": { 256 | "type": "opencollective", 257 | "url": "https://opencollective.com/typescript-eslint" 258 | } 259 | }, 260 | "node_modules/@typescript-eslint/type-utils": { 261 | "version": "5.54.1", 262 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", 263 | "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", 264 | "dev": true, 265 | "dependencies": { 266 | "@typescript-eslint/typescript-estree": "5.54.1", 267 | "@typescript-eslint/utils": "5.54.1", 268 | "debug": "^4.3.4", 269 | "tsutils": "^3.21.0" 270 | }, 271 | "engines": { 272 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 273 | }, 274 | "funding": { 275 | "type": "opencollective", 276 | "url": "https://opencollective.com/typescript-eslint" 277 | }, 278 | "peerDependencies": { 279 | "eslint": "*" 280 | }, 281 | "peerDependenciesMeta": { 282 | "typescript": { 283 | "optional": true 284 | } 285 | } 286 | }, 287 | "node_modules/@typescript-eslint/types": { 288 | "version": "5.54.1", 289 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", 290 | "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", 291 | "dev": true, 292 | "engines": { 293 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 294 | }, 295 | "funding": { 296 | "type": "opencollective", 297 | "url": "https://opencollective.com/typescript-eslint" 298 | } 299 | }, 300 | "node_modules/@typescript-eslint/typescript-estree": { 301 | "version": "5.54.1", 302 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", 303 | "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", 304 | "dev": true, 305 | "dependencies": { 306 | "@typescript-eslint/types": "5.54.1", 307 | "@typescript-eslint/visitor-keys": "5.54.1", 308 | "debug": "^4.3.4", 309 | "globby": "^11.1.0", 310 | "is-glob": "^4.0.3", 311 | "semver": "^7.3.7", 312 | "tsutils": "^3.21.0" 313 | }, 314 | "engines": { 315 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 316 | }, 317 | "funding": { 318 | "type": "opencollective", 319 | "url": "https://opencollective.com/typescript-eslint" 320 | }, 321 | "peerDependenciesMeta": { 322 | "typescript": { 323 | "optional": true 324 | } 325 | } 326 | }, 327 | "node_modules/@typescript-eslint/utils": { 328 | "version": "5.54.1", 329 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", 330 | "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", 331 | "dev": true, 332 | "dependencies": { 333 | "@types/json-schema": "^7.0.9", 334 | "@types/semver": "^7.3.12", 335 | "@typescript-eslint/scope-manager": "5.54.1", 336 | "@typescript-eslint/types": "5.54.1", 337 | "@typescript-eslint/typescript-estree": "5.54.1", 338 | "eslint-scope": "^5.1.1", 339 | "eslint-utils": "^3.0.0", 340 | "semver": "^7.3.7" 341 | }, 342 | "engines": { 343 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 344 | }, 345 | "funding": { 346 | "type": "opencollective", 347 | "url": "https://opencollective.com/typescript-eslint" 348 | }, 349 | "peerDependencies": { 350 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 351 | } 352 | }, 353 | "node_modules/@typescript-eslint/visitor-keys": { 354 | "version": "5.54.1", 355 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", 356 | "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", 357 | "dev": true, 358 | "dependencies": { 359 | "@typescript-eslint/types": "5.54.1", 360 | "eslint-visitor-keys": "^3.3.0" 361 | }, 362 | "engines": { 363 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 364 | }, 365 | "funding": { 366 | "type": "opencollective", 367 | "url": "https://opencollective.com/typescript-eslint" 368 | } 369 | }, 370 | "node_modules/@vscode/test-electron": { 371 | "version": "2.3.0", 372 | "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.0.tgz", 373 | "integrity": "sha512-fwzA9RtazH1GT/sckYlbxu6t5e4VaMXwCVtyLv4UAG0hP6NTfnMaaG25XCfWqlVwFhBMcQXHBCy5dmz2eLUnkw==", 374 | "dev": true, 375 | "dependencies": { 376 | "http-proxy-agent": "^4.0.1", 377 | "https-proxy-agent": "^5.0.0", 378 | "jszip": "^3.10.1", 379 | "semver": "^7.3.8" 380 | }, 381 | "engines": { 382 | "node": ">=16" 383 | } 384 | }, 385 | "node_modules/acorn": { 386 | "version": "8.8.2", 387 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 388 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 389 | "dev": true, 390 | "bin": { 391 | "acorn": "bin/acorn" 392 | }, 393 | "engines": { 394 | "node": ">=0.4.0" 395 | } 396 | }, 397 | "node_modules/acorn-jsx": { 398 | "version": "5.3.2", 399 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 400 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 401 | "dev": true, 402 | "peerDependencies": { 403 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 404 | } 405 | }, 406 | "node_modules/agent-base": { 407 | "version": "6.0.2", 408 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 409 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 410 | "dev": true, 411 | "dependencies": { 412 | "debug": "4" 413 | }, 414 | "engines": { 415 | "node": ">= 6.0.0" 416 | } 417 | }, 418 | "node_modules/ajv": { 419 | "version": "6.12.6", 420 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 421 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 422 | "dev": true, 423 | "dependencies": { 424 | "fast-deep-equal": "^3.1.1", 425 | "fast-json-stable-stringify": "^2.0.0", 426 | "json-schema-traverse": "^0.4.1", 427 | "uri-js": "^4.2.2" 428 | }, 429 | "funding": { 430 | "type": "github", 431 | "url": "https://github.com/sponsors/epoberezkin" 432 | } 433 | }, 434 | "node_modules/ansi-colors": { 435 | "version": "4.1.1", 436 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 437 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 438 | "dev": true, 439 | "engines": { 440 | "node": ">=6" 441 | } 442 | }, 443 | "node_modules/ansi-regex": { 444 | "version": "5.0.1", 445 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 446 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 447 | "dev": true, 448 | "engines": { 449 | "node": ">=8" 450 | } 451 | }, 452 | "node_modules/ansi-styles": { 453 | "version": "4.3.0", 454 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 455 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 456 | "dev": true, 457 | "dependencies": { 458 | "color-convert": "^2.0.1" 459 | }, 460 | "engines": { 461 | "node": ">=8" 462 | }, 463 | "funding": { 464 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 465 | } 466 | }, 467 | "node_modules/anymatch": { 468 | "version": "3.1.3", 469 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 470 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 471 | "dev": true, 472 | "dependencies": { 473 | "normalize-path": "^3.0.0", 474 | "picomatch": "^2.0.4" 475 | }, 476 | "engines": { 477 | "node": ">= 8" 478 | } 479 | }, 480 | "node_modules/argparse": { 481 | "version": "2.0.1", 482 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 483 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 484 | "dev": true 485 | }, 486 | "node_modules/array-union": { 487 | "version": "2.1.0", 488 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 489 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 490 | "dev": true, 491 | "engines": { 492 | "node": ">=8" 493 | } 494 | }, 495 | "node_modules/balanced-match": { 496 | "version": "1.0.2", 497 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 498 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 499 | "dev": true 500 | }, 501 | "node_modules/binary-extensions": { 502 | "version": "2.2.0", 503 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 504 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 505 | "dev": true, 506 | "engines": { 507 | "node": ">=8" 508 | } 509 | }, 510 | "node_modules/brace-expansion": { 511 | "version": "1.1.11", 512 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 513 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 514 | "dev": true, 515 | "dependencies": { 516 | "balanced-match": "^1.0.0", 517 | "concat-map": "0.0.1" 518 | } 519 | }, 520 | "node_modules/braces": { 521 | "version": "3.0.2", 522 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 523 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 524 | "dev": true, 525 | "dependencies": { 526 | "fill-range": "^7.0.1" 527 | }, 528 | "engines": { 529 | "node": ">=8" 530 | } 531 | }, 532 | "node_modules/browser-stdout": { 533 | "version": "1.3.1", 534 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 535 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 536 | "dev": true 537 | }, 538 | "node_modules/callsites": { 539 | "version": "3.1.0", 540 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 541 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 542 | "dev": true, 543 | "engines": { 544 | "node": ">=6" 545 | } 546 | }, 547 | "node_modules/camelcase": { 548 | "version": "6.3.0", 549 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 550 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 551 | "dev": true, 552 | "engines": { 553 | "node": ">=10" 554 | }, 555 | "funding": { 556 | "url": "https://github.com/sponsors/sindresorhus" 557 | } 558 | }, 559 | "node_modules/chalk": { 560 | "version": "4.1.2", 561 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 562 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 563 | "dev": true, 564 | "dependencies": { 565 | "ansi-styles": "^4.1.0", 566 | "supports-color": "^7.1.0" 567 | }, 568 | "engines": { 569 | "node": ">=10" 570 | }, 571 | "funding": { 572 | "url": "https://github.com/chalk/chalk?sponsor=1" 573 | } 574 | }, 575 | "node_modules/chokidar": { 576 | "version": "3.5.3", 577 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 578 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 579 | "dev": true, 580 | "funding": [ 581 | { 582 | "type": "individual", 583 | "url": "https://paulmillr.com/funding/" 584 | } 585 | ], 586 | "dependencies": { 587 | "anymatch": "~3.1.2", 588 | "braces": "~3.0.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 | "engines": { 596 | "node": ">= 8.10.0" 597 | }, 598 | "optionalDependencies": { 599 | "fsevents": "~2.3.2" 600 | } 601 | }, 602 | "node_modules/chokidar/node_modules/glob-parent": { 603 | "version": "5.1.2", 604 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 605 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 606 | "dev": true, 607 | "dependencies": { 608 | "is-glob": "^4.0.1" 609 | }, 610 | "engines": { 611 | "node": ">= 6" 612 | } 613 | }, 614 | "node_modules/cliui": { 615 | "version": "7.0.4", 616 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 617 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 618 | "dev": true, 619 | "dependencies": { 620 | "string-width": "^4.2.0", 621 | "strip-ansi": "^6.0.0", 622 | "wrap-ansi": "^7.0.0" 623 | } 624 | }, 625 | "node_modules/color-convert": { 626 | "version": "2.0.1", 627 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 628 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 629 | "dev": true, 630 | "dependencies": { 631 | "color-name": "~1.1.4" 632 | }, 633 | "engines": { 634 | "node": ">=7.0.0" 635 | } 636 | }, 637 | "node_modules/color-name": { 638 | "version": "1.1.4", 639 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 640 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 641 | "dev": true 642 | }, 643 | "node_modules/concat-map": { 644 | "version": "0.0.1", 645 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 646 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 647 | "dev": true 648 | }, 649 | "node_modules/core-util-is": { 650 | "version": "1.0.3", 651 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 652 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 653 | "dev": true 654 | }, 655 | "node_modules/cross-spawn": { 656 | "version": "7.0.3", 657 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 658 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 659 | "dev": true, 660 | "dependencies": { 661 | "path-key": "^3.1.0", 662 | "shebang-command": "^2.0.0", 663 | "which": "^2.0.1" 664 | }, 665 | "engines": { 666 | "node": ">= 8" 667 | } 668 | }, 669 | "node_modules/debug": { 670 | "version": "4.3.4", 671 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 672 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 673 | "dev": true, 674 | "dependencies": { 675 | "ms": "2.1.2" 676 | }, 677 | "engines": { 678 | "node": ">=6.0" 679 | }, 680 | "peerDependenciesMeta": { 681 | "supports-color": { 682 | "optional": true 683 | } 684 | } 685 | }, 686 | "node_modules/decamelize": { 687 | "version": "4.0.0", 688 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 689 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 690 | "dev": true, 691 | "engines": { 692 | "node": ">=10" 693 | }, 694 | "funding": { 695 | "url": "https://github.com/sponsors/sindresorhus" 696 | } 697 | }, 698 | "node_modules/deep-is": { 699 | "version": "0.1.4", 700 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 701 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 702 | "dev": true 703 | }, 704 | "node_modules/diff": { 705 | "version": "5.0.0", 706 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 707 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 708 | "dev": true, 709 | "engines": { 710 | "node": ">=0.3.1" 711 | } 712 | }, 713 | "node_modules/dir-glob": { 714 | "version": "3.0.1", 715 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 716 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 717 | "dev": true, 718 | "dependencies": { 719 | "path-type": "^4.0.0" 720 | }, 721 | "engines": { 722 | "node": ">=8" 723 | } 724 | }, 725 | "node_modules/doctrine": { 726 | "version": "3.0.0", 727 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 728 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 729 | "dev": true, 730 | "dependencies": { 731 | "esutils": "^2.0.2" 732 | }, 733 | "engines": { 734 | "node": ">=6.0.0" 735 | } 736 | }, 737 | "node_modules/emoji-regex": { 738 | "version": "8.0.0", 739 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 740 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 741 | "dev": true 742 | }, 743 | "node_modules/escalade": { 744 | "version": "3.1.1", 745 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 746 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 747 | "dev": true, 748 | "engines": { 749 | "node": ">=6" 750 | } 751 | }, 752 | "node_modules/escape-string-regexp": { 753 | "version": "4.0.0", 754 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 755 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 756 | "dev": true, 757 | "engines": { 758 | "node": ">=10" 759 | }, 760 | "funding": { 761 | "url": "https://github.com/sponsors/sindresorhus" 762 | } 763 | }, 764 | "node_modules/eslint": { 765 | "version": "8.35.0", 766 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", 767 | "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", 768 | "dev": true, 769 | "dependencies": { 770 | "@eslint/eslintrc": "^2.0.0", 771 | "@eslint/js": "8.35.0", 772 | "@humanwhocodes/config-array": "^0.11.8", 773 | "@humanwhocodes/module-importer": "^1.0.1", 774 | "@nodelib/fs.walk": "^1.2.8", 775 | "ajv": "^6.10.0", 776 | "chalk": "^4.0.0", 777 | "cross-spawn": "^7.0.2", 778 | "debug": "^4.3.2", 779 | "doctrine": "^3.0.0", 780 | "escape-string-regexp": "^4.0.0", 781 | "eslint-scope": "^7.1.1", 782 | "eslint-utils": "^3.0.0", 783 | "eslint-visitor-keys": "^3.3.0", 784 | "espree": "^9.4.0", 785 | "esquery": "^1.4.2", 786 | "esutils": "^2.0.2", 787 | "fast-deep-equal": "^3.1.3", 788 | "file-entry-cache": "^6.0.1", 789 | "find-up": "^5.0.0", 790 | "glob-parent": "^6.0.2", 791 | "globals": "^13.19.0", 792 | "grapheme-splitter": "^1.0.4", 793 | "ignore": "^5.2.0", 794 | "import-fresh": "^3.0.0", 795 | "imurmurhash": "^0.1.4", 796 | "is-glob": "^4.0.0", 797 | "is-path-inside": "^3.0.3", 798 | "js-sdsl": "^4.1.4", 799 | "js-yaml": "^4.1.0", 800 | "json-stable-stringify-without-jsonify": "^1.0.1", 801 | "levn": "^0.4.1", 802 | "lodash.merge": "^4.6.2", 803 | "minimatch": "^3.1.2", 804 | "natural-compare": "^1.4.0", 805 | "optionator": "^0.9.1", 806 | "regexpp": "^3.2.0", 807 | "strip-ansi": "^6.0.1", 808 | "strip-json-comments": "^3.1.0", 809 | "text-table": "^0.2.0" 810 | }, 811 | "bin": { 812 | "eslint": "bin/eslint.js" 813 | }, 814 | "engines": { 815 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 816 | }, 817 | "funding": { 818 | "url": "https://opencollective.com/eslint" 819 | } 820 | }, 821 | "node_modules/eslint-scope": { 822 | "version": "5.1.1", 823 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 824 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 825 | "dev": true, 826 | "dependencies": { 827 | "esrecurse": "^4.3.0", 828 | "estraverse": "^4.1.1" 829 | }, 830 | "engines": { 831 | "node": ">=8.0.0" 832 | } 833 | }, 834 | "node_modules/eslint-utils": { 835 | "version": "3.0.0", 836 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 837 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 838 | "dev": true, 839 | "dependencies": { 840 | "eslint-visitor-keys": "^2.0.0" 841 | }, 842 | "engines": { 843 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 844 | }, 845 | "funding": { 846 | "url": "https://github.com/sponsors/mysticatea" 847 | }, 848 | "peerDependencies": { 849 | "eslint": ">=5" 850 | } 851 | }, 852 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 853 | "version": "2.1.0", 854 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 855 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 856 | "dev": true, 857 | "engines": { 858 | "node": ">=10" 859 | } 860 | }, 861 | "node_modules/eslint-visitor-keys": { 862 | "version": "3.3.0", 863 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 864 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 865 | "dev": true, 866 | "engines": { 867 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 868 | } 869 | }, 870 | "node_modules/eslint/node_modules/eslint-scope": { 871 | "version": "7.1.1", 872 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 873 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 874 | "dev": true, 875 | "dependencies": { 876 | "esrecurse": "^4.3.0", 877 | "estraverse": "^5.2.0" 878 | }, 879 | "engines": { 880 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 881 | } 882 | }, 883 | "node_modules/eslint/node_modules/estraverse": { 884 | "version": "5.3.0", 885 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 886 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 887 | "dev": true, 888 | "engines": { 889 | "node": ">=4.0" 890 | } 891 | }, 892 | "node_modules/espree": { 893 | "version": "9.4.1", 894 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 895 | "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 896 | "dev": true, 897 | "dependencies": { 898 | "acorn": "^8.8.0", 899 | "acorn-jsx": "^5.3.2", 900 | "eslint-visitor-keys": "^3.3.0" 901 | }, 902 | "engines": { 903 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 904 | }, 905 | "funding": { 906 | "url": "https://opencollective.com/eslint" 907 | } 908 | }, 909 | "node_modules/esquery": { 910 | "version": "1.5.0", 911 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 912 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 913 | "dev": true, 914 | "dependencies": { 915 | "estraverse": "^5.1.0" 916 | }, 917 | "engines": { 918 | "node": ">=0.10" 919 | } 920 | }, 921 | "node_modules/esquery/node_modules/estraverse": { 922 | "version": "5.3.0", 923 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 924 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 925 | "dev": true, 926 | "engines": { 927 | "node": ">=4.0" 928 | } 929 | }, 930 | "node_modules/esrecurse": { 931 | "version": "4.3.0", 932 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 933 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 934 | "dev": true, 935 | "dependencies": { 936 | "estraverse": "^5.2.0" 937 | }, 938 | "engines": { 939 | "node": ">=4.0" 940 | } 941 | }, 942 | "node_modules/esrecurse/node_modules/estraverse": { 943 | "version": "5.3.0", 944 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 945 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 946 | "dev": true, 947 | "engines": { 948 | "node": ">=4.0" 949 | } 950 | }, 951 | "node_modules/estraverse": { 952 | "version": "4.3.0", 953 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 954 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 955 | "dev": true, 956 | "engines": { 957 | "node": ">=4.0" 958 | } 959 | }, 960 | "node_modules/esutils": { 961 | "version": "2.0.3", 962 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 963 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 964 | "dev": true, 965 | "engines": { 966 | "node": ">=0.10.0" 967 | } 968 | }, 969 | "node_modules/fast-deep-equal": { 970 | "version": "3.1.3", 971 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 972 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 973 | "dev": true 974 | }, 975 | "node_modules/fast-glob": { 976 | "version": "3.2.12", 977 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 978 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 979 | "dev": true, 980 | "dependencies": { 981 | "@nodelib/fs.stat": "^2.0.2", 982 | "@nodelib/fs.walk": "^1.2.3", 983 | "glob-parent": "^5.1.2", 984 | "merge2": "^1.3.0", 985 | "micromatch": "^4.0.4" 986 | }, 987 | "engines": { 988 | "node": ">=8.6.0" 989 | } 990 | }, 991 | "node_modules/fast-glob/node_modules/glob-parent": { 992 | "version": "5.1.2", 993 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 994 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 995 | "dev": true, 996 | "dependencies": { 997 | "is-glob": "^4.0.1" 998 | }, 999 | "engines": { 1000 | "node": ">= 6" 1001 | } 1002 | }, 1003 | "node_modules/fast-json-stable-stringify": { 1004 | "version": "2.1.0", 1005 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1006 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1007 | "dev": true 1008 | }, 1009 | "node_modules/fast-levenshtein": { 1010 | "version": "2.0.6", 1011 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1012 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1013 | "dev": true 1014 | }, 1015 | "node_modules/fastq": { 1016 | "version": "1.15.0", 1017 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 1018 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 1019 | "dev": true, 1020 | "dependencies": { 1021 | "reusify": "^1.0.4" 1022 | } 1023 | }, 1024 | "node_modules/file-entry-cache": { 1025 | "version": "6.0.1", 1026 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1027 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1028 | "dev": true, 1029 | "dependencies": { 1030 | "flat-cache": "^3.0.4" 1031 | }, 1032 | "engines": { 1033 | "node": "^10.12.0 || >=12.0.0" 1034 | } 1035 | }, 1036 | "node_modules/fill-range": { 1037 | "version": "7.0.1", 1038 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1039 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1040 | "dev": true, 1041 | "dependencies": { 1042 | "to-regex-range": "^5.0.1" 1043 | }, 1044 | "engines": { 1045 | "node": ">=8" 1046 | } 1047 | }, 1048 | "node_modules/find-up": { 1049 | "version": "5.0.0", 1050 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1051 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1052 | "dev": true, 1053 | "dependencies": { 1054 | "locate-path": "^6.0.0", 1055 | "path-exists": "^4.0.0" 1056 | }, 1057 | "engines": { 1058 | "node": ">=10" 1059 | }, 1060 | "funding": { 1061 | "url": "https://github.com/sponsors/sindresorhus" 1062 | } 1063 | }, 1064 | "node_modules/flat": { 1065 | "version": "5.0.2", 1066 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1067 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1068 | "dev": true, 1069 | "bin": { 1070 | "flat": "cli.js" 1071 | } 1072 | }, 1073 | "node_modules/flat-cache": { 1074 | "version": "3.0.4", 1075 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1076 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1077 | "dev": true, 1078 | "dependencies": { 1079 | "flatted": "^3.1.0", 1080 | "rimraf": "^3.0.2" 1081 | }, 1082 | "engines": { 1083 | "node": "^10.12.0 || >=12.0.0" 1084 | } 1085 | }, 1086 | "node_modules/flatted": { 1087 | "version": "3.2.7", 1088 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 1089 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 1090 | "dev": true 1091 | }, 1092 | "node_modules/fs.realpath": { 1093 | "version": "1.0.0", 1094 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1095 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1096 | "dev": true 1097 | }, 1098 | "node_modules/fsevents": { 1099 | "version": "2.3.2", 1100 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1101 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1102 | "dev": true, 1103 | "hasInstallScript": true, 1104 | "optional": true, 1105 | "os": [ 1106 | "darwin" 1107 | ], 1108 | "engines": { 1109 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1110 | } 1111 | }, 1112 | "node_modules/get-caller-file": { 1113 | "version": "2.0.5", 1114 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1115 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1116 | "dev": true, 1117 | "engines": { 1118 | "node": "6.* || 8.* || >= 10.*" 1119 | } 1120 | }, 1121 | "node_modules/glob": { 1122 | "version": "8.1.0", 1123 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1124 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1125 | "dev": true, 1126 | "dependencies": { 1127 | "fs.realpath": "^1.0.0", 1128 | "inflight": "^1.0.4", 1129 | "inherits": "2", 1130 | "minimatch": "^5.0.1", 1131 | "once": "^1.3.0" 1132 | }, 1133 | "engines": { 1134 | "node": ">=12" 1135 | }, 1136 | "funding": { 1137 | "url": "https://github.com/sponsors/isaacs" 1138 | } 1139 | }, 1140 | "node_modules/glob-parent": { 1141 | "version": "6.0.2", 1142 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1143 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1144 | "dev": true, 1145 | "dependencies": { 1146 | "is-glob": "^4.0.3" 1147 | }, 1148 | "engines": { 1149 | "node": ">=10.13.0" 1150 | } 1151 | }, 1152 | "node_modules/glob/node_modules/brace-expansion": { 1153 | "version": "2.0.1", 1154 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1155 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1156 | "dev": true, 1157 | "dependencies": { 1158 | "balanced-match": "^1.0.0" 1159 | } 1160 | }, 1161 | "node_modules/glob/node_modules/minimatch": { 1162 | "version": "5.1.6", 1163 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1164 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1165 | "dev": true, 1166 | "dependencies": { 1167 | "brace-expansion": "^2.0.1" 1168 | }, 1169 | "engines": { 1170 | "node": ">=10" 1171 | } 1172 | }, 1173 | "node_modules/globals": { 1174 | "version": "13.20.0", 1175 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 1176 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 1177 | "dev": true, 1178 | "dependencies": { 1179 | "type-fest": "^0.20.2" 1180 | }, 1181 | "engines": { 1182 | "node": ">=8" 1183 | }, 1184 | "funding": { 1185 | "url": "https://github.com/sponsors/sindresorhus" 1186 | } 1187 | }, 1188 | "node_modules/globby": { 1189 | "version": "11.1.0", 1190 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1191 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1192 | "dev": true, 1193 | "dependencies": { 1194 | "array-union": "^2.1.0", 1195 | "dir-glob": "^3.0.1", 1196 | "fast-glob": "^3.2.9", 1197 | "ignore": "^5.2.0", 1198 | "merge2": "^1.4.1", 1199 | "slash": "^3.0.0" 1200 | }, 1201 | "engines": { 1202 | "node": ">=10" 1203 | }, 1204 | "funding": { 1205 | "url": "https://github.com/sponsors/sindresorhus" 1206 | } 1207 | }, 1208 | "node_modules/grapheme-splitter": { 1209 | "version": "1.0.4", 1210 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 1211 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 1212 | "dev": true 1213 | }, 1214 | "node_modules/has-flag": { 1215 | "version": "4.0.0", 1216 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1217 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1218 | "dev": true, 1219 | "engines": { 1220 | "node": ">=8" 1221 | } 1222 | }, 1223 | "node_modules/he": { 1224 | "version": "1.2.0", 1225 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1226 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1227 | "dev": true, 1228 | "bin": { 1229 | "he": "bin/he" 1230 | } 1231 | }, 1232 | "node_modules/http-proxy-agent": { 1233 | "version": "4.0.1", 1234 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 1235 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 1236 | "dev": true, 1237 | "dependencies": { 1238 | "@tootallnate/once": "1", 1239 | "agent-base": "6", 1240 | "debug": "4" 1241 | }, 1242 | "engines": { 1243 | "node": ">= 6" 1244 | } 1245 | }, 1246 | "node_modules/https-proxy-agent": { 1247 | "version": "5.0.1", 1248 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1249 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1250 | "dev": true, 1251 | "dependencies": { 1252 | "agent-base": "6", 1253 | "debug": "4" 1254 | }, 1255 | "engines": { 1256 | "node": ">= 6" 1257 | } 1258 | }, 1259 | "node_modules/ignore": { 1260 | "version": "5.2.4", 1261 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1262 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1263 | "dev": true, 1264 | "engines": { 1265 | "node": ">= 4" 1266 | } 1267 | }, 1268 | "node_modules/immediate": { 1269 | "version": "3.0.6", 1270 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1271 | "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", 1272 | "dev": true 1273 | }, 1274 | "node_modules/import-fresh": { 1275 | "version": "3.3.0", 1276 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1277 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1278 | "dev": true, 1279 | "dependencies": { 1280 | "parent-module": "^1.0.0", 1281 | "resolve-from": "^4.0.0" 1282 | }, 1283 | "engines": { 1284 | "node": ">=6" 1285 | }, 1286 | "funding": { 1287 | "url": "https://github.com/sponsors/sindresorhus" 1288 | } 1289 | }, 1290 | "node_modules/imurmurhash": { 1291 | "version": "0.1.4", 1292 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1293 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1294 | "dev": true, 1295 | "engines": { 1296 | "node": ">=0.8.19" 1297 | } 1298 | }, 1299 | "node_modules/inflight": { 1300 | "version": "1.0.6", 1301 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1302 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1303 | "dev": true, 1304 | "dependencies": { 1305 | "once": "^1.3.0", 1306 | "wrappy": "1" 1307 | } 1308 | }, 1309 | "node_modules/inherits": { 1310 | "version": "2.0.4", 1311 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1312 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1313 | "dev": true 1314 | }, 1315 | "node_modules/is-binary-path": { 1316 | "version": "2.1.0", 1317 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1318 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1319 | "dev": true, 1320 | "dependencies": { 1321 | "binary-extensions": "^2.0.0" 1322 | }, 1323 | "engines": { 1324 | "node": ">=8" 1325 | } 1326 | }, 1327 | "node_modules/is-extglob": { 1328 | "version": "2.1.1", 1329 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1330 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1331 | "dev": true, 1332 | "engines": { 1333 | "node": ">=0.10.0" 1334 | } 1335 | }, 1336 | "node_modules/is-fullwidth-code-point": { 1337 | "version": "3.0.0", 1338 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1339 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1340 | "dev": true, 1341 | "engines": { 1342 | "node": ">=8" 1343 | } 1344 | }, 1345 | "node_modules/is-glob": { 1346 | "version": "4.0.3", 1347 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1348 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1349 | "dev": true, 1350 | "dependencies": { 1351 | "is-extglob": "^2.1.1" 1352 | }, 1353 | "engines": { 1354 | "node": ">=0.10.0" 1355 | } 1356 | }, 1357 | "node_modules/is-number": { 1358 | "version": "7.0.0", 1359 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1360 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1361 | "dev": true, 1362 | "engines": { 1363 | "node": ">=0.12.0" 1364 | } 1365 | }, 1366 | "node_modules/is-path-inside": { 1367 | "version": "3.0.3", 1368 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1369 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1370 | "dev": true, 1371 | "engines": { 1372 | "node": ">=8" 1373 | } 1374 | }, 1375 | "node_modules/is-plain-obj": { 1376 | "version": "2.1.0", 1377 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1378 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1379 | "dev": true, 1380 | "engines": { 1381 | "node": ">=8" 1382 | } 1383 | }, 1384 | "node_modules/is-unicode-supported": { 1385 | "version": "0.1.0", 1386 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1387 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1388 | "dev": true, 1389 | "engines": { 1390 | "node": ">=10" 1391 | }, 1392 | "funding": { 1393 | "url": "https://github.com/sponsors/sindresorhus" 1394 | } 1395 | }, 1396 | "node_modules/isarray": { 1397 | "version": "1.0.0", 1398 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1399 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1400 | "dev": true 1401 | }, 1402 | "node_modules/isexe": { 1403 | "version": "2.0.0", 1404 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1405 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1406 | "dev": true 1407 | }, 1408 | "node_modules/js-sdsl": { 1409 | "version": "4.3.0", 1410 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", 1411 | "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", 1412 | "dev": true, 1413 | "funding": { 1414 | "type": "opencollective", 1415 | "url": "https://opencollective.com/js-sdsl" 1416 | } 1417 | }, 1418 | "node_modules/js-yaml": { 1419 | "version": "4.1.0", 1420 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1421 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1422 | "dev": true, 1423 | "dependencies": { 1424 | "argparse": "^2.0.1" 1425 | }, 1426 | "bin": { 1427 | "js-yaml": "bin/js-yaml.js" 1428 | } 1429 | }, 1430 | "node_modules/json-schema-traverse": { 1431 | "version": "0.4.1", 1432 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1433 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1434 | "dev": true 1435 | }, 1436 | "node_modules/json-stable-stringify-without-jsonify": { 1437 | "version": "1.0.1", 1438 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1439 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1440 | "dev": true 1441 | }, 1442 | "node_modules/jszip": { 1443 | "version": "3.10.1", 1444 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", 1445 | "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", 1446 | "dev": true, 1447 | "dependencies": { 1448 | "lie": "~3.3.0", 1449 | "pako": "~1.0.2", 1450 | "readable-stream": "~2.3.6", 1451 | "setimmediate": "^1.0.5" 1452 | } 1453 | }, 1454 | "node_modules/levn": { 1455 | "version": "0.4.1", 1456 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1457 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1458 | "dev": true, 1459 | "dependencies": { 1460 | "prelude-ls": "^1.2.1", 1461 | "type-check": "~0.4.0" 1462 | }, 1463 | "engines": { 1464 | "node": ">= 0.8.0" 1465 | } 1466 | }, 1467 | "node_modules/lie": { 1468 | "version": "3.3.0", 1469 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 1470 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 1471 | "dev": true, 1472 | "dependencies": { 1473 | "immediate": "~3.0.5" 1474 | } 1475 | }, 1476 | "node_modules/locate-path": { 1477 | "version": "6.0.0", 1478 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1479 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1480 | "dev": true, 1481 | "dependencies": { 1482 | "p-locate": "^5.0.0" 1483 | }, 1484 | "engines": { 1485 | "node": ">=10" 1486 | }, 1487 | "funding": { 1488 | "url": "https://github.com/sponsors/sindresorhus" 1489 | } 1490 | }, 1491 | "node_modules/lodash.merge": { 1492 | "version": "4.6.2", 1493 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1494 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1495 | "dev": true 1496 | }, 1497 | "node_modules/log-symbols": { 1498 | "version": "4.1.0", 1499 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1500 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1501 | "dev": true, 1502 | "dependencies": { 1503 | "chalk": "^4.1.0", 1504 | "is-unicode-supported": "^0.1.0" 1505 | }, 1506 | "engines": { 1507 | "node": ">=10" 1508 | }, 1509 | "funding": { 1510 | "url": "https://github.com/sponsors/sindresorhus" 1511 | } 1512 | }, 1513 | "node_modules/lru-cache": { 1514 | "version": "6.0.0", 1515 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1516 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1517 | "dev": true, 1518 | "dependencies": { 1519 | "yallist": "^4.0.0" 1520 | }, 1521 | "engines": { 1522 | "node": ">=10" 1523 | } 1524 | }, 1525 | "node_modules/merge2": { 1526 | "version": "1.4.1", 1527 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1528 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1529 | "dev": true, 1530 | "engines": { 1531 | "node": ">= 8" 1532 | } 1533 | }, 1534 | "node_modules/micromatch": { 1535 | "version": "4.0.5", 1536 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1537 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1538 | "dev": true, 1539 | "dependencies": { 1540 | "braces": "^3.0.2", 1541 | "picomatch": "^2.3.1" 1542 | }, 1543 | "engines": { 1544 | "node": ">=8.6" 1545 | } 1546 | }, 1547 | "node_modules/minimatch": { 1548 | "version": "3.1.2", 1549 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1550 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1551 | "dev": true, 1552 | "dependencies": { 1553 | "brace-expansion": "^1.1.7" 1554 | }, 1555 | "engines": { 1556 | "node": "*" 1557 | } 1558 | }, 1559 | "node_modules/mocha": { 1560 | "version": "10.2.0", 1561 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1562 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1563 | "dev": true, 1564 | "dependencies": { 1565 | "ansi-colors": "4.1.1", 1566 | "browser-stdout": "1.3.1", 1567 | "chokidar": "3.5.3", 1568 | "debug": "4.3.4", 1569 | "diff": "5.0.0", 1570 | "escape-string-regexp": "4.0.0", 1571 | "find-up": "5.0.0", 1572 | "glob": "7.2.0", 1573 | "he": "1.2.0", 1574 | "js-yaml": "4.1.0", 1575 | "log-symbols": "4.1.0", 1576 | "minimatch": "5.0.1", 1577 | "ms": "2.1.3", 1578 | "nanoid": "3.3.3", 1579 | "serialize-javascript": "6.0.0", 1580 | "strip-json-comments": "3.1.1", 1581 | "supports-color": "8.1.1", 1582 | "workerpool": "6.2.1", 1583 | "yargs": "16.2.0", 1584 | "yargs-parser": "20.2.4", 1585 | "yargs-unparser": "2.0.0" 1586 | }, 1587 | "bin": { 1588 | "_mocha": "bin/_mocha", 1589 | "mocha": "bin/mocha.js" 1590 | }, 1591 | "engines": { 1592 | "node": ">= 14.0.0" 1593 | }, 1594 | "funding": { 1595 | "type": "opencollective", 1596 | "url": "https://opencollective.com/mochajs" 1597 | } 1598 | }, 1599 | "node_modules/mocha/node_modules/glob": { 1600 | "version": "7.2.0", 1601 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 1602 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 1603 | "dev": true, 1604 | "dependencies": { 1605 | "fs.realpath": "^1.0.0", 1606 | "inflight": "^1.0.4", 1607 | "inherits": "2", 1608 | "minimatch": "^3.0.4", 1609 | "once": "^1.3.0", 1610 | "path-is-absolute": "^1.0.0" 1611 | }, 1612 | "engines": { 1613 | "node": "*" 1614 | }, 1615 | "funding": { 1616 | "url": "https://github.com/sponsors/isaacs" 1617 | } 1618 | }, 1619 | "node_modules/mocha/node_modules/glob/node_modules/minimatch": { 1620 | "version": "3.1.2", 1621 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1622 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1623 | "dev": true, 1624 | "dependencies": { 1625 | "brace-expansion": "^1.1.7" 1626 | }, 1627 | "engines": { 1628 | "node": "*" 1629 | } 1630 | }, 1631 | "node_modules/mocha/node_modules/minimatch": { 1632 | "version": "5.0.1", 1633 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 1634 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 1635 | "dev": true, 1636 | "dependencies": { 1637 | "brace-expansion": "^2.0.1" 1638 | }, 1639 | "engines": { 1640 | "node": ">=10" 1641 | } 1642 | }, 1643 | "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { 1644 | "version": "2.0.1", 1645 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1646 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1647 | "dev": true, 1648 | "dependencies": { 1649 | "balanced-match": "^1.0.0" 1650 | } 1651 | }, 1652 | "node_modules/mocha/node_modules/ms": { 1653 | "version": "2.1.3", 1654 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1655 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1656 | "dev": true 1657 | }, 1658 | "node_modules/mocha/node_modules/supports-color": { 1659 | "version": "8.1.1", 1660 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1661 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1662 | "dev": true, 1663 | "dependencies": { 1664 | "has-flag": "^4.0.0" 1665 | }, 1666 | "engines": { 1667 | "node": ">=10" 1668 | }, 1669 | "funding": { 1670 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1671 | } 1672 | }, 1673 | "node_modules/ms": { 1674 | "version": "2.1.2", 1675 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1676 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1677 | "dev": true 1678 | }, 1679 | "node_modules/nanoid": { 1680 | "version": "3.3.3", 1681 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1682 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1683 | "dev": true, 1684 | "bin": { 1685 | "nanoid": "bin/nanoid.cjs" 1686 | }, 1687 | "engines": { 1688 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1689 | } 1690 | }, 1691 | "node_modules/natural-compare": { 1692 | "version": "1.4.0", 1693 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1694 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1695 | "dev": true 1696 | }, 1697 | "node_modules/natural-compare-lite": { 1698 | "version": "1.4.0", 1699 | "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", 1700 | "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", 1701 | "dev": true 1702 | }, 1703 | "node_modules/normalize-path": { 1704 | "version": "3.0.0", 1705 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1706 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1707 | "dev": true, 1708 | "engines": { 1709 | "node": ">=0.10.0" 1710 | } 1711 | }, 1712 | "node_modules/once": { 1713 | "version": "1.4.0", 1714 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1715 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1716 | "dev": true, 1717 | "dependencies": { 1718 | "wrappy": "1" 1719 | } 1720 | }, 1721 | "node_modules/optionator": { 1722 | "version": "0.9.1", 1723 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1724 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1725 | "dev": true, 1726 | "dependencies": { 1727 | "deep-is": "^0.1.3", 1728 | "fast-levenshtein": "^2.0.6", 1729 | "levn": "^0.4.1", 1730 | "prelude-ls": "^1.2.1", 1731 | "type-check": "^0.4.0", 1732 | "word-wrap": "^1.2.3" 1733 | }, 1734 | "engines": { 1735 | "node": ">= 0.8.0" 1736 | } 1737 | }, 1738 | "node_modules/p-limit": { 1739 | "version": "3.1.0", 1740 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1741 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1742 | "dev": true, 1743 | "dependencies": { 1744 | "yocto-queue": "^0.1.0" 1745 | }, 1746 | "engines": { 1747 | "node": ">=10" 1748 | }, 1749 | "funding": { 1750 | "url": "https://github.com/sponsors/sindresorhus" 1751 | } 1752 | }, 1753 | "node_modules/p-locate": { 1754 | "version": "5.0.0", 1755 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1756 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1757 | "dev": true, 1758 | "dependencies": { 1759 | "p-limit": "^3.0.2" 1760 | }, 1761 | "engines": { 1762 | "node": ">=10" 1763 | }, 1764 | "funding": { 1765 | "url": "https://github.com/sponsors/sindresorhus" 1766 | } 1767 | }, 1768 | "node_modules/pako": { 1769 | "version": "1.0.11", 1770 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1771 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 1772 | "dev": true 1773 | }, 1774 | "node_modules/parent-module": { 1775 | "version": "1.0.1", 1776 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1777 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1778 | "dev": true, 1779 | "dependencies": { 1780 | "callsites": "^3.0.0" 1781 | }, 1782 | "engines": { 1783 | "node": ">=6" 1784 | } 1785 | }, 1786 | "node_modules/path-exists": { 1787 | "version": "4.0.0", 1788 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1789 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1790 | "dev": true, 1791 | "engines": { 1792 | "node": ">=8" 1793 | } 1794 | }, 1795 | "node_modules/path-is-absolute": { 1796 | "version": "1.0.1", 1797 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1798 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1799 | "dev": true, 1800 | "engines": { 1801 | "node": ">=0.10.0" 1802 | } 1803 | }, 1804 | "node_modules/path-key": { 1805 | "version": "3.1.1", 1806 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1807 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1808 | "dev": true, 1809 | "engines": { 1810 | "node": ">=8" 1811 | } 1812 | }, 1813 | "node_modules/path-type": { 1814 | "version": "4.0.0", 1815 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1816 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1817 | "dev": true, 1818 | "engines": { 1819 | "node": ">=8" 1820 | } 1821 | }, 1822 | "node_modules/picomatch": { 1823 | "version": "2.3.1", 1824 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1825 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1826 | "dev": true, 1827 | "engines": { 1828 | "node": ">=8.6" 1829 | }, 1830 | "funding": { 1831 | "url": "https://github.com/sponsors/jonschlinkert" 1832 | } 1833 | }, 1834 | "node_modules/prelude-ls": { 1835 | "version": "1.2.1", 1836 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1837 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1838 | "dev": true, 1839 | "engines": { 1840 | "node": ">= 0.8.0" 1841 | } 1842 | }, 1843 | "node_modules/process-nextick-args": { 1844 | "version": "2.0.1", 1845 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1846 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1847 | "dev": true 1848 | }, 1849 | "node_modules/punycode": { 1850 | "version": "2.3.0", 1851 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1852 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1853 | "dev": true, 1854 | "engines": { 1855 | "node": ">=6" 1856 | } 1857 | }, 1858 | "node_modules/queue-microtask": { 1859 | "version": "1.2.3", 1860 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1861 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1862 | "dev": true, 1863 | "funding": [ 1864 | { 1865 | "type": "github", 1866 | "url": "https://github.com/sponsors/feross" 1867 | }, 1868 | { 1869 | "type": "patreon", 1870 | "url": "https://www.patreon.com/feross" 1871 | }, 1872 | { 1873 | "type": "consulting", 1874 | "url": "https://feross.org/support" 1875 | } 1876 | ] 1877 | }, 1878 | "node_modules/randombytes": { 1879 | "version": "2.1.0", 1880 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1881 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1882 | "dev": true, 1883 | "dependencies": { 1884 | "safe-buffer": "^5.1.0" 1885 | } 1886 | }, 1887 | "node_modules/readable-stream": { 1888 | "version": "2.3.8", 1889 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 1890 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1891 | "dev": true, 1892 | "dependencies": { 1893 | "core-util-is": "~1.0.0", 1894 | "inherits": "~2.0.3", 1895 | "isarray": "~1.0.0", 1896 | "process-nextick-args": "~2.0.0", 1897 | "safe-buffer": "~5.1.1", 1898 | "string_decoder": "~1.1.1", 1899 | "util-deprecate": "~1.0.1" 1900 | } 1901 | }, 1902 | "node_modules/readdirp": { 1903 | "version": "3.6.0", 1904 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1905 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1906 | "dev": true, 1907 | "dependencies": { 1908 | "picomatch": "^2.2.1" 1909 | }, 1910 | "engines": { 1911 | "node": ">=8.10.0" 1912 | } 1913 | }, 1914 | "node_modules/regexpp": { 1915 | "version": "3.2.0", 1916 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1917 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1918 | "dev": true, 1919 | "engines": { 1920 | "node": ">=8" 1921 | }, 1922 | "funding": { 1923 | "url": "https://github.com/sponsors/mysticatea" 1924 | } 1925 | }, 1926 | "node_modules/require-directory": { 1927 | "version": "2.1.1", 1928 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1929 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1930 | "dev": true, 1931 | "engines": { 1932 | "node": ">=0.10.0" 1933 | } 1934 | }, 1935 | "node_modules/resolve-from": { 1936 | "version": "4.0.0", 1937 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1938 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1939 | "dev": true, 1940 | "engines": { 1941 | "node": ">=4" 1942 | } 1943 | }, 1944 | "node_modules/reusify": { 1945 | "version": "1.0.4", 1946 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1947 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1948 | "dev": true, 1949 | "engines": { 1950 | "iojs": ">=1.0.0", 1951 | "node": ">=0.10.0" 1952 | } 1953 | }, 1954 | "node_modules/rimraf": { 1955 | "version": "3.0.2", 1956 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1957 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1958 | "dev": true, 1959 | "dependencies": { 1960 | "glob": "^7.1.3" 1961 | }, 1962 | "bin": { 1963 | "rimraf": "bin.js" 1964 | }, 1965 | "funding": { 1966 | "url": "https://github.com/sponsors/isaacs" 1967 | } 1968 | }, 1969 | "node_modules/rimraf/node_modules/glob": { 1970 | "version": "7.2.3", 1971 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1972 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1973 | "dev": true, 1974 | "dependencies": { 1975 | "fs.realpath": "^1.0.0", 1976 | "inflight": "^1.0.4", 1977 | "inherits": "2", 1978 | "minimatch": "^3.1.1", 1979 | "once": "^1.3.0", 1980 | "path-is-absolute": "^1.0.0" 1981 | }, 1982 | "engines": { 1983 | "node": "*" 1984 | }, 1985 | "funding": { 1986 | "url": "https://github.com/sponsors/isaacs" 1987 | } 1988 | }, 1989 | "node_modules/run-parallel": { 1990 | "version": "1.2.0", 1991 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1992 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1993 | "dev": true, 1994 | "funding": [ 1995 | { 1996 | "type": "github", 1997 | "url": "https://github.com/sponsors/feross" 1998 | }, 1999 | { 2000 | "type": "patreon", 2001 | "url": "https://www.patreon.com/feross" 2002 | }, 2003 | { 2004 | "type": "consulting", 2005 | "url": "https://feross.org/support" 2006 | } 2007 | ], 2008 | "dependencies": { 2009 | "queue-microtask": "^1.2.2" 2010 | } 2011 | }, 2012 | "node_modules/safe-buffer": { 2013 | "version": "5.1.2", 2014 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2015 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2016 | "dev": true 2017 | }, 2018 | "node_modules/semver": { 2019 | "version": "7.3.8", 2020 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 2021 | "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 2022 | "dev": true, 2023 | "dependencies": { 2024 | "lru-cache": "^6.0.0" 2025 | }, 2026 | "bin": { 2027 | "semver": "bin/semver.js" 2028 | }, 2029 | "engines": { 2030 | "node": ">=10" 2031 | } 2032 | }, 2033 | "node_modules/serialize-javascript": { 2034 | "version": "6.0.0", 2035 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2036 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2037 | "dev": true, 2038 | "dependencies": { 2039 | "randombytes": "^2.1.0" 2040 | } 2041 | }, 2042 | "node_modules/setimmediate": { 2043 | "version": "1.0.5", 2044 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2045 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", 2046 | "dev": true 2047 | }, 2048 | "node_modules/shebang-command": { 2049 | "version": "2.0.0", 2050 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2051 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2052 | "dev": true, 2053 | "dependencies": { 2054 | "shebang-regex": "^3.0.0" 2055 | }, 2056 | "engines": { 2057 | "node": ">=8" 2058 | } 2059 | }, 2060 | "node_modules/shebang-regex": { 2061 | "version": "3.0.0", 2062 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2063 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2064 | "dev": true, 2065 | "engines": { 2066 | "node": ">=8" 2067 | } 2068 | }, 2069 | "node_modules/slash": { 2070 | "version": "3.0.0", 2071 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2072 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2073 | "dev": true, 2074 | "engines": { 2075 | "node": ">=8" 2076 | } 2077 | }, 2078 | "node_modules/string_decoder": { 2079 | "version": "1.1.1", 2080 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2081 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2082 | "dev": true, 2083 | "dependencies": { 2084 | "safe-buffer": "~5.1.0" 2085 | } 2086 | }, 2087 | "node_modules/string-width": { 2088 | "version": "4.2.3", 2089 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2090 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2091 | "dev": true, 2092 | "dependencies": { 2093 | "emoji-regex": "^8.0.0", 2094 | "is-fullwidth-code-point": "^3.0.0", 2095 | "strip-ansi": "^6.0.1" 2096 | }, 2097 | "engines": { 2098 | "node": ">=8" 2099 | } 2100 | }, 2101 | "node_modules/strip-ansi": { 2102 | "version": "6.0.1", 2103 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2104 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2105 | "dev": true, 2106 | "dependencies": { 2107 | "ansi-regex": "^5.0.1" 2108 | }, 2109 | "engines": { 2110 | "node": ">=8" 2111 | } 2112 | }, 2113 | "node_modules/strip-json-comments": { 2114 | "version": "3.1.1", 2115 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2116 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2117 | "dev": true, 2118 | "engines": { 2119 | "node": ">=8" 2120 | }, 2121 | "funding": { 2122 | "url": "https://github.com/sponsors/sindresorhus" 2123 | } 2124 | }, 2125 | "node_modules/supports-color": { 2126 | "version": "7.2.0", 2127 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2128 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2129 | "dev": true, 2130 | "dependencies": { 2131 | "has-flag": "^4.0.0" 2132 | }, 2133 | "engines": { 2134 | "node": ">=8" 2135 | } 2136 | }, 2137 | "node_modules/text-table": { 2138 | "version": "0.2.0", 2139 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2140 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2141 | "dev": true 2142 | }, 2143 | "node_modules/to-regex-range": { 2144 | "version": "5.0.1", 2145 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2146 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2147 | "dev": true, 2148 | "dependencies": { 2149 | "is-number": "^7.0.0" 2150 | }, 2151 | "engines": { 2152 | "node": ">=8.0" 2153 | } 2154 | }, 2155 | "node_modules/tslib": { 2156 | "version": "1.14.1", 2157 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2158 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2159 | "dev": true 2160 | }, 2161 | "node_modules/tsutils": { 2162 | "version": "3.21.0", 2163 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 2164 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 2165 | "dev": true, 2166 | "dependencies": { 2167 | "tslib": "^1.8.1" 2168 | }, 2169 | "engines": { 2170 | "node": ">= 6" 2171 | }, 2172 | "peerDependencies": { 2173 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 2174 | } 2175 | }, 2176 | "node_modules/type-check": { 2177 | "version": "0.4.0", 2178 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2179 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2180 | "dev": true, 2181 | "dependencies": { 2182 | "prelude-ls": "^1.2.1" 2183 | }, 2184 | "engines": { 2185 | "node": ">= 0.8.0" 2186 | } 2187 | }, 2188 | "node_modules/type-fest": { 2189 | "version": "0.20.2", 2190 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2191 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2192 | "dev": true, 2193 | "engines": { 2194 | "node": ">=10" 2195 | }, 2196 | "funding": { 2197 | "url": "https://github.com/sponsors/sindresorhus" 2198 | } 2199 | }, 2200 | "node_modules/typescript": { 2201 | "version": "4.9.5", 2202 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 2203 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 2204 | "dev": true, 2205 | "bin": { 2206 | "tsc": "bin/tsc", 2207 | "tsserver": "bin/tsserver" 2208 | }, 2209 | "engines": { 2210 | "node": ">=4.2.0" 2211 | } 2212 | }, 2213 | "node_modules/uri-js": { 2214 | "version": "4.4.1", 2215 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2216 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2217 | "dev": true, 2218 | "dependencies": { 2219 | "punycode": "^2.1.0" 2220 | } 2221 | }, 2222 | "node_modules/util-deprecate": { 2223 | "version": "1.0.2", 2224 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2225 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2226 | "dev": true 2227 | }, 2228 | "node_modules/which": { 2229 | "version": "2.0.2", 2230 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2231 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2232 | "dev": true, 2233 | "dependencies": { 2234 | "isexe": "^2.0.0" 2235 | }, 2236 | "bin": { 2237 | "node-which": "bin/node-which" 2238 | }, 2239 | "engines": { 2240 | "node": ">= 8" 2241 | } 2242 | }, 2243 | "node_modules/word-wrap": { 2244 | "version": "1.2.3", 2245 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2246 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2247 | "dev": true, 2248 | "engines": { 2249 | "node": ">=0.10.0" 2250 | } 2251 | }, 2252 | "node_modules/workerpool": { 2253 | "version": "6.2.1", 2254 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 2255 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 2256 | "dev": true 2257 | }, 2258 | "node_modules/wrap-ansi": { 2259 | "version": "7.0.0", 2260 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2261 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2262 | "dev": true, 2263 | "dependencies": { 2264 | "ansi-styles": "^4.0.0", 2265 | "string-width": "^4.1.0", 2266 | "strip-ansi": "^6.0.0" 2267 | }, 2268 | "engines": { 2269 | "node": ">=10" 2270 | }, 2271 | "funding": { 2272 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2273 | } 2274 | }, 2275 | "node_modules/wrappy": { 2276 | "version": "1.0.2", 2277 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2278 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2279 | "dev": true 2280 | }, 2281 | "node_modules/y18n": { 2282 | "version": "5.0.8", 2283 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2284 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2285 | "dev": true, 2286 | "engines": { 2287 | "node": ">=10" 2288 | } 2289 | }, 2290 | "node_modules/yallist": { 2291 | "version": "4.0.0", 2292 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2293 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2294 | "dev": true 2295 | }, 2296 | "node_modules/yargs": { 2297 | "version": "16.2.0", 2298 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2299 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2300 | "dev": true, 2301 | "dependencies": { 2302 | "cliui": "^7.0.2", 2303 | "escalade": "^3.1.1", 2304 | "get-caller-file": "^2.0.5", 2305 | "require-directory": "^2.1.1", 2306 | "string-width": "^4.2.0", 2307 | "y18n": "^5.0.5", 2308 | "yargs-parser": "^20.2.2" 2309 | }, 2310 | "engines": { 2311 | "node": ">=10" 2312 | } 2313 | }, 2314 | "node_modules/yargs-parser": { 2315 | "version": "20.2.4", 2316 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 2317 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 2318 | "dev": true, 2319 | "engines": { 2320 | "node": ">=10" 2321 | } 2322 | }, 2323 | "node_modules/yargs-unparser": { 2324 | "version": "2.0.0", 2325 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2326 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2327 | "dev": true, 2328 | "dependencies": { 2329 | "camelcase": "^6.0.0", 2330 | "decamelize": "^4.0.0", 2331 | "flat": "^5.0.2", 2332 | "is-plain-obj": "^2.1.0" 2333 | }, 2334 | "engines": { 2335 | "node": ">=10" 2336 | } 2337 | }, 2338 | "node_modules/yocto-queue": { 2339 | "version": "0.1.0", 2340 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2341 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2342 | "dev": true, 2343 | "engines": { 2344 | "node": ">=10" 2345 | }, 2346 | "funding": { 2347 | "url": "https://github.com/sponsors/sindresorhus" 2348 | } 2349 | } 2350 | } 2351 | } 2352 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gptcommit", 3 | "displayName": "vscode-gptcommit", 4 | "description": "Automated git commit messages using GPT models", 5 | "version": "0.3.0", 6 | "repository": { 7 | "url": "https://github.com/pwwang/vscode-gptcommit" 8 | }, 9 | "engines": { 10 | "vscode": "^1.70.0" 11 | }, 12 | "publisher": "pwwang", 13 | "categories": [ 14 | "Other" 15 | ], 16 | "keywords": [ 17 | "git", 18 | "commit", 19 | "gpt", 20 | "openai" 21 | ], 22 | "icon": "icon.png", 23 | "activationEvents": [ 24 | "onCommand:gptcommit.generateGitCommitMessage", 25 | "onCommand:gptcommit.setupOpenAIApiKey", 26 | "onCommand:gptcommit.useDifferentModel", 27 | "onCommand:gptcommit.setOutputLanguage" 28 | ], 29 | "main": "./out/extension.js", 30 | "contributes": { 31 | "commands": [ 32 | { 33 | "command": "gptcommit.generateGitCommitMessage", 34 | "title": "GPTCommit: Generate Git Commit Message", 35 | "icon": "$(output)", 36 | "enablement": "!gptcommit.generating" 37 | }, 38 | { 39 | "command": "gptcommit.setupOpenAIApiKey", 40 | "title": "GPTCommit: Setup OpenAI API Key" 41 | }, 42 | { 43 | "command": "gptcommit.useDifferentModel", 44 | "title": "GPTCommit: Use a different OpenAI model" 45 | }, 46 | { 47 | "command": "gptcommit.setOutputLanguage", 48 | "title": "GPTCommit: Set output language" 49 | }, 50 | { 51 | "command": "gptcommit.showPerFileSummary", 52 | "title": "GPTCommit: Show per-file summary" 53 | }, 54 | { 55 | "command": "gptcommit.disableConventionalCommit", 56 | "title": "GPTCommit: Disable conventional commit" 57 | }, 58 | { 59 | "command": "gptcommit.openConfigFile", 60 | "title": "GPTCommit: Open gptcommit configuration file" 61 | } 62 | ], 63 | "menus": { 64 | "scm/title": [ 65 | { 66 | "when": "scmProvider == git", 67 | "command": "gptcommit.generateGitCommitMessage", 68 | "group": "navigation" 69 | } 70 | ] 71 | }, 72 | "configuration": { 73 | "title": "GPTCommit", 74 | "properties": { 75 | "gptcommit.gptcommitPath": { 76 | "type": "string", 77 | "default": "", 78 | "description": "Path to gptcommit executable." 79 | }, 80 | "gptcommit.debug": { 81 | "type": "boolean", 82 | "default": false, 83 | "description": "If true, debug information will be shown in the output channel." 84 | }, 85 | "gptcommit.expressMode": { 86 | "type": "boolean", 87 | "default": false, 88 | "description": "If true, generated message will be filled into the Source Control commit message input box directly, instead of opening a new editor." 89 | }, 90 | "gptcommit.expressModeContent": { 91 | "type": "string", 92 | "default": "title + summary", 93 | "enum": [ 94 | "title", 95 | "title + summary", 96 | "title + per-file", 97 | "title + summary + per-file" 98 | ], 99 | "enumDescriptions": [ 100 | "Only the title", 101 | "Title and bullet-point summary", 102 | "Title and per-file summary", 103 | "Title, bullet-point summary and per-file summary" 104 | ], 105 | "description": "Content of the message to fill in the express mode. Note that you need enable per-file summary for the per-file content (by GPTCommit: Show per-file summary)." 106 | }, 107 | "gptcommit.onFiles": { 108 | "type": "string", 109 | "default": "tryStagedThenUnstaged", 110 | "enum": [ 111 | "staged", 112 | "unstaged", 113 | "tryStagedThenUnstaged" 114 | ], 115 | "enumDescriptions": [ 116 | "Only staged files", 117 | "Only unstaged files", 118 | "Staged files, if any, otherwise unstaged files" 119 | ], 120 | "description": "Diff of files to use for generating the commit message." 121 | } 122 | } 123 | } 124 | }, 125 | "scripts": { 126 | "vscode:prepublish": "npm run compile", 127 | "compile": "tsc -p ./", 128 | "watch": "tsc -watch -p ./", 129 | "pretest": "npm run compile && npm run lint", 130 | "lint": "eslint src --ext ts", 131 | "test": "node ./out/test/runTest.js" 132 | }, 133 | "devDependencies": { 134 | "@types/vscode": "^1.70.0", 135 | "@types/glob": "^8.0.1", 136 | "@types/mocha": "^10.0.1", 137 | "@types/node": "16.x", 138 | "@typescript-eslint/eslint-plugin": "^5.49.0", 139 | "@typescript-eslint/parser": "^5.49.0", 140 | "eslint": "^8.33.0", 141 | "glob": "^8.1.0", 142 | "mocha": "^10.1.0", 143 | "typescript": "^4.9.4", 144 | "@vscode/test-electron": "^2.2.2" 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /src/@types/git.d.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | 6 | import { Event, Uri } from 'vscode'; 7 | 8 | export interface Git { 9 | readonly path: string; 10 | } 11 | 12 | export interface InputBox { 13 | value: string; 14 | } 15 | 16 | export const enum RefType { 17 | Head, 18 | RemoteHead, 19 | Tag 20 | } 21 | 22 | export interface Ref { 23 | readonly type: RefType; 24 | readonly name?: string; 25 | readonly commit?: string; 26 | readonly remote?: string; 27 | } 28 | 29 | export interface UpstreamRef { 30 | readonly remote: string; 31 | readonly name: string; 32 | } 33 | 34 | export interface Branch extends Ref { 35 | readonly upstream?: UpstreamRef; 36 | readonly ahead?: number; 37 | readonly behind?: number; 38 | } 39 | 40 | export interface Commit { 41 | readonly hash: string; 42 | readonly message: string; 43 | readonly parents: string[]; 44 | readonly authorEmail?: string | undefined; 45 | } 46 | 47 | export interface Submodule { 48 | readonly name: string; 49 | readonly path: string; 50 | readonly url: string; 51 | } 52 | 53 | export interface Remote { 54 | readonly name: string; 55 | readonly fetchUrl?: string; 56 | readonly pushUrl?: string; 57 | readonly isReadOnly: boolean; 58 | } 59 | 60 | export const enum Status { 61 | INDEX_MODIFIED, 62 | INDEX_ADDED, 63 | INDEX_DELETED, 64 | INDEX_RENAMED, 65 | INDEX_COPIED, 66 | 67 | MODIFIED, 68 | DELETED, 69 | UNTRACKED, 70 | IGNORED, 71 | INTENT_TO_ADD, 72 | 73 | ADDED_BY_US, 74 | ADDED_BY_THEM, 75 | DELETED_BY_US, 76 | DELETED_BY_THEM, 77 | BOTH_ADDED, 78 | BOTH_DELETED, 79 | BOTH_MODIFIED 80 | } 81 | 82 | export interface Change { 83 | 84 | /** 85 | * Returns either `originalUri` or `renameUri`, depending 86 | * on whether this change is a rename change. When 87 | * in doubt always use `uri` over the other two alternatives. 88 | */ 89 | readonly uri: Uri; 90 | readonly originalUri: Uri; 91 | readonly renameUri: Uri | undefined; 92 | readonly status: Status; 93 | } 94 | 95 | export interface RepositoryState { 96 | readonly HEAD: Branch | undefined; 97 | readonly refs: Ref[]; 98 | readonly remotes: Remote[]; 99 | readonly submodules: Submodule[]; 100 | readonly rebaseCommit: Commit | undefined; 101 | 102 | readonly mergeChanges: Change[]; 103 | readonly indexChanges: Change[]; 104 | readonly workingTreeChanges: Change[]; 105 | 106 | readonly onDidChange: Event; 107 | } 108 | 109 | export interface RepositoryUIState { 110 | readonly selected: boolean; 111 | readonly onDidChange: Event; 112 | } 113 | 114 | /** 115 | * Log options. 116 | */ 117 | export interface LogOptions { 118 | /** Max number of log entries to retrieve. If not specified, the default is 32. */ 119 | readonly maxEntries?: number; 120 | } 121 | 122 | export interface Repository { 123 | 124 | readonly rootUri: Uri; 125 | readonly inputBox: InputBox; 126 | readonly state: RepositoryState; 127 | readonly ui: RepositoryUIState; 128 | 129 | getConfigs(): Promise<{ key: string; value: string; }[]>; 130 | getConfig(key: string): Promise; 131 | setConfig(key: string, value: string): Promise; 132 | getGlobalConfig(key: string): Promise; 133 | 134 | getObjectDetails(treeish: string, path: string): Promise<{ mode: string, object: string, size: number }>; 135 | detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }>; 136 | buffer(ref: string, path: string): Promise; 137 | show(ref: string, path: string): Promise; 138 | getCommit(ref: string): Promise; 139 | 140 | clean(paths: string[]): Promise; 141 | 142 | apply(patch: string, reverse?: boolean): Promise; 143 | diff(cached?: boolean): Promise; 144 | diffWithHEAD(): Promise; 145 | diffWithHEAD(path: string): Promise; 146 | diffWith(ref: string): Promise; 147 | diffWith(ref: string, path: string): Promise; 148 | diffIndexWithHEAD(): Promise; 149 | diffIndexWithHEAD(path: string): Promise; 150 | diffIndexWith(ref: string): Promise; 151 | diffIndexWith(ref: string, path: string): Promise; 152 | diffBlobs(object1: string, object2: string): Promise; 153 | diffBetween(ref1: string, ref2: string): Promise; 154 | diffBetween(ref1: string, ref2: string, path: string): Promise; 155 | 156 | hashObject(data: string): Promise; 157 | 158 | createBranch(name: string, checkout: boolean, ref?: string): Promise; 159 | deleteBranch(name: string, force?: boolean): Promise; 160 | getBranch(name: string): Promise; 161 | setBranchUpstream(name: string, upstream: string): Promise; 162 | 163 | getMergeBase(ref1: string, ref2: string): Promise; 164 | 165 | status(): Promise; 166 | checkout(treeish: string): Promise; 167 | 168 | addRemote(name: string, url: string): Promise; 169 | removeRemote(name: string): Promise; 170 | 171 | fetch(remote?: string, ref?: string, depth?: number): Promise; 172 | pull(unshallow?: boolean): Promise; 173 | push(remoteName?: string, branchName?: string, setUpstream?: boolean): Promise; 174 | 175 | blame(path: string): Promise; 176 | log(options?: LogOptions): Promise; 177 | } 178 | 179 | export interface API { 180 | readonly git: Git; 181 | readonly repositories: Repository[]; 182 | readonly onDidOpenRepository: Event; 183 | readonly onDidCloseRepository: Event; 184 | } 185 | 186 | export interface GitExtension { 187 | 188 | readonly enabled: boolean; 189 | readonly onDidChangeEnablement: Event; 190 | 191 | /** 192 | * Returns a specific API version. 193 | * 194 | * Throws error if git extension is disabled. You can listed to the 195 | * [GitExtension.onDidChangeEnablement](#GitExtension.onDidChangeEnablement) event 196 | * to know when the extension becomes enabled/disabled. 197 | * 198 | * @param version Version number. 199 | * @returns API instance 200 | */ 201 | getAPI(version: 1): API; 202 | } 203 | -------------------------------------------------------------------------------- /src/commands/createCommandConfigs.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import * as path from 'path'; 3 | import { getRepo, saveConfig } from '../utils'; 4 | 5 | export function setupOpenAIApiKey(context: vscode.ExtensionContext, channel: vscode.OutputChannel) { 6 | let apiCommand = vscode.commands.registerCommand('gptcommit.setupOpenAIApiKey', async (uri?: vscode.SourceControl) => { 7 | vscode.window.showInputBox({ 8 | prompt: 'Enter your OpenAI API key', 9 | placeHolder: 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 10 | ignoreFocusOut: true, 11 | }).then((key) => { 12 | if (key) { 13 | saveConfig( 14 | 'openai.api_key', 15 | 'openai.api_key', 16 | channel, 17 | getRepo(uri), 18 | key, 19 | 'Configuration openai.api_key saved' 20 | ); 21 | } 22 | }); 23 | }); 24 | 25 | context.subscriptions.push(apiCommand); 26 | }; 27 | 28 | export function useDifferentModel(context: vscode.ExtensionContext, channel: vscode.OutputChannel) { 29 | let modelCommand = vscode.commands.registerCommand('gptcommit.useDifferentModel', async (uri?: vscode.SourceControl) => { 30 | vscode.window.showInputBox({ 31 | prompt: 'Enter the model you want to use', 32 | placeHolder: 'gpt-3.5-turbo', 33 | ignoreFocusOut: true, 34 | }).then((model) => { 35 | if (model) { 36 | saveConfig( 37 | 'openai.model', 38 | 'openai.model', 39 | channel, 40 | getRepo(uri), 41 | model, 42 | 'Configuration openai.model saved' 43 | ); 44 | } 45 | }); 46 | }); 47 | 48 | context.subscriptions.push(modelCommand); 49 | } 50 | 51 | export function setOutputLanguage(context: vscode.ExtensionContext, channel: vscode.OutputChannel) { 52 | let languageCommand = vscode.commands.registerCommand('gptcommit.setOutputLanguage', async (uri?: vscode.SourceControl) => { 53 | vscode.window.showInputBox({ 54 | prompt: 'Enter the language of the generated commit message', 55 | placeHolder: 'en', 56 | ignoreFocusOut: true, 57 | }).then((lang) => { 58 | if (lang) { 59 | saveConfig( 60 | 'output.lang', 61 | 'output.lang', 62 | channel, 63 | getRepo(uri), 64 | lang, 65 | 'Configuration output.lang saved' 66 | ); 67 | } 68 | }); 69 | }); 70 | 71 | context.subscriptions.push(languageCommand); 72 | } 73 | 74 | export function showPerFileSummary(context: vscode.ExtensionContext, channel: vscode.OutputChannel) { 75 | let showPerFileCommand = vscode.commands.registerCommand('gptcommit.showPerFileSummary', async (uri?: vscode.SourceControl) => { 76 | vscode.window.showQuickPick( 77 | ["Yes", "No"], 78 | { 79 | placeHolder: 'Enable "show per-file summary"?', 80 | } 81 | ).then((show) => { 82 | if (show === "Yes" || show === "No") { 83 | saveConfig( 84 | 'output.show_per_file_summary', 85 | 'output.show_per_file_summary', 86 | channel, 87 | getRepo(uri), 88 | show === "Yes" ? "true" : "false", 89 | 'Configuration output.show_per_file_summary saved' 90 | ); 91 | } 92 | }); 93 | }); 94 | 95 | context.subscriptions.push(showPerFileCommand); 96 | } 97 | 98 | export function disableConventionalCommit(context: vscode.ExtensionContext, channel: vscode.OutputChannel) { 99 | let disableConvCommitCommand = vscode.commands.registerCommand('gptcommit.disableConventionalCommit', async (uri?: vscode.SourceControl) => { 100 | vscode.window.showQuickPick( 101 | ["Yes", "No"], 102 | { 103 | placeHolder: 'Disable conventional commit?', 104 | } 105 | ).then((show) => { 106 | if (show === "Yes" || show === "No") { 107 | saveConfig( 108 | 'output.conventional_commit', 109 | 'output.conventional_commit', 110 | channel, 111 | getRepo(uri), 112 | show === "Yes" ? "false" : "true", 113 | 'Configuration output.conventional_commit saved' 114 | ); 115 | } 116 | }); 117 | }); 118 | 119 | context.subscriptions.push(disableConvCommitCommand); 120 | } 121 | 122 | export function openConfigFile(context: vscode.ExtensionContext, channel: vscode.OutputChannel) { 123 | let openConfigFileCommand = vscode.commands.registerCommand('gptcommit.openConfigFile', async (uri?: vscode.SourceControl) => { 124 | const repo = getRepo(uri); 125 | if (!repo) { 126 | return; 127 | } 128 | channel.appendLine(`Opening ${path.join(repo.rootUri.fsPath, ".git", "gptcommit.toml")}`); 129 | const editor = vscode.window.activeTextEditor; 130 | const doc = await vscode.workspace.openTextDocument(path.join(repo.rootUri.fsPath, ".git", "gptcommit.toml")); 131 | await vscode.window.showTextDocument(doc, { 132 | preview: false, 133 | viewColumn: editor ? editor.viewColumn : undefined, 134 | }); 135 | }); 136 | 137 | context.subscriptions.push(openConfigFileCommand); 138 | } 139 | -------------------------------------------------------------------------------- /src/commands/createCommandGenerateGitCommitMessage.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import { getCommitMessage } from '../utils'; 3 | import { getRepo } from '../utils'; 4 | 5 | export default (context: vscode.ExtensionContext, channel: vscode.OutputChannel) => { 6 | let command1 = vscode.commands.registerCommand( 7 | 'gptcommit.generateGitCommitMessage', 8 | async (uri?: vscode.SourceControl) => { 9 | const repo = getRepo(uri); 10 | if (!repo) { 11 | return; 12 | } 13 | 14 | const config = vscode.workspace.getConfiguration('gptcommit'); 15 | vscode.commands.executeCommand('setContext', 'gptcommit.generating', true); 16 | getCommitMessage(config, repo, context, channel).then((message) => { 17 | if (repo) { 18 | repo.inputBox.value = message; 19 | } 20 | }).catch((err) => { 21 | vscode.window.showErrorMessage(err, "Show Output").then((choice) => { 22 | if (choice === "Show Output") { 23 | channel.show(); 24 | } 25 | }); 26 | }).finally(() => { 27 | vscode.commands.executeCommand('setContext', 'gptcommit.generating', false); 28 | }); 29 | } 30 | ); 31 | 32 | context.subscriptions.push(command1); 33 | }; 34 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | // The module 'vscode' contains the VS Code extensibility API 2 | // Import the module and reference it with the alias vscode in your code below 3 | import * as vscode from 'vscode'; 4 | import createCommandGenerateGitCommitMessage from './commands/createCommandGenerateGitCommitMessage'; 5 | import { 6 | setupOpenAIApiKey, 7 | useDifferentModel, 8 | setOutputLanguage, 9 | showPerFileSummary, 10 | disableConventionalCommit, 11 | openConfigFile, 12 | } from './commands/createCommandConfigs'; 13 | 14 | // This method is called when your extension is activated 15 | // Your extension is activated the very first time the command is executed 16 | export function activate(context: vscode.ExtensionContext) { 17 | 18 | // Use the console to output diagnostic information (console.log) and errors (console.error) 19 | // This line of code will only be executed once when your extension is activated 20 | // console.log('Congratulations, your extension "gptcommit" is now active!'); 21 | 22 | let channel = vscode.window.createOutputChannel('GPTCommit'); 23 | context.subscriptions.push(channel); 24 | 25 | // The command has been defined in the package.json file 26 | // Now provide the implementation of the command with registerCommand 27 | // The commandId parameter must match the command field in package.json 28 | createCommandGenerateGitCommitMessage(context, channel); 29 | setupOpenAIApiKey(context, channel); 30 | useDifferentModel(context, channel); 31 | setOutputLanguage(context, channel); 32 | showPerFileSummary(context, channel); 33 | disableConventionalCommit(context, channel); 34 | openConfigFile(context, channel); 35 | } 36 | 37 | // This method is called when your extension is deactivated 38 | export function deactivate() {} 39 | -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | import { runTests } from '@vscode/test-electron'; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 10 | 11 | // The path to test runner 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 17 | } catch (err) { 18 | console.error('Failed to run tests', err); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | main(); 24 | -------------------------------------------------------------------------------- /src/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | 3 | // You can import and use all API from the 'vscode' module 4 | // as well as import your extension to test it 5 | import * as vscode from 'vscode'; 6 | // import * as myExtension from '../../extension'; 7 | 8 | suite('Extension Test Suite', () => { 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | test('Sample test', () => { 12 | assert.strictEqual(-1, [1, 2, 3].indexOf(5)); 13 | assert.strictEqual(-1, [1, 2, 3].indexOf(0)); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /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 | ui: 'tdd', 9 | color: true 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/utils.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import * as path from 'path'; 3 | import { randomUUID } from 'crypto'; 4 | import { tmpdir } from 'os'; 5 | import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'fs'; 6 | import { exec, execSync } from 'child_process'; 7 | import { GitExtension, Repository } from './@types/git'; 8 | 9 | export function getGitExtension() { 10 | const vscodeGit = vscode.extensions.getExtension('vscode.git'); 11 | const gitExtension = vscodeGit && vscodeGit.exports; 12 | return gitExtension && gitExtension.getAPI(1); 13 | } 14 | 15 | export async function getCommitMessage( 16 | config: vscode.WorkspaceConfiguration, 17 | repo: Repository, 18 | context: vscode.ExtensionContext, 19 | channel: vscode.OutputChannel 20 | ) { 21 | const gptcommit = config.gptcommitPath || "gptcommit"; 22 | const uid = randomUUID(); 23 | const tmpMsgFile = path.join(tmpdir(), `vscode-gptcommit-${uid}.txt`); 24 | const tmpDiffFile = path.join(tmpdir(), `vscode-gptcommit-${uid}.diff`); 25 | const onFiles = config.onFiles || 'tryStagedThenUnstaged'; 26 | 27 | return vscode.window.withProgress({ 28 | location: vscode.ProgressLocation.SourceControl, 29 | title: 'Generating commit message...', 30 | cancellable: false 31 | }, async (progress, token) => { 32 | let diff: string; 33 | if (onFiles === 'staged') { 34 | diff = await repo.diff(true); 35 | } else if (onFiles === 'unstaged') { 36 | diff = await repo.diff(false); 37 | } else { 38 | diff = await repo.diff(true); 39 | if (!diff) { 40 | diff = await repo.diff(false); 41 | } 42 | } 43 | // if diff is empty, return the promise here 44 | if (!diff) { 45 | return Promise.reject('No changes to commit'); 46 | } 47 | writeFileSync(tmpDiffFile, diff); 48 | const cmd = `${gptcommit} prepare-commit-msg --commit-msg-file ${tmpMsgFile} --commit-source commit --git-diff-content ${tmpDiffFile}`; 49 | channel.appendLine(`COMMAND: ${cmd}`); 50 | return new Promise((resolve, reject) => { 51 | exec(cmd, { 52 | cwd: repo.rootUri.fsPath 53 | }, (err, stdout, stderr) => { 54 | channel.appendLine(`STDOUT: ${stdout}`); 55 | channel.appendLine(`STDERR: ${stderr}`); 56 | try { unlinkSync(tmpDiffFile); } catch (e) {} 57 | 58 | if (/: not found\s*$/.test(stderr)) { 59 | if (config.debug) { 60 | channel.appendLine('DEBUG: gptcommit not found'); 61 | } 62 | reject('gptcommit not found, see https://github.com/zurawiki/gptcommit. If it is not in your PATH, set "gptcommit.gptcommitPath" in your settings to the path to gptcommit'); 63 | } else if (/OpenAI API key not found/.test(stderr)) { 64 | if (config.debug) { 65 | channel.appendLine('DEBUG: OpenAI API key not set'); 66 | } 67 | reject('OpenAI API key not found, run "gptcommit.setupOpenAIApiKey" command to set it up'); 68 | } else if (/is being amended/.test(stdout)) { 69 | if (config.debug) { 70 | channel.appendLine('DEBUG: allow_amend is false'); 71 | } 72 | // set allow-amend to true 73 | const cmd = `${gptcommit} config set --local allow_amend true`; 74 | channel.appendLine(`COMMAND: ${cmd}`); 75 | let setAmendSuccess = true; 76 | try { 77 | const setAmendOut = execSync(cmd, {cwd: repo.rootUri.fsPath}).toString(); 78 | channel.appendLine(`STDOUT: ${setAmendOut}`); 79 | } catch (error) { 80 | setAmendSuccess = false; 81 | channel.appendLine(`ERROR: ${error}`); 82 | reject("Failed to set allow_amend to true"); 83 | } 84 | if (setAmendSuccess) { 85 | // try again 86 | getCommitMessage(config, repo, context, channel).then((msg) => { 87 | resolve(msg); 88 | }).catch((err) => { 89 | reject(err); 90 | }); 91 | } 92 | } else if (err || stderr) { 93 | if (config.debug) { 94 | channel.appendLine(`DEBUG: gptcommit failed with error: ${err} | ${stderr}`); 95 | } 96 | try { unlinkSync(tmpMsgFile); } catch (e) {} 97 | reject(err || stderr); 98 | } else if (!existsSync(tmpMsgFile)) { 99 | if (config.debug) { 100 | channel.appendLine('DEBUG: gptcommit failed to generate commit message, message file not generated'); 101 | } 102 | reject('Failed to generate commit message'); 103 | } else if (config.expressMode) { 104 | if (config.debug) { 105 | channel.appendLine('DEBUG: express mode enabled, skipping editor'); 106 | } 107 | const msg = readFileSync(tmpMsgFile, 'utf8'); 108 | try { unlinkSync(tmpMsgFile); } catch (e) {} 109 | resolve(polishMessage(msg, config.expressModeContent)); 110 | } else { 111 | if (config.debug) { 112 | channel.appendLine('DEBUG: opening editor'); 113 | } 114 | const editor = vscode.window.activeTextEditor; 115 | vscode.workspace.openTextDocument(tmpMsgFile).then(async (doc) => { 116 | await vscode.window.showTextDocument(doc, { 117 | preview: false, 118 | viewColumn: editor ? editor.viewColumn : undefined, 119 | }); 120 | progress.report({ increment: 100 }); 121 | vscode.commands.executeCommand('setContext', 'gptcommit.generating', false); 122 | }); 123 | 124 | let disposable = vscode.workspace.onDidSaveTextDocument(async (doc) => { 125 | if (doc.fileName === tmpMsgFile) { 126 | repo.inputBox.value = doc.getText(); 127 | } 128 | }); 129 | context.subscriptions.push(disposable); 130 | } 131 | }); 132 | }); 133 | }); 134 | } 135 | 136 | export function polishMessage(msg: string, content: string) { 137 | const lines = msg.split('\n'); 138 | let title = lines[0]; 139 | let summary = []; 140 | let breakdown = []; 141 | let breakdownStarted = false; 142 | for (let line of lines.slice(1)) { 143 | if (line.startsWith('### BEGIN GIT COMMIT')) { 144 | break; 145 | } 146 | if (line.startsWith('[')) { 147 | breakdownStarted = true; 148 | } 149 | if (breakdownStarted) { 150 | breakdown.push(line); 151 | } else if (line.startsWith('- ')) { 152 | summary.push(line); 153 | } 154 | } 155 | if (/breakdown/.test(content)) { 156 | breakdown = ['', ...breakdown]; 157 | } 158 | if (content === 'title') { 159 | return title; 160 | } 161 | if (content === 'title + summary') { 162 | return [title, '', ...summary].join('\n'); 163 | } 164 | if (content === 'title + breakdown') { 165 | return [title, ...breakdown].join('\n'); 166 | } 167 | return [title, '', ...summary, ...breakdown].join('\n'); 168 | } 169 | 170 | export function getRepo(uri?: vscode.SourceControl): Repository | undefined { 171 | const git = getGitExtension(); 172 | 173 | if (!git) { 174 | vscode.window.showErrorMessage('Git extension not found'); 175 | return undefined; 176 | } 177 | 178 | if (uri) { 179 | const uriPath = uri.rootUri?.path; 180 | return git.repositories.find(r => r.rootUri.path === uriPath); 181 | } 182 | if (git.repositories.length === 1) { 183 | return git.repositories[0]; 184 | } 185 | if (git.repositories.length > 1) { 186 | vscode.window.showWarningMessage('Multiple repositories found, using first one'); 187 | return git.repositories[0]; 188 | } 189 | vscode.window.showErrorMessage('No repository found'); 190 | return undefined; 191 | } 192 | 193 | export function saveConfig( 194 | key: string, 195 | gckey: string, 196 | channel: vscode.OutputChannel, 197 | repo: Repository | undefined, 198 | value: any | undefined = undefined, 199 | savedInfo: string | undefined = undefined, 200 | ) { 201 | if (repo === undefined) { 202 | return; 203 | } 204 | const gptcommit = vscode.workspace.getConfiguration('gptcommit').gptcommitPath || 'gptcommit'; 205 | if (value === undefined) { 206 | value = vscode.workspace.getConfiguration('gptcommit')[key]; 207 | } 208 | const cmd = `${gptcommit} config set --local ${gckey} ${value}`; 209 | exec(cmd, { cwd: repo.rootUri.fsPath }, (err, stdout, stderr) => { 210 | if (err) { 211 | vscode.window.showErrorMessage(`Failed to save "${key}": ${err}`); 212 | channel.appendLine(`COMMAND: ${cmd}`); 213 | channel.appendLine(`STDOUT: ${stdout}`); 214 | channel.appendLine(`STDERR: ${stderr}`); 215 | exec("pwd", (err, stdout, stderr) => { 216 | vscode.window.showErrorMessage(`pwd: ${stdout} ${stderr} ${err}`) 217 | }); 218 | } else if (savedInfo !== undefined) { 219 | vscode.window.showInformationMessage(savedInfo); 220 | } 221 | }); 222 | } 223 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2020", 5 | "outDir": "out", 6 | "lib": [ 7 | "ES2020" 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 | } 18 | -------------------------------------------------------------------------------- /vscode-gptcommit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwwang/vscode-gptcommit/8e3da84622869d0ba52e3bfd999d2b32f5c4d7c0/vscode-gptcommit.gif --------------------------------------------------------------------------------