├── .github └── workflows │ └── release.yml ├── .gitignore ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── manifest.json ├── package-lock.json ├── package.json ├── src └── main.ts ├── styles.css └── tsconfig.json /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Obsidian plugin 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | permissions: 9 | contents: write 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v3 17 | 18 | - name: Use Node.js 19 | uses: actions/setup-node@v3 20 | with: 21 | node-version: "18.x" 22 | 23 | - name: Build plugin 24 | run: | 25 | npm install 26 | npm run build 27 | 28 | - name: Upload to release 29 | env: 30 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 31 | run: | 32 | tag="${GITHUB_REF#refs/tags/}" 33 | 34 | gh release upload "$tag" main.js manifest.json styles.css 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependency directories 2 | node_modules/ 3 | 4 | # TypeScript cache 5 | *.tsbuildinfo 6 | 7 | # Optional npm cache directory 8 | .npm 9 | 10 | # Optional eslint cache 11 | .eslintcache 12 | 13 | # OS generated files 14 | .DS_Store 15 | Thumbs.db 16 | 17 | 18 | # Compiled JavaScript file 19 | main.js 20 | 21 | # Plugin settings file 22 | data.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Mike Bird 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 | # Open Interpreter Plugin for Obsidian 2 | 3 | This plugin integrates Open Interpreter with Obsidian, allowing you to run AI-powered automations directly within your vault using natural language commands. 4 | 5 | ## Features 6 | 7 | - Use natural language commands to automate tasks within your Obsidian vault 8 | - Interactive chat interface for communicating with Open Interpreter 9 | - Automatic installation check and guidance for Open Interpreter 10 | - Seamless integration with your Obsidian vault, with full access to read, write, and edit Markdown files 11 | - Always requires user approval before executing actions 12 | 13 | ## Installation 14 | 15 | 1. Install the plugin from the [Obsidian Community Plugins browser](obsidian://show-plugin?id=open-interpreter) 16 | 2. Enable the plugin in Obsidian Community plugins settings. 17 | 3. Ensure [Open Interpreter](https://github.com/OpenInterpreter/open-interpreter) is installed on your system. If not, the plugin will guide you through the installation process. 18 | 19 | ## Usage 20 | 21 | 1. Use the command palette (Cmd/Ctrl + P) and search for "AI Command". 22 | 2. Enter your natural language command in the input modal that appears. 23 | 3. Interact with the interpreter through the chat interface to automate tasks within your vault. 24 | 25 | ## Requirements 26 | 27 | - Obsidian v0.15.0 or higher 28 | - Open Interpreter installed on your system 29 | 30 | ## Configuration 31 | 32 | The plugin automatically detects your Obsidian vault path and sets up the necessary environment for Open Interpreter to run within your vault context. 33 | 34 | You will need to set your API key(s) and appropriate settings for your selected model in Settings. 35 | 36 | ## Troubleshooting 37 | 38 | If you encounter issues: 39 | 40 | 1. Ensure Open Interpreter is correctly installed and accessible from your terminal. 41 | 2. Check the console for any error messages. 42 | 3. Verify that your GROQ_API_KEY, OPENAI_API_KEY, and/or ANTHROPIC_API_KEY is set correctly. 43 | 44 | ## Contributing 45 | 46 | Contributions are welcome! Please feel free to submit a Pull Request ❤️ 47 | 48 | ## License 49 | 50 | This project is licensed under the MIT License. 51 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from "builtin-modules"; 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 | if you want to view the source, please visit the github repository of this plugin 9 | */ 10 | `; 11 | 12 | const prod = (process.argv[2] === "production"); 13 | 14 | esbuild.build({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ["src/main.ts"], 19 | bundle: true, 20 | external: [ 21 | "obsidian", 22 | "electron", 23 | "@codemirror/autocomplete", 24 | "@codemirror/collab", 25 | "@codemirror/commands", 26 | "@codemirror/language", 27 | "@codemirror/lint", 28 | "@codemirror/search", 29 | "@codemirror/state", 30 | "@codemirror/view", 31 | "@lezer/common", 32 | "@lezer/highlight", 33 | "@lezer/lr", 34 | ...builtins], 35 | format: "cjs", 36 | target: "es2018", 37 | logLevel: "info", 38 | sourcemap: prod ? false : "inline", 39 | treeShaking: true, 40 | outfile: "main.js", 41 | }).catch(() => process.exit(1)); 42 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "open-interpreter", 3 | "name": "Open Interpreter", 4 | "version": "1.3.1", 5 | "minAppVersion": "0.15.0", 6 | "description": "Use Open Interpreter to run automatic operations on your vault", 7 | "author": "Mike Bird", 8 | "authorUrl": "https://www.github.com/MikeBirdTech", 9 | "isDesktopOnly": true 10 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "open-interpreter-plugin", 3 | "version": "1.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "open-interpreter-plugin", 9 | "version": "1.1.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@types/node": "^16.11.6", 13 | "@typescript-eslint/eslint-plugin": "5.29.0", 14 | "@typescript-eslint/parser": "5.29.0", 15 | "builtin-modules": "3.3.0", 16 | "esbuild": "0.17.3", 17 | "obsidian": "latest", 18 | "tslib": "2.4.0", 19 | "typescript": "4.7.4" 20 | } 21 | }, 22 | "node_modules/@codemirror/state": { 23 | "version": "6.4.1", 24 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", 25 | "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", 26 | "dev": true, 27 | "license": "MIT", 28 | "peer": true 29 | }, 30 | "node_modules/@codemirror/view": { 31 | "version": "6.30.0", 32 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.30.0.tgz", 33 | "integrity": "sha512-96Nmn8OeLh6aONQprIeYk8hGVnEuYpWuxKSkdsODOx9hWPxyuyZGvmvxV/JmLsp+CubMO1PsLaN5TNNgrl0UrQ==", 34 | "dev": true, 35 | "license": "MIT", 36 | "peer": true, 37 | "dependencies": { 38 | "@codemirror/state": "^6.4.0", 39 | "style-mod": "^4.1.0", 40 | "w3c-keyname": "^2.2.4" 41 | } 42 | }, 43 | "node_modules/@esbuild/android-arm": { 44 | "version": "0.17.3", 45 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", 46 | "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", 47 | "cpu": [ 48 | "arm" 49 | ], 50 | "dev": true, 51 | "optional": true, 52 | "os": [ 53 | "android" 54 | ], 55 | "engines": { 56 | "node": ">=12" 57 | } 58 | }, 59 | "node_modules/@esbuild/android-arm64": { 60 | "version": "0.17.3", 61 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", 62 | "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", 63 | "cpu": [ 64 | "arm64" 65 | ], 66 | "dev": true, 67 | "optional": true, 68 | "os": [ 69 | "android" 70 | ], 71 | "engines": { 72 | "node": ">=12" 73 | } 74 | }, 75 | "node_modules/@esbuild/android-x64": { 76 | "version": "0.17.3", 77 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", 78 | "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", 79 | "cpu": [ 80 | "x64" 81 | ], 82 | "dev": true, 83 | "optional": true, 84 | "os": [ 85 | "android" 86 | ], 87 | "engines": { 88 | "node": ">=12" 89 | } 90 | }, 91 | "node_modules/@esbuild/darwin-arm64": { 92 | "version": "0.17.3", 93 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", 94 | "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", 95 | "cpu": [ 96 | "arm64" 97 | ], 98 | "dev": true, 99 | "optional": true, 100 | "os": [ 101 | "darwin" 102 | ], 103 | "engines": { 104 | "node": ">=12" 105 | } 106 | }, 107 | "node_modules/@esbuild/darwin-x64": { 108 | "version": "0.17.3", 109 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", 110 | "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", 111 | "cpu": [ 112 | "x64" 113 | ], 114 | "dev": true, 115 | "optional": true, 116 | "os": [ 117 | "darwin" 118 | ], 119 | "engines": { 120 | "node": ">=12" 121 | } 122 | }, 123 | "node_modules/@esbuild/freebsd-arm64": { 124 | "version": "0.17.3", 125 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", 126 | "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", 127 | "cpu": [ 128 | "arm64" 129 | ], 130 | "dev": true, 131 | "optional": true, 132 | "os": [ 133 | "freebsd" 134 | ], 135 | "engines": { 136 | "node": ">=12" 137 | } 138 | }, 139 | "node_modules/@esbuild/freebsd-x64": { 140 | "version": "0.17.3", 141 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", 142 | "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", 143 | "cpu": [ 144 | "x64" 145 | ], 146 | "dev": true, 147 | "optional": true, 148 | "os": [ 149 | "freebsd" 150 | ], 151 | "engines": { 152 | "node": ">=12" 153 | } 154 | }, 155 | "node_modules/@esbuild/linux-arm": { 156 | "version": "0.17.3", 157 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", 158 | "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", 159 | "cpu": [ 160 | "arm" 161 | ], 162 | "dev": true, 163 | "optional": true, 164 | "os": [ 165 | "linux" 166 | ], 167 | "engines": { 168 | "node": ">=12" 169 | } 170 | }, 171 | "node_modules/@esbuild/linux-arm64": { 172 | "version": "0.17.3", 173 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", 174 | "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", 175 | "cpu": [ 176 | "arm64" 177 | ], 178 | "dev": true, 179 | "optional": true, 180 | "os": [ 181 | "linux" 182 | ], 183 | "engines": { 184 | "node": ">=12" 185 | } 186 | }, 187 | "node_modules/@esbuild/linux-ia32": { 188 | "version": "0.17.3", 189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", 190 | "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", 191 | "cpu": [ 192 | "ia32" 193 | ], 194 | "dev": true, 195 | "optional": true, 196 | "os": [ 197 | "linux" 198 | ], 199 | "engines": { 200 | "node": ">=12" 201 | } 202 | }, 203 | "node_modules/@esbuild/linux-loong64": { 204 | "version": "0.17.3", 205 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", 206 | "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", 207 | "cpu": [ 208 | "loong64" 209 | ], 210 | "dev": true, 211 | "optional": true, 212 | "os": [ 213 | "linux" 214 | ], 215 | "engines": { 216 | "node": ">=12" 217 | } 218 | }, 219 | "node_modules/@esbuild/linux-mips64el": { 220 | "version": "0.17.3", 221 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", 222 | "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", 223 | "cpu": [ 224 | "mips64el" 225 | ], 226 | "dev": true, 227 | "optional": true, 228 | "os": [ 229 | "linux" 230 | ], 231 | "engines": { 232 | "node": ">=12" 233 | } 234 | }, 235 | "node_modules/@esbuild/linux-ppc64": { 236 | "version": "0.17.3", 237 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", 238 | "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", 239 | "cpu": [ 240 | "ppc64" 241 | ], 242 | "dev": true, 243 | "optional": true, 244 | "os": [ 245 | "linux" 246 | ], 247 | "engines": { 248 | "node": ">=12" 249 | } 250 | }, 251 | "node_modules/@esbuild/linux-riscv64": { 252 | "version": "0.17.3", 253 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", 254 | "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", 255 | "cpu": [ 256 | "riscv64" 257 | ], 258 | "dev": true, 259 | "optional": true, 260 | "os": [ 261 | "linux" 262 | ], 263 | "engines": { 264 | "node": ">=12" 265 | } 266 | }, 267 | "node_modules/@esbuild/linux-s390x": { 268 | "version": "0.17.3", 269 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", 270 | "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", 271 | "cpu": [ 272 | "s390x" 273 | ], 274 | "dev": true, 275 | "optional": true, 276 | "os": [ 277 | "linux" 278 | ], 279 | "engines": { 280 | "node": ">=12" 281 | } 282 | }, 283 | "node_modules/@esbuild/linux-x64": { 284 | "version": "0.17.3", 285 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", 286 | "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", 287 | "cpu": [ 288 | "x64" 289 | ], 290 | "dev": true, 291 | "optional": true, 292 | "os": [ 293 | "linux" 294 | ], 295 | "engines": { 296 | "node": ">=12" 297 | } 298 | }, 299 | "node_modules/@esbuild/netbsd-x64": { 300 | "version": "0.17.3", 301 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", 302 | "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", 303 | "cpu": [ 304 | "x64" 305 | ], 306 | "dev": true, 307 | "optional": true, 308 | "os": [ 309 | "netbsd" 310 | ], 311 | "engines": { 312 | "node": ">=12" 313 | } 314 | }, 315 | "node_modules/@esbuild/openbsd-x64": { 316 | "version": "0.17.3", 317 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", 318 | "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", 319 | "cpu": [ 320 | "x64" 321 | ], 322 | "dev": true, 323 | "optional": true, 324 | "os": [ 325 | "openbsd" 326 | ], 327 | "engines": { 328 | "node": ">=12" 329 | } 330 | }, 331 | "node_modules/@esbuild/sunos-x64": { 332 | "version": "0.17.3", 333 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", 334 | "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", 335 | "cpu": [ 336 | "x64" 337 | ], 338 | "dev": true, 339 | "optional": true, 340 | "os": [ 341 | "sunos" 342 | ], 343 | "engines": { 344 | "node": ">=12" 345 | } 346 | }, 347 | "node_modules/@esbuild/win32-arm64": { 348 | "version": "0.17.3", 349 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", 350 | "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", 351 | "cpu": [ 352 | "arm64" 353 | ], 354 | "dev": true, 355 | "optional": true, 356 | "os": [ 357 | "win32" 358 | ], 359 | "engines": { 360 | "node": ">=12" 361 | } 362 | }, 363 | "node_modules/@esbuild/win32-ia32": { 364 | "version": "0.17.3", 365 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", 366 | "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", 367 | "cpu": [ 368 | "ia32" 369 | ], 370 | "dev": true, 371 | "optional": true, 372 | "os": [ 373 | "win32" 374 | ], 375 | "engines": { 376 | "node": ">=12" 377 | } 378 | }, 379 | "node_modules/@esbuild/win32-x64": { 380 | "version": "0.17.3", 381 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", 382 | "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", 383 | "cpu": [ 384 | "x64" 385 | ], 386 | "dev": true, 387 | "optional": true, 388 | "os": [ 389 | "win32" 390 | ], 391 | "engines": { 392 | "node": ">=12" 393 | } 394 | }, 395 | "node_modules/@eslint-community/eslint-utils": { 396 | "version": "4.4.0", 397 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 398 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 399 | "dev": true, 400 | "peer": true, 401 | "dependencies": { 402 | "eslint-visitor-keys": "^3.3.0" 403 | }, 404 | "engines": { 405 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 406 | }, 407 | "peerDependencies": { 408 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 409 | } 410 | }, 411 | "node_modules/@eslint-community/regexpp": { 412 | "version": "4.11.1", 413 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", 414 | "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", 415 | "dev": true, 416 | "peer": true, 417 | "engines": { 418 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 419 | } 420 | }, 421 | "node_modules/@eslint/eslintrc": { 422 | "version": "2.1.4", 423 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 424 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 425 | "dev": true, 426 | "peer": true, 427 | "dependencies": { 428 | "ajv": "^6.12.4", 429 | "debug": "^4.3.2", 430 | "espree": "^9.6.0", 431 | "globals": "^13.19.0", 432 | "ignore": "^5.2.0", 433 | "import-fresh": "^3.2.1", 434 | "js-yaml": "^4.1.0", 435 | "minimatch": "^3.1.2", 436 | "strip-json-comments": "^3.1.1" 437 | }, 438 | "engines": { 439 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 440 | }, 441 | "funding": { 442 | "url": "https://opencollective.com/eslint" 443 | } 444 | }, 445 | "node_modules/@eslint/js": { 446 | "version": "8.57.1", 447 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", 448 | "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", 449 | "dev": true, 450 | "peer": true, 451 | "engines": { 452 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 453 | } 454 | }, 455 | "node_modules/@humanwhocodes/config-array": { 456 | "version": "0.13.0", 457 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", 458 | "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", 459 | "deprecated": "Use @eslint/config-array instead", 460 | "dev": true, 461 | "peer": true, 462 | "dependencies": { 463 | "@humanwhocodes/object-schema": "^2.0.3", 464 | "debug": "^4.3.1", 465 | "minimatch": "^3.0.5" 466 | }, 467 | "engines": { 468 | "node": ">=10.10.0" 469 | } 470 | }, 471 | "node_modules/@humanwhocodes/module-importer": { 472 | "version": "1.0.1", 473 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 474 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 475 | "dev": true, 476 | "peer": true, 477 | "engines": { 478 | "node": ">=12.22" 479 | }, 480 | "funding": { 481 | "type": "github", 482 | "url": "https://github.com/sponsors/nzakas" 483 | } 484 | }, 485 | "node_modules/@humanwhocodes/object-schema": { 486 | "version": "2.0.3", 487 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", 488 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 489 | "deprecated": "Use @eslint/object-schema instead", 490 | "dev": true, 491 | "peer": true 492 | }, 493 | "node_modules/@nodelib/fs.scandir": { 494 | "version": "2.1.5", 495 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 496 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 497 | "dev": true, 498 | "dependencies": { 499 | "@nodelib/fs.stat": "2.0.5", 500 | "run-parallel": "^1.1.9" 501 | }, 502 | "engines": { 503 | "node": ">= 8" 504 | } 505 | }, 506 | "node_modules/@nodelib/fs.stat": { 507 | "version": "2.0.5", 508 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 509 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 510 | "dev": true, 511 | "engines": { 512 | "node": ">= 8" 513 | } 514 | }, 515 | "node_modules/@nodelib/fs.walk": { 516 | "version": "1.2.8", 517 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 518 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 519 | "dev": true, 520 | "dependencies": { 521 | "@nodelib/fs.scandir": "2.1.5", 522 | "fastq": "^1.6.0" 523 | }, 524 | "engines": { 525 | "node": ">= 8" 526 | } 527 | }, 528 | "node_modules/@types/codemirror": { 529 | "version": "5.60.8", 530 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 531 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 532 | "dev": true, 533 | "license": "MIT", 534 | "dependencies": { 535 | "@types/tern": "*" 536 | } 537 | }, 538 | "node_modules/@types/estree": { 539 | "version": "1.0.5", 540 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 541 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 542 | "dev": true, 543 | "license": "MIT" 544 | }, 545 | "node_modules/@types/json-schema": { 546 | "version": "7.0.15", 547 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 548 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 549 | "dev": true 550 | }, 551 | "node_modules/@types/node": { 552 | "version": "16.18.115", 553 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.115.tgz", 554 | "integrity": "sha512-NF5ajYn+dq0tRfswdyp8Df75h7D9z+L8TCIwrXoh46ZLK6KZVXkRhf/luXaZytvm/keUo9vU4m1Bg39St91a5w==", 555 | "dev": true 556 | }, 557 | "node_modules/@types/tern": { 558 | "version": "0.23.9", 559 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 560 | "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 561 | "dev": true, 562 | "license": "MIT", 563 | "dependencies": { 564 | "@types/estree": "*" 565 | } 566 | }, 567 | "node_modules/@typescript-eslint/eslint-plugin": { 568 | "version": "5.29.0", 569 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", 570 | "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", 571 | "dev": true, 572 | "dependencies": { 573 | "@typescript-eslint/scope-manager": "5.29.0", 574 | "@typescript-eslint/type-utils": "5.29.0", 575 | "@typescript-eslint/utils": "5.29.0", 576 | "debug": "^4.3.4", 577 | "functional-red-black-tree": "^1.0.1", 578 | "ignore": "^5.2.0", 579 | "regexpp": "^3.2.0", 580 | "semver": "^7.3.7", 581 | "tsutils": "^3.21.0" 582 | }, 583 | "engines": { 584 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 585 | }, 586 | "funding": { 587 | "type": "opencollective", 588 | "url": "https://opencollective.com/typescript-eslint" 589 | }, 590 | "peerDependencies": { 591 | "@typescript-eslint/parser": "^5.0.0", 592 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 593 | }, 594 | "peerDependenciesMeta": { 595 | "typescript": { 596 | "optional": true 597 | } 598 | } 599 | }, 600 | "node_modules/@typescript-eslint/parser": { 601 | "version": "5.29.0", 602 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", 603 | "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", 604 | "dev": true, 605 | "dependencies": { 606 | "@typescript-eslint/scope-manager": "5.29.0", 607 | "@typescript-eslint/types": "5.29.0", 608 | "@typescript-eslint/typescript-estree": "5.29.0", 609 | "debug": "^4.3.4" 610 | }, 611 | "engines": { 612 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 613 | }, 614 | "funding": { 615 | "type": "opencollective", 616 | "url": "https://opencollective.com/typescript-eslint" 617 | }, 618 | "peerDependencies": { 619 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 620 | }, 621 | "peerDependenciesMeta": { 622 | "typescript": { 623 | "optional": true 624 | } 625 | } 626 | }, 627 | "node_modules/@typescript-eslint/scope-manager": { 628 | "version": "5.29.0", 629 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", 630 | "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", 631 | "dev": true, 632 | "dependencies": { 633 | "@typescript-eslint/types": "5.29.0", 634 | "@typescript-eslint/visitor-keys": "5.29.0" 635 | }, 636 | "engines": { 637 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 638 | }, 639 | "funding": { 640 | "type": "opencollective", 641 | "url": "https://opencollective.com/typescript-eslint" 642 | } 643 | }, 644 | "node_modules/@typescript-eslint/type-utils": { 645 | "version": "5.29.0", 646 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", 647 | "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", 648 | "dev": true, 649 | "dependencies": { 650 | "@typescript-eslint/utils": "5.29.0", 651 | "debug": "^4.3.4", 652 | "tsutils": "^3.21.0" 653 | }, 654 | "engines": { 655 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 656 | }, 657 | "funding": { 658 | "type": "opencollective", 659 | "url": "https://opencollective.com/typescript-eslint" 660 | }, 661 | "peerDependencies": { 662 | "eslint": "*" 663 | }, 664 | "peerDependenciesMeta": { 665 | "typescript": { 666 | "optional": true 667 | } 668 | } 669 | }, 670 | "node_modules/@typescript-eslint/types": { 671 | "version": "5.29.0", 672 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", 673 | "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", 674 | "dev": true, 675 | "engines": { 676 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 677 | }, 678 | "funding": { 679 | "type": "opencollective", 680 | "url": "https://opencollective.com/typescript-eslint" 681 | } 682 | }, 683 | "node_modules/@typescript-eslint/typescript-estree": { 684 | "version": "5.29.0", 685 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", 686 | "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", 687 | "dev": true, 688 | "dependencies": { 689 | "@typescript-eslint/types": "5.29.0", 690 | "@typescript-eslint/visitor-keys": "5.29.0", 691 | "debug": "^4.3.4", 692 | "globby": "^11.1.0", 693 | "is-glob": "^4.0.3", 694 | "semver": "^7.3.7", 695 | "tsutils": "^3.21.0" 696 | }, 697 | "engines": { 698 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 699 | }, 700 | "funding": { 701 | "type": "opencollective", 702 | "url": "https://opencollective.com/typescript-eslint" 703 | }, 704 | "peerDependenciesMeta": { 705 | "typescript": { 706 | "optional": true 707 | } 708 | } 709 | }, 710 | "node_modules/@typescript-eslint/utils": { 711 | "version": "5.29.0", 712 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", 713 | "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", 714 | "dev": true, 715 | "dependencies": { 716 | "@types/json-schema": "^7.0.9", 717 | "@typescript-eslint/scope-manager": "5.29.0", 718 | "@typescript-eslint/types": "5.29.0", 719 | "@typescript-eslint/typescript-estree": "5.29.0", 720 | "eslint-scope": "^5.1.1", 721 | "eslint-utils": "^3.0.0" 722 | }, 723 | "engines": { 724 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 725 | }, 726 | "funding": { 727 | "type": "opencollective", 728 | "url": "https://opencollective.com/typescript-eslint" 729 | }, 730 | "peerDependencies": { 731 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 732 | } 733 | }, 734 | "node_modules/@typescript-eslint/visitor-keys": { 735 | "version": "5.29.0", 736 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", 737 | "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", 738 | "dev": true, 739 | "dependencies": { 740 | "@typescript-eslint/types": "5.29.0", 741 | "eslint-visitor-keys": "^3.3.0" 742 | }, 743 | "engines": { 744 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 745 | }, 746 | "funding": { 747 | "type": "opencollective", 748 | "url": "https://opencollective.com/typescript-eslint" 749 | } 750 | }, 751 | "node_modules/@ungap/structured-clone": { 752 | "version": "1.2.0", 753 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 754 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 755 | "dev": true, 756 | "peer": true 757 | }, 758 | "node_modules/acorn": { 759 | "version": "8.13.0", 760 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", 761 | "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", 762 | "dev": true, 763 | "peer": true, 764 | "bin": { 765 | "acorn": "bin/acorn" 766 | }, 767 | "engines": { 768 | "node": ">=0.4.0" 769 | } 770 | }, 771 | "node_modules/acorn-jsx": { 772 | "version": "5.3.2", 773 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 774 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 775 | "dev": true, 776 | "peer": true, 777 | "peerDependencies": { 778 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 779 | } 780 | }, 781 | "node_modules/ajv": { 782 | "version": "6.12.6", 783 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 784 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 785 | "dev": true, 786 | "peer": true, 787 | "dependencies": { 788 | "fast-deep-equal": "^3.1.1", 789 | "fast-json-stable-stringify": "^2.0.0", 790 | "json-schema-traverse": "^0.4.1", 791 | "uri-js": "^4.2.2" 792 | }, 793 | "funding": { 794 | "type": "github", 795 | "url": "https://github.com/sponsors/epoberezkin" 796 | } 797 | }, 798 | "node_modules/ansi-regex": { 799 | "version": "5.0.1", 800 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 801 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 802 | "dev": true, 803 | "peer": true, 804 | "engines": { 805 | "node": ">=8" 806 | } 807 | }, 808 | "node_modules/ansi-styles": { 809 | "version": "4.3.0", 810 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 811 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 812 | "dev": true, 813 | "peer": true, 814 | "dependencies": { 815 | "color-convert": "^2.0.1" 816 | }, 817 | "engines": { 818 | "node": ">=8" 819 | }, 820 | "funding": { 821 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 822 | } 823 | }, 824 | "node_modules/argparse": { 825 | "version": "2.0.1", 826 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 827 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 828 | "dev": true, 829 | "peer": true 830 | }, 831 | "node_modules/array-union": { 832 | "version": "2.1.0", 833 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 834 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 835 | "dev": true, 836 | "engines": { 837 | "node": ">=8" 838 | } 839 | }, 840 | "node_modules/balanced-match": { 841 | "version": "1.0.2", 842 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 843 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 844 | "dev": true, 845 | "peer": true 846 | }, 847 | "node_modules/brace-expansion": { 848 | "version": "1.1.11", 849 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 850 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 851 | "dev": true, 852 | "peer": true, 853 | "dependencies": { 854 | "balanced-match": "^1.0.0", 855 | "concat-map": "0.0.1" 856 | } 857 | }, 858 | "node_modules/braces": { 859 | "version": "3.0.3", 860 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 861 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 862 | "dev": true, 863 | "dependencies": { 864 | "fill-range": "^7.1.1" 865 | }, 866 | "engines": { 867 | "node": ">=8" 868 | } 869 | }, 870 | "node_modules/builtin-modules": { 871 | "version": "3.3.0", 872 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 873 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 874 | "dev": true, 875 | "engines": { 876 | "node": ">=6" 877 | }, 878 | "funding": { 879 | "url": "https://github.com/sponsors/sindresorhus" 880 | } 881 | }, 882 | "node_modules/callsites": { 883 | "version": "3.1.0", 884 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 885 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 886 | "dev": true, 887 | "peer": true, 888 | "engines": { 889 | "node": ">=6" 890 | } 891 | }, 892 | "node_modules/chalk": { 893 | "version": "4.1.2", 894 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 895 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 896 | "dev": true, 897 | "peer": true, 898 | "dependencies": { 899 | "ansi-styles": "^4.1.0", 900 | "supports-color": "^7.1.0" 901 | }, 902 | "engines": { 903 | "node": ">=10" 904 | }, 905 | "funding": { 906 | "url": "https://github.com/chalk/chalk?sponsor=1" 907 | } 908 | }, 909 | "node_modules/color-convert": { 910 | "version": "2.0.1", 911 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 912 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 913 | "dev": true, 914 | "peer": true, 915 | "dependencies": { 916 | "color-name": "~1.1.4" 917 | }, 918 | "engines": { 919 | "node": ">=7.0.0" 920 | } 921 | }, 922 | "node_modules/color-name": { 923 | "version": "1.1.4", 924 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 925 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 926 | "dev": true, 927 | "peer": true 928 | }, 929 | "node_modules/concat-map": { 930 | "version": "0.0.1", 931 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 932 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 933 | "dev": true, 934 | "peer": true 935 | }, 936 | "node_modules/cross-spawn": { 937 | "version": "7.0.3", 938 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 939 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 940 | "dev": true, 941 | "peer": true, 942 | "dependencies": { 943 | "path-key": "^3.1.0", 944 | "shebang-command": "^2.0.0", 945 | "which": "^2.0.1" 946 | }, 947 | "engines": { 948 | "node": ">= 8" 949 | } 950 | }, 951 | "node_modules/debug": { 952 | "version": "4.3.7", 953 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 954 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 955 | "dev": true, 956 | "dependencies": { 957 | "ms": "^2.1.3" 958 | }, 959 | "engines": { 960 | "node": ">=6.0" 961 | }, 962 | "peerDependenciesMeta": { 963 | "supports-color": { 964 | "optional": true 965 | } 966 | } 967 | }, 968 | "node_modules/deep-is": { 969 | "version": "0.1.4", 970 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 971 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 972 | "dev": true, 973 | "peer": true 974 | }, 975 | "node_modules/dir-glob": { 976 | "version": "3.0.1", 977 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 978 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 979 | "dev": true, 980 | "dependencies": { 981 | "path-type": "^4.0.0" 982 | }, 983 | "engines": { 984 | "node": ">=8" 985 | } 986 | }, 987 | "node_modules/doctrine": { 988 | "version": "3.0.0", 989 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 990 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 991 | "dev": true, 992 | "peer": true, 993 | "dependencies": { 994 | "esutils": "^2.0.2" 995 | }, 996 | "engines": { 997 | "node": ">=6.0.0" 998 | } 999 | }, 1000 | "node_modules/esbuild": { 1001 | "version": "0.17.3", 1002 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", 1003 | "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", 1004 | "dev": true, 1005 | "hasInstallScript": true, 1006 | "bin": { 1007 | "esbuild": "bin/esbuild" 1008 | }, 1009 | "engines": { 1010 | "node": ">=12" 1011 | }, 1012 | "optionalDependencies": { 1013 | "@esbuild/android-arm": "0.17.3", 1014 | "@esbuild/android-arm64": "0.17.3", 1015 | "@esbuild/android-x64": "0.17.3", 1016 | "@esbuild/darwin-arm64": "0.17.3", 1017 | "@esbuild/darwin-x64": "0.17.3", 1018 | "@esbuild/freebsd-arm64": "0.17.3", 1019 | "@esbuild/freebsd-x64": "0.17.3", 1020 | "@esbuild/linux-arm": "0.17.3", 1021 | "@esbuild/linux-arm64": "0.17.3", 1022 | "@esbuild/linux-ia32": "0.17.3", 1023 | "@esbuild/linux-loong64": "0.17.3", 1024 | "@esbuild/linux-mips64el": "0.17.3", 1025 | "@esbuild/linux-ppc64": "0.17.3", 1026 | "@esbuild/linux-riscv64": "0.17.3", 1027 | "@esbuild/linux-s390x": "0.17.3", 1028 | "@esbuild/linux-x64": "0.17.3", 1029 | "@esbuild/netbsd-x64": "0.17.3", 1030 | "@esbuild/openbsd-x64": "0.17.3", 1031 | "@esbuild/sunos-x64": "0.17.3", 1032 | "@esbuild/win32-arm64": "0.17.3", 1033 | "@esbuild/win32-ia32": "0.17.3", 1034 | "@esbuild/win32-x64": "0.17.3" 1035 | } 1036 | }, 1037 | "node_modules/escape-string-regexp": { 1038 | "version": "4.0.0", 1039 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1040 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1041 | "dev": true, 1042 | "peer": true, 1043 | "engines": { 1044 | "node": ">=10" 1045 | }, 1046 | "funding": { 1047 | "url": "https://github.com/sponsors/sindresorhus" 1048 | } 1049 | }, 1050 | "node_modules/eslint": { 1051 | "version": "8.57.1", 1052 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", 1053 | "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", 1054 | "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", 1055 | "dev": true, 1056 | "peer": true, 1057 | "dependencies": { 1058 | "@eslint-community/eslint-utils": "^4.2.0", 1059 | "@eslint-community/regexpp": "^4.6.1", 1060 | "@eslint/eslintrc": "^2.1.4", 1061 | "@eslint/js": "8.57.1", 1062 | "@humanwhocodes/config-array": "^0.13.0", 1063 | "@humanwhocodes/module-importer": "^1.0.1", 1064 | "@nodelib/fs.walk": "^1.2.8", 1065 | "@ungap/structured-clone": "^1.2.0", 1066 | "ajv": "^6.12.4", 1067 | "chalk": "^4.0.0", 1068 | "cross-spawn": "^7.0.2", 1069 | "debug": "^4.3.2", 1070 | "doctrine": "^3.0.0", 1071 | "escape-string-regexp": "^4.0.0", 1072 | "eslint-scope": "^7.2.2", 1073 | "eslint-visitor-keys": "^3.4.3", 1074 | "espree": "^9.6.1", 1075 | "esquery": "^1.4.2", 1076 | "esutils": "^2.0.2", 1077 | "fast-deep-equal": "^3.1.3", 1078 | "file-entry-cache": "^6.0.1", 1079 | "find-up": "^5.0.0", 1080 | "glob-parent": "^6.0.2", 1081 | "globals": "^13.19.0", 1082 | "graphemer": "^1.4.0", 1083 | "ignore": "^5.2.0", 1084 | "imurmurhash": "^0.1.4", 1085 | "is-glob": "^4.0.0", 1086 | "is-path-inside": "^3.0.3", 1087 | "js-yaml": "^4.1.0", 1088 | "json-stable-stringify-without-jsonify": "^1.0.1", 1089 | "levn": "^0.4.1", 1090 | "lodash.merge": "^4.6.2", 1091 | "minimatch": "^3.1.2", 1092 | "natural-compare": "^1.4.0", 1093 | "optionator": "^0.9.3", 1094 | "strip-ansi": "^6.0.1", 1095 | "text-table": "^0.2.0" 1096 | }, 1097 | "bin": { 1098 | "eslint": "bin/eslint.js" 1099 | }, 1100 | "engines": { 1101 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1102 | }, 1103 | "funding": { 1104 | "url": "https://opencollective.com/eslint" 1105 | } 1106 | }, 1107 | "node_modules/eslint-scope": { 1108 | "version": "5.1.1", 1109 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1110 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1111 | "dev": true, 1112 | "dependencies": { 1113 | "esrecurse": "^4.3.0", 1114 | "estraverse": "^4.1.1" 1115 | }, 1116 | "engines": { 1117 | "node": ">=8.0.0" 1118 | } 1119 | }, 1120 | "node_modules/eslint-utils": { 1121 | "version": "3.0.0", 1122 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1123 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1124 | "dev": true, 1125 | "dependencies": { 1126 | "eslint-visitor-keys": "^2.0.0" 1127 | }, 1128 | "engines": { 1129 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 1130 | }, 1131 | "funding": { 1132 | "url": "https://github.com/sponsors/mysticatea" 1133 | }, 1134 | "peerDependencies": { 1135 | "eslint": ">=5" 1136 | } 1137 | }, 1138 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 1139 | "version": "2.1.0", 1140 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1141 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1142 | "dev": true, 1143 | "engines": { 1144 | "node": ">=10" 1145 | } 1146 | }, 1147 | "node_modules/eslint-visitor-keys": { 1148 | "version": "3.4.3", 1149 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1150 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1151 | "dev": true, 1152 | "engines": { 1153 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1154 | }, 1155 | "funding": { 1156 | "url": "https://opencollective.com/eslint" 1157 | } 1158 | }, 1159 | "node_modules/eslint/node_modules/eslint-scope": { 1160 | "version": "7.2.2", 1161 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 1162 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 1163 | "dev": true, 1164 | "peer": true, 1165 | "dependencies": { 1166 | "esrecurse": "^4.3.0", 1167 | "estraverse": "^5.2.0" 1168 | }, 1169 | "engines": { 1170 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1171 | }, 1172 | "funding": { 1173 | "url": "https://opencollective.com/eslint" 1174 | } 1175 | }, 1176 | "node_modules/eslint/node_modules/estraverse": { 1177 | "version": "5.3.0", 1178 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1179 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1180 | "dev": true, 1181 | "peer": true, 1182 | "engines": { 1183 | "node": ">=4.0" 1184 | } 1185 | }, 1186 | "node_modules/espree": { 1187 | "version": "9.6.1", 1188 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 1189 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 1190 | "dev": true, 1191 | "peer": true, 1192 | "dependencies": { 1193 | "acorn": "^8.9.0", 1194 | "acorn-jsx": "^5.3.2", 1195 | "eslint-visitor-keys": "^3.4.1" 1196 | }, 1197 | "engines": { 1198 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1199 | }, 1200 | "funding": { 1201 | "url": "https://opencollective.com/eslint" 1202 | } 1203 | }, 1204 | "node_modules/esquery": { 1205 | "version": "1.6.0", 1206 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1207 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1208 | "dev": true, 1209 | "peer": true, 1210 | "dependencies": { 1211 | "estraverse": "^5.1.0" 1212 | }, 1213 | "engines": { 1214 | "node": ">=0.10" 1215 | } 1216 | }, 1217 | "node_modules/esquery/node_modules/estraverse": { 1218 | "version": "5.3.0", 1219 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1220 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1221 | "dev": true, 1222 | "peer": true, 1223 | "engines": { 1224 | "node": ">=4.0" 1225 | } 1226 | }, 1227 | "node_modules/esrecurse": { 1228 | "version": "4.3.0", 1229 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1230 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1231 | "dev": true, 1232 | "dependencies": { 1233 | "estraverse": "^5.2.0" 1234 | }, 1235 | "engines": { 1236 | "node": ">=4.0" 1237 | } 1238 | }, 1239 | "node_modules/esrecurse/node_modules/estraverse": { 1240 | "version": "5.3.0", 1241 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1242 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1243 | "dev": true, 1244 | "engines": { 1245 | "node": ">=4.0" 1246 | } 1247 | }, 1248 | "node_modules/estraverse": { 1249 | "version": "4.3.0", 1250 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1251 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1252 | "dev": true, 1253 | "engines": { 1254 | "node": ">=4.0" 1255 | } 1256 | }, 1257 | "node_modules/esutils": { 1258 | "version": "2.0.3", 1259 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1260 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1261 | "dev": true, 1262 | "peer": true, 1263 | "engines": { 1264 | "node": ">=0.10.0" 1265 | } 1266 | }, 1267 | "node_modules/fast-deep-equal": { 1268 | "version": "3.1.3", 1269 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1270 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1271 | "dev": true, 1272 | "peer": true 1273 | }, 1274 | "node_modules/fast-glob": { 1275 | "version": "3.3.2", 1276 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1277 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1278 | "dev": true, 1279 | "dependencies": { 1280 | "@nodelib/fs.stat": "^2.0.2", 1281 | "@nodelib/fs.walk": "^1.2.3", 1282 | "glob-parent": "^5.1.2", 1283 | "merge2": "^1.3.0", 1284 | "micromatch": "^4.0.4" 1285 | }, 1286 | "engines": { 1287 | "node": ">=8.6.0" 1288 | } 1289 | }, 1290 | "node_modules/fast-glob/node_modules/glob-parent": { 1291 | "version": "5.1.2", 1292 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1293 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1294 | "dev": true, 1295 | "dependencies": { 1296 | "is-glob": "^4.0.1" 1297 | }, 1298 | "engines": { 1299 | "node": ">= 6" 1300 | } 1301 | }, 1302 | "node_modules/fast-json-stable-stringify": { 1303 | "version": "2.1.0", 1304 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1305 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1306 | "dev": true, 1307 | "peer": true 1308 | }, 1309 | "node_modules/fast-levenshtein": { 1310 | "version": "2.0.6", 1311 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1312 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1313 | "dev": true, 1314 | "peer": true 1315 | }, 1316 | "node_modules/fastq": { 1317 | "version": "1.17.1", 1318 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1319 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1320 | "dev": true, 1321 | "dependencies": { 1322 | "reusify": "^1.0.4" 1323 | } 1324 | }, 1325 | "node_modules/file-entry-cache": { 1326 | "version": "6.0.1", 1327 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1328 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1329 | "dev": true, 1330 | "peer": true, 1331 | "dependencies": { 1332 | "flat-cache": "^3.0.4" 1333 | }, 1334 | "engines": { 1335 | "node": "^10.12.0 || >=12.0.0" 1336 | } 1337 | }, 1338 | "node_modules/fill-range": { 1339 | "version": "7.1.1", 1340 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1341 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1342 | "dev": true, 1343 | "dependencies": { 1344 | "to-regex-range": "^5.0.1" 1345 | }, 1346 | "engines": { 1347 | "node": ">=8" 1348 | } 1349 | }, 1350 | "node_modules/find-up": { 1351 | "version": "5.0.0", 1352 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1353 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1354 | "dev": true, 1355 | "peer": true, 1356 | "dependencies": { 1357 | "locate-path": "^6.0.0", 1358 | "path-exists": "^4.0.0" 1359 | }, 1360 | "engines": { 1361 | "node": ">=10" 1362 | }, 1363 | "funding": { 1364 | "url": "https://github.com/sponsors/sindresorhus" 1365 | } 1366 | }, 1367 | "node_modules/flat-cache": { 1368 | "version": "3.2.0", 1369 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 1370 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 1371 | "dev": true, 1372 | "peer": true, 1373 | "dependencies": { 1374 | "flatted": "^3.2.9", 1375 | "keyv": "^4.5.3", 1376 | "rimraf": "^3.0.2" 1377 | }, 1378 | "engines": { 1379 | "node": "^10.12.0 || >=12.0.0" 1380 | } 1381 | }, 1382 | "node_modules/flatted": { 1383 | "version": "3.3.1", 1384 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 1385 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 1386 | "dev": true, 1387 | "peer": true 1388 | }, 1389 | "node_modules/fs.realpath": { 1390 | "version": "1.0.0", 1391 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1392 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1393 | "dev": true, 1394 | "peer": true 1395 | }, 1396 | "node_modules/functional-red-black-tree": { 1397 | "version": "1.0.1", 1398 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1399 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 1400 | "dev": true 1401 | }, 1402 | "node_modules/glob": { 1403 | "version": "7.2.3", 1404 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1405 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1406 | "deprecated": "Glob versions prior to v9 are no longer supported", 1407 | "dev": true, 1408 | "peer": true, 1409 | "dependencies": { 1410 | "fs.realpath": "^1.0.0", 1411 | "inflight": "^1.0.4", 1412 | "inherits": "2", 1413 | "minimatch": "^3.1.1", 1414 | "once": "^1.3.0", 1415 | "path-is-absolute": "^1.0.0" 1416 | }, 1417 | "engines": { 1418 | "node": "*" 1419 | }, 1420 | "funding": { 1421 | "url": "https://github.com/sponsors/isaacs" 1422 | } 1423 | }, 1424 | "node_modules/glob-parent": { 1425 | "version": "6.0.2", 1426 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1427 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1428 | "dev": true, 1429 | "peer": true, 1430 | "dependencies": { 1431 | "is-glob": "^4.0.3" 1432 | }, 1433 | "engines": { 1434 | "node": ">=10.13.0" 1435 | } 1436 | }, 1437 | "node_modules/globals": { 1438 | "version": "13.24.0", 1439 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 1440 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 1441 | "dev": true, 1442 | "peer": true, 1443 | "dependencies": { 1444 | "type-fest": "^0.20.2" 1445 | }, 1446 | "engines": { 1447 | "node": ">=8" 1448 | }, 1449 | "funding": { 1450 | "url": "https://github.com/sponsors/sindresorhus" 1451 | } 1452 | }, 1453 | "node_modules/globby": { 1454 | "version": "11.1.0", 1455 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1456 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1457 | "dev": true, 1458 | "dependencies": { 1459 | "array-union": "^2.1.0", 1460 | "dir-glob": "^3.0.1", 1461 | "fast-glob": "^3.2.9", 1462 | "ignore": "^5.2.0", 1463 | "merge2": "^1.4.1", 1464 | "slash": "^3.0.0" 1465 | }, 1466 | "engines": { 1467 | "node": ">=10" 1468 | }, 1469 | "funding": { 1470 | "url": "https://github.com/sponsors/sindresorhus" 1471 | } 1472 | }, 1473 | "node_modules/graphemer": { 1474 | "version": "1.4.0", 1475 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1476 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1477 | "dev": true, 1478 | "peer": true 1479 | }, 1480 | "node_modules/has-flag": { 1481 | "version": "4.0.0", 1482 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1483 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1484 | "dev": true, 1485 | "peer": true, 1486 | "engines": { 1487 | "node": ">=8" 1488 | } 1489 | }, 1490 | "node_modules/ignore": { 1491 | "version": "5.3.2", 1492 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1493 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1494 | "dev": true, 1495 | "engines": { 1496 | "node": ">= 4" 1497 | } 1498 | }, 1499 | "node_modules/import-fresh": { 1500 | "version": "3.3.0", 1501 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1502 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1503 | "dev": true, 1504 | "peer": true, 1505 | "dependencies": { 1506 | "parent-module": "^1.0.0", 1507 | "resolve-from": "^4.0.0" 1508 | }, 1509 | "engines": { 1510 | "node": ">=6" 1511 | }, 1512 | "funding": { 1513 | "url": "https://github.com/sponsors/sindresorhus" 1514 | } 1515 | }, 1516 | "node_modules/imurmurhash": { 1517 | "version": "0.1.4", 1518 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1519 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1520 | "dev": true, 1521 | "peer": true, 1522 | "engines": { 1523 | "node": ">=0.8.19" 1524 | } 1525 | }, 1526 | "node_modules/inflight": { 1527 | "version": "1.0.6", 1528 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1529 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1530 | "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.", 1531 | "dev": true, 1532 | "peer": true, 1533 | "dependencies": { 1534 | "once": "^1.3.0", 1535 | "wrappy": "1" 1536 | } 1537 | }, 1538 | "node_modules/inherits": { 1539 | "version": "2.0.4", 1540 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1541 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1542 | "dev": true, 1543 | "peer": true 1544 | }, 1545 | "node_modules/is-extglob": { 1546 | "version": "2.1.1", 1547 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1548 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1549 | "dev": true, 1550 | "engines": { 1551 | "node": ">=0.10.0" 1552 | } 1553 | }, 1554 | "node_modules/is-glob": { 1555 | "version": "4.0.3", 1556 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1557 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1558 | "dev": true, 1559 | "dependencies": { 1560 | "is-extglob": "^2.1.1" 1561 | }, 1562 | "engines": { 1563 | "node": ">=0.10.0" 1564 | } 1565 | }, 1566 | "node_modules/is-number": { 1567 | "version": "7.0.0", 1568 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1569 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1570 | "dev": true, 1571 | "engines": { 1572 | "node": ">=0.12.0" 1573 | } 1574 | }, 1575 | "node_modules/is-path-inside": { 1576 | "version": "3.0.3", 1577 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1578 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1579 | "dev": true, 1580 | "peer": true, 1581 | "engines": { 1582 | "node": ">=8" 1583 | } 1584 | }, 1585 | "node_modules/isexe": { 1586 | "version": "2.0.0", 1587 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1588 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1589 | "dev": true, 1590 | "peer": true 1591 | }, 1592 | "node_modules/js-yaml": { 1593 | "version": "4.1.0", 1594 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1595 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1596 | "dev": true, 1597 | "peer": true, 1598 | "dependencies": { 1599 | "argparse": "^2.0.1" 1600 | }, 1601 | "bin": { 1602 | "js-yaml": "bin/js-yaml.js" 1603 | } 1604 | }, 1605 | "node_modules/json-buffer": { 1606 | "version": "3.0.1", 1607 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1608 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1609 | "dev": true, 1610 | "peer": true 1611 | }, 1612 | "node_modules/json-schema-traverse": { 1613 | "version": "0.4.1", 1614 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1615 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1616 | "dev": true, 1617 | "peer": true 1618 | }, 1619 | "node_modules/json-stable-stringify-without-jsonify": { 1620 | "version": "1.0.1", 1621 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1622 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1623 | "dev": true, 1624 | "peer": true 1625 | }, 1626 | "node_modules/keyv": { 1627 | "version": "4.5.4", 1628 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1629 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1630 | "dev": true, 1631 | "peer": true, 1632 | "dependencies": { 1633 | "json-buffer": "3.0.1" 1634 | } 1635 | }, 1636 | "node_modules/levn": { 1637 | "version": "0.4.1", 1638 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1639 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1640 | "dev": true, 1641 | "peer": true, 1642 | "dependencies": { 1643 | "prelude-ls": "^1.2.1", 1644 | "type-check": "~0.4.0" 1645 | }, 1646 | "engines": { 1647 | "node": ">= 0.8.0" 1648 | } 1649 | }, 1650 | "node_modules/locate-path": { 1651 | "version": "6.0.0", 1652 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1653 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1654 | "dev": true, 1655 | "peer": true, 1656 | "dependencies": { 1657 | "p-locate": "^5.0.0" 1658 | }, 1659 | "engines": { 1660 | "node": ">=10" 1661 | }, 1662 | "funding": { 1663 | "url": "https://github.com/sponsors/sindresorhus" 1664 | } 1665 | }, 1666 | "node_modules/lodash.merge": { 1667 | "version": "4.6.2", 1668 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1669 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1670 | "dev": true, 1671 | "peer": true 1672 | }, 1673 | "node_modules/merge2": { 1674 | "version": "1.4.1", 1675 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1676 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1677 | "dev": true, 1678 | "engines": { 1679 | "node": ">= 8" 1680 | } 1681 | }, 1682 | "node_modules/micromatch": { 1683 | "version": "4.0.8", 1684 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1685 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1686 | "dev": true, 1687 | "dependencies": { 1688 | "braces": "^3.0.3", 1689 | "picomatch": "^2.3.1" 1690 | }, 1691 | "engines": { 1692 | "node": ">=8.6" 1693 | } 1694 | }, 1695 | "node_modules/minimatch": { 1696 | "version": "3.1.2", 1697 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1698 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1699 | "dev": true, 1700 | "peer": true, 1701 | "dependencies": { 1702 | "brace-expansion": "^1.1.7" 1703 | }, 1704 | "engines": { 1705 | "node": "*" 1706 | } 1707 | }, 1708 | "node_modules/moment": { 1709 | "version": "2.29.4", 1710 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 1711 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 1712 | "dev": true, 1713 | "license": "MIT", 1714 | "engines": { 1715 | "node": "*" 1716 | } 1717 | }, 1718 | "node_modules/ms": { 1719 | "version": "2.1.3", 1720 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1721 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1722 | "dev": true 1723 | }, 1724 | "node_modules/natural-compare": { 1725 | "version": "1.4.0", 1726 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1727 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1728 | "dev": true, 1729 | "peer": true 1730 | }, 1731 | "node_modules/obsidian": { 1732 | "version": "1.6.6", 1733 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.6.6.tgz", 1734 | "integrity": "sha512-GZHzeOiwmw/wBjB5JwrsxAZBLqxGQmqtEKSvJJvT0LtTcqeOFnV8jv0ZK5kO7hBb44WxJc+LdS7mZgLXbb+qXQ==", 1735 | "dev": true, 1736 | "license": "MIT", 1737 | "dependencies": { 1738 | "@types/codemirror": "5.60.8", 1739 | "moment": "2.29.4" 1740 | }, 1741 | "peerDependencies": { 1742 | "@codemirror/state": "^6.0.0", 1743 | "@codemirror/view": "^6.0.0" 1744 | } 1745 | }, 1746 | "node_modules/once": { 1747 | "version": "1.4.0", 1748 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1749 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1750 | "dev": true, 1751 | "peer": true, 1752 | "dependencies": { 1753 | "wrappy": "1" 1754 | } 1755 | }, 1756 | "node_modules/optionator": { 1757 | "version": "0.9.4", 1758 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1759 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1760 | "dev": true, 1761 | "peer": true, 1762 | "dependencies": { 1763 | "deep-is": "^0.1.3", 1764 | "fast-levenshtein": "^2.0.6", 1765 | "levn": "^0.4.1", 1766 | "prelude-ls": "^1.2.1", 1767 | "type-check": "^0.4.0", 1768 | "word-wrap": "^1.2.5" 1769 | }, 1770 | "engines": { 1771 | "node": ">= 0.8.0" 1772 | } 1773 | }, 1774 | "node_modules/p-limit": { 1775 | "version": "3.1.0", 1776 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1777 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1778 | "dev": true, 1779 | "peer": true, 1780 | "dependencies": { 1781 | "yocto-queue": "^0.1.0" 1782 | }, 1783 | "engines": { 1784 | "node": ">=10" 1785 | }, 1786 | "funding": { 1787 | "url": "https://github.com/sponsors/sindresorhus" 1788 | } 1789 | }, 1790 | "node_modules/p-locate": { 1791 | "version": "5.0.0", 1792 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1793 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1794 | "dev": true, 1795 | "peer": true, 1796 | "dependencies": { 1797 | "p-limit": "^3.0.2" 1798 | }, 1799 | "engines": { 1800 | "node": ">=10" 1801 | }, 1802 | "funding": { 1803 | "url": "https://github.com/sponsors/sindresorhus" 1804 | } 1805 | }, 1806 | "node_modules/parent-module": { 1807 | "version": "1.0.1", 1808 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1809 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1810 | "dev": true, 1811 | "peer": true, 1812 | "dependencies": { 1813 | "callsites": "^3.0.0" 1814 | }, 1815 | "engines": { 1816 | "node": ">=6" 1817 | } 1818 | }, 1819 | "node_modules/path-exists": { 1820 | "version": "4.0.0", 1821 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1822 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1823 | "dev": true, 1824 | "peer": true, 1825 | "engines": { 1826 | "node": ">=8" 1827 | } 1828 | }, 1829 | "node_modules/path-is-absolute": { 1830 | "version": "1.0.1", 1831 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1832 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1833 | "dev": true, 1834 | "peer": true, 1835 | "engines": { 1836 | "node": ">=0.10.0" 1837 | } 1838 | }, 1839 | "node_modules/path-key": { 1840 | "version": "3.1.1", 1841 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1842 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1843 | "dev": true, 1844 | "peer": true, 1845 | "engines": { 1846 | "node": ">=8" 1847 | } 1848 | }, 1849 | "node_modules/path-type": { 1850 | "version": "4.0.0", 1851 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1852 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1853 | "dev": true, 1854 | "engines": { 1855 | "node": ">=8" 1856 | } 1857 | }, 1858 | "node_modules/picomatch": { 1859 | "version": "2.3.1", 1860 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1861 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1862 | "dev": true, 1863 | "engines": { 1864 | "node": ">=8.6" 1865 | }, 1866 | "funding": { 1867 | "url": "https://github.com/sponsors/jonschlinkert" 1868 | } 1869 | }, 1870 | "node_modules/prelude-ls": { 1871 | "version": "1.2.1", 1872 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1873 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1874 | "dev": true, 1875 | "peer": true, 1876 | "engines": { 1877 | "node": ">= 0.8.0" 1878 | } 1879 | }, 1880 | "node_modules/punycode": { 1881 | "version": "2.3.1", 1882 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1883 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1884 | "dev": true, 1885 | "peer": true, 1886 | "engines": { 1887 | "node": ">=6" 1888 | } 1889 | }, 1890 | "node_modules/queue-microtask": { 1891 | "version": "1.2.3", 1892 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1893 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1894 | "dev": true, 1895 | "funding": [ 1896 | { 1897 | "type": "github", 1898 | "url": "https://github.com/sponsors/feross" 1899 | }, 1900 | { 1901 | "type": "patreon", 1902 | "url": "https://www.patreon.com/feross" 1903 | }, 1904 | { 1905 | "type": "consulting", 1906 | "url": "https://feross.org/support" 1907 | } 1908 | ] 1909 | }, 1910 | "node_modules/regexpp": { 1911 | "version": "3.2.0", 1912 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1913 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1914 | "dev": true, 1915 | "engines": { 1916 | "node": ">=8" 1917 | }, 1918 | "funding": { 1919 | "url": "https://github.com/sponsors/mysticatea" 1920 | } 1921 | }, 1922 | "node_modules/resolve-from": { 1923 | "version": "4.0.0", 1924 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1925 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1926 | "dev": true, 1927 | "peer": true, 1928 | "engines": { 1929 | "node": ">=4" 1930 | } 1931 | }, 1932 | "node_modules/reusify": { 1933 | "version": "1.0.4", 1934 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1935 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1936 | "dev": true, 1937 | "engines": { 1938 | "iojs": ">=1.0.0", 1939 | "node": ">=0.10.0" 1940 | } 1941 | }, 1942 | "node_modules/rimraf": { 1943 | "version": "3.0.2", 1944 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1945 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1946 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1947 | "dev": true, 1948 | "peer": true, 1949 | "dependencies": { 1950 | "glob": "^7.1.3" 1951 | }, 1952 | "bin": { 1953 | "rimraf": "bin.js" 1954 | }, 1955 | "funding": { 1956 | "url": "https://github.com/sponsors/isaacs" 1957 | } 1958 | }, 1959 | "node_modules/run-parallel": { 1960 | "version": "1.2.0", 1961 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1962 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1963 | "dev": true, 1964 | "funding": [ 1965 | { 1966 | "type": "github", 1967 | "url": "https://github.com/sponsors/feross" 1968 | }, 1969 | { 1970 | "type": "patreon", 1971 | "url": "https://www.patreon.com/feross" 1972 | }, 1973 | { 1974 | "type": "consulting", 1975 | "url": "https://feross.org/support" 1976 | } 1977 | ], 1978 | "dependencies": { 1979 | "queue-microtask": "^1.2.2" 1980 | } 1981 | }, 1982 | "node_modules/semver": { 1983 | "version": "7.6.3", 1984 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1985 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1986 | "dev": true, 1987 | "bin": { 1988 | "semver": "bin/semver.js" 1989 | }, 1990 | "engines": { 1991 | "node": ">=10" 1992 | } 1993 | }, 1994 | "node_modules/shebang-command": { 1995 | "version": "2.0.0", 1996 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1997 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1998 | "dev": true, 1999 | "peer": true, 2000 | "dependencies": { 2001 | "shebang-regex": "^3.0.0" 2002 | }, 2003 | "engines": { 2004 | "node": ">=8" 2005 | } 2006 | }, 2007 | "node_modules/shebang-regex": { 2008 | "version": "3.0.0", 2009 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2010 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2011 | "dev": true, 2012 | "peer": true, 2013 | "engines": { 2014 | "node": ">=8" 2015 | } 2016 | }, 2017 | "node_modules/slash": { 2018 | "version": "3.0.0", 2019 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2020 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2021 | "dev": true, 2022 | "engines": { 2023 | "node": ">=8" 2024 | } 2025 | }, 2026 | "node_modules/strip-ansi": { 2027 | "version": "6.0.1", 2028 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2029 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2030 | "dev": true, 2031 | "peer": true, 2032 | "dependencies": { 2033 | "ansi-regex": "^5.0.1" 2034 | }, 2035 | "engines": { 2036 | "node": ">=8" 2037 | } 2038 | }, 2039 | "node_modules/strip-json-comments": { 2040 | "version": "3.1.1", 2041 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2042 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2043 | "dev": true, 2044 | "peer": true, 2045 | "engines": { 2046 | "node": ">=8" 2047 | }, 2048 | "funding": { 2049 | "url": "https://github.com/sponsors/sindresorhus" 2050 | } 2051 | }, 2052 | "node_modules/style-mod": { 2053 | "version": "4.1.2", 2054 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", 2055 | "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", 2056 | "dev": true, 2057 | "license": "MIT", 2058 | "peer": true 2059 | }, 2060 | "node_modules/supports-color": { 2061 | "version": "7.2.0", 2062 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2063 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2064 | "dev": true, 2065 | "peer": true, 2066 | "dependencies": { 2067 | "has-flag": "^4.0.0" 2068 | }, 2069 | "engines": { 2070 | "node": ">=8" 2071 | } 2072 | }, 2073 | "node_modules/text-table": { 2074 | "version": "0.2.0", 2075 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2076 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2077 | "dev": true, 2078 | "peer": true 2079 | }, 2080 | "node_modules/to-regex-range": { 2081 | "version": "5.0.1", 2082 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2083 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2084 | "dev": true, 2085 | "dependencies": { 2086 | "is-number": "^7.0.0" 2087 | }, 2088 | "engines": { 2089 | "node": ">=8.0" 2090 | } 2091 | }, 2092 | "node_modules/tslib": { 2093 | "version": "2.4.0", 2094 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 2095 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 2096 | "dev": true 2097 | }, 2098 | "node_modules/tsutils": { 2099 | "version": "3.21.0", 2100 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 2101 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 2102 | "dev": true, 2103 | "dependencies": { 2104 | "tslib": "^1.8.1" 2105 | }, 2106 | "engines": { 2107 | "node": ">= 6" 2108 | }, 2109 | "peerDependencies": { 2110 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 2111 | } 2112 | }, 2113 | "node_modules/tsutils/node_modules/tslib": { 2114 | "version": "1.14.1", 2115 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2116 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2117 | "dev": true 2118 | }, 2119 | "node_modules/type-check": { 2120 | "version": "0.4.0", 2121 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2122 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2123 | "dev": true, 2124 | "peer": true, 2125 | "dependencies": { 2126 | "prelude-ls": "^1.2.1" 2127 | }, 2128 | "engines": { 2129 | "node": ">= 0.8.0" 2130 | } 2131 | }, 2132 | "node_modules/type-fest": { 2133 | "version": "0.20.2", 2134 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2135 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2136 | "dev": true, 2137 | "peer": true, 2138 | "engines": { 2139 | "node": ">=10" 2140 | }, 2141 | "funding": { 2142 | "url": "https://github.com/sponsors/sindresorhus" 2143 | } 2144 | }, 2145 | "node_modules/typescript": { 2146 | "version": "4.7.4", 2147 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 2148 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 2149 | "dev": true, 2150 | "bin": { 2151 | "tsc": "bin/tsc", 2152 | "tsserver": "bin/tsserver" 2153 | }, 2154 | "engines": { 2155 | "node": ">=4.2.0" 2156 | } 2157 | }, 2158 | "node_modules/uri-js": { 2159 | "version": "4.4.1", 2160 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2161 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2162 | "dev": true, 2163 | "peer": true, 2164 | "dependencies": { 2165 | "punycode": "^2.1.0" 2166 | } 2167 | }, 2168 | "node_modules/w3c-keyname": { 2169 | "version": "2.2.8", 2170 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 2171 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 2172 | "dev": true, 2173 | "license": "MIT", 2174 | "peer": true 2175 | }, 2176 | "node_modules/which": { 2177 | "version": "2.0.2", 2178 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2179 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2180 | "dev": true, 2181 | "peer": true, 2182 | "dependencies": { 2183 | "isexe": "^2.0.0" 2184 | }, 2185 | "bin": { 2186 | "node-which": "bin/node-which" 2187 | }, 2188 | "engines": { 2189 | "node": ">= 8" 2190 | } 2191 | }, 2192 | "node_modules/word-wrap": { 2193 | "version": "1.2.5", 2194 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2195 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2196 | "dev": true, 2197 | "peer": true, 2198 | "engines": { 2199 | "node": ">=0.10.0" 2200 | } 2201 | }, 2202 | "node_modules/wrappy": { 2203 | "version": "1.0.2", 2204 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2205 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2206 | "dev": true, 2207 | "peer": true 2208 | }, 2209 | "node_modules/yocto-queue": { 2210 | "version": "0.1.0", 2211 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2212 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2213 | "dev": true, 2214 | "peer": true, 2215 | "engines": { 2216 | "node": ">=10" 2217 | }, 2218 | "funding": { 2219 | "url": "https://github.com/sponsors/sindresorhus" 2220 | } 2221 | } 2222 | } 2223 | } 2224 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "open-interpreter-plugin", 3 | "version": "1.2.2", 4 | "description": "Plugin for integrating Open Interpreter with Obsidian", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json" 10 | }, 11 | "keywords": [ 12 | "obsidian-plugin" 13 | ], 14 | "author": "Mike Bird", 15 | "license": "MIT", 16 | "devDependencies": { 17 | "obsidian": "latest", 18 | "@types/node": "^16.11.6", 19 | "@typescript-eslint/eslint-plugin": "5.29.0", 20 | "@typescript-eslint/parser": "5.29.0", 21 | "builtin-modules": "3.3.0", 22 | "esbuild": "0.17.3", 23 | "tslib": "2.4.0", 24 | "typescript": "4.7.4" 25 | } 26 | } -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Plugin, 3 | Notice, 4 | Modal, 5 | App, 6 | Setting, 7 | PluginSettingTab, 8 | Platform, 9 | DropdownComponent, 10 | FileSystemAdapter, 11 | } from "obsidian"; 12 | import { exec, ChildProcess, spawn } from "child_process"; 13 | import * as os from "os"; 14 | import * as fs from "fs/promises"; 15 | import path from "path"; 16 | 17 | interface OpenInterpreterSettings { 18 | provider: "OpenAI" | "Anthropic" | "Groq" | "Custom"; 19 | model: string; 20 | contextWindow: string; 21 | maxTokens: string; 22 | llmSupportsFunctions: boolean; 23 | llmSupportsVision: boolean; 24 | customApiUrl?: string; 25 | } 26 | 27 | const DEFAULT_SETTINGS: OpenInterpreterSettings = { 28 | provider: "Anthropic", 29 | model: "claude-3-5-sonnet-20241022", 30 | contextWindow: "4000", 31 | maxTokens: "2048", 32 | llmSupportsFunctions: false, 33 | llmSupportsVision: false, 34 | customApiUrl: "", 35 | }; 36 | 37 | interface SecureStorage { 38 | keys: { 39 | openai?: string; 40 | anthropic?: string; 41 | groq?: string; 42 | }; 43 | } 44 | 45 | class SecureKeyStorage { 46 | private storagePath: string; 47 | private keys: SecureStorage = { keys: {} }; 48 | 49 | constructor(private app: App) { 50 | const vaultPath = (app.vault.adapter as any).getBasePath(); 51 | this.storagePath = path.join(vaultPath, ".obsidian", ".keys.json"); 52 | } 53 | 54 | async initialize() { 55 | try { 56 | await this.ensureStorageFile(); 57 | await this.loadKeys(); 58 | } catch (error) { 59 | console.error("Error initializing secure storage:", error); 60 | new Notice("Failed to initialize secure storage"); 61 | } 62 | } 63 | 64 | private async ensureStorageFile() { 65 | try { 66 | // Create directories if needed 67 | const dirPath = path.dirname(this.storagePath); 68 | const vaultPath = (this.app.vault.adapter as any).getBasePath(); 69 | 70 | // Update root .gitignore 71 | const gitignorePath = path.join(vaultPath, ".gitignore"); 72 | const ignorePattern = ".obsidian/.keys.json"; 73 | 74 | try { 75 | let gitignoreContent = ""; 76 | try { 77 | gitignoreContent = await fs.readFile(gitignorePath, "utf-8"); 78 | } catch { 79 | // File doesn't exist yet 80 | } 81 | 82 | const lines = gitignoreContent.split("\n"); 83 | if (!lines.some((line) => line.trim() === ignorePattern)) { 84 | const newContent = gitignoreContent 85 | ? gitignoreContent.endsWith("\n") 86 | ? gitignoreContent + ignorePattern + "\n" 87 | : gitignoreContent + "\n" + ignorePattern + "\n" 88 | : ignorePattern + "\n"; 89 | 90 | await fs.writeFile(gitignorePath, newContent); 91 | } 92 | } catch (error) { 93 | console.error("Error updating .gitignore:", error); 94 | new Notice( 95 | "Failed to update .gitignore. Please add .obsidian/.keys.json manually." 96 | ); 97 | } 98 | } catch (error) { 99 | console.error("Error ensuring storage file:", error); 100 | throw error; 101 | } 102 | } 103 | 104 | private async loadKeys() { 105 | try { 106 | const content = await fs.readFile(this.storagePath, "utf-8"); 107 | this.keys = JSON.parse(content); 108 | } catch (error) { 109 | console.error("Error loading keys:", error); 110 | this.keys = { keys: {} }; 111 | } 112 | } 113 | 114 | private async saveKeys() { 115 | try { 116 | await fs.writeFile( 117 | this.storagePath, 118 | JSON.stringify(this.keys, null, 2), 119 | "utf-8" 120 | ); 121 | } catch (error) { 122 | console.error("Error saving keys:", error); 123 | throw error; 124 | } 125 | } 126 | 127 | async getKey(provider: string): Promise { 128 | const key = provider.toLowerCase() as "openai" | "anthropic" | "groq"; 129 | return this.keys.keys[key]; 130 | } 131 | 132 | async setKey(provider: string, key: string) { 133 | const keyName = provider.toLowerCase() as "openai" | "anthropic" | "groq"; 134 | this.keys.keys[keyName] = key; 135 | await this.saveKeys(); 136 | } 137 | 138 | async removeKey(provider: string) { 139 | const keyName = provider.toLowerCase() as "openai" | "anthropic" | "groq"; 140 | delete this.keys.keys[keyName]; 141 | await this.saveKeys(); 142 | } 143 | } 144 | 145 | class InstallationGuideModal extends Modal { 146 | constructor(app: App) { 147 | super(app); 148 | } 149 | 150 | onOpen() { 151 | let { contentEl } = this; 152 | contentEl.setText("Open Interpreter is not installed."); 153 | contentEl.createEl("p", { 154 | text: "To install, run the following command in your terminal:", 155 | }); 156 | contentEl.createEl("pre", { text: "pip install open-interpreter" }); 157 | contentEl.createEl("p", { text: "For more information, visit:" }); 158 | contentEl.createEl("a", { 159 | text: "Open Interpreter Documentation", 160 | href: "https://docs.openinterpreter.com/getting-started/introduction", 161 | }); 162 | } 163 | 164 | onClose() { 165 | let { contentEl } = this; 166 | contentEl.empty(); 167 | } 168 | } 169 | 170 | class InterpreterInputModal extends Modal { 171 | result: string = ""; 172 | onSubmit: (result: string) => void; 173 | 174 | constructor(app: App, onSubmit: (result: string) => void) { 175 | super(app); 176 | this.onSubmit = onSubmit; 177 | } 178 | 179 | onOpen() { 180 | const { contentEl } = this; 181 | contentEl.addClass("interpreter-modal-content"); 182 | 183 | contentEl.createEl("h2", { 184 | text: "Enter command for Open Interpreter", 185 | cls: "interpreter-modal-title", 186 | }); 187 | 188 | const inputEl = contentEl.createEl("input", { 189 | type: "text", 190 | cls: "interpreter-modal-input", 191 | placeholder: "Enter your command...", 192 | }); 193 | 194 | inputEl.addEventListener("input", (e) => { 195 | this.result = (e.target as HTMLInputElement).value; 196 | }); 197 | 198 | inputEl.addEventListener("keydown", (event: KeyboardEvent) => { 199 | if (event.key === "Enter") { 200 | event.preventDefault(); 201 | this.close(); 202 | this.onSubmit(this.result); 203 | } 204 | }); 205 | 206 | inputEl.focus(); 207 | 208 | const submitButton = contentEl.createEl("button", { 209 | text: "Submit", 210 | cls: "submit-button", 211 | }); 212 | 213 | submitButton.addEventListener("click", () => { 214 | this.close(); 215 | this.onSubmit(this.result); 216 | }); 217 | } 218 | 219 | onClose() { 220 | const { contentEl } = this; 221 | contentEl.empty(); 222 | } 223 | } 224 | 225 | class InterpreterChatModal extends Modal { 226 | private interpreter: ChildProcess; 227 | private inputEl!: HTMLTextAreaElement; 228 | private outputEl!: HTMLElement; 229 | private buttonContainer!: HTMLElement; 230 | private yesButton!: HTMLButtonElement; 231 | private noButton!: HTMLButtonElement; 232 | private sendButton!: HTMLButtonElement; 233 | 234 | constructor(app: App, interpreter: ChildProcess) { 235 | super(app); 236 | this.interpreter = interpreter; 237 | } 238 | 239 | onOpen() { 240 | const { contentEl } = this; 241 | contentEl.addClass("interpreter-modal-content"); 242 | 243 | contentEl.createEl("h2", { text: "Open Interpreter Chat" }); 244 | 245 | this.outputEl = contentEl.createEl("div", { cls: "interpreter-output" }); 246 | 247 | this.createInputArea(); 248 | this.createButtons(); 249 | 250 | this.setupInterpreterListeners(); 251 | } 252 | 253 | private setupInterpreterListeners() { 254 | if (this.interpreter.stdout) { 255 | this.interpreter.stdout.on("data", (data) => { 256 | this.appendOutput(data.toString()); 257 | }); 258 | } 259 | 260 | if (this.interpreter.stderr) { 261 | this.interpreter.stderr.on("data", (data) => { 262 | this.appendOutput(`Error: ${data.toString()}`, true); 263 | }); 264 | } 265 | 266 | this.interpreter.on("close", (code) => { 267 | this.appendOutput(`Interpreter closed with code ${code}`); 268 | this.close(); 269 | }); 270 | } 271 | 272 | onClose() { 273 | this.interpreter.kill(); 274 | const { contentEl } = this; 275 | contentEl.empty(); 276 | } 277 | 278 | private appendOutput(text: string, isError: boolean = false) { 279 | const chunks = text.match(/.{1,1000}/g) || []; 280 | 281 | chunks.forEach((chunk) => { 282 | const p = this.outputEl.createEl("p"); 283 | p.textContent = chunk; 284 | if (isError) { 285 | p.style.color = "red"; 286 | } 287 | }); 288 | 289 | this.outputEl.scrollTop = this.outputEl.scrollHeight; 290 | 291 | if (text.trim().endsWith("Would you like to run this code? (y/n)")) { 292 | this.showYesNoButtons(); 293 | } else { 294 | this.showInputArea(); 295 | } 296 | } 297 | 298 | private sendMessage(overrideMessage?: string) { 299 | let message: string; 300 | if (overrideMessage) { 301 | message = overrideMessage; 302 | } else { 303 | message = this.inputEl.value; 304 | this.inputEl.value = ""; 305 | } 306 | 307 | if (this.interpreter.stdin) { 308 | this.interpreter.stdin.write(message + "\n"); 309 | } 310 | this.appendOutput(`You: ${message}`); 311 | this.showInputArea(); 312 | } 313 | 314 | private createInputArea() { 315 | this.inputEl = this.contentEl.createEl("textarea", { 316 | cls: "interpreter-input", 317 | }); 318 | } 319 | 320 | private createButtons() { 321 | // Create Yes/No buttons container 322 | this.buttonContainer = this.contentEl.createEl("div", { 323 | cls: "yes-no-buttons", 324 | }); 325 | 326 | // Create Yes button 327 | this.yesButton = this.buttonContainer.createEl("button", { 328 | text: "Yes", 329 | cls: "interpreter-chat-button yes", 330 | }); 331 | this.yesButton.onclick = () => this.sendMessage("y"); 332 | 333 | // Create No button 334 | this.noButton = this.buttonContainer.createEl("button", { 335 | text: "No", 336 | cls: "interpreter-chat-button no", 337 | }); 338 | this.noButton.onclick = () => this.sendMessage("n"); 339 | 340 | // Create Send button 341 | this.sendButton = this.contentEl.createEl("button", { 342 | text: "Send", 343 | cls: "interpreter-chat-button send", 344 | }); 345 | this.sendButton.onclick = () => this.sendMessage(); 346 | 347 | // Initially hide the Yes/No buttons 348 | this.buttonContainer.style.display = "none"; 349 | } 350 | 351 | private showInputArea() { 352 | this.inputEl.style.display = "block"; 353 | this.buttonContainer.style.display = "none"; 354 | this.sendButton.style.display = "block"; 355 | } 356 | 357 | private showYesNoButtons() { 358 | this.inputEl.style.display = "none"; 359 | this.buttonContainer.style.display = "flex"; 360 | this.sendButton.style.display = "none"; 361 | } 362 | } 363 | 364 | export default class OpenInterpreterPlugin extends Plugin { 365 | settings: OpenInterpreterSettings = DEFAULT_SETTINGS; 366 | keyStorage!: SecureKeyStorage; 367 | private interpreterInstalled: boolean = false; 368 | 369 | async onload() { 370 | this.keyStorage = new SecureKeyStorage(this.app); 371 | await this.keyStorage.initialize(); 372 | await this.loadSettings(); 373 | 374 | this.addSettingTab(new OpenInterpreterSettingTab(this.app, this)); 375 | 376 | this.addCommand({ 377 | id: "run-interpreter", 378 | name: "AI Command", 379 | callback: () => this.runInterpreter(), 380 | }); 381 | } 382 | 383 | async loadSettings() { 384 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 385 | } 386 | 387 | async saveSettings() { 388 | await this.saveData(this.settings); 389 | } 390 | 391 | private async checkInterpreterInstallation(): Promise { 392 | return new Promise((resolve) => { 393 | const command = '$SHELL -i -c "which interpreter"'; 394 | console.log("Executing command:", command); 395 | 396 | exec(command, (error, stdout, stderr) => { 397 | if (error) { 398 | console.error("Error finding interpreter:", error); 399 | console.log("Stderr:", stderr); 400 | this.interpreterInstalled = false; 401 | } else { 402 | const interpreterPath = stdout.trim(); 403 | console.log("Interpreter found at:", interpreterPath); 404 | this.interpreterInstalled = !!interpreterPath; 405 | } 406 | console.log("Interpreter installed:", this.interpreterInstalled); 407 | resolve(); 408 | }); 409 | }); 410 | } 411 | 412 | private getVaultPath(): string | null { 413 | const adapter = this.app.vault.adapter; 414 | if (adapter instanceof FileSystemAdapter) { 415 | return adapter.getBasePath(); 416 | } 417 | console.error("Could not determine vault path"); 418 | return null; 419 | } 420 | 421 | private getApiKey(provider: string): string | undefined { 422 | console.log("All environment variables:", Object.keys(process.env)); 423 | console.log("Complete env object:", JSON.stringify(process.env, null, 2)); 424 | 425 | switch (provider) { 426 | case "OpenAI": 427 | return process.env.OPENAI_API_KEY; 428 | case "Anthropic": 429 | return process.env.ANTHROPIC_API_KEY; 430 | case "Groq": 431 | return process.env.GROQ_API_KEY; 432 | case "Custom": 433 | return ""; // Custom API key handling if necessary 434 | default: 435 | return undefined; 436 | } 437 | } 438 | 439 | async runInterpreter() { 440 | await this.checkInterpreterInstallation(); 441 | if (!this.interpreterInstalled) { 442 | console.log("Interpreter not installed, showing modal"); 443 | new InstallationGuideModal(this.app).open(); 444 | return; 445 | } 446 | 447 | new InterpreterInputModal(this.app, (command) => { 448 | this.executeInterpreterCommand(command); 449 | }).open(); 450 | } 451 | 452 | private async executeInterpreterCommand(command: string) { 453 | const vaultPath = this.getVaultPath(); 454 | 455 | console.log("Determined vault path:", vaultPath); 456 | 457 | if (!vaultPath) { 458 | console.error("Vault path could not be determined."); 459 | new Notice( 460 | "Unable to determine vault path. Please check console for details." 461 | ); 462 | return; 463 | } 464 | 465 | const interpreterPath = await this.getInterpreterPath(); 466 | if (!interpreterPath) { 467 | new Notice( 468 | "Unable to find the interpreter executable. Please make sure it's installed and in your PATH." 469 | ); 470 | return; 471 | } 472 | 473 | const apiKey = await this.keyStorage.getKey( 474 | this.settings.provider.toLowerCase() 475 | ); 476 | if (!apiKey) { 477 | new Notice( 478 | `Please set your ${this.settings.provider} API key in settings` 479 | ); 480 | return; 481 | } 482 | 483 | const env = { ...process.env }; 484 | let apiUrl = ""; 485 | if (this.settings.provider === "Custom") { 486 | apiUrl = this.settings.customApiUrl || ""; 487 | // Optionally handle API key for custom providers 488 | } else { 489 | switch (this.settings.provider) { 490 | case "OpenAI": 491 | env.OPENAI_API_KEY = apiKey; 492 | apiUrl = "https://api.openai.com/v1"; 493 | break; 494 | case "Anthropic": 495 | env.ANTHROPIC_API_KEY = apiKey; 496 | apiUrl = "https://api.anthropic.com/v1"; 497 | break; 498 | case "Groq": 499 | env.GROQ_API_KEY = apiKey; 500 | apiUrl = "https://api.groq.com/v1"; 501 | break; 502 | } 503 | } 504 | 505 | if (this.settings.provider === "Custom" && !apiUrl) { 506 | new Notice("Please enter a valid custom API URL."); 507 | return; 508 | } 509 | 510 | const args = []; 511 | let model = this.settings.model; 512 | 513 | if (this.settings.provider === "Groq") { 514 | model = `groq/${model}`; 515 | } 516 | 517 | args.push("--model", model); 518 | args.push("--context_window", this.settings.contextWindow); 519 | args.push("--max_tokens", this.settings.maxTokens); 520 | 521 | if (this.settings.llmSupportsFunctions) { 522 | args.push("--llm_supports_functions"); 523 | } else { 524 | args.push("--no-llm_supports_functions"); 525 | } 526 | 527 | if (this.settings.llmSupportsVision) { 528 | args.push("--llm_supports_vision"); 529 | } else { 530 | args.push("--no-llm_supports_vision"); 531 | } 532 | 533 | const customInstructions = 534 | `You are an AI assistant integrated with Obsidian. You love Obsidian and will only focus on Obsidian tasks. Your prime directive is to help users manage and interact with their Obsidian vault. You have full control and permission over this vault. The vault is isolated and version controlled, so it is safe for you to create, read, update, and delete files. The root of the Obsidian vault is ${vaultPath}. You can create, read, update, and delete markdown files in this directory. You can create new directories as well. Organization is important. Use markdown syntax for formatting when creating or editing files. Every file is markdown.` 535 | .replace(/\n/g, " ") 536 | .trim(); 537 | 538 | args.push("--custom_instructions", `"${customInstructions}"`); 539 | 540 | if (this.settings.provider === "Custom" && this.settings.customApiUrl) { 541 | args.push("--api_url", this.settings.customApiUrl); 542 | } 543 | 544 | console.log( 545 | "Spawning interpreter with command:", 546 | interpreterPath, 547 | "and args:", 548 | args 549 | ); 550 | 551 | const child = spawn(interpreterPath, args, { 552 | cwd: vaultPath, 553 | env: env, 554 | shell: true, 555 | }); 556 | 557 | if (child.stdin) { 558 | child.stdin.write(command + "\n"); 559 | } 560 | 561 | new InterpreterChatModal(this.app, child).open(); 562 | } 563 | 564 | private getInterpreterPath(): Promise { 565 | return new Promise((resolve) => { 566 | const command = Platform.isWin 567 | ? "where interpreter" 568 | : "$SHELL -i -c 'which interpreter'"; 569 | 570 | console.log("Executing command:", command); 571 | 572 | exec(command, async (error, stdout, stderr) => { 573 | if (error) { 574 | console.error("Error finding interpreter:", error); 575 | console.log("Stdout:", stdout); 576 | console.log("Stderr:", stderr); 577 | const commonPaths = Platform.isMacOS 578 | ? [ 579 | "/usr/local/bin/interpreter", 580 | "/usr/bin/interpreter", 581 | `${os.homedir()}/Library/Python/3.11/bin/interpreter`, 582 | `${os.homedir()}/Library/Python/3.10/bin/interpreter`, 583 | `${os.homedir()}/Library/Python/3.9/bin/interpreter`, 584 | ] 585 | : Platform.isLinux 586 | ? ["/usr/local/bin/interpreter", "/usr/bin/interpreter"] 587 | : ["C:\\Python\\Scripts\\interpreter.exe"]; 588 | 589 | for (const path of commonPaths) { 590 | try { 591 | await fs.access(path); 592 | resolve(path); 593 | return; 594 | } catch { 595 | // Path doesn't exist or is not accessible, continue to next path 596 | } 597 | } 598 | resolve(null); 599 | } else { 600 | console.log("Interpreter found at:", stdout.trim()); 601 | resolve(stdout.trim()); 602 | } 603 | }); 604 | }); 605 | } 606 | 607 | onunload() { 608 | console.log("unloading open interpreter plugin"); 609 | } 610 | } 611 | 612 | class OpenInterpreterSettingTab extends PluginSettingTab { 613 | plugin: OpenInterpreterPlugin; 614 | private modelDropdown: DropdownComponent | null = null; 615 | 616 | constructor(app: App, plugin: OpenInterpreterPlugin) { 617 | super(app, plugin); 618 | this.plugin = plugin; 619 | } 620 | 621 | async display(): Promise { 622 | const { containerEl } = this; 623 | 624 | containerEl.empty(); 625 | 626 | new Setting(containerEl) 627 | .setName("Provider") 628 | .setDesc("Select the LLM provider") 629 | .addDropdown((dropdown) => 630 | dropdown 631 | .addOption("OpenAI", "OpenAI") 632 | .addOption("Anthropic", "Anthropic") 633 | .addOption("Groq", "Groq") 634 | .addOption("Custom", "Custom") 635 | .setValue(this.plugin.settings.provider) 636 | .onChange(async (value) => { 637 | this.plugin.settings.provider = value as 638 | | "OpenAI" 639 | | "Anthropic" 640 | | "Groq" 641 | | "Custom"; 642 | await this.plugin.saveSettings(); 643 | this.updateModelOptions(); 644 | }) 645 | ); 646 | 647 | // API Key settings 648 | const providers = ["OpenAI", "Anthropic", "Groq"]; 649 | for (const provider of providers) { 650 | const currentKey = await this.plugin.keyStorage.getKey( 651 | provider.toLowerCase() 652 | ); 653 | 654 | new Setting(containerEl) 655 | .setName(`${provider} API Key`) 656 | .setDesc(`Enter your ${provider} API key`) 657 | .addText((text) => { 658 | text 659 | .setPlaceholder(`Enter ${provider} API key`) 660 | .setValue(currentKey || "") 661 | .onChange(async (value) => { 662 | if (value) { 663 | await this.plugin.keyStorage.setKey( 664 | provider.toLowerCase(), 665 | value 666 | ); 667 | } else { 668 | await this.plugin.keyStorage.removeKey(provider.toLowerCase()); 669 | } 670 | }); 671 | text.inputEl.type = "password"; 672 | text.inputEl.dataset.lpignore = "true"; 673 | }); 674 | } 675 | 676 | new Setting(containerEl) 677 | .setName("Custom API URL") 678 | .setDesc("Enter a custom API URL for your LLM provider") 679 | .addText((text) => 680 | text 681 | .setPlaceholder("https://api.your-llm-provider.com") 682 | .setValue(this.plugin.settings.customApiUrl || "") 683 | .onChange(async (value) => { 684 | this.plugin.settings.customApiUrl = value; 685 | await this.plugin.saveSettings(); 686 | }) 687 | ); 688 | 689 | new Setting(containerEl) 690 | .setName("Model") 691 | .setDesc("Select the LLM model") 692 | .addDropdown((dropdown) => { 693 | this.modelDropdown = dropdown; 694 | this.updateModelOptions(); 695 | dropdown.onChange(async (value) => { 696 | this.plugin.settings.model = value; 697 | await this.plugin.saveSettings(); 698 | }); 699 | }); 700 | 701 | new Setting(containerEl) 702 | .setName("Context Window") 703 | .setDesc("Set the context window size") 704 | .addText((text) => 705 | text 706 | .setPlaceholder("Enter context window size") 707 | .setValue(this.plugin.settings.contextWindow) 708 | .onChange(async (value) => { 709 | this.plugin.settings.contextWindow = value; 710 | await this.plugin.saveSettings(); 711 | }) 712 | ); 713 | 714 | new Setting(containerEl) 715 | .setName("Max Tokens") 716 | .setDesc("Set the maximum number of tokens") 717 | .addText((text) => 718 | text 719 | .setPlaceholder("Enter max tokens") 720 | .setValue(this.plugin.settings.maxTokens) 721 | .onChange(async (value) => { 722 | this.plugin.settings.maxTokens = value; 723 | await this.plugin.saveSettings(); 724 | }) 725 | ); 726 | 727 | new Setting(containerEl) 728 | .setName("LLM Supports Functions") 729 | .setDesc("Enable or disable LLM support for functions") 730 | .addToggle((toggle) => 731 | toggle 732 | .setValue(this.plugin.settings.llmSupportsFunctions) 733 | .onChange(async (value) => { 734 | this.plugin.settings.llmSupportsFunctions = value; 735 | await this.plugin.saveSettings(); 736 | }) 737 | ); 738 | 739 | new Setting(containerEl) 740 | .setName("LLM Supports Vision") 741 | .setDesc("Enable or disable LLM support for vision") 742 | .addToggle((toggle) => 743 | toggle 744 | .setValue(this.plugin.settings.llmSupportsVision) 745 | .onChange(async (value) => { 746 | this.plugin.settings.llmSupportsVision = value; 747 | await this.plugin.saveSettings(); 748 | }) 749 | ); 750 | } 751 | 752 | private updateModelOptions() { 753 | if (this.modelDropdown) { 754 | const models = this.getModelsForProvider(this.plugin.settings.provider); 755 | this.modelDropdown.selectEl.empty(); 756 | Object.entries(models).forEach(([value, name]) => { 757 | this.modelDropdown?.addOption(value, name); 758 | }); 759 | 760 | if (!models[this.plugin.settings.model]) { 761 | this.plugin.settings.model = Object.keys(models)[0]; 762 | this.plugin.saveSettings(); 763 | } 764 | 765 | this.modelDropdown.setValue(this.plugin.settings.model); 766 | } 767 | } 768 | 769 | private getModelsForProvider( 770 | provider: "OpenAI" | "Anthropic" | "Groq" 771 | ): Record { 772 | switch (provider) { 773 | case "OpenAI": 774 | return { 775 | "gpt-4o": "GPT-4o", 776 | "gpt-4o-mini": "GPT-4o-mini", 777 | }; 778 | case "Anthropic": 779 | return { 780 | "claude-3-5-sonnet-20241022": "Claude 3.5 Sonnet", 781 | "claude-3-opus-20240229": "Claude 3 Opus", 782 | }; 783 | case "Groq": 784 | return { 785 | "llama-3.1-70b-versatile": "Llama 3.1 70B", 786 | "llama-3.1-8b-instant": "Llama 3.1 8B", 787 | "mixtral-8x7b-32768": "Mixtral 8x7B", 788 | }; 789 | default: 790 | console.error(`Unknown provider: ${provider}`); 791 | return {}; 792 | } 793 | } 794 | } 795 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | /* Modal Container - this targets Obsidian's modal container */ 2 | .modal { 3 | background-color: var(--background-primary); 4 | border-radius: 12px; 5 | border: 1px solid var(--background-modifier-border); 6 | box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4); 7 | width: 600px; /* Set default width */ 8 | } 9 | 10 | /* Modal Content */ 11 | .interpreter-modal-content { 12 | padding: 20px; 13 | width: 100%; /* Take up full width of modal */ 14 | box-sizing: border-box; 15 | } 16 | 17 | /* Modal Title */ 18 | .interpreter-modal-title { 19 | color: var(--text-normal); 20 | font-size: 1.2em; 21 | font-weight: 500; 22 | margin: 0 0 20px 0; 23 | text-align: center; 24 | } 25 | 26 | /* Input Field */ 27 | .interpreter-modal-input { 28 | width: 100%; 29 | padding: 12px 16px; 30 | background-color: var(--background-secondary); 31 | border: 1px solid var(--background-modifier-border); 32 | border-radius: 8px; 33 | color: var(--text-normal); 34 | font-size: 1em; 35 | transition: all 0.2s ease; 36 | margin-bottom: 20px; 37 | box-sizing: border-box; 38 | } 39 | 40 | .interpreter-modal-input:focus { 41 | outline: none; 42 | border-color: var(--interactive-accent); 43 | box-shadow: 0 0 0 2px var(--background-modifier-border-hover); 44 | } 45 | 46 | /* Submit Button */ 47 | .submit-button { 48 | background-color: var(--interactive-accent); 49 | color: var(--text-on-accent); 50 | border: none; 51 | border-radius: 6px; 52 | padding: 8px 16px; 53 | font-size: 14px; 54 | font-weight: 500; 55 | cursor: pointer; 56 | transition: all 0.2s ease; 57 | margin-left: auto; 58 | display: block; 59 | } 60 | 61 | .submit-button:hover { 62 | filter: brightness(1.1); 63 | } 64 | 65 | /* Close Button */ 66 | .modal-close-button { 67 | color: var(--text-muted); 68 | opacity: 0.8; 69 | transition: all 0.2s ease; 70 | } 71 | 72 | .modal-close-button:hover { 73 | color: var(--text-normal); 74 | opacity: 1; 75 | } 76 | 77 | /* Output Area */ 78 | .interpreter-output { 79 | height: 400px; 80 | width: 100%; 81 | overflow-y: auto; 82 | padding: 16px; 83 | margin-bottom: 16px; 84 | border-radius: 8px; 85 | background-color: var(--background-secondary); 86 | border: 1px solid var(--background-modifier-border); 87 | box-sizing: border-box; 88 | } 89 | 90 | /* Chat Input Area */ 91 | .interpreter-input { 92 | width: 100%; 93 | height: 100px; 94 | padding: 12px 16px; 95 | background-color: var(--background-secondary); 96 | border: 1px solid var(--background-modifier-border); 97 | border-radius: 8px; 98 | color: var(--text-normal); 99 | font-size: 1em; 100 | transition: all 0.2s ease; 101 | resize: vertical; 102 | margin-bottom: 16px; 103 | box-sizing: border-box; 104 | } 105 | 106 | .interpreter-input:focus { 107 | outline: none; 108 | border-color: var(--interactive-accent); 109 | box-shadow: 0 0 0 2px var(--background-modifier-border-hover); 110 | } 111 | 112 | /* Button Container */ 113 | .yes-no-buttons { 114 | display: flex; 115 | justify-content: flex-end; 116 | gap: 8px; 117 | margin-top: 16px; 118 | } 119 | 120 | /* Chat Interface Buttons */ 121 | .interpreter-chat-button { 122 | padding: 8px 16px; 123 | border-radius: 6px; 124 | font-weight: 500; 125 | cursor: pointer; 126 | transition: all 0.2s ease; 127 | border: none; 128 | text-align: center; 129 | min-width: 80px; 130 | } 131 | 132 | .interpreter-chat-button.yes { 133 | background-color: #4caf50; 134 | color: white; 135 | } 136 | 137 | .interpreter-chat-button.no { 138 | background-color: #f44336; 139 | color: white; 140 | } 141 | 142 | .interpreter-chat-button.send { 143 | background-color: var(--interactive-accent); 144 | color: white; 145 | } 146 | 147 | .interpreter-chat-button:hover { 148 | filter: brightness(1.1); 149 | } 150 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "lib": ["DOM", "ES5", "ES6", "ES7"], 15 | "strict": true, 16 | "esModuleInterop": true, 17 | "forceConsistentCasingInFileNames": true, 18 | "resolveJsonModule": true, 19 | "skipLibCheck": true, 20 | "outDir": ".", 21 | "allowSyntheticDefaultImports": true, 22 | "noEmit": true 23 | }, 24 | "include": ["src/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | --------------------------------------------------------------------------------