├── .github ├── dependabot.yml └── workflows │ └── build-and-test.yml ├── .gitignore ├── .npmrc ├── .vscode-test.mjs ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── .vscodeignore ├── LICENSE.md ├── README.md ├── biome.json ├── commitollama-demo.gif ├── icon.jpg ├── package-lock.json ├── package.json ├── sampleWorkspace └── .vscode │ └── settings.json ├── src ├── config.ts ├── constants.ts ├── extension.ts ├── generator.ts ├── test │ └── extension.test.ts ├── types │ ├── config.d.ts │ ├── git.d.ts │ └── llm.ts └── utils.ts └── tsconfig.json /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directories: 5 | - "/" 6 | schedule: 7 | interval: "weekly" 8 | -------------------------------------------------------------------------------- /.github/workflows/build-and-test.yml: -------------------------------------------------------------------------------- 1 | name: Build and Test commitollama 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | branches: 8 | - main 9 | jobs: 10 | build-and-test: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout code 14 | uses: actions/checkout@v4 15 | - name: Setup Node.js 16 | uses: actions/setup-node@v4 17 | with: 18 | node-version: '20' 19 | cache: 'npm' 20 | - name: Install dependencies 21 | run: npm ci 22 | - name: Build 23 | run: npm run build 24 | - name: Run tests 25 | run: xvfb-run -a npm test 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | node_modules 4 | temp 5 | .vscode-test/ 6 | *.vsix 7 | .DS_Store -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | enable-pre-post-scripts = true -------------------------------------------------------------------------------- /.vscode-test.mjs: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'node:url'; 2 | import { dirname } from 'node:path'; 3 | import { defineConfig } from "@vscode/test-cli"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | export default defineConfig({ 9 | files: "out/test/**/*.test.js", 10 | extensionDevelopmentPath: __dirname, 11 | workspaceFolder: `${__dirname}/sampleWorkspace`, 12 | }); -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["biomejs.biome"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Run Extension", 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "args": ["--extensionDevelopmentPath=${workspaceFolder}"], 9 | "outFiles": ["${workspaceFolder}/out/**/*.js"], 10 | "preLaunchTask": "${defaultBuildTask}" 11 | }, 12 | { 13 | "name": "Extension Tests", 14 | "type": "extensionHost", 15 | "request": "launch", 16 | "runtimeExecutable": "${execPath}", 17 | "args": [ 18 | "--extensionDevelopmentPath=${workspaceFolder}", 19 | "--extensionTestsPath=${workspaceFolder}/out/test" 20 | ], 21 | "outFiles": ["${workspaceFolder}/out/test/**/*.js"], 22 | "preLaunchTask": "${defaultBuildTask}" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "out": false 4 | }, 5 | "search.exclude": { 6 | "out": true 7 | }, 8 | "typescript.tsc.autoDetect": "off", 9 | "cSpell.words": ["commitollama", "ollama"], 10 | "editor.defaultFormatter": "biomejs.biome", 11 | "[json]": { 12 | "editor.defaultFormatter": "biomejs.biome" 13 | }, 14 | "[typescript]": { 15 | "editor.defaultFormatter": "biomejs.biome" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.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 | **/.vscode-test.* 12 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Antonio Jesús Rodríguez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Commitollama 🦙 2 | 3 | A free alternative to Github Copilot's commit generator that runs on your device using [ollama][1]. 4 | 5 | ## Features 6 | 7 | - No telemetry or tracking. 8 | - No API key needed. 9 | - Different models available. 10 | - No Internet connection needed. 11 | 12 | ## Demo 13 | 14 | ![vscode-commitollama-demo][2] 15 | 16 | ## Requirements 17 | 18 | - Install [Ollama][1] on your local machine. 19 | - Install the model to use: `ollama pull [model_name]`, recommended to use `llama3.2` or `gemma3`. 20 | - Make sure ollama is running, you can do it by visiting http://127.0.0.1:11434/ in your web browser (The port number might be different for you). If not, only opening the app should be enough, or run in your terminal: `ollama serve`. 21 | 22 | ## Configuration 23 | 24 | - Model: You can select the model from the plugin configuration. 25 | 26 | `Llama` - default (Uses llama3.2:latest) (slow) 27 | 28 | `Codegemma` (Uses codegemma:latest) 29 | 30 | `Codellama` (Uses codellama. Worst result obtained) 31 | 32 | `Mistral` (Uses mistral:latest) 33 | 34 | `Gemma` (Uses gemma3:latest) (fast) 35 | 36 | `Qwen` (Uses qwen3:latest) 37 | 38 | `Custom` - It allows you to write down any other model name from ollama. 39 | 40 | - Use Emojis: It allows you to enable or disable the use of emojis in commit messages. 41 | 42 | - Use Description: It allows you to enable or disable the use of commit descriptions. 43 | 44 | - Use Lowercase: Enables or disables the use of lowercase at the beginning of commit messages. 45 | 46 | - Language: Language for commit messages. 47 | 48 | - Prompt Temperature: Custom temperature for generating the commit message. (Higher number = more creative) 49 | 50 | - Commit Template: It allows you to write down the commit template you want to use. You should use the following placeholders: 51 | - `{{type}}`: It will be replaced by the type of the commit. 52 | - `{{emoji}}`: It will be replaced by the emoji selected in the configuration. 53 | - `{{message}}`: It will be replaced by the commit message. 54 | 55 | Default value: `{{type}} {{emoji}}: {{message}}` 56 | 57 | - Custom Model: Allows you to specify any model. The model has to be downloaded and available on your Ollama instance. **Note:** Ignored if `commitollama.model` is not set to "Custom". 58 | 59 | - Custom Language: Allows you to specify any language for the commit messages. **Note:** Ignored if `commitollama.language` is not set to "Custom". 60 | 61 | - Custom Emojis: Allows you to specify the emojis you want to use in the next template object within the VSCode config.json. 62 | 63 | ```json 64 | "commitollama.commitEmojis": { 65 | "feat": "✨", 66 | "fix": "🐛", 67 | "docs": "📝", 68 | "style": "💎", 69 | "refactor": "♻️", 70 | "test": "🧪", 71 | "chore": "📦", 72 | "revert": "⏪" 73 | } 74 | ``` 75 | 76 | - Custom Endpoint: Ollama usually uses port 11434. It is the value that will be used if empty. 77 | 78 | - Custom Prompt: The prompt that will be used to generate the commit message instead of the default one. If this field is populated, it will override all the extension prompts and rules. 79 | 80 | - Custom Type Rules: Custom rules for commit message types. 81 | 82 | - Custom Commit Message Rules: Custom rules for commit messages. 83 | 84 | - Custom Description Prompt: A custom prompt to generate the commit description. 85 | 86 | ## Known Issues 87 | 88 | Sometimes, depending on the model used, it can generate quite long commit messages. However, it provides a good starting point for what the commit should be and can be manually edited to achieve the desired length. 89 | 90 | [1]: https://ollama.ai/ 91 | [2]: https://raw.githubusercontent.com/jepricreations/commitollama/main/commitollama-demo.gif 92 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.5.0/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "linter": { 7 | "enabled": true, 8 | "rules": { 9 | "recommended": true, 10 | "suspicious": { 11 | "noExplicitAny": "off" 12 | }, 13 | "style": { 14 | "noNonNullAssertion": "off" 15 | } 16 | } 17 | }, 18 | "formatter": { 19 | "enabled": true 20 | }, 21 | "javascript": { 22 | "formatter": { 23 | "semicolons": "asNeeded", 24 | "quoteStyle": "single" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /commitollama-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anjerodev/commitollama/a2108510b336c03d70df8035365753ea7436ac2f/commitollama-demo.gif -------------------------------------------------------------------------------- /icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anjerodev/commitollama/a2108510b336c03d70df8035365753ea7436ac2f/icon.jpg -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "commitollama", 3 | "version": "2.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "commitollama", 9 | "version": "2.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "ollama": "0.5.16" 13 | }, 14 | "devDependencies": { 15 | "@biomejs/biome": "1.9.4", 16 | "@types/mocha": "10.0.10", 17 | "@types/node": "22.15.29", 18 | "@types/sinon": "17.0.4", 19 | "@types/vscode": "^1.98.0", 20 | "@vscode/test-cli": "0.0.11", 21 | "@vscode/test-electron": "2.5.2", 22 | "esbuild": "0.25.5", 23 | "mocha": "11.5.0", 24 | "sinon": "20.0.0", 25 | "typescript": "5.8.3" 26 | }, 27 | "engines": { 28 | "vscode": "^1.98.0" 29 | } 30 | }, 31 | "node_modules/@bcoe/v8-coverage": { 32 | "version": "0.2.3", 33 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 34 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 35 | "dev": true, 36 | "license": "MIT" 37 | }, 38 | "node_modules/@biomejs/biome": { 39 | "version": "1.9.4", 40 | "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", 41 | "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", 42 | "dev": true, 43 | "hasInstallScript": true, 44 | "license": "MIT OR Apache-2.0", 45 | "bin": { 46 | "biome": "bin/biome" 47 | }, 48 | "engines": { 49 | "node": ">=14.21.3" 50 | }, 51 | "funding": { 52 | "type": "opencollective", 53 | "url": "https://opencollective.com/biome" 54 | }, 55 | "optionalDependencies": { 56 | "@biomejs/cli-darwin-arm64": "1.9.4", 57 | "@biomejs/cli-darwin-x64": "1.9.4", 58 | "@biomejs/cli-linux-arm64": "1.9.4", 59 | "@biomejs/cli-linux-arm64-musl": "1.9.4", 60 | "@biomejs/cli-linux-x64": "1.9.4", 61 | "@biomejs/cli-linux-x64-musl": "1.9.4", 62 | "@biomejs/cli-win32-arm64": "1.9.4", 63 | "@biomejs/cli-win32-x64": "1.9.4" 64 | } 65 | }, 66 | "node_modules/@biomejs/cli-darwin-arm64": { 67 | "version": "1.9.4", 68 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", 69 | "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", 70 | "cpu": [ 71 | "arm64" 72 | ], 73 | "dev": true, 74 | "license": "MIT OR Apache-2.0", 75 | "optional": true, 76 | "os": [ 77 | "darwin" 78 | ], 79 | "engines": { 80 | "node": ">=14.21.3" 81 | } 82 | }, 83 | "node_modules/@biomejs/cli-darwin-x64": { 84 | "version": "1.9.4", 85 | "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", 86 | "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", 87 | "cpu": [ 88 | "x64" 89 | ], 90 | "dev": true, 91 | "license": "MIT OR Apache-2.0", 92 | "optional": true, 93 | "os": [ 94 | "darwin" 95 | ], 96 | "engines": { 97 | "node": ">=14.21.3" 98 | } 99 | }, 100 | "node_modules/@biomejs/cli-linux-arm64": { 101 | "version": "1.9.4", 102 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", 103 | "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", 104 | "cpu": [ 105 | "arm64" 106 | ], 107 | "dev": true, 108 | "license": "MIT OR Apache-2.0", 109 | "optional": true, 110 | "os": [ 111 | "linux" 112 | ], 113 | "engines": { 114 | "node": ">=14.21.3" 115 | } 116 | }, 117 | "node_modules/@biomejs/cli-linux-arm64-musl": { 118 | "version": "1.9.4", 119 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", 120 | "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", 121 | "cpu": [ 122 | "arm64" 123 | ], 124 | "dev": true, 125 | "license": "MIT OR Apache-2.0", 126 | "optional": true, 127 | "os": [ 128 | "linux" 129 | ], 130 | "engines": { 131 | "node": ">=14.21.3" 132 | } 133 | }, 134 | "node_modules/@biomejs/cli-linux-x64": { 135 | "version": "1.9.4", 136 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", 137 | "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", 138 | "cpu": [ 139 | "x64" 140 | ], 141 | "dev": true, 142 | "license": "MIT OR Apache-2.0", 143 | "optional": true, 144 | "os": [ 145 | "linux" 146 | ], 147 | "engines": { 148 | "node": ">=14.21.3" 149 | } 150 | }, 151 | "node_modules/@biomejs/cli-linux-x64-musl": { 152 | "version": "1.9.4", 153 | "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", 154 | "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", 155 | "cpu": [ 156 | "x64" 157 | ], 158 | "dev": true, 159 | "license": "MIT OR Apache-2.0", 160 | "optional": true, 161 | "os": [ 162 | "linux" 163 | ], 164 | "engines": { 165 | "node": ">=14.21.3" 166 | } 167 | }, 168 | "node_modules/@biomejs/cli-win32-arm64": { 169 | "version": "1.9.4", 170 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", 171 | "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", 172 | "cpu": [ 173 | "arm64" 174 | ], 175 | "dev": true, 176 | "license": "MIT OR Apache-2.0", 177 | "optional": true, 178 | "os": [ 179 | "win32" 180 | ], 181 | "engines": { 182 | "node": ">=14.21.3" 183 | } 184 | }, 185 | "node_modules/@biomejs/cli-win32-x64": { 186 | "version": "1.9.4", 187 | "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", 188 | "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", 189 | "cpu": [ 190 | "x64" 191 | ], 192 | "dev": true, 193 | "license": "MIT OR Apache-2.0", 194 | "optional": true, 195 | "os": [ 196 | "win32" 197 | ], 198 | "engines": { 199 | "node": ">=14.21.3" 200 | } 201 | }, 202 | "node_modules/@esbuild/aix-ppc64": { 203 | "version": "0.25.5", 204 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", 205 | "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", 206 | "cpu": [ 207 | "ppc64" 208 | ], 209 | "dev": true, 210 | "license": "MIT", 211 | "optional": true, 212 | "os": [ 213 | "aix" 214 | ], 215 | "engines": { 216 | "node": ">=18" 217 | } 218 | }, 219 | "node_modules/@esbuild/android-arm": { 220 | "version": "0.25.5", 221 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", 222 | "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", 223 | "cpu": [ 224 | "arm" 225 | ], 226 | "dev": true, 227 | "license": "MIT", 228 | "optional": true, 229 | "os": [ 230 | "android" 231 | ], 232 | "engines": { 233 | "node": ">=18" 234 | } 235 | }, 236 | "node_modules/@esbuild/android-arm64": { 237 | "version": "0.25.5", 238 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", 239 | "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", 240 | "cpu": [ 241 | "arm64" 242 | ], 243 | "dev": true, 244 | "license": "MIT", 245 | "optional": true, 246 | "os": [ 247 | "android" 248 | ], 249 | "engines": { 250 | "node": ">=18" 251 | } 252 | }, 253 | "node_modules/@esbuild/android-x64": { 254 | "version": "0.25.5", 255 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", 256 | "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", 257 | "cpu": [ 258 | "x64" 259 | ], 260 | "dev": true, 261 | "license": "MIT", 262 | "optional": true, 263 | "os": [ 264 | "android" 265 | ], 266 | "engines": { 267 | "node": ">=18" 268 | } 269 | }, 270 | "node_modules/@esbuild/darwin-arm64": { 271 | "version": "0.25.5", 272 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", 273 | "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", 274 | "cpu": [ 275 | "arm64" 276 | ], 277 | "dev": true, 278 | "license": "MIT", 279 | "optional": true, 280 | "os": [ 281 | "darwin" 282 | ], 283 | "engines": { 284 | "node": ">=18" 285 | } 286 | }, 287 | "node_modules/@esbuild/darwin-x64": { 288 | "version": "0.25.5", 289 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", 290 | "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", 291 | "cpu": [ 292 | "x64" 293 | ], 294 | "dev": true, 295 | "license": "MIT", 296 | "optional": true, 297 | "os": [ 298 | "darwin" 299 | ], 300 | "engines": { 301 | "node": ">=18" 302 | } 303 | }, 304 | "node_modules/@esbuild/freebsd-arm64": { 305 | "version": "0.25.5", 306 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", 307 | "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", 308 | "cpu": [ 309 | "arm64" 310 | ], 311 | "dev": true, 312 | "license": "MIT", 313 | "optional": true, 314 | "os": [ 315 | "freebsd" 316 | ], 317 | "engines": { 318 | "node": ">=18" 319 | } 320 | }, 321 | "node_modules/@esbuild/freebsd-x64": { 322 | "version": "0.25.5", 323 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", 324 | "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", 325 | "cpu": [ 326 | "x64" 327 | ], 328 | "dev": true, 329 | "license": "MIT", 330 | "optional": true, 331 | "os": [ 332 | "freebsd" 333 | ], 334 | "engines": { 335 | "node": ">=18" 336 | } 337 | }, 338 | "node_modules/@esbuild/linux-arm": { 339 | "version": "0.25.5", 340 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", 341 | "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", 342 | "cpu": [ 343 | "arm" 344 | ], 345 | "dev": true, 346 | "license": "MIT", 347 | "optional": true, 348 | "os": [ 349 | "linux" 350 | ], 351 | "engines": { 352 | "node": ">=18" 353 | } 354 | }, 355 | "node_modules/@esbuild/linux-arm64": { 356 | "version": "0.25.5", 357 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", 358 | "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", 359 | "cpu": [ 360 | "arm64" 361 | ], 362 | "dev": true, 363 | "license": "MIT", 364 | "optional": true, 365 | "os": [ 366 | "linux" 367 | ], 368 | "engines": { 369 | "node": ">=18" 370 | } 371 | }, 372 | "node_modules/@esbuild/linux-ia32": { 373 | "version": "0.25.5", 374 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", 375 | "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", 376 | "cpu": [ 377 | "ia32" 378 | ], 379 | "dev": true, 380 | "license": "MIT", 381 | "optional": true, 382 | "os": [ 383 | "linux" 384 | ], 385 | "engines": { 386 | "node": ">=18" 387 | } 388 | }, 389 | "node_modules/@esbuild/linux-loong64": { 390 | "version": "0.25.5", 391 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", 392 | "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", 393 | "cpu": [ 394 | "loong64" 395 | ], 396 | "dev": true, 397 | "license": "MIT", 398 | "optional": true, 399 | "os": [ 400 | "linux" 401 | ], 402 | "engines": { 403 | "node": ">=18" 404 | } 405 | }, 406 | "node_modules/@esbuild/linux-mips64el": { 407 | "version": "0.25.5", 408 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", 409 | "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", 410 | "cpu": [ 411 | "mips64el" 412 | ], 413 | "dev": true, 414 | "license": "MIT", 415 | "optional": true, 416 | "os": [ 417 | "linux" 418 | ], 419 | "engines": { 420 | "node": ">=18" 421 | } 422 | }, 423 | "node_modules/@esbuild/linux-ppc64": { 424 | "version": "0.25.5", 425 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", 426 | "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", 427 | "cpu": [ 428 | "ppc64" 429 | ], 430 | "dev": true, 431 | "license": "MIT", 432 | "optional": true, 433 | "os": [ 434 | "linux" 435 | ], 436 | "engines": { 437 | "node": ">=18" 438 | } 439 | }, 440 | "node_modules/@esbuild/linux-riscv64": { 441 | "version": "0.25.5", 442 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", 443 | "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", 444 | "cpu": [ 445 | "riscv64" 446 | ], 447 | "dev": true, 448 | "license": "MIT", 449 | "optional": true, 450 | "os": [ 451 | "linux" 452 | ], 453 | "engines": { 454 | "node": ">=18" 455 | } 456 | }, 457 | "node_modules/@esbuild/linux-s390x": { 458 | "version": "0.25.5", 459 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", 460 | "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", 461 | "cpu": [ 462 | "s390x" 463 | ], 464 | "dev": true, 465 | "license": "MIT", 466 | "optional": true, 467 | "os": [ 468 | "linux" 469 | ], 470 | "engines": { 471 | "node": ">=18" 472 | } 473 | }, 474 | "node_modules/@esbuild/linux-x64": { 475 | "version": "0.25.5", 476 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", 477 | "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", 478 | "cpu": [ 479 | "x64" 480 | ], 481 | "dev": true, 482 | "license": "MIT", 483 | "optional": true, 484 | "os": [ 485 | "linux" 486 | ], 487 | "engines": { 488 | "node": ">=18" 489 | } 490 | }, 491 | "node_modules/@esbuild/netbsd-arm64": { 492 | "version": "0.25.5", 493 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", 494 | "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", 495 | "cpu": [ 496 | "arm64" 497 | ], 498 | "dev": true, 499 | "license": "MIT", 500 | "optional": true, 501 | "os": [ 502 | "netbsd" 503 | ], 504 | "engines": { 505 | "node": ">=18" 506 | } 507 | }, 508 | "node_modules/@esbuild/netbsd-x64": { 509 | "version": "0.25.5", 510 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", 511 | "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", 512 | "cpu": [ 513 | "x64" 514 | ], 515 | "dev": true, 516 | "license": "MIT", 517 | "optional": true, 518 | "os": [ 519 | "netbsd" 520 | ], 521 | "engines": { 522 | "node": ">=18" 523 | } 524 | }, 525 | "node_modules/@esbuild/openbsd-arm64": { 526 | "version": "0.25.5", 527 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", 528 | "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", 529 | "cpu": [ 530 | "arm64" 531 | ], 532 | "dev": true, 533 | "license": "MIT", 534 | "optional": true, 535 | "os": [ 536 | "openbsd" 537 | ], 538 | "engines": { 539 | "node": ">=18" 540 | } 541 | }, 542 | "node_modules/@esbuild/openbsd-x64": { 543 | "version": "0.25.5", 544 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", 545 | "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", 546 | "cpu": [ 547 | "x64" 548 | ], 549 | "dev": true, 550 | "license": "MIT", 551 | "optional": true, 552 | "os": [ 553 | "openbsd" 554 | ], 555 | "engines": { 556 | "node": ">=18" 557 | } 558 | }, 559 | "node_modules/@esbuild/sunos-x64": { 560 | "version": "0.25.5", 561 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", 562 | "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", 563 | "cpu": [ 564 | "x64" 565 | ], 566 | "dev": true, 567 | "license": "MIT", 568 | "optional": true, 569 | "os": [ 570 | "sunos" 571 | ], 572 | "engines": { 573 | "node": ">=18" 574 | } 575 | }, 576 | "node_modules/@esbuild/win32-arm64": { 577 | "version": "0.25.5", 578 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", 579 | "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", 580 | "cpu": [ 581 | "arm64" 582 | ], 583 | "dev": true, 584 | "license": "MIT", 585 | "optional": true, 586 | "os": [ 587 | "win32" 588 | ], 589 | "engines": { 590 | "node": ">=18" 591 | } 592 | }, 593 | "node_modules/@esbuild/win32-ia32": { 594 | "version": "0.25.5", 595 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", 596 | "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", 597 | "cpu": [ 598 | "ia32" 599 | ], 600 | "dev": true, 601 | "license": "MIT", 602 | "optional": true, 603 | "os": [ 604 | "win32" 605 | ], 606 | "engines": { 607 | "node": ">=18" 608 | } 609 | }, 610 | "node_modules/@esbuild/win32-x64": { 611 | "version": "0.25.5", 612 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", 613 | "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", 614 | "cpu": [ 615 | "x64" 616 | ], 617 | "dev": true, 618 | "license": "MIT", 619 | "optional": true, 620 | "os": [ 621 | "win32" 622 | ], 623 | "engines": { 624 | "node": ">=18" 625 | } 626 | }, 627 | "node_modules/@isaacs/cliui": { 628 | "version": "8.0.2", 629 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 630 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 631 | "dev": true, 632 | "license": "ISC", 633 | "dependencies": { 634 | "string-width": "^5.1.2", 635 | "string-width-cjs": "npm:string-width@^4.2.0", 636 | "strip-ansi": "^7.0.1", 637 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 638 | "wrap-ansi": "^8.1.0", 639 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 640 | }, 641 | "engines": { 642 | "node": ">=12" 643 | } 644 | }, 645 | "node_modules/@istanbuljs/schema": { 646 | "version": "0.1.3", 647 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 648 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 649 | "dev": true, 650 | "license": "MIT", 651 | "engines": { 652 | "node": ">=8" 653 | } 654 | }, 655 | "node_modules/@jridgewell/resolve-uri": { 656 | "version": "3.1.2", 657 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 658 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 659 | "dev": true, 660 | "license": "MIT", 661 | "engines": { 662 | "node": ">=6.0.0" 663 | } 664 | }, 665 | "node_modules/@jridgewell/sourcemap-codec": { 666 | "version": "1.5.0", 667 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 668 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 669 | "dev": true, 670 | "license": "MIT" 671 | }, 672 | "node_modules/@jridgewell/trace-mapping": { 673 | "version": "0.3.25", 674 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 675 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 676 | "dev": true, 677 | "license": "MIT", 678 | "dependencies": { 679 | "@jridgewell/resolve-uri": "^3.1.0", 680 | "@jridgewell/sourcemap-codec": "^1.4.14" 681 | } 682 | }, 683 | "node_modules/@pkgjs/parseargs": { 684 | "version": "0.11.0", 685 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 686 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 687 | "dev": true, 688 | "license": "MIT", 689 | "optional": true, 690 | "engines": { 691 | "node": ">=14" 692 | } 693 | }, 694 | "node_modules/@sinonjs/commons": { 695 | "version": "3.0.1", 696 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", 697 | "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", 698 | "dev": true, 699 | "license": "BSD-3-Clause", 700 | "dependencies": { 701 | "type-detect": "4.0.8" 702 | } 703 | }, 704 | "node_modules/@sinonjs/fake-timers": { 705 | "version": "13.0.5", 706 | "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", 707 | "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", 708 | "dev": true, 709 | "license": "BSD-3-Clause", 710 | "dependencies": { 711 | "@sinonjs/commons": "^3.0.1" 712 | } 713 | }, 714 | "node_modules/@sinonjs/samsam": { 715 | "version": "8.0.2", 716 | "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", 717 | "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", 718 | "dev": true, 719 | "license": "BSD-3-Clause", 720 | "dependencies": { 721 | "@sinonjs/commons": "^3.0.1", 722 | "lodash.get": "^4.4.2", 723 | "type-detect": "^4.1.0" 724 | } 725 | }, 726 | "node_modules/@sinonjs/samsam/node_modules/type-detect": { 727 | "version": "4.1.0", 728 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", 729 | "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", 730 | "dev": true, 731 | "license": "MIT", 732 | "engines": { 733 | "node": ">=4" 734 | } 735 | }, 736 | "node_modules/@types/istanbul-lib-coverage": { 737 | "version": "2.0.6", 738 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", 739 | "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", 740 | "dev": true, 741 | "license": "MIT" 742 | }, 743 | "node_modules/@types/mocha": { 744 | "version": "10.0.10", 745 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", 746 | "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", 747 | "dev": true, 748 | "license": "MIT" 749 | }, 750 | "node_modules/@types/node": { 751 | "version": "22.15.29", 752 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", 753 | "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", 754 | "dev": true, 755 | "license": "MIT", 756 | "dependencies": { 757 | "undici-types": "~6.21.0" 758 | } 759 | }, 760 | "node_modules/@types/sinon": { 761 | "version": "17.0.4", 762 | "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.4.tgz", 763 | "integrity": "sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==", 764 | "dev": true, 765 | "license": "MIT", 766 | "dependencies": { 767 | "@types/sinonjs__fake-timers": "*" 768 | } 769 | }, 770 | "node_modules/@types/sinonjs__fake-timers": { 771 | "version": "8.1.5", 772 | "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", 773 | "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", 774 | "dev": true, 775 | "license": "MIT" 776 | }, 777 | "node_modules/@types/vscode": { 778 | "version": "1.100.0", 779 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.100.0.tgz", 780 | "integrity": "sha512-4uNyvzHoraXEeCamR3+fzcBlh7Afs4Ifjs4epINyUX/jvdk0uzLnwiDY35UKDKnkCHP5Nu3dljl2H8lR6s+rQw==", 781 | "dev": true, 782 | "license": "MIT" 783 | }, 784 | "node_modules/@vscode/test-cli": { 785 | "version": "0.0.11", 786 | "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.11.tgz", 787 | "integrity": "sha512-qO332yvzFqGhBMJrp6TdwbIydiHgCtxXc2Nl6M58mbH/Z+0CyLR76Jzv4YWPEthhrARprzCRJUqzFvTHFhTj7Q==", 788 | "dev": true, 789 | "license": "MIT", 790 | "dependencies": { 791 | "@types/mocha": "^10.0.2", 792 | "c8": "^9.1.0", 793 | "chokidar": "^3.5.3", 794 | "enhanced-resolve": "^5.15.0", 795 | "glob": "^10.3.10", 796 | "minimatch": "^9.0.3", 797 | "mocha": "^11.1.0", 798 | "supports-color": "^9.4.0", 799 | "yargs": "^17.7.2" 800 | }, 801 | "bin": { 802 | "vscode-test": "out/bin.mjs" 803 | }, 804 | "engines": { 805 | "node": ">=18" 806 | } 807 | }, 808 | "node_modules/@vscode/test-electron": { 809 | "version": "2.5.2", 810 | "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", 811 | "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", 812 | "dev": true, 813 | "license": "MIT", 814 | "dependencies": { 815 | "http-proxy-agent": "^7.0.2", 816 | "https-proxy-agent": "^7.0.5", 817 | "jszip": "^3.10.1", 818 | "ora": "^8.1.0", 819 | "semver": "^7.6.2" 820 | }, 821 | "engines": { 822 | "node": ">=16" 823 | } 824 | }, 825 | "node_modules/agent-base": { 826 | "version": "7.1.3", 827 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", 828 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", 829 | "dev": true, 830 | "license": "MIT", 831 | "engines": { 832 | "node": ">= 14" 833 | } 834 | }, 835 | "node_modules/ansi-regex": { 836 | "version": "6.1.0", 837 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 838 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 839 | "dev": true, 840 | "license": "MIT", 841 | "engines": { 842 | "node": ">=12" 843 | }, 844 | "funding": { 845 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 846 | } 847 | }, 848 | "node_modules/ansi-styles": { 849 | "version": "4.3.0", 850 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 851 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 852 | "dev": true, 853 | "license": "MIT", 854 | "dependencies": { 855 | "color-convert": "^2.0.1" 856 | }, 857 | "engines": { 858 | "node": ">=8" 859 | }, 860 | "funding": { 861 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 862 | } 863 | }, 864 | "node_modules/anymatch": { 865 | "version": "3.1.3", 866 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 867 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 868 | "dev": true, 869 | "license": "ISC", 870 | "dependencies": { 871 | "normalize-path": "^3.0.0", 872 | "picomatch": "^2.0.4" 873 | }, 874 | "engines": { 875 | "node": ">= 8" 876 | } 877 | }, 878 | "node_modules/argparse": { 879 | "version": "2.0.1", 880 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 881 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 882 | "dev": true, 883 | "license": "Python-2.0" 884 | }, 885 | "node_modules/balanced-match": { 886 | "version": "1.0.2", 887 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 888 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 889 | "dev": true, 890 | "license": "MIT" 891 | }, 892 | "node_modules/binary-extensions": { 893 | "version": "2.3.0", 894 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 895 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 896 | "dev": true, 897 | "license": "MIT", 898 | "engines": { 899 | "node": ">=8" 900 | }, 901 | "funding": { 902 | "url": "https://github.com/sponsors/sindresorhus" 903 | } 904 | }, 905 | "node_modules/brace-expansion": { 906 | "version": "2.0.1", 907 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 908 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 909 | "dev": true, 910 | "license": "MIT", 911 | "dependencies": { 912 | "balanced-match": "^1.0.0" 913 | } 914 | }, 915 | "node_modules/braces": { 916 | "version": "3.0.3", 917 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 918 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 919 | "dev": true, 920 | "license": "MIT", 921 | "dependencies": { 922 | "fill-range": "^7.1.1" 923 | }, 924 | "engines": { 925 | "node": ">=8" 926 | } 927 | }, 928 | "node_modules/browser-stdout": { 929 | "version": "1.3.1", 930 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 931 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 932 | "dev": true, 933 | "license": "ISC" 934 | }, 935 | "node_modules/c8": { 936 | "version": "9.1.0", 937 | "resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz", 938 | "integrity": "sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==", 939 | "dev": true, 940 | "license": "ISC", 941 | "dependencies": { 942 | "@bcoe/v8-coverage": "^0.2.3", 943 | "@istanbuljs/schema": "^0.1.3", 944 | "find-up": "^5.0.0", 945 | "foreground-child": "^3.1.1", 946 | "istanbul-lib-coverage": "^3.2.0", 947 | "istanbul-lib-report": "^3.0.1", 948 | "istanbul-reports": "^3.1.6", 949 | "test-exclude": "^6.0.0", 950 | "v8-to-istanbul": "^9.0.0", 951 | "yargs": "^17.7.2", 952 | "yargs-parser": "^21.1.1" 953 | }, 954 | "bin": { 955 | "c8": "bin/c8.js" 956 | }, 957 | "engines": { 958 | "node": ">=14.14.0" 959 | } 960 | }, 961 | "node_modules/camelcase": { 962 | "version": "6.3.0", 963 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 964 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 965 | "dev": true, 966 | "license": "MIT", 967 | "engines": { 968 | "node": ">=10" 969 | }, 970 | "funding": { 971 | "url": "https://github.com/sponsors/sindresorhus" 972 | } 973 | }, 974 | "node_modules/chalk": { 975 | "version": "4.1.2", 976 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 977 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 978 | "dev": true, 979 | "license": "MIT", 980 | "dependencies": { 981 | "ansi-styles": "^4.1.0", 982 | "supports-color": "^7.1.0" 983 | }, 984 | "engines": { 985 | "node": ">=10" 986 | }, 987 | "funding": { 988 | "url": "https://github.com/chalk/chalk?sponsor=1" 989 | } 990 | }, 991 | "node_modules/chalk/node_modules/supports-color": { 992 | "version": "7.2.0", 993 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 994 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 995 | "dev": true, 996 | "license": "MIT", 997 | "dependencies": { 998 | "has-flag": "^4.0.0" 999 | }, 1000 | "engines": { 1001 | "node": ">=8" 1002 | } 1003 | }, 1004 | "node_modules/chokidar": { 1005 | "version": "3.6.0", 1006 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 1007 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 1008 | "dev": true, 1009 | "license": "MIT", 1010 | "dependencies": { 1011 | "anymatch": "~3.1.2", 1012 | "braces": "~3.0.2", 1013 | "glob-parent": "~5.1.2", 1014 | "is-binary-path": "~2.1.0", 1015 | "is-glob": "~4.0.1", 1016 | "normalize-path": "~3.0.0", 1017 | "readdirp": "~3.6.0" 1018 | }, 1019 | "engines": { 1020 | "node": ">= 8.10.0" 1021 | }, 1022 | "funding": { 1023 | "url": "https://paulmillr.com/funding/" 1024 | }, 1025 | "optionalDependencies": { 1026 | "fsevents": "~2.3.2" 1027 | } 1028 | }, 1029 | "node_modules/cli-cursor": { 1030 | "version": "5.0.0", 1031 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", 1032 | "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", 1033 | "dev": true, 1034 | "license": "MIT", 1035 | "dependencies": { 1036 | "restore-cursor": "^5.0.0" 1037 | }, 1038 | "engines": { 1039 | "node": ">=18" 1040 | }, 1041 | "funding": { 1042 | "url": "https://github.com/sponsors/sindresorhus" 1043 | } 1044 | }, 1045 | "node_modules/cli-spinners": { 1046 | "version": "2.9.2", 1047 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", 1048 | "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", 1049 | "dev": true, 1050 | "license": "MIT", 1051 | "engines": { 1052 | "node": ">=6" 1053 | }, 1054 | "funding": { 1055 | "url": "https://github.com/sponsors/sindresorhus" 1056 | } 1057 | }, 1058 | "node_modules/cliui": { 1059 | "version": "8.0.1", 1060 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 1061 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 1062 | "dev": true, 1063 | "license": "ISC", 1064 | "dependencies": { 1065 | "string-width": "^4.2.0", 1066 | "strip-ansi": "^6.0.1", 1067 | "wrap-ansi": "^7.0.0" 1068 | }, 1069 | "engines": { 1070 | "node": ">=12" 1071 | } 1072 | }, 1073 | "node_modules/cliui/node_modules/ansi-regex": { 1074 | "version": "5.0.1", 1075 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1076 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1077 | "dev": true, 1078 | "license": "MIT", 1079 | "engines": { 1080 | "node": ">=8" 1081 | } 1082 | }, 1083 | "node_modules/cliui/node_modules/emoji-regex": { 1084 | "version": "8.0.0", 1085 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1086 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1087 | "dev": true, 1088 | "license": "MIT" 1089 | }, 1090 | "node_modules/cliui/node_modules/string-width": { 1091 | "version": "4.2.3", 1092 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1093 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1094 | "dev": true, 1095 | "license": "MIT", 1096 | "dependencies": { 1097 | "emoji-regex": "^8.0.0", 1098 | "is-fullwidth-code-point": "^3.0.0", 1099 | "strip-ansi": "^6.0.1" 1100 | }, 1101 | "engines": { 1102 | "node": ">=8" 1103 | } 1104 | }, 1105 | "node_modules/cliui/node_modules/strip-ansi": { 1106 | "version": "6.0.1", 1107 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1108 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1109 | "dev": true, 1110 | "license": "MIT", 1111 | "dependencies": { 1112 | "ansi-regex": "^5.0.1" 1113 | }, 1114 | "engines": { 1115 | "node": ">=8" 1116 | } 1117 | }, 1118 | "node_modules/cliui/node_modules/wrap-ansi": { 1119 | "version": "7.0.0", 1120 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1121 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1122 | "dev": true, 1123 | "license": "MIT", 1124 | "dependencies": { 1125 | "ansi-styles": "^4.0.0", 1126 | "string-width": "^4.1.0", 1127 | "strip-ansi": "^6.0.0" 1128 | }, 1129 | "engines": { 1130 | "node": ">=10" 1131 | }, 1132 | "funding": { 1133 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1134 | } 1135 | }, 1136 | "node_modules/color-convert": { 1137 | "version": "2.0.1", 1138 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1139 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1140 | "dev": true, 1141 | "license": "MIT", 1142 | "dependencies": { 1143 | "color-name": "~1.1.4" 1144 | }, 1145 | "engines": { 1146 | "node": ">=7.0.0" 1147 | } 1148 | }, 1149 | "node_modules/color-name": { 1150 | "version": "1.1.4", 1151 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1152 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1153 | "dev": true, 1154 | "license": "MIT" 1155 | }, 1156 | "node_modules/concat-map": { 1157 | "version": "0.0.1", 1158 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1159 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1160 | "dev": true, 1161 | "license": "MIT" 1162 | }, 1163 | "node_modules/convert-source-map": { 1164 | "version": "2.0.0", 1165 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1166 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1167 | "dev": true, 1168 | "license": "MIT" 1169 | }, 1170 | "node_modules/core-util-is": { 1171 | "version": "1.0.3", 1172 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1173 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 1174 | "dev": true, 1175 | "license": "MIT" 1176 | }, 1177 | "node_modules/cross-spawn": { 1178 | "version": "7.0.6", 1179 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1180 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1181 | "dev": true, 1182 | "license": "MIT", 1183 | "dependencies": { 1184 | "path-key": "^3.1.0", 1185 | "shebang-command": "^2.0.0", 1186 | "which": "^2.0.1" 1187 | }, 1188 | "engines": { 1189 | "node": ">= 8" 1190 | } 1191 | }, 1192 | "node_modules/debug": { 1193 | "version": "4.4.1", 1194 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 1195 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 1196 | "dev": true, 1197 | "license": "MIT", 1198 | "dependencies": { 1199 | "ms": "^2.1.3" 1200 | }, 1201 | "engines": { 1202 | "node": ">=6.0" 1203 | }, 1204 | "peerDependenciesMeta": { 1205 | "supports-color": { 1206 | "optional": true 1207 | } 1208 | } 1209 | }, 1210 | "node_modules/decamelize": { 1211 | "version": "4.0.0", 1212 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1213 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1214 | "dev": true, 1215 | "license": "MIT", 1216 | "engines": { 1217 | "node": ">=10" 1218 | }, 1219 | "funding": { 1220 | "url": "https://github.com/sponsors/sindresorhus" 1221 | } 1222 | }, 1223 | "node_modules/diff": { 1224 | "version": "7.0.0", 1225 | "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", 1226 | "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", 1227 | "dev": true, 1228 | "license": "BSD-3-Clause", 1229 | "engines": { 1230 | "node": ">=0.3.1" 1231 | } 1232 | }, 1233 | "node_modules/eastasianwidth": { 1234 | "version": "0.2.0", 1235 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1236 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1237 | "dev": true, 1238 | "license": "MIT" 1239 | }, 1240 | "node_modules/emoji-regex": { 1241 | "version": "9.2.2", 1242 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1243 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1244 | "dev": true, 1245 | "license": "MIT" 1246 | }, 1247 | "node_modules/enhanced-resolve": { 1248 | "version": "5.18.1", 1249 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", 1250 | "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", 1251 | "dev": true, 1252 | "license": "MIT", 1253 | "dependencies": { 1254 | "graceful-fs": "^4.2.4", 1255 | "tapable": "^2.2.0" 1256 | }, 1257 | "engines": { 1258 | "node": ">=10.13.0" 1259 | } 1260 | }, 1261 | "node_modules/esbuild": { 1262 | "version": "0.25.5", 1263 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", 1264 | "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", 1265 | "dev": true, 1266 | "hasInstallScript": true, 1267 | "license": "MIT", 1268 | "bin": { 1269 | "esbuild": "bin/esbuild" 1270 | }, 1271 | "engines": { 1272 | "node": ">=18" 1273 | }, 1274 | "optionalDependencies": { 1275 | "@esbuild/aix-ppc64": "0.25.5", 1276 | "@esbuild/android-arm": "0.25.5", 1277 | "@esbuild/android-arm64": "0.25.5", 1278 | "@esbuild/android-x64": "0.25.5", 1279 | "@esbuild/darwin-arm64": "0.25.5", 1280 | "@esbuild/darwin-x64": "0.25.5", 1281 | "@esbuild/freebsd-arm64": "0.25.5", 1282 | "@esbuild/freebsd-x64": "0.25.5", 1283 | "@esbuild/linux-arm": "0.25.5", 1284 | "@esbuild/linux-arm64": "0.25.5", 1285 | "@esbuild/linux-ia32": "0.25.5", 1286 | "@esbuild/linux-loong64": "0.25.5", 1287 | "@esbuild/linux-mips64el": "0.25.5", 1288 | "@esbuild/linux-ppc64": "0.25.5", 1289 | "@esbuild/linux-riscv64": "0.25.5", 1290 | "@esbuild/linux-s390x": "0.25.5", 1291 | "@esbuild/linux-x64": "0.25.5", 1292 | "@esbuild/netbsd-arm64": "0.25.5", 1293 | "@esbuild/netbsd-x64": "0.25.5", 1294 | "@esbuild/openbsd-arm64": "0.25.5", 1295 | "@esbuild/openbsd-x64": "0.25.5", 1296 | "@esbuild/sunos-x64": "0.25.5", 1297 | "@esbuild/win32-arm64": "0.25.5", 1298 | "@esbuild/win32-ia32": "0.25.5", 1299 | "@esbuild/win32-x64": "0.25.5" 1300 | } 1301 | }, 1302 | "node_modules/escalade": { 1303 | "version": "3.2.0", 1304 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1305 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1306 | "dev": true, 1307 | "license": "MIT", 1308 | "engines": { 1309 | "node": ">=6" 1310 | } 1311 | }, 1312 | "node_modules/escape-string-regexp": { 1313 | "version": "4.0.0", 1314 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1315 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1316 | "dev": true, 1317 | "license": "MIT", 1318 | "engines": { 1319 | "node": ">=10" 1320 | }, 1321 | "funding": { 1322 | "url": "https://github.com/sponsors/sindresorhus" 1323 | } 1324 | }, 1325 | "node_modules/fill-range": { 1326 | "version": "7.1.1", 1327 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1328 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1329 | "dev": true, 1330 | "license": "MIT", 1331 | "dependencies": { 1332 | "to-regex-range": "^5.0.1" 1333 | }, 1334 | "engines": { 1335 | "node": ">=8" 1336 | } 1337 | }, 1338 | "node_modules/find-up": { 1339 | "version": "5.0.0", 1340 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1341 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1342 | "dev": true, 1343 | "license": "MIT", 1344 | "dependencies": { 1345 | "locate-path": "^6.0.0", 1346 | "path-exists": "^4.0.0" 1347 | }, 1348 | "engines": { 1349 | "node": ">=10" 1350 | }, 1351 | "funding": { 1352 | "url": "https://github.com/sponsors/sindresorhus" 1353 | } 1354 | }, 1355 | "node_modules/flat": { 1356 | "version": "5.0.2", 1357 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1358 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1359 | "dev": true, 1360 | "license": "BSD-3-Clause", 1361 | "bin": { 1362 | "flat": "cli.js" 1363 | } 1364 | }, 1365 | "node_modules/foreground-child": { 1366 | "version": "3.3.1", 1367 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 1368 | "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 1369 | "dev": true, 1370 | "license": "ISC", 1371 | "dependencies": { 1372 | "cross-spawn": "^7.0.6", 1373 | "signal-exit": "^4.0.1" 1374 | }, 1375 | "engines": { 1376 | "node": ">=14" 1377 | }, 1378 | "funding": { 1379 | "url": "https://github.com/sponsors/isaacs" 1380 | } 1381 | }, 1382 | "node_modules/fs.realpath": { 1383 | "version": "1.0.0", 1384 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1385 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1386 | "dev": true, 1387 | "license": "ISC" 1388 | }, 1389 | "node_modules/fsevents": { 1390 | "version": "2.3.3", 1391 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1392 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1393 | "dev": true, 1394 | "hasInstallScript": true, 1395 | "license": "MIT", 1396 | "optional": true, 1397 | "os": [ 1398 | "darwin" 1399 | ], 1400 | "engines": { 1401 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1402 | } 1403 | }, 1404 | "node_modules/get-caller-file": { 1405 | "version": "2.0.5", 1406 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1407 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1408 | "dev": true, 1409 | "license": "ISC", 1410 | "engines": { 1411 | "node": "6.* || 8.* || >= 10.*" 1412 | } 1413 | }, 1414 | "node_modules/get-east-asian-width": { 1415 | "version": "1.3.0", 1416 | "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", 1417 | "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", 1418 | "dev": true, 1419 | "license": "MIT", 1420 | "engines": { 1421 | "node": ">=18" 1422 | }, 1423 | "funding": { 1424 | "url": "https://github.com/sponsors/sindresorhus" 1425 | } 1426 | }, 1427 | "node_modules/glob": { 1428 | "version": "10.4.5", 1429 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1430 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1431 | "dev": true, 1432 | "license": "ISC", 1433 | "dependencies": { 1434 | "foreground-child": "^3.1.0", 1435 | "jackspeak": "^3.1.2", 1436 | "minimatch": "^9.0.4", 1437 | "minipass": "^7.1.2", 1438 | "package-json-from-dist": "^1.0.0", 1439 | "path-scurry": "^1.11.1" 1440 | }, 1441 | "bin": { 1442 | "glob": "dist/esm/bin.mjs" 1443 | }, 1444 | "funding": { 1445 | "url": "https://github.com/sponsors/isaacs" 1446 | } 1447 | }, 1448 | "node_modules/glob-parent": { 1449 | "version": "5.1.2", 1450 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1451 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1452 | "dev": true, 1453 | "license": "ISC", 1454 | "dependencies": { 1455 | "is-glob": "^4.0.1" 1456 | }, 1457 | "engines": { 1458 | "node": ">= 6" 1459 | } 1460 | }, 1461 | "node_modules/graceful-fs": { 1462 | "version": "4.2.11", 1463 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1464 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1465 | "dev": true, 1466 | "license": "ISC" 1467 | }, 1468 | "node_modules/has-flag": { 1469 | "version": "4.0.0", 1470 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1471 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1472 | "dev": true, 1473 | "license": "MIT", 1474 | "engines": { 1475 | "node": ">=8" 1476 | } 1477 | }, 1478 | "node_modules/he": { 1479 | "version": "1.2.0", 1480 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1481 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1482 | "dev": true, 1483 | "license": "MIT", 1484 | "bin": { 1485 | "he": "bin/he" 1486 | } 1487 | }, 1488 | "node_modules/html-escaper": { 1489 | "version": "2.0.2", 1490 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1491 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1492 | "dev": true, 1493 | "license": "MIT" 1494 | }, 1495 | "node_modules/http-proxy-agent": { 1496 | "version": "7.0.2", 1497 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 1498 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 1499 | "dev": true, 1500 | "license": "MIT", 1501 | "dependencies": { 1502 | "agent-base": "^7.1.0", 1503 | "debug": "^4.3.4" 1504 | }, 1505 | "engines": { 1506 | "node": ">= 14" 1507 | } 1508 | }, 1509 | "node_modules/https-proxy-agent": { 1510 | "version": "7.0.6", 1511 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 1512 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 1513 | "dev": true, 1514 | "license": "MIT", 1515 | "dependencies": { 1516 | "agent-base": "^7.1.2", 1517 | "debug": "4" 1518 | }, 1519 | "engines": { 1520 | "node": ">= 14" 1521 | } 1522 | }, 1523 | "node_modules/immediate": { 1524 | "version": "3.0.6", 1525 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 1526 | "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", 1527 | "dev": true, 1528 | "license": "MIT" 1529 | }, 1530 | "node_modules/inflight": { 1531 | "version": "1.0.6", 1532 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1533 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1534 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1535 | "dev": true, 1536 | "license": "ISC", 1537 | "dependencies": { 1538 | "once": "^1.3.0", 1539 | "wrappy": "1" 1540 | } 1541 | }, 1542 | "node_modules/inherits": { 1543 | "version": "2.0.4", 1544 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1545 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1546 | "dev": true, 1547 | "license": "ISC" 1548 | }, 1549 | "node_modules/is-binary-path": { 1550 | "version": "2.1.0", 1551 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1552 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1553 | "dev": true, 1554 | "license": "MIT", 1555 | "dependencies": { 1556 | "binary-extensions": "^2.0.0" 1557 | }, 1558 | "engines": { 1559 | "node": ">=8" 1560 | } 1561 | }, 1562 | "node_modules/is-extglob": { 1563 | "version": "2.1.1", 1564 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1565 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1566 | "dev": true, 1567 | "license": "MIT", 1568 | "engines": { 1569 | "node": ">=0.10.0" 1570 | } 1571 | }, 1572 | "node_modules/is-fullwidth-code-point": { 1573 | "version": "3.0.0", 1574 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1575 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1576 | "dev": true, 1577 | "license": "MIT", 1578 | "engines": { 1579 | "node": ">=8" 1580 | } 1581 | }, 1582 | "node_modules/is-glob": { 1583 | "version": "4.0.3", 1584 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1585 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1586 | "dev": true, 1587 | "license": "MIT", 1588 | "dependencies": { 1589 | "is-extglob": "^2.1.1" 1590 | }, 1591 | "engines": { 1592 | "node": ">=0.10.0" 1593 | } 1594 | }, 1595 | "node_modules/is-interactive": { 1596 | "version": "2.0.0", 1597 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", 1598 | "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", 1599 | "dev": true, 1600 | "license": "MIT", 1601 | "engines": { 1602 | "node": ">=12" 1603 | }, 1604 | "funding": { 1605 | "url": "https://github.com/sponsors/sindresorhus" 1606 | } 1607 | }, 1608 | "node_modules/is-number": { 1609 | "version": "7.0.0", 1610 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1611 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1612 | "dev": true, 1613 | "license": "MIT", 1614 | "engines": { 1615 | "node": ">=0.12.0" 1616 | } 1617 | }, 1618 | "node_modules/is-plain-obj": { 1619 | "version": "2.1.0", 1620 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1621 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1622 | "dev": true, 1623 | "license": "MIT", 1624 | "engines": { 1625 | "node": ">=8" 1626 | } 1627 | }, 1628 | "node_modules/is-unicode-supported": { 1629 | "version": "0.1.0", 1630 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1631 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1632 | "dev": true, 1633 | "license": "MIT", 1634 | "engines": { 1635 | "node": ">=10" 1636 | }, 1637 | "funding": { 1638 | "url": "https://github.com/sponsors/sindresorhus" 1639 | } 1640 | }, 1641 | "node_modules/isarray": { 1642 | "version": "1.0.0", 1643 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1644 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1645 | "dev": true, 1646 | "license": "MIT" 1647 | }, 1648 | "node_modules/isexe": { 1649 | "version": "2.0.0", 1650 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1651 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1652 | "dev": true, 1653 | "license": "ISC" 1654 | }, 1655 | "node_modules/istanbul-lib-coverage": { 1656 | "version": "3.2.2", 1657 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 1658 | "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 1659 | "dev": true, 1660 | "license": "BSD-3-Clause", 1661 | "engines": { 1662 | "node": ">=8" 1663 | } 1664 | }, 1665 | "node_modules/istanbul-lib-report": { 1666 | "version": "3.0.1", 1667 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 1668 | "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 1669 | "dev": true, 1670 | "license": "BSD-3-Clause", 1671 | "dependencies": { 1672 | "istanbul-lib-coverage": "^3.0.0", 1673 | "make-dir": "^4.0.0", 1674 | "supports-color": "^7.1.0" 1675 | }, 1676 | "engines": { 1677 | "node": ">=10" 1678 | } 1679 | }, 1680 | "node_modules/istanbul-lib-report/node_modules/supports-color": { 1681 | "version": "7.2.0", 1682 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1683 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1684 | "dev": true, 1685 | "license": "MIT", 1686 | "dependencies": { 1687 | "has-flag": "^4.0.0" 1688 | }, 1689 | "engines": { 1690 | "node": ">=8" 1691 | } 1692 | }, 1693 | "node_modules/istanbul-reports": { 1694 | "version": "3.1.7", 1695 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", 1696 | "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", 1697 | "dev": true, 1698 | "license": "BSD-3-Clause", 1699 | "dependencies": { 1700 | "html-escaper": "^2.0.0", 1701 | "istanbul-lib-report": "^3.0.0" 1702 | }, 1703 | "engines": { 1704 | "node": ">=8" 1705 | } 1706 | }, 1707 | "node_modules/jackspeak": { 1708 | "version": "3.4.3", 1709 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1710 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1711 | "dev": true, 1712 | "license": "BlueOak-1.0.0", 1713 | "dependencies": { 1714 | "@isaacs/cliui": "^8.0.2" 1715 | }, 1716 | "funding": { 1717 | "url": "https://github.com/sponsors/isaacs" 1718 | }, 1719 | "optionalDependencies": { 1720 | "@pkgjs/parseargs": "^0.11.0" 1721 | } 1722 | }, 1723 | "node_modules/js-yaml": { 1724 | "version": "4.1.0", 1725 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1726 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1727 | "dev": true, 1728 | "license": "MIT", 1729 | "dependencies": { 1730 | "argparse": "^2.0.1" 1731 | }, 1732 | "bin": { 1733 | "js-yaml": "bin/js-yaml.js" 1734 | } 1735 | }, 1736 | "node_modules/jszip": { 1737 | "version": "3.10.1", 1738 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", 1739 | "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", 1740 | "dev": true, 1741 | "license": "(MIT OR GPL-3.0-or-later)", 1742 | "dependencies": { 1743 | "lie": "~3.3.0", 1744 | "pako": "~1.0.2", 1745 | "readable-stream": "~2.3.6", 1746 | "setimmediate": "^1.0.5" 1747 | } 1748 | }, 1749 | "node_modules/lie": { 1750 | "version": "3.3.0", 1751 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 1752 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 1753 | "dev": true, 1754 | "license": "MIT", 1755 | "dependencies": { 1756 | "immediate": "~3.0.5" 1757 | } 1758 | }, 1759 | "node_modules/locate-path": { 1760 | "version": "6.0.0", 1761 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1762 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1763 | "dev": true, 1764 | "license": "MIT", 1765 | "dependencies": { 1766 | "p-locate": "^5.0.0" 1767 | }, 1768 | "engines": { 1769 | "node": ">=10" 1770 | }, 1771 | "funding": { 1772 | "url": "https://github.com/sponsors/sindresorhus" 1773 | } 1774 | }, 1775 | "node_modules/lodash.get": { 1776 | "version": "4.4.2", 1777 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 1778 | "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", 1779 | "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", 1780 | "dev": true, 1781 | "license": "MIT" 1782 | }, 1783 | "node_modules/log-symbols": { 1784 | "version": "4.1.0", 1785 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1786 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1787 | "dev": true, 1788 | "license": "MIT", 1789 | "dependencies": { 1790 | "chalk": "^4.1.0", 1791 | "is-unicode-supported": "^0.1.0" 1792 | }, 1793 | "engines": { 1794 | "node": ">=10" 1795 | }, 1796 | "funding": { 1797 | "url": "https://github.com/sponsors/sindresorhus" 1798 | } 1799 | }, 1800 | "node_modules/lru-cache": { 1801 | "version": "10.4.3", 1802 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1803 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1804 | "dev": true, 1805 | "license": "ISC" 1806 | }, 1807 | "node_modules/make-dir": { 1808 | "version": "4.0.0", 1809 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 1810 | "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 1811 | "dev": true, 1812 | "license": "MIT", 1813 | "dependencies": { 1814 | "semver": "^7.5.3" 1815 | }, 1816 | "engines": { 1817 | "node": ">=10" 1818 | }, 1819 | "funding": { 1820 | "url": "https://github.com/sponsors/sindresorhus" 1821 | } 1822 | }, 1823 | "node_modules/mimic-function": { 1824 | "version": "5.0.1", 1825 | "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", 1826 | "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", 1827 | "dev": true, 1828 | "license": "MIT", 1829 | "engines": { 1830 | "node": ">=18" 1831 | }, 1832 | "funding": { 1833 | "url": "https://github.com/sponsors/sindresorhus" 1834 | } 1835 | }, 1836 | "node_modules/minimatch": { 1837 | "version": "9.0.5", 1838 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1839 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1840 | "dev": true, 1841 | "license": "ISC", 1842 | "dependencies": { 1843 | "brace-expansion": "^2.0.1" 1844 | }, 1845 | "engines": { 1846 | "node": ">=16 || 14 >=14.17" 1847 | }, 1848 | "funding": { 1849 | "url": "https://github.com/sponsors/isaacs" 1850 | } 1851 | }, 1852 | "node_modules/minipass": { 1853 | "version": "7.1.2", 1854 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 1855 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 1856 | "dev": true, 1857 | "license": "ISC", 1858 | "engines": { 1859 | "node": ">=16 || 14 >=14.17" 1860 | } 1861 | }, 1862 | "node_modules/mocha": { 1863 | "version": "11.5.0", 1864 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.5.0.tgz", 1865 | "integrity": "sha512-VKDjhy6LMTKm0WgNEdlY77YVsD49LZnPSXJAaPNL9NRYQADxvORsyG1DIQY6v53BKTnlNbEE2MbVCDbnxr4K3w==", 1866 | "dev": true, 1867 | "license": "MIT", 1868 | "dependencies": { 1869 | "browser-stdout": "^1.3.1", 1870 | "chokidar": "^4.0.1", 1871 | "debug": "^4.3.5", 1872 | "diff": "^7.0.0", 1873 | "escape-string-regexp": "^4.0.0", 1874 | "find-up": "^5.0.0", 1875 | "glob": "^10.4.5", 1876 | "he": "^1.2.0", 1877 | "js-yaml": "^4.1.0", 1878 | "log-symbols": "^4.1.0", 1879 | "minimatch": "^9.0.5", 1880 | "ms": "^2.1.3", 1881 | "picocolors": "^1.1.1", 1882 | "serialize-javascript": "^6.0.2", 1883 | "strip-json-comments": "^3.1.1", 1884 | "supports-color": "^8.1.1", 1885 | "workerpool": "^6.5.1", 1886 | "yargs": "^17.7.2", 1887 | "yargs-parser": "^21.1.1", 1888 | "yargs-unparser": "^2.0.0" 1889 | }, 1890 | "bin": { 1891 | "_mocha": "bin/_mocha", 1892 | "mocha": "bin/mocha.js" 1893 | }, 1894 | "engines": { 1895 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1896 | } 1897 | }, 1898 | "node_modules/mocha/node_modules/chokidar": { 1899 | "version": "4.0.3", 1900 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 1901 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1902 | "dev": true, 1903 | "license": "MIT", 1904 | "dependencies": { 1905 | "readdirp": "^4.0.1" 1906 | }, 1907 | "engines": { 1908 | "node": ">= 14.16.0" 1909 | }, 1910 | "funding": { 1911 | "url": "https://paulmillr.com/funding/" 1912 | } 1913 | }, 1914 | "node_modules/mocha/node_modules/readdirp": { 1915 | "version": "4.1.2", 1916 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 1917 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 1918 | "dev": true, 1919 | "license": "MIT", 1920 | "engines": { 1921 | "node": ">= 14.18.0" 1922 | }, 1923 | "funding": { 1924 | "type": "individual", 1925 | "url": "https://paulmillr.com/funding/" 1926 | } 1927 | }, 1928 | "node_modules/mocha/node_modules/supports-color": { 1929 | "version": "8.1.1", 1930 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1931 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1932 | "dev": true, 1933 | "license": "MIT", 1934 | "dependencies": { 1935 | "has-flag": "^4.0.0" 1936 | }, 1937 | "engines": { 1938 | "node": ">=10" 1939 | }, 1940 | "funding": { 1941 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1942 | } 1943 | }, 1944 | "node_modules/ms": { 1945 | "version": "2.1.3", 1946 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1947 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1948 | "dev": true, 1949 | "license": "MIT" 1950 | }, 1951 | "node_modules/normalize-path": { 1952 | "version": "3.0.0", 1953 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1954 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1955 | "dev": true, 1956 | "license": "MIT", 1957 | "engines": { 1958 | "node": ">=0.10.0" 1959 | } 1960 | }, 1961 | "node_modules/ollama": { 1962 | "version": "0.5.16", 1963 | "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.16.tgz", 1964 | "integrity": "sha512-OEbxxOIUZtdZgOaTPAULo051F5y+Z1vosxEYOoABPnQKeW7i4O8tJNlxCB+xioyoorVqgjkdj+TA1f1Hy2ug/w==", 1965 | "license": "MIT", 1966 | "dependencies": { 1967 | "whatwg-fetch": "^3.6.20" 1968 | } 1969 | }, 1970 | "node_modules/once": { 1971 | "version": "1.4.0", 1972 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1973 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1974 | "dev": true, 1975 | "license": "ISC", 1976 | "dependencies": { 1977 | "wrappy": "1" 1978 | } 1979 | }, 1980 | "node_modules/onetime": { 1981 | "version": "7.0.0", 1982 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", 1983 | "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", 1984 | "dev": true, 1985 | "license": "MIT", 1986 | "dependencies": { 1987 | "mimic-function": "^5.0.0" 1988 | }, 1989 | "engines": { 1990 | "node": ">=18" 1991 | }, 1992 | "funding": { 1993 | "url": "https://github.com/sponsors/sindresorhus" 1994 | } 1995 | }, 1996 | "node_modules/ora": { 1997 | "version": "8.2.0", 1998 | "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", 1999 | "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", 2000 | "dev": true, 2001 | "license": "MIT", 2002 | "dependencies": { 2003 | "chalk": "^5.3.0", 2004 | "cli-cursor": "^5.0.0", 2005 | "cli-spinners": "^2.9.2", 2006 | "is-interactive": "^2.0.0", 2007 | "is-unicode-supported": "^2.0.0", 2008 | "log-symbols": "^6.0.0", 2009 | "stdin-discarder": "^0.2.2", 2010 | "string-width": "^7.2.0", 2011 | "strip-ansi": "^7.1.0" 2012 | }, 2013 | "engines": { 2014 | "node": ">=18" 2015 | }, 2016 | "funding": { 2017 | "url": "https://github.com/sponsors/sindresorhus" 2018 | } 2019 | }, 2020 | "node_modules/ora/node_modules/chalk": { 2021 | "version": "5.4.1", 2022 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", 2023 | "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", 2024 | "dev": true, 2025 | "license": "MIT", 2026 | "engines": { 2027 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 2028 | }, 2029 | "funding": { 2030 | "url": "https://github.com/chalk/chalk?sponsor=1" 2031 | } 2032 | }, 2033 | "node_modules/ora/node_modules/emoji-regex": { 2034 | "version": "10.4.0", 2035 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", 2036 | "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", 2037 | "dev": true, 2038 | "license": "MIT" 2039 | }, 2040 | "node_modules/ora/node_modules/is-unicode-supported": { 2041 | "version": "2.1.0", 2042 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", 2043 | "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", 2044 | "dev": true, 2045 | "license": "MIT", 2046 | "engines": { 2047 | "node": ">=18" 2048 | }, 2049 | "funding": { 2050 | "url": "https://github.com/sponsors/sindresorhus" 2051 | } 2052 | }, 2053 | "node_modules/ora/node_modules/log-symbols": { 2054 | "version": "6.0.0", 2055 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", 2056 | "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", 2057 | "dev": true, 2058 | "license": "MIT", 2059 | "dependencies": { 2060 | "chalk": "^5.3.0", 2061 | "is-unicode-supported": "^1.3.0" 2062 | }, 2063 | "engines": { 2064 | "node": ">=18" 2065 | }, 2066 | "funding": { 2067 | "url": "https://github.com/sponsors/sindresorhus" 2068 | } 2069 | }, 2070 | "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { 2071 | "version": "1.3.0", 2072 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", 2073 | "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", 2074 | "dev": true, 2075 | "license": "MIT", 2076 | "engines": { 2077 | "node": ">=12" 2078 | }, 2079 | "funding": { 2080 | "url": "https://github.com/sponsors/sindresorhus" 2081 | } 2082 | }, 2083 | "node_modules/ora/node_modules/string-width": { 2084 | "version": "7.2.0", 2085 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", 2086 | "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 2087 | "dev": true, 2088 | "license": "MIT", 2089 | "dependencies": { 2090 | "emoji-regex": "^10.3.0", 2091 | "get-east-asian-width": "^1.0.0", 2092 | "strip-ansi": "^7.1.0" 2093 | }, 2094 | "engines": { 2095 | "node": ">=18" 2096 | }, 2097 | "funding": { 2098 | "url": "https://github.com/sponsors/sindresorhus" 2099 | } 2100 | }, 2101 | "node_modules/p-limit": { 2102 | "version": "3.1.0", 2103 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2104 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2105 | "dev": true, 2106 | "license": "MIT", 2107 | "dependencies": { 2108 | "yocto-queue": "^0.1.0" 2109 | }, 2110 | "engines": { 2111 | "node": ">=10" 2112 | }, 2113 | "funding": { 2114 | "url": "https://github.com/sponsors/sindresorhus" 2115 | } 2116 | }, 2117 | "node_modules/p-locate": { 2118 | "version": "5.0.0", 2119 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2120 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2121 | "dev": true, 2122 | "license": "MIT", 2123 | "dependencies": { 2124 | "p-limit": "^3.0.2" 2125 | }, 2126 | "engines": { 2127 | "node": ">=10" 2128 | }, 2129 | "funding": { 2130 | "url": "https://github.com/sponsors/sindresorhus" 2131 | } 2132 | }, 2133 | "node_modules/package-json-from-dist": { 2134 | "version": "1.0.1", 2135 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2136 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 2137 | "dev": true, 2138 | "license": "BlueOak-1.0.0" 2139 | }, 2140 | "node_modules/pako": { 2141 | "version": "1.0.11", 2142 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 2143 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 2144 | "dev": true, 2145 | "license": "(MIT AND Zlib)" 2146 | }, 2147 | "node_modules/path-exists": { 2148 | "version": "4.0.0", 2149 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2150 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2151 | "dev": true, 2152 | "license": "MIT", 2153 | "engines": { 2154 | "node": ">=8" 2155 | } 2156 | }, 2157 | "node_modules/path-is-absolute": { 2158 | "version": "1.0.1", 2159 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2160 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2161 | "dev": true, 2162 | "license": "MIT", 2163 | "engines": { 2164 | "node": ">=0.10.0" 2165 | } 2166 | }, 2167 | "node_modules/path-key": { 2168 | "version": "3.1.1", 2169 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2170 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2171 | "dev": true, 2172 | "license": "MIT", 2173 | "engines": { 2174 | "node": ">=8" 2175 | } 2176 | }, 2177 | "node_modules/path-scurry": { 2178 | "version": "1.11.1", 2179 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2180 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2181 | "dev": true, 2182 | "license": "BlueOak-1.0.0", 2183 | "dependencies": { 2184 | "lru-cache": "^10.2.0", 2185 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2186 | }, 2187 | "engines": { 2188 | "node": ">=16 || 14 >=14.18" 2189 | }, 2190 | "funding": { 2191 | "url": "https://github.com/sponsors/isaacs" 2192 | } 2193 | }, 2194 | "node_modules/picocolors": { 2195 | "version": "1.1.1", 2196 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2197 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2198 | "dev": true, 2199 | "license": "ISC" 2200 | }, 2201 | "node_modules/picomatch": { 2202 | "version": "2.3.1", 2203 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2204 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2205 | "dev": true, 2206 | "license": "MIT", 2207 | "engines": { 2208 | "node": ">=8.6" 2209 | }, 2210 | "funding": { 2211 | "url": "https://github.com/sponsors/jonschlinkert" 2212 | } 2213 | }, 2214 | "node_modules/process-nextick-args": { 2215 | "version": "2.0.1", 2216 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2217 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2218 | "dev": true, 2219 | "license": "MIT" 2220 | }, 2221 | "node_modules/randombytes": { 2222 | "version": "2.1.0", 2223 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2224 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2225 | "dev": true, 2226 | "license": "MIT", 2227 | "dependencies": { 2228 | "safe-buffer": "^5.1.0" 2229 | } 2230 | }, 2231 | "node_modules/readable-stream": { 2232 | "version": "2.3.8", 2233 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 2234 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 2235 | "dev": true, 2236 | "license": "MIT", 2237 | "dependencies": { 2238 | "core-util-is": "~1.0.0", 2239 | "inherits": "~2.0.3", 2240 | "isarray": "~1.0.0", 2241 | "process-nextick-args": "~2.0.0", 2242 | "safe-buffer": "~5.1.1", 2243 | "string_decoder": "~1.1.1", 2244 | "util-deprecate": "~1.0.1" 2245 | } 2246 | }, 2247 | "node_modules/readdirp": { 2248 | "version": "3.6.0", 2249 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2250 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2251 | "dev": true, 2252 | "license": "MIT", 2253 | "dependencies": { 2254 | "picomatch": "^2.2.1" 2255 | }, 2256 | "engines": { 2257 | "node": ">=8.10.0" 2258 | } 2259 | }, 2260 | "node_modules/require-directory": { 2261 | "version": "2.1.1", 2262 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2263 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2264 | "dev": true, 2265 | "license": "MIT", 2266 | "engines": { 2267 | "node": ">=0.10.0" 2268 | } 2269 | }, 2270 | "node_modules/restore-cursor": { 2271 | "version": "5.1.0", 2272 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", 2273 | "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", 2274 | "dev": true, 2275 | "license": "MIT", 2276 | "dependencies": { 2277 | "onetime": "^7.0.0", 2278 | "signal-exit": "^4.1.0" 2279 | }, 2280 | "engines": { 2281 | "node": ">=18" 2282 | }, 2283 | "funding": { 2284 | "url": "https://github.com/sponsors/sindresorhus" 2285 | } 2286 | }, 2287 | "node_modules/safe-buffer": { 2288 | "version": "5.1.2", 2289 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2290 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2291 | "dev": true, 2292 | "license": "MIT" 2293 | }, 2294 | "node_modules/semver": { 2295 | "version": "7.7.2", 2296 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 2297 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 2298 | "dev": true, 2299 | "license": "ISC", 2300 | "bin": { 2301 | "semver": "bin/semver.js" 2302 | }, 2303 | "engines": { 2304 | "node": ">=10" 2305 | } 2306 | }, 2307 | "node_modules/serialize-javascript": { 2308 | "version": "6.0.2", 2309 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", 2310 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", 2311 | "dev": true, 2312 | "license": "BSD-3-Clause", 2313 | "dependencies": { 2314 | "randombytes": "^2.1.0" 2315 | } 2316 | }, 2317 | "node_modules/setimmediate": { 2318 | "version": "1.0.5", 2319 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2320 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", 2321 | "dev": true, 2322 | "license": "MIT" 2323 | }, 2324 | "node_modules/shebang-command": { 2325 | "version": "2.0.0", 2326 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2327 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2328 | "dev": true, 2329 | "license": "MIT", 2330 | "dependencies": { 2331 | "shebang-regex": "^3.0.0" 2332 | }, 2333 | "engines": { 2334 | "node": ">=8" 2335 | } 2336 | }, 2337 | "node_modules/shebang-regex": { 2338 | "version": "3.0.0", 2339 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2340 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2341 | "dev": true, 2342 | "license": "MIT", 2343 | "engines": { 2344 | "node": ">=8" 2345 | } 2346 | }, 2347 | "node_modules/signal-exit": { 2348 | "version": "4.1.0", 2349 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2350 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2351 | "dev": true, 2352 | "license": "ISC", 2353 | "engines": { 2354 | "node": ">=14" 2355 | }, 2356 | "funding": { 2357 | "url": "https://github.com/sponsors/isaacs" 2358 | } 2359 | }, 2360 | "node_modules/sinon": { 2361 | "version": "20.0.0", 2362 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-20.0.0.tgz", 2363 | "integrity": "sha512-+FXOAbdnj94AQIxH0w1v8gzNxkawVvNqE3jUzRLptR71Oykeu2RrQXXl/VQjKay+Qnh73fDt/oDfMo6xMeDQbQ==", 2364 | "dev": true, 2365 | "license": "BSD-3-Clause", 2366 | "dependencies": { 2367 | "@sinonjs/commons": "^3.0.1", 2368 | "@sinonjs/fake-timers": "^13.0.5", 2369 | "@sinonjs/samsam": "^8.0.1", 2370 | "diff": "^7.0.0", 2371 | "supports-color": "^7.2.0" 2372 | }, 2373 | "funding": { 2374 | "type": "opencollective", 2375 | "url": "https://opencollective.com/sinon" 2376 | } 2377 | }, 2378 | "node_modules/sinon/node_modules/supports-color": { 2379 | "version": "7.2.0", 2380 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2381 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2382 | "dev": true, 2383 | "license": "MIT", 2384 | "dependencies": { 2385 | "has-flag": "^4.0.0" 2386 | }, 2387 | "engines": { 2388 | "node": ">=8" 2389 | } 2390 | }, 2391 | "node_modules/stdin-discarder": { 2392 | "version": "0.2.2", 2393 | "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", 2394 | "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", 2395 | "dev": true, 2396 | "license": "MIT", 2397 | "engines": { 2398 | "node": ">=18" 2399 | }, 2400 | "funding": { 2401 | "url": "https://github.com/sponsors/sindresorhus" 2402 | } 2403 | }, 2404 | "node_modules/string_decoder": { 2405 | "version": "1.1.1", 2406 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2407 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2408 | "dev": true, 2409 | "license": "MIT", 2410 | "dependencies": { 2411 | "safe-buffer": "~5.1.0" 2412 | } 2413 | }, 2414 | "node_modules/string-width": { 2415 | "version": "5.1.2", 2416 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2417 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2418 | "dev": true, 2419 | "license": "MIT", 2420 | "dependencies": { 2421 | "eastasianwidth": "^0.2.0", 2422 | "emoji-regex": "^9.2.2", 2423 | "strip-ansi": "^7.0.1" 2424 | }, 2425 | "engines": { 2426 | "node": ">=12" 2427 | }, 2428 | "funding": { 2429 | "url": "https://github.com/sponsors/sindresorhus" 2430 | } 2431 | }, 2432 | "node_modules/string-width-cjs": { 2433 | "name": "string-width", 2434 | "version": "4.2.3", 2435 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2436 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2437 | "dev": true, 2438 | "license": "MIT", 2439 | "dependencies": { 2440 | "emoji-regex": "^8.0.0", 2441 | "is-fullwidth-code-point": "^3.0.0", 2442 | "strip-ansi": "^6.0.1" 2443 | }, 2444 | "engines": { 2445 | "node": ">=8" 2446 | } 2447 | }, 2448 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2449 | "version": "5.0.1", 2450 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2451 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2452 | "dev": true, 2453 | "license": "MIT", 2454 | "engines": { 2455 | "node": ">=8" 2456 | } 2457 | }, 2458 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2459 | "version": "8.0.0", 2460 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2461 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2462 | "dev": true, 2463 | "license": "MIT" 2464 | }, 2465 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2466 | "version": "6.0.1", 2467 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2468 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2469 | "dev": true, 2470 | "license": "MIT", 2471 | "dependencies": { 2472 | "ansi-regex": "^5.0.1" 2473 | }, 2474 | "engines": { 2475 | "node": ">=8" 2476 | } 2477 | }, 2478 | "node_modules/strip-ansi": { 2479 | "version": "7.1.0", 2480 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2481 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2482 | "dev": true, 2483 | "license": "MIT", 2484 | "dependencies": { 2485 | "ansi-regex": "^6.0.1" 2486 | }, 2487 | "engines": { 2488 | "node": ">=12" 2489 | }, 2490 | "funding": { 2491 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2492 | } 2493 | }, 2494 | "node_modules/strip-ansi-cjs": { 2495 | "name": "strip-ansi", 2496 | "version": "6.0.1", 2497 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2498 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2499 | "dev": true, 2500 | "license": "MIT", 2501 | "dependencies": { 2502 | "ansi-regex": "^5.0.1" 2503 | }, 2504 | "engines": { 2505 | "node": ">=8" 2506 | } 2507 | }, 2508 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2509 | "version": "5.0.1", 2510 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2511 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2512 | "dev": true, 2513 | "license": "MIT", 2514 | "engines": { 2515 | "node": ">=8" 2516 | } 2517 | }, 2518 | "node_modules/strip-json-comments": { 2519 | "version": "3.1.1", 2520 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2521 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2522 | "dev": true, 2523 | "license": "MIT", 2524 | "engines": { 2525 | "node": ">=8" 2526 | }, 2527 | "funding": { 2528 | "url": "https://github.com/sponsors/sindresorhus" 2529 | } 2530 | }, 2531 | "node_modules/supports-color": { 2532 | "version": "9.4.0", 2533 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", 2534 | "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", 2535 | "dev": true, 2536 | "license": "MIT", 2537 | "engines": { 2538 | "node": ">=12" 2539 | }, 2540 | "funding": { 2541 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2542 | } 2543 | }, 2544 | "node_modules/tapable": { 2545 | "version": "2.2.2", 2546 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", 2547 | "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", 2548 | "dev": true, 2549 | "license": "MIT", 2550 | "engines": { 2551 | "node": ">=6" 2552 | } 2553 | }, 2554 | "node_modules/test-exclude": { 2555 | "version": "6.0.0", 2556 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 2557 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 2558 | "dev": true, 2559 | "license": "ISC", 2560 | "dependencies": { 2561 | "@istanbuljs/schema": "^0.1.2", 2562 | "glob": "^7.1.4", 2563 | "minimatch": "^3.0.4" 2564 | }, 2565 | "engines": { 2566 | "node": ">=8" 2567 | } 2568 | }, 2569 | "node_modules/test-exclude/node_modules/brace-expansion": { 2570 | "version": "1.1.11", 2571 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2572 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2573 | "dev": true, 2574 | "license": "MIT", 2575 | "dependencies": { 2576 | "balanced-match": "^1.0.0", 2577 | "concat-map": "0.0.1" 2578 | } 2579 | }, 2580 | "node_modules/test-exclude/node_modules/glob": { 2581 | "version": "7.2.3", 2582 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2583 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2584 | "deprecated": "Glob versions prior to v9 are no longer supported", 2585 | "dev": true, 2586 | "license": "ISC", 2587 | "dependencies": { 2588 | "fs.realpath": "^1.0.0", 2589 | "inflight": "^1.0.4", 2590 | "inherits": "2", 2591 | "minimatch": "^3.1.1", 2592 | "once": "^1.3.0", 2593 | "path-is-absolute": "^1.0.0" 2594 | }, 2595 | "engines": { 2596 | "node": "*" 2597 | }, 2598 | "funding": { 2599 | "url": "https://github.com/sponsors/isaacs" 2600 | } 2601 | }, 2602 | "node_modules/test-exclude/node_modules/minimatch": { 2603 | "version": "3.1.2", 2604 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2605 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2606 | "dev": true, 2607 | "license": "ISC", 2608 | "dependencies": { 2609 | "brace-expansion": "^1.1.7" 2610 | }, 2611 | "engines": { 2612 | "node": "*" 2613 | } 2614 | }, 2615 | "node_modules/to-regex-range": { 2616 | "version": "5.0.1", 2617 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2618 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2619 | "dev": true, 2620 | "license": "MIT", 2621 | "dependencies": { 2622 | "is-number": "^7.0.0" 2623 | }, 2624 | "engines": { 2625 | "node": ">=8.0" 2626 | } 2627 | }, 2628 | "node_modules/type-detect": { 2629 | "version": "4.0.8", 2630 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 2631 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 2632 | "dev": true, 2633 | "license": "MIT", 2634 | "engines": { 2635 | "node": ">=4" 2636 | } 2637 | }, 2638 | "node_modules/typescript": { 2639 | "version": "5.8.3", 2640 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 2641 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 2642 | "dev": true, 2643 | "license": "Apache-2.0", 2644 | "bin": { 2645 | "tsc": "bin/tsc", 2646 | "tsserver": "bin/tsserver" 2647 | }, 2648 | "engines": { 2649 | "node": ">=14.17" 2650 | } 2651 | }, 2652 | "node_modules/undici-types": { 2653 | "version": "6.21.0", 2654 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 2655 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 2656 | "dev": true, 2657 | "license": "MIT" 2658 | }, 2659 | "node_modules/util-deprecate": { 2660 | "version": "1.0.2", 2661 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2662 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2663 | "dev": true, 2664 | "license": "MIT" 2665 | }, 2666 | "node_modules/v8-to-istanbul": { 2667 | "version": "9.3.0", 2668 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", 2669 | "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", 2670 | "dev": true, 2671 | "license": "ISC", 2672 | "dependencies": { 2673 | "@jridgewell/trace-mapping": "^0.3.12", 2674 | "@types/istanbul-lib-coverage": "^2.0.1", 2675 | "convert-source-map": "^2.0.0" 2676 | }, 2677 | "engines": { 2678 | "node": ">=10.12.0" 2679 | } 2680 | }, 2681 | "node_modules/whatwg-fetch": { 2682 | "version": "3.6.20", 2683 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", 2684 | "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", 2685 | "license": "MIT" 2686 | }, 2687 | "node_modules/which": { 2688 | "version": "2.0.2", 2689 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2690 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2691 | "dev": true, 2692 | "license": "ISC", 2693 | "dependencies": { 2694 | "isexe": "^2.0.0" 2695 | }, 2696 | "bin": { 2697 | "node-which": "bin/node-which" 2698 | }, 2699 | "engines": { 2700 | "node": ">= 8" 2701 | } 2702 | }, 2703 | "node_modules/workerpool": { 2704 | "version": "6.5.1", 2705 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", 2706 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", 2707 | "dev": true, 2708 | "license": "Apache-2.0" 2709 | }, 2710 | "node_modules/wrap-ansi": { 2711 | "version": "8.1.0", 2712 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2713 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2714 | "dev": true, 2715 | "license": "MIT", 2716 | "dependencies": { 2717 | "ansi-styles": "^6.1.0", 2718 | "string-width": "^5.0.1", 2719 | "strip-ansi": "^7.0.1" 2720 | }, 2721 | "engines": { 2722 | "node": ">=12" 2723 | }, 2724 | "funding": { 2725 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2726 | } 2727 | }, 2728 | "node_modules/wrap-ansi-cjs": { 2729 | "name": "wrap-ansi", 2730 | "version": "7.0.0", 2731 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2732 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2733 | "dev": true, 2734 | "license": "MIT", 2735 | "dependencies": { 2736 | "ansi-styles": "^4.0.0", 2737 | "string-width": "^4.1.0", 2738 | "strip-ansi": "^6.0.0" 2739 | }, 2740 | "engines": { 2741 | "node": ">=10" 2742 | }, 2743 | "funding": { 2744 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2745 | } 2746 | }, 2747 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2748 | "version": "5.0.1", 2749 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2750 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2751 | "dev": true, 2752 | "license": "MIT", 2753 | "engines": { 2754 | "node": ">=8" 2755 | } 2756 | }, 2757 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2758 | "version": "8.0.0", 2759 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2760 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2761 | "dev": true, 2762 | "license": "MIT" 2763 | }, 2764 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2765 | "version": "4.2.3", 2766 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2767 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2768 | "dev": true, 2769 | "license": "MIT", 2770 | "dependencies": { 2771 | "emoji-regex": "^8.0.0", 2772 | "is-fullwidth-code-point": "^3.0.0", 2773 | "strip-ansi": "^6.0.1" 2774 | }, 2775 | "engines": { 2776 | "node": ">=8" 2777 | } 2778 | }, 2779 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2780 | "version": "6.0.1", 2781 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2782 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2783 | "dev": true, 2784 | "license": "MIT", 2785 | "dependencies": { 2786 | "ansi-regex": "^5.0.1" 2787 | }, 2788 | "engines": { 2789 | "node": ">=8" 2790 | } 2791 | }, 2792 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 2793 | "version": "6.2.1", 2794 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 2795 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 2796 | "dev": true, 2797 | "license": "MIT", 2798 | "engines": { 2799 | "node": ">=12" 2800 | }, 2801 | "funding": { 2802 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2803 | } 2804 | }, 2805 | "node_modules/wrappy": { 2806 | "version": "1.0.2", 2807 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2808 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2809 | "dev": true, 2810 | "license": "ISC" 2811 | }, 2812 | "node_modules/y18n": { 2813 | "version": "5.0.8", 2814 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2815 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2816 | "dev": true, 2817 | "license": "ISC", 2818 | "engines": { 2819 | "node": ">=10" 2820 | } 2821 | }, 2822 | "node_modules/yargs": { 2823 | "version": "17.7.2", 2824 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 2825 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 2826 | "dev": true, 2827 | "license": "MIT", 2828 | "dependencies": { 2829 | "cliui": "^8.0.1", 2830 | "escalade": "^3.1.1", 2831 | "get-caller-file": "^2.0.5", 2832 | "require-directory": "^2.1.1", 2833 | "string-width": "^4.2.3", 2834 | "y18n": "^5.0.5", 2835 | "yargs-parser": "^21.1.1" 2836 | }, 2837 | "engines": { 2838 | "node": ">=12" 2839 | } 2840 | }, 2841 | "node_modules/yargs-parser": { 2842 | "version": "21.1.1", 2843 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2844 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2845 | "dev": true, 2846 | "license": "ISC", 2847 | "engines": { 2848 | "node": ">=12" 2849 | } 2850 | }, 2851 | "node_modules/yargs-unparser": { 2852 | "version": "2.0.0", 2853 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2854 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2855 | "dev": true, 2856 | "license": "MIT", 2857 | "dependencies": { 2858 | "camelcase": "^6.0.0", 2859 | "decamelize": "^4.0.0", 2860 | "flat": "^5.0.2", 2861 | "is-plain-obj": "^2.1.0" 2862 | }, 2863 | "engines": { 2864 | "node": ">=10" 2865 | } 2866 | }, 2867 | "node_modules/yargs/node_modules/ansi-regex": { 2868 | "version": "5.0.1", 2869 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2870 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2871 | "dev": true, 2872 | "license": "MIT", 2873 | "engines": { 2874 | "node": ">=8" 2875 | } 2876 | }, 2877 | "node_modules/yargs/node_modules/emoji-regex": { 2878 | "version": "8.0.0", 2879 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2880 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2881 | "dev": true, 2882 | "license": "MIT" 2883 | }, 2884 | "node_modules/yargs/node_modules/string-width": { 2885 | "version": "4.2.3", 2886 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2887 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2888 | "dev": true, 2889 | "license": "MIT", 2890 | "dependencies": { 2891 | "emoji-regex": "^8.0.0", 2892 | "is-fullwidth-code-point": "^3.0.0", 2893 | "strip-ansi": "^6.0.1" 2894 | }, 2895 | "engines": { 2896 | "node": ">=8" 2897 | } 2898 | }, 2899 | "node_modules/yargs/node_modules/strip-ansi": { 2900 | "version": "6.0.1", 2901 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2902 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2903 | "dev": true, 2904 | "license": "MIT", 2905 | "dependencies": { 2906 | "ansi-regex": "^5.0.1" 2907 | }, 2908 | "engines": { 2909 | "node": ">=8" 2910 | } 2911 | }, 2912 | "node_modules/yocto-queue": { 2913 | "version": "0.1.0", 2914 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2915 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2916 | "dev": true, 2917 | "license": "MIT", 2918 | "engines": { 2919 | "node": ">=10" 2920 | }, 2921 | "funding": { 2922 | "url": "https://github.com/sponsors/sindresorhus" 2923 | } 2924 | } 2925 | } 2926 | } 2927 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "commitollama", 3 | "displayName": "commitollama", 4 | "description": "AI Commits with ollama", 5 | "publisher": "Commitollama", 6 | "version": "1.11.0", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/anjerodev/commitollama.git" 10 | }, 11 | "engines": { 12 | "vscode": "^1.98.0" 13 | }, 14 | "categories": ["Machine Learning", "Programming Languages"], 15 | "icon": "icon.jpg", 16 | "license": "MIT", 17 | "keywords": ["code", "assistant", "ai", "llm", "commits", "ollama"], 18 | "main": "./out/extension.js", 19 | "activationEvents": [], 20 | "contributes": { 21 | "commands": [ 22 | { 23 | "command": "commitollama.createCommit", 24 | "title": "Run Commitollama", 25 | "icon": "$(sparkle)" 26 | }, 27 | { 28 | "command": "commitollama.runOllamaPull", 29 | "title": "Pull model from ollama" 30 | } 31 | ], 32 | "menus": { 33 | "scm/title": [ 34 | { 35 | "when": "scmProvider == git", 36 | "command": "commitollama.createCommit", 37 | "group": "navigation" 38 | } 39 | ] 40 | }, 41 | "configuration": [ 42 | { 43 | "type": "object", 44 | "title": "Commitollama", 45 | "properties": { 46 | "commitollama.model": { 47 | "type": "string", 48 | "enum": [ 49 | "Llama", 50 | "Codegemma", 51 | "Codellama", 52 | "Mistral", 53 | "Gemma", 54 | "Qwen", 55 | "Custom" 56 | ], 57 | "description": "Specify the desired model for generating commit messages.", 58 | "default": "Llama", 59 | "order": 0 60 | }, 61 | "commitollama.useEmojis": { 62 | "type": "boolean", 63 | "description": "Enable or disable the use of emojis in commit messages.", 64 | "default": false, 65 | "order": 1 66 | }, 67 | "commitollama.useDescription": { 68 | "type": "boolean", 69 | "description": "Enable or disable the use of commit descriptions.", 70 | "default": false, 71 | "order": 2 72 | }, 73 | "commitollama.useLowerCase": { 74 | "type": "boolean", 75 | "description": "Enable or disable lowercase commit messages.", 76 | "default": false, 77 | "order": 3 78 | }, 79 | "commitollama.language": { 80 | "type": "string", 81 | "enum": [ 82 | "Arabic", 83 | "Chinese", 84 | "English", 85 | "French", 86 | "German", 87 | "Italian", 88 | "Japanese", 89 | "Korean", 90 | "Portuguese", 91 | "Russian", 92 | "Spanish", 93 | "Custom" 94 | ], 95 | "description": "Language for commit messages.", 96 | "default": "English", 97 | "order": 4 98 | }, 99 | "commitollama.promptTemperature": { 100 | "type": "number", 101 | "minimum": 0, 102 | "maximum": 1, 103 | "description": "Custom temperature for generating the commit message. (Higher number = more creative)", 104 | "default": 0.2, 105 | "order": 7 106 | }, 107 | "commitollama.commitTemplate": { 108 | "type": "string", 109 | "description": "Custom template for commit messages.", 110 | "default": "{{type}} {{emoji}}: {{message}}", 111 | "order": 8 112 | }, 113 | "commitollama.custom.model": { 114 | "type": "string", 115 | "description": "Allows you to specify any model name. The model has to be downloaded and available on your Ollama instance. **Note:** Ignored if `commitollama.model` is not set to \"Custom\".", 116 | "order": 5 117 | }, 118 | "commitollama.custom.language": { 119 | "type": "string", 120 | "description": "Allows you to specify any language for the commit messages. **Note:** Ignored if `commitollama.language` is not set to \"Custom\".", 121 | "order": 6 122 | }, 123 | "commitollama.custom.emojis": { 124 | "type": "object", 125 | "description": "Map commit types to emojis. Only used if emojis are enabled.", 126 | "order": 9 127 | }, 128 | "commitollama.custom.endpoint": { 129 | "type": "string", 130 | "description": "Ollama Server Endpoint. Leave empty to use the default ollama endpoint.", 131 | "order": 10 132 | }, 133 | "commitollama.custom.prompt": { 134 | "type": "string", 135 | "description": "Custom prompt to generate the commit message with.", 136 | "order": 11 137 | }, 138 | "commitollama.custom.typeRules": { 139 | "type": "string", 140 | "description": "Custom rules for commit message types.", 141 | "order": 12 142 | }, 143 | "commitollama.custom.commitMessageRules": { 144 | "type": "string", 145 | "description": "Custom rules for commit messages.", 146 | "order": 13 147 | }, 148 | "commitollama.custom.descriptionPrompt": { 149 | "type": "string", 150 | "description": "Custom prompt to generate the commit description with.", 151 | "order": 14 152 | } 153 | } 154 | } 155 | ] 156 | }, 157 | "scripts": { 158 | "vscode:prepublish": "npm run build", 159 | "build": "tsc -p ./", 160 | "watch": "tsc -watch -p ./", 161 | "lint": "npx @biomejs/biome lint ./src", 162 | "format": "npx @biomejs/biome format ./src", 163 | "format-fix": "npx @biomejs/biome format ./src --fix", 164 | "test": "vscode-test", 165 | "publish": "npm run build && vsce publish", 166 | "publish:major": "npm run build && vsce publish major", 167 | "publish:minor": "npm run build && vsce publish minor", 168 | "publish:patch": "npm run build && vsce publish patch", 169 | "package": "vsce package" 170 | }, 171 | "devDependencies": { 172 | "@biomejs/biome": "1.9.4", 173 | "@types/mocha": "10.0.10", 174 | "@types/node": "22.15.29", 175 | "@types/sinon": "17.0.4", 176 | "@types/vscode": "^1.98.0", 177 | "@vscode/test-cli": "0.0.11", 178 | "@vscode/test-electron": "2.5.2", 179 | "esbuild": "0.25.5", 180 | "mocha": "11.5.0", 181 | "sinon": "20.0.0", 182 | "typescript": "5.8.3" 183 | }, 184 | "dependencies": { 185 | "ollama": "0.5.16" 186 | }, 187 | "extensionDependencies": ["vscode.git"] 188 | } 189 | -------------------------------------------------------------------------------- /sampleWorkspace/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "commitollama.useEmojis": false, 3 | "commitollama.useDescription": false, 4 | "commitollama.useLowerCase": false, 5 | "commitollama.custom.emojis": {}, 6 | "commitollama.commitTemplate": "{{type}} {{emoji}}: {{message}}", 7 | } 8 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type EmojisMap, 3 | type Model, 4 | type Language, 5 | Models, 6 | Languages, 7 | } from './types/llm' 8 | import { getConfig } from './utils' 9 | 10 | export const defaultConfig = { 11 | endpoint: 'http://127.0.0.1:11434', 12 | model: Models.Llama, 13 | useEmojis: false, 14 | useDescription: false, 15 | useLowerCase: false, 16 | language: Languages.English, 17 | commitTemplate: '{{type}} {{emoji}}: {{message}}', 18 | promptTemperature: 0.2, 19 | emojis: { 20 | feat: '✨', 21 | fix: '🐛', 22 | docs: '📝', 23 | style: '💎', 24 | refactor: '♻️', 25 | test: '🧪', 26 | chore: '📦', 27 | revert: '⏪', 28 | } as EmojisMap, 29 | } as const 30 | 31 | class Config { 32 | get inference() { 33 | // Load model 34 | const configModel = getConfig('model') 35 | let model: string | Model = configModel 36 | ? Models[configModel] 37 | : defaultConfig.model 38 | 39 | if (model === Models.Custom) { 40 | model = getConfig('custom.model') || defaultConfig.model 41 | } 42 | 43 | // Load Emojis config 44 | const useEmojis = getConfig('useEmojis') || defaultConfig.useEmojis 45 | const customEmojis = getConfig('custom.emojis') 46 | const commitEmojis = 47 | customEmojis && typeof customEmojis === 'object' 48 | ? { ...defaultConfig.emojis, ...(customEmojis as EmojisMap) } 49 | : defaultConfig.emojis 50 | 51 | const useDescription = 52 | getConfig('useDescription') || defaultConfig.useDescription 53 | 54 | // Load useLowerCase config 55 | const useLowerCase = getConfig('useLowerCase') || defaultConfig.useLowerCase 56 | 57 | // Load commitTemplate config 58 | const commitTemplate = 59 | getConfig('commitTemplate') || defaultConfig.commitTemplate 60 | 61 | // Load language config 62 | const configLanguage = getConfig('language') 63 | let language: string | Language = configLanguage 64 | ? Languages[configLanguage] 65 | : defaultConfig.language 66 | if (language === Languages.Custom) { 67 | language = getConfig('custom.language') || defaultConfig.language 68 | } 69 | 70 | // Load endpoint 71 | let endpoint = getConfig('custom.endpoint') || defaultConfig.endpoint 72 | if (endpoint.endsWith('/')) { 73 | endpoint = endpoint.slice(0, -1).trim() 74 | } 75 | 76 | // Load temperature 77 | const promptTemperature = 78 | getConfig('promptTemperature') || defaultConfig.promptTemperature 79 | 80 | // Load custom prompts 81 | const customPrompt = getConfig('custom.prompt') 82 | const customTypeRules = getConfig('custom.typeRules') 83 | const customCommitMessageRules = getConfig('custom.commitMessageRules') 84 | const customDescriptionPrompt = getConfig('custom.descriptionPrompt') 85 | 86 | return { 87 | commitEmojis, 88 | promptTemperature, 89 | commitTemplate, 90 | customCommitMessageRules, 91 | customDescriptionPrompt, 92 | customPrompt, 93 | customTypeRules, 94 | endpoint, 95 | language, 96 | model, 97 | useDescription, 98 | useEmojis, 99 | useLowerCase, 100 | } 101 | } 102 | } 103 | 104 | export const config = new Config() 105 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const OLLAMA_URL = 'https://ollama.com/library' 2 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode' 2 | import ollama from 'ollama' 3 | import { createCommitMessage, getGitExtension } from './utils' 4 | 5 | export function activate(context: vscode.ExtensionContext) { 6 | const createCommitDisposable = vscode.commands.registerCommand( 7 | 'commitollama.createCommit', 8 | async (uri?) => { 9 | const git = getGitExtension() 10 | if (!git) { 11 | vscode.window.showErrorMessage('Unable to load Git Extension') 12 | return 13 | } 14 | if (uri) { 15 | const uriPath = uri._rootUri?.path || uri.rootUri.path 16 | const selectedRepository = git.repositories.find((repository) => { 17 | return repository.rootUri.path === uriPath 18 | }) 19 | if (selectedRepository) { 20 | await createCommitMessage(selectedRepository) 21 | } 22 | } else { 23 | for (const repo of git.repositories) { 24 | await createCommitMessage(repo) 25 | } 26 | } 27 | }, 28 | ) 29 | 30 | const ollamaPullDisposable = vscode.commands.registerCommand( 31 | 'commitollama.runOllamaPull', 32 | async (model: string) => { 33 | vscode.window.withProgress( 34 | { 35 | location: vscode.ProgressLocation.Notification, 36 | title: `Pulling model "${model}", this can take a while... Please be patient.`, 37 | cancellable: true, 38 | }, 39 | async (progress, token) => { 40 | if (!model) { 41 | vscode.window.showErrorMessage('Please provide a model name.') 42 | return 43 | } 44 | 45 | let pullPromise = ollama.pull({ model }) 46 | 47 | token.onCancellationRequested(() => { 48 | vscode.window.showInformationMessage('Model pull cancelled.') 49 | pullPromise = Promise.reject('pull-cancelled') 50 | }) 51 | 52 | try { 53 | await pullPromise 54 | vscode.window.showInformationMessage( 55 | `Model "${model}" pulled successfully.`, 56 | ) 57 | } catch (error: any) { 58 | if (error === 'pull-cancelled') { 59 | vscode.window.showInformationMessage('Model pull was cancelled.') 60 | } else { 61 | vscode.window.showErrorMessage( 62 | error?.message || 'The model could not be pulled.', 63 | ) 64 | } 65 | } 66 | }, 67 | ) 68 | }, 69 | ) 70 | 71 | context.subscriptions.push(createCommitDisposable, ollamaPullDisposable) 72 | } 73 | 74 | export function deactivate() {} 75 | -------------------------------------------------------------------------------- /src/generator.ts: -------------------------------------------------------------------------------- 1 | import { config } from './config' 2 | import { Ollama } from 'ollama' 3 | import type { EmojisMap } from './types/llm' 4 | import * as vscode from 'vscode' 5 | import { OLLAMA_URL } from './constants' 6 | 7 | interface CommitStructure { 8 | type: string 9 | message: string 10 | summary?: string 11 | } 12 | 13 | export async function generateStructuredCommit( 14 | summaries: string[], 15 | ): Promise { 16 | const { 17 | endpoint, 18 | promptTemperature, 19 | model, 20 | language, 21 | useDescription, 22 | customPrompt, 23 | customTypeRules, 24 | customCommitMessageRules, 25 | customDescriptionPrompt, 26 | } = config.inference 27 | const ollama = new Ollama({ host: endpoint }) 28 | 29 | const typeRules = 30 | customTypeRules || 31 | `- feat: Only when adding a new feature 32 | - fix: When fixing a bug 33 | - docs: When updating documentation 34 | - style: When changing elements styles or design and/or making changes to the code style (formatting, missing semicolons, etc.) without changing the code logic 35 | - test: When adding or updating tests 36 | - chore: When making changes to the build process or auxiliary tools and libraries 37 | - revert: When undoing a previous commit 38 | - refactor: When restructuring code without changing its external behavior` 39 | 40 | const commitMessageRules = 41 | customCommitMessageRules || 42 | `- Be concise and descriptive 43 | - Keep under 50 characters 44 | - Describe the main goal of the changes 45 | - Do not include the type in the message (it will be separate)` 46 | 47 | const descriptionPrompt = 48 | customDescriptionPrompt || 49 | 'Also provide an extended summary (1-3 sentences) that describes the changes in more detail for the commit description.' 50 | 51 | const structuredPrompt = 52 | customPrompt || 53 | `You are an expert developer specialist in creating commit messages. 54 | Based on the provided user changes, generate a commit message with the appropriate type. 55 | 56 | Rules for commit type: 57 | ${typeRules} 58 | 59 | Rules for commit message: 60 | ${commitMessageRules} 61 | - Write the message in ${language} 62 | 63 | ${useDescription ? descriptionPrompt : ''} 64 | Respond using JSON` 65 | 66 | const format = { 67 | type: 'object', 68 | properties: { 69 | type: { 70 | type: 'string', 71 | description: 72 | 'The commit type (feat, fix, docs, style, test, chore, revert, refactor)', 73 | }, 74 | message: { 75 | type: 'string', 76 | description: `The commit message in ${language}`, 77 | }, 78 | ...(useDescription && { 79 | summary: { 80 | type: 'string', 81 | description: `Extended summary of the changes in ${language}`, 82 | }, 83 | }), 84 | }, 85 | required: useDescription 86 | ? ['type', 'message', 'summary'] 87 | : ['type', 'message'], 88 | } 89 | 90 | try { 91 | const response = await ollama.generate({ 92 | model, 93 | prompt: `${structuredPrompt}\n\nChanges summaries: ${summaries.join(', ')}`, 94 | stream: false, 95 | format: format, 96 | options: { 97 | temperature: promptTemperature, 98 | num_predict: 100, 99 | }, 100 | }) 101 | 102 | return JSON.parse(response.response) 103 | } catch (error: any) { 104 | if (error?.status_code === 404) { 105 | const errorMessage = 106 | error?.message.charAt(0).toUpperCase() + error?.message.slice(1) 107 | 108 | vscode.window 109 | .showErrorMessage(errorMessage, 'Go to ollama website', 'Pull model') 110 | .then((action) => { 111 | if (action === 'Go to ollama website') { 112 | vscode.env.openExternal(vscode.Uri.parse(OLLAMA_URL)) 113 | } 114 | if (action === 'Pull model') { 115 | vscode.commands.executeCommand('commitollama.runOllamaPull', model) 116 | } 117 | }) 118 | 119 | throw new Error() 120 | } 121 | 122 | throw new Error( 123 | 'Unable to connect to ollama. Please, check that ollama is running.', 124 | ) 125 | } 126 | } 127 | 128 | export async function getCommitMessage(summaries: string[]) { 129 | const { 130 | useDescription, 131 | useEmojis, 132 | commitEmojis, 133 | useLowerCase, 134 | commitTemplate, 135 | } = config.inference 136 | 137 | try { 138 | const structuredCommit = await generateStructuredCommit(summaries) 139 | 140 | const { type, message, summary } = structuredCommit 141 | 142 | // Handle lower and upper case commit messages 143 | const commitMessage = useLowerCase 144 | ? message.charAt(0).toLowerCase() + message.slice(1) 145 | : message.charAt(0).toUpperCase() + message.slice(1) 146 | 147 | // Handle emojis 148 | const emoji = useEmojis ? commitEmojis?.[type as keyof EmojisMap] : '' 149 | 150 | // Build final commit with template 151 | let commit = commitTemplate 152 | .replace('{{type}}', type) 153 | .replace('{{message}}', commitMessage) 154 | .replace('{{emoji}}', emoji) 155 | .replace(/\s+/g, ' ') // Replace multiple spaces with single space 156 | .replace(/\s+:/g, ':') // Remove space before colon 157 | 158 | // Add extended summary as description if useDescription is activated 159 | if (useDescription && summary) { 160 | commit = `${commit}\n\n${summary}` 161 | } 162 | 163 | return commit.trim() 164 | } catch (error) { 165 | throw new Error('Unable to generate commit.') 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /src/test/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'node:assert' 2 | import * as vscode from 'vscode' 3 | import * as sinon from 'sinon' 4 | import * as extension from '../extension' 5 | import { Ollama } from 'ollama' 6 | import { getCommitMessage, generateStructuredCommit } from '../generator' 7 | import { getConfig, getGitExtension, setConfig } from '../utils' 8 | import { defaultConfig } from '../config' 9 | 10 | suite('Extension Test Suite', () => { 11 | test('Extension is active', () => { 12 | assert.ok(extension.activate) 13 | }) 14 | 15 | test('Get Git Extension', () => { 16 | const gitExtension = getGitExtension() 17 | assert.ok(gitExtension) 18 | }) 19 | }) 20 | 21 | suite('generateStructuredCommit Tests', () => { 22 | const summariesSample = ['Added a feature', 'Fixed a bug'] 23 | const structuredCommitResponse = { 24 | response: JSON.stringify({ 25 | type: 'feat', 26 | message: 'Add new feature', 27 | }), 28 | } 29 | 30 | let ollamaGenerateStub: sinon.SinonStub 31 | 32 | setup(() => { 33 | ollamaGenerateStub = sinon.stub(Ollama.prototype, 'generate') 34 | }) 35 | 36 | teardown(() => { 37 | ollamaGenerateStub.restore() 38 | }) 39 | 40 | test('Should return a structured commit for summaries', async () => { 41 | ollamaGenerateStub.resolves(structuredCommitResponse) 42 | 43 | const result = await generateStructuredCommit(summariesSample) 44 | 45 | assert.strictEqual(result.type, 'feat') 46 | assert.strictEqual(result.message, 'Add new feature') 47 | assert(ollamaGenerateStub.calledOnce) 48 | }) 49 | 50 | test('Should show error message when model is not found', async () => { 51 | const error = { status_code: 404, message: 'model not found' } 52 | ollamaGenerateStub.rejects(error) 53 | 54 | const showErrorMessageStub = sinon 55 | .stub(vscode.window, 'showErrorMessage') 56 | .resolves() 57 | 58 | try { 59 | await generateStructuredCommit(summariesSample) 60 | } catch (e) { 61 | // Expected error 62 | } 63 | 64 | showErrorMessageStub.restore() 65 | }) 66 | }) 67 | 68 | suite('getCommitMessage Tests', () => { 69 | const summariesSample = ['Added a feature', 'Fixed a bug'] 70 | const structuredCommitResponse = { 71 | response: JSON.stringify({ 72 | type: 'feat', 73 | message: 'Add new feature', 74 | }), 75 | } 76 | 77 | let ollamaGenerateStub: sinon.SinonStub 78 | let originalUseEmojis: any 79 | let originalUseDescription: any 80 | let originalLowerCase: any 81 | let originalCustomEmojis: any 82 | let originalCustomCommitTemplate: any 83 | 84 | setup(async () => { 85 | ollamaGenerateStub = sinon.stub(Ollama.prototype, 'generate') 86 | // Store original config values 87 | originalUseEmojis = getConfig('useEmojis') 88 | originalUseDescription = getConfig('useDescription') 89 | originalLowerCase = getConfig('useLowerCase') 90 | originalCustomCommitTemplate = getConfig('commitTemplate') 91 | originalCustomEmojis = getConfig('custom.emojis') 92 | 93 | // Reset all config values to default 94 | await setConfig('useEmojis', false) 95 | await setConfig('useDescription', false) 96 | await setConfig('useLowerCase', false) 97 | }) 98 | 99 | teardown(async () => { 100 | ollamaGenerateStub.restore() 101 | // Restore original config values 102 | await setConfig('useEmojis', originalUseEmojis) 103 | await setConfig('useDescription', originalUseDescription) 104 | await setConfig('useLowerCase', originalLowerCase) 105 | await setConfig('commitTemplate', originalCustomCommitTemplate) 106 | await setConfig('custom.emojis', originalCustomEmojis) 107 | }) 108 | 109 | test('Should return a commit message based on summaries', async () => { 110 | ollamaGenerateStub.resolves(structuredCommitResponse) 111 | 112 | const result = await getCommitMessage(summariesSample) 113 | 114 | assert.strictEqual(result, 'feat: Add new feature') 115 | assert(ollamaGenerateStub.calledOnce) 116 | }) 117 | 118 | test('Should add emojis if configured to use emojis', async () => { 119 | ollamaGenerateStub.resolves(structuredCommitResponse) 120 | 121 | const originalUseEmojis = getConfig('useEmojis') 122 | const originalCustomEmojis = getConfig('custom.emojis') 123 | 124 | await setConfig('useEmojis', true) 125 | await setConfig('custom.emojis', { ...defaultConfig.emojis, feat: '🔥' }) 126 | 127 | const result = await getCommitMessage(summariesSample) 128 | 129 | assert.strictEqual(result, 'feat 🔥: Add new feature') 130 | await setConfig('useEmojis', originalUseEmojis!) 131 | await setConfig('custom.emojis', originalCustomEmojis!) 132 | }) 133 | 134 | test('Should add summaries as descriptions if configured to use descriptions', async () => { 135 | const responseWithDescription = { 136 | response: JSON.stringify({ 137 | type: 'feat', 138 | message: 'Add new feature', 139 | summary: 'Extended summary of the feature', 140 | }), 141 | } 142 | ollamaGenerateStub.resolves(responseWithDescription) 143 | 144 | const originalUseDescription = getConfig('useDescription') 145 | await setConfig('useDescription', true) 146 | 147 | const result = await getCommitMessage(summariesSample) 148 | 149 | assert.strictEqual( 150 | result, 151 | 'feat: Add new feature\n\nExtended summary of the feature', 152 | ) 153 | 154 | await setConfig('useDescription', originalUseDescription!) 155 | }) 156 | 157 | test('Should lowercase the message if configured to use lowercase', async () => { 158 | ollamaGenerateStub.resolves(structuredCommitResponse) 159 | const originalLowercase = getConfig('useLowerCase') 160 | await setConfig('useLowerCase', true) 161 | 162 | const result = await getCommitMessage(summariesSample) 163 | 164 | assert.strictEqual(result, 'feat: add new feature') 165 | 166 | await setConfig('useLowerCase', originalLowercase!) 167 | }) 168 | 169 | test('Should format commit message according to template', async () => { 170 | ollamaGenerateStub.resolves(structuredCommitResponse) 171 | const originalCustomCommitTemplate = getConfig('commitTemplate') 172 | const originalUseEmojis = getConfig('useEmojis') 173 | 174 | await setConfig('commitTemplate', '{{emoji}}{{type}}: {{message}}') 175 | await setConfig('useEmojis', true) 176 | 177 | const result = await getCommitMessage(summariesSample) 178 | 179 | assert.strictEqual(result, '✨feat: Add new feature') 180 | await setConfig('commitTemplate', originalCustomCommitTemplate!) 181 | await setConfig('useEmojis', originalUseEmojis!) 182 | }) 183 | }) 184 | -------------------------------------------------------------------------------- /src/types/config.d.ts: -------------------------------------------------------------------------------- 1 | import type { EmojisMap, Language, Model } from './llm' 2 | 3 | export type ExtensionConfig = { 4 | model: Model 5 | useEmojis: boolean 6 | useDescription: boolean 7 | useLowerCase: boolean 8 | language: Language 9 | promptTemperature: number 10 | commitTemplate: string 11 | 'custom.model'?: string 12 | 'custom.language'?: string 13 | 'custom.emojis'?: EmojisMap 14 | 'custom.endpoint'?: string 15 | 'custom.prompt'?: string 16 | 'custom.typeRules'?: string 17 | 'custom.commitMessageRules'?: string 18 | 'custom.descriptionPrompt'?: string 19 | } 20 | -------------------------------------------------------------------------------- /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 type { 7 | Uri, 8 | Event, 9 | Disposable, 10 | ProviderResult, 11 | Command, 12 | CancellationToken, 13 | } from 'vscode' 14 | export { ProviderResult } from 'vscode' 15 | 16 | export interface Git { 17 | readonly path: string 18 | } 19 | 20 | export interface InputBox { 21 | value: string 22 | } 23 | 24 | export enum ForcePushMode { 25 | Force = 0, 26 | ForceWithLease = 1, 27 | } 28 | 29 | export enum RefType { 30 | Head = 0, 31 | RemoteHead = 1, 32 | Tag = 2, 33 | } 34 | 35 | export interface Ref { 36 | readonly type: RefType 37 | readonly name?: string 38 | readonly commit?: string 39 | readonly remote?: string 40 | } 41 | 42 | export interface UpstreamRef { 43 | readonly remote: string 44 | readonly name: string 45 | } 46 | 47 | export interface Branch extends Ref { 48 | readonly upstream?: UpstreamRef 49 | readonly ahead?: number 50 | readonly behind?: number 51 | } 52 | 53 | export interface Commit { 54 | readonly hash: string 55 | readonly message: string 56 | readonly parents: string[] 57 | readonly authorDate?: Date 58 | readonly authorName?: string 59 | readonly authorEmail?: string 60 | readonly commitDate?: Date 61 | } 62 | 63 | export interface Submodule { 64 | readonly name: string 65 | readonly path: string 66 | readonly url: string 67 | } 68 | 69 | export interface Remote { 70 | readonly name: string 71 | readonly fetchUrl?: string 72 | readonly pushUrl?: string 73 | readonly isReadOnly: boolean 74 | } 75 | 76 | export enum Status { 77 | INDEX_MODIFIED = 0, 78 | INDEX_ADDED = 1, 79 | INDEX_DELETED = 2, 80 | INDEX_RENAMED = 3, 81 | INDEX_COPIED = 4, 82 | 83 | MODIFIED = 5, 84 | DELETED = 6, 85 | UNTRACKED = 7, 86 | IGNORED = 8, 87 | INTENT_TO_ADD = 9, 88 | 89 | ADDED_BY_US = 10, 90 | ADDED_BY_THEM = 11, 91 | DELETED_BY_US = 12, 92 | DELETED_BY_THEM = 13, 93 | BOTH_ADDED = 14, 94 | BOTH_DELETED = 15, 95 | BOTH_MODIFIED = 16, 96 | } 97 | 98 | export interface Change { 99 | /** 100 | * Returns either `originalUri` or `renameUri`, depending 101 | * on whether this change is a rename change. When 102 | * in doubt always use `uri` over the other two alternatives. 103 | */ 104 | readonly uri: Uri 105 | readonly originalUri: Uri 106 | readonly renameUri: Uri | undefined 107 | readonly status: Status 108 | } 109 | 110 | export interface RepositoryState { 111 | readonly HEAD: Branch | undefined 112 | readonly refs: Ref[] 113 | readonly remotes: Remote[] 114 | readonly submodules: Submodule[] 115 | readonly rebaseCommit: Commit | undefined 116 | 117 | readonly mergeChanges: Change[] 118 | readonly indexChanges: Change[] 119 | readonly workingTreeChanges: Change[] 120 | 121 | readonly onDidChange: Event 122 | } 123 | 124 | export interface RepositoryUIState { 125 | readonly selected: boolean 126 | readonly onDidChange: Event 127 | } 128 | 129 | /** 130 | * Log options. 131 | */ 132 | export interface LogOptions { 133 | /** Max number of log entries to retrieve. If not specified, the default is 32. */ 134 | readonly maxEntries?: number 135 | readonly path?: string 136 | } 137 | 138 | export interface CommitOptions { 139 | all?: boolean | 'tracked' 140 | amend?: boolean 141 | signoff?: boolean 142 | signCommit?: boolean 143 | empty?: boolean 144 | noVerify?: boolean 145 | requireUserConfig?: boolean 146 | useEditor?: boolean 147 | verbose?: boolean 148 | /** 149 | * string - execute the specified command after the commit operation 150 | * undefined - execute the command specified in git.postCommitCommand 151 | * after the commit operation 152 | * null - do not execute any command after the commit operation 153 | */ 154 | postCommitCommand?: string | null 155 | } 156 | 157 | export interface FetchOptions { 158 | remote?: string 159 | ref?: string 160 | all?: boolean 161 | prune?: boolean 162 | depth?: number 163 | } 164 | 165 | export interface RefQuery { 166 | readonly contains?: string 167 | readonly count?: number 168 | readonly pattern?: string 169 | readonly sort?: 'alphabetically' | 'committerdate' 170 | } 171 | 172 | export interface BranchQuery extends RefQuery { 173 | readonly remote?: boolean 174 | } 175 | 176 | export interface Repository { 177 | readonly rootUri: Uri 178 | readonly inputBox: InputBox 179 | readonly state: RepositoryState 180 | readonly ui: RepositoryUIState 181 | 182 | getConfigs(): Promise<{ key: string; value: string }[]> 183 | getConfig(key: string): Promise 184 | setConfig(key: string, value: string): Promise 185 | getGlobalConfig(key: string): Promise 186 | 187 | getObjectDetails( 188 | treeish: string, 189 | path: string, 190 | ): Promise<{ mode: string; object: string; size: number }> 191 | detectObjectType( 192 | object: string, 193 | ): Promise<{ mimetype: string; encoding?: string }> 194 | buffer(ref: string, path: string): Promise 195 | show(ref: string, path: string): Promise 196 | getCommit(ref: string): Promise 197 | 198 | add(paths: string[]): Promise 199 | revert(paths: string[]): Promise 200 | clean(paths: string[]): Promise 201 | 202 | apply(patch: string, reverse?: boolean): Promise 203 | diff(cached?: boolean): Promise 204 | diffWithHEAD(): Promise 205 | diffWithHEAD(path: string): Promise 206 | diffWith(ref: string): Promise 207 | diffWith(ref: string, path: string): Promise 208 | diffIndexWithHEAD(): Promise 209 | diffIndexWithHEAD(path: string): Promise 210 | diffIndexWith(ref: string): Promise 211 | diffIndexWith(ref: string, path: string): Promise 212 | diffBlobs(object1: string, object2: string): Promise 213 | diffBetween(ref1: string, ref2: string): Promise 214 | diffBetween(ref1: string, ref2: string, path: string): Promise 215 | 216 | hashObject(data: string): Promise 217 | 218 | createBranch(name: string, checkout: boolean, ref?: string): Promise 219 | deleteBranch(name: string, force?: boolean): Promise 220 | getBranch(name: string): Promise 221 | getBranches( 222 | query: BranchQuery, 223 | cancellationToken?: CancellationToken, 224 | ): Promise 225 | setBranchUpstream(name: string, upstream: string): Promise 226 | 227 | getRefs( 228 | query: RefQuery, 229 | cancellationToken?: CancellationToken, 230 | ): Promise 231 | 232 | getMergeBase(ref1: string, ref2: string): Promise 233 | 234 | tag(name: string, upstream: string): Promise 235 | deleteTag(name: string): Promise 236 | 237 | status(): Promise 238 | checkout(treeish: string): Promise 239 | 240 | addRemote(name: string, url: string): Promise 241 | removeRemote(name: string): Promise 242 | renameRemote(name: string, newName: string): Promise 243 | 244 | fetch(options?: FetchOptions): Promise 245 | fetch(remote?: string, ref?: string, depth?: number): Promise 246 | pull(unshallow?: boolean): Promise 247 | push( 248 | remoteName?: string, 249 | branchName?: string, 250 | setUpstream?: boolean, 251 | force?: ForcePushMode, 252 | ): Promise 253 | 254 | blame(path: string): Promise 255 | log(options?: LogOptions): Promise 256 | 257 | commit(message: string, opts?: CommitOptions): Promise 258 | } 259 | 260 | export interface RemoteSource { 261 | readonly name: string 262 | readonly description?: string 263 | readonly url: string | string[] 264 | } 265 | 266 | export interface RemoteSourceProvider { 267 | readonly name: string 268 | readonly icon?: string // codicon name 269 | readonly supportsQuery?: boolean 270 | getRemoteSources(query?: string): ProviderResult 271 | getBranches?(url: string): ProviderResult 272 | publishRepository?(repository: Repository): Promise 273 | } 274 | 275 | export interface RemoteSourcePublisher { 276 | readonly name: string 277 | readonly icon?: string // codicon name 278 | publishRepository(repository: Repository): Promise 279 | } 280 | 281 | export interface Credentials { 282 | readonly username: string 283 | readonly password: string 284 | } 285 | 286 | export interface CredentialsProvider { 287 | getCredentials(host: Uri): ProviderResult 288 | } 289 | 290 | export interface PostCommitCommandsProvider { 291 | getCommands(repository: Repository): Command[] 292 | } 293 | 294 | export interface PushErrorHandler { 295 | handlePushError( 296 | repository: Repository, 297 | remote: Remote, 298 | refspec: string, 299 | error: Error & { gitErrorCode: GitErrorCodes }, 300 | ): Promise 301 | } 302 | 303 | export type APIState = 'uninitialized' | 'initialized' 304 | 305 | export interface PublishEvent { 306 | repository: Repository 307 | branch?: string 308 | } 309 | 310 | export interface API { 311 | readonly state: APIState 312 | readonly onDidChangeState: Event 313 | readonly onDidPublish: Event 314 | readonly git: Git 315 | readonly repositories: Repository[] 316 | readonly onDidOpenRepository: Event 317 | readonly onDidCloseRepository: Event 318 | 319 | toGitUri(uri: Uri, ref: string): Uri 320 | getRepository(uri: Uri): Repository | null 321 | init(root: Uri): Promise 322 | openRepository(root: Uri): Promise 323 | 324 | registerRemoteSourcePublisher(publisher: RemoteSourcePublisher): Disposable 325 | registerRemoteSourceProvider(provider: RemoteSourceProvider): Disposable 326 | registerCredentialsProvider(provider: CredentialsProvider): Disposable 327 | registerPostCommitCommandsProvider( 328 | provider: PostCommitCommandsProvider, 329 | ): Disposable 330 | registerPushErrorHandler(handler: PushErrorHandler): Disposable 331 | } 332 | 333 | export interface GitExtension { 334 | readonly enabled: boolean 335 | readonly onDidChangeEnablement: Event 336 | 337 | /** 338 | * Returns a specific API version. 339 | * 340 | * Throws error if git extension is disabled. You can listen to the 341 | * [GitExtension.onDidChangeEnablement](#GitExtension.onDidChangeEnablement) event 342 | * to know when the extension becomes enabled/disabled. 343 | * 344 | * @param version Version number. 345 | * @returns API instance 346 | */ 347 | getAPI(version: 1): API 348 | } 349 | 350 | export enum GitErrorCodes { 351 | BadConfigFile = 'BadConfigFile', 352 | AuthenticationFailed = 'AuthenticationFailed', 353 | NoUserNameConfigured = 'NoUserNameConfigured', 354 | NoUserEmailConfigured = 'NoUserEmailConfigured', 355 | NoRemoteRepositorySpecified = 'NoRemoteRepositorySpecified', 356 | NotAGitRepository = 'NotAGitRepository', 357 | NotAtRepositoryRoot = 'NotAtRepositoryRoot', 358 | Conflict = 'Conflict', 359 | StashConflict = 'StashConflict', 360 | UnmergedChanges = 'UnmergedChanges', 361 | PushRejected = 'PushRejected', 362 | RemoteConnectionError = 'RemoteConnectionError', 363 | DirtyWorkTree = 'DirtyWorkTree', 364 | CantOpenResource = 'CantOpenResource', 365 | GitNotFound = 'GitNotFound', 366 | CantCreatePipe = 'CantCreatePipe', 367 | PermissionDenied = 'PermissionDenied', 368 | CantAccessRemote = 'CantAccessRemote', 369 | RepositoryNotFound = 'RepositoryNotFound', 370 | RepositoryIsLocked = 'RepositoryIsLocked', 371 | BranchNotFullyMerged = 'BranchNotFullyMerged', 372 | NoRemoteReference = 'NoRemoteReference', 373 | InvalidBranchName = 'InvalidBranchName', 374 | BranchAlreadyExists = 'BranchAlreadyExists', 375 | NoLocalChanges = 'NoLocalChanges', 376 | NoStashFound = 'NoStashFound', 377 | LocalChangesOverwritten = 'LocalChangesOverwritten', 378 | NoUpstreamBranch = 'NoUpstreamBranch', 379 | IsInSubmodule = 'IsInSubmodule', 380 | WrongCase = 'WrongCase', 381 | CantLockRef = 'CantLockRef', 382 | CantRebaseMultipleBranches = 'CantRebaseMultipleBranches', 383 | PatchDoesNotApply = 'PatchDoesNotApply', 384 | NoPathFound = 'NoPathFound', 385 | UnknownPath = 'UnknownPath', 386 | EmptyCommitMessage = 'EmptyCommitMessage', 387 | BranchFastForwardRejected = 'BranchFastForwardRejected', 388 | BranchNotYetBorn = 'BranchNotYetBorn', 389 | TagConflict = 'TagConflict', 390 | } 391 | -------------------------------------------------------------------------------- /src/types/llm.ts: -------------------------------------------------------------------------------- 1 | export const Models = { 2 | Llama: 'llama3.2:latest', 3 | Codegemma: 'codegemma:latest', 4 | Codellama: 'codellama', 5 | Mistral: 'mistral:latest', 6 | Gemma: 'gemma3:latest', 7 | Qwen: 'qwen3:latest', 8 | Custom: 'custom', 9 | } as const 10 | export type Model = keyof typeof Models 11 | 12 | export const Languages = { 13 | Arabic: 'arabic', 14 | Chinese: 'chinese', 15 | English: 'english', 16 | French: 'french', 17 | German: 'german', 18 | Italian: 'italian', 19 | Japanese: 'japanese', 20 | Korean: 'korean', 21 | Portuguese: 'portuguese', 22 | Russian: 'russian', 23 | Spanish: 'spanish', 24 | Custom: 'custom', 25 | } as const 26 | export type Language = keyof typeof Languages 27 | 28 | export type EmojisMap = { 29 | feat: string 30 | fix: string 31 | docs: string 32 | style: string 33 | refactor: string 34 | test: string 35 | chore: string 36 | revert: string 37 | } 38 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode' 2 | import type { GitExtension, Repository } from './types/git' 3 | import { getCommitMessage } from './generator' 4 | import type { ExtensionConfig } from './types/config' 5 | 6 | export function getConfig(key: K) { 7 | return vscode.workspace 8 | .getConfiguration('commitollama') 9 | .get(key) 10 | } 11 | 12 | export function setConfig( 13 | key: K, 14 | value: ExtensionConfig[K], 15 | ) { 16 | return vscode.workspace 17 | .getConfiguration('commitollama') 18 | .update(key, value, vscode.ConfigurationTarget.Workspace) 19 | } 20 | 21 | export async function getSummaryUriDiff(repo: Repository, uri: string) { 22 | const diff = await repo.diffIndexWithHEAD(uri) 23 | return diff 24 | } 25 | 26 | export async function createCommitMessage(repo: Repository) { 27 | vscode.window.withProgress( 28 | { 29 | location: vscode.ProgressLocation.SourceControl, 30 | cancellable: false, 31 | title: 'Loading commit message', 32 | }, 33 | async () => { 34 | vscode.commands.executeCommand('workbench.view.scm') 35 | try { 36 | // Clean the current message: 37 | repo.inputBox.value = '' 38 | 39 | const ind = await repo.diffIndexWithHEAD() 40 | 41 | if (ind.length === 0) { 42 | throw new Error( 43 | 'No changes to commit. Please stage your changes first.', 44 | ) 45 | } 46 | 47 | const callbacks = ind.map((change) => 48 | getSummaryUriDiff(repo, change.uri.fsPath), 49 | ) 50 | const summaries = await Promise.all(callbacks) 51 | 52 | const commitMessage = await getCommitMessage(summaries) 53 | repo.inputBox.value = commitMessage 54 | } catch (error: any) { 55 | vscode.window.showErrorMessage( 56 | error?.message || 'Unable to create commit message.', 57 | ) 58 | } 59 | }, 60 | ) 61 | } 62 | 63 | export function getGitExtension() { 64 | const vscodeGit = vscode.extensions.getExtension('vscode.git') 65 | const gitExtension = vscodeGit?.exports 66 | return gitExtension?.getAPI(1) 67 | } 68 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2021", 5 | "lib": ["ES2021", "DOM"], 6 | "sourceMap": true, 7 | "outDir": "out", 8 | "rootDir": "src", 9 | "strict": true 10 | }, 11 | "include": ["src/**/*.ts"], 12 | "exclude": ["node_modules", ".vscode-test"] 13 | } 14 | --------------------------------------------------------------------------------