From a1a9f83e70adf84bf6d3a1646c5af7892275b283 Mon Sep 17 00:00:00 2001 From: Sinduja Ramaraj Date: Tue, 3 Dec 2024 14:11:03 -0800 Subject: [PATCH] Initial commit --- .gitignore | 5 + .prettierignore | 4 + .prettierrc | 8 + .vscode-test.mjs | 5 + .vscode/extensions.json | 5 + .vscode/launch.json | 21 + .vscode/settings.json | 13 + .vscode/tasks.json | 40 + .vscodeignore | 14 + CHANGELOG.md | 9 + README.md | 45 + builder.jpeg | Bin 0 -> 92889 bytes eslint.config copy.mjs | 41 + eslint.config.mjs | 28 + package-lock.json | 4858 ++++++++++++++++++++++++++ package.json | 67 + src/builder/app.ts | 179 + src/builder/constants.ts | 5 + src/builder/mobile/mobileApp.ts | 297 ++ src/builder/prompt.ts | 71 + src/builder/terminalHelper.ts | 51 + src/builder/types.ts | 154 + src/builder/utils/appconfigHelper.ts | 61 + src/builder/utils/contentUtil.ts | 157 + src/builder/utils/fileParser.ts | 130 + src/builder/utils/nodeUtil.ts | 47 + src/extension.ts | 75 + src/test/extension.test.ts | 15 + tsconfig.json | 19 + vsc-extension-quickstart.md | 48 + webpack.config.js | 48 + 31 files changed, 6520 insertions(+) create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode-test.mjs create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 builder.jpeg create mode 100644 eslint.config copy.mjs create mode 100644 eslint.config.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/builder/app.ts create mode 100644 src/builder/constants.ts create mode 100644 src/builder/mobile/mobileApp.ts create mode 100644 src/builder/prompt.ts create mode 100644 src/builder/terminalHelper.ts create mode 100644 src/builder/types.ts create mode 100644 src/builder/utils/appconfigHelper.ts create mode 100644 src/builder/utils/contentUtil.ts create mode 100644 src/builder/utils/fileParser.ts create mode 100644 src/builder/utils/nodeUtil.ts create mode 100644 src/extension.ts create mode 100644 src/test/extension.test.ts create mode 100644 tsconfig.json create mode 100644 vsc-extension-quickstart.md create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b60dfa --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +out +dist +node_modules +.vscode-test/ +*.vsix diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..dc9d03e --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +node_modules +dist +.vscode +.vscode-test \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..e25debd --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "singleQuote": true, + "trailingComma": "all", + "printWidth": 80, + "useTabs": false, + "tabWidth": 2 +} diff --git a/.vscode-test.mjs b/.vscode-test.mjs new file mode 100644 index 0000000..b62ba25 --- /dev/null +++ b/.vscode-test.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from '@vscode/test-cli'; + +export default defineConfig({ + files: 'out/test/**/*.test.js', +}); diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..dd01eb3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": ["dbaeumer.vscode-eslint", "amodio.tsl-problem-matcher", "ms-vscode.extension-test-runner"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..c42edc0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..16a5c02 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false, // set this to true to hide the "out" folder with the compiled JS files + "dist": false // set this to true to hide the "dist" folder with the compiled JS files + }, + "search.exclude": { + "out": true, // set this to false to include "out" folder in search results + "dist": true // set this to false to include "dist" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..c2ab68a --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,40 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$ts-webpack-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "watch-tests", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": "build" + }, + { + "label": "tasks: watch-tests", + "dependsOn": [ + "npm: watch", + "npm: watch-tests" + ], + "problemMatcher": [] + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..d255964 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,14 @@ +.vscode/** +.vscode-test/** +out/** +node_modules/** +src/** +.gitignore +.yarnrc +webpack.config.js +vsc-extension-quickstart.md +**/tsconfig.json +**/eslint.config.mjs +**/*.map +**/*.ts +**/.vscode-test.* diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c92b1f0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "app-developer-copilot" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..99c004a --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# App Developer Copilot + +A VS Code extension that helps you create react-native mobile applications using Copilot. + +## Features + +- Create mobile apps using React Native and Expo +- Generate application architecture and component designs +- Automatically generate TypeScript code for components +- Handle project setup and dependency management +- Uses expo-router for navigation and react-native-paper for theming + +## Requirements + +- Node.js v16.0.0 or higher +- Visual Studio Code 1.95.0 or higher + +## Usage + +1. Open the Command Palette (`Ctrl+Shift+P` or `Cmd+Shift+P`) +2. Type "App Developer Mobile" +3. Select the chat participant and provide your app requirements +4. The extension will: + - Generate app architecture diagram + - Create an Expo project + - Generate component code + - Install required dependencies + +## Chat Participants + +- Mobile App Developer(`@app-developer-mobile`) + +## Commands + +- `create` - Create a new mobile application +- `run` - Run the generated application + +## Extension Development + +Built with: + +- TypeScript +- VS Code Extension API +- Webpack for bundling +- Jest for testing diff --git a/builder.jpeg b/builder.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..356234c51deb340099c7fc387482e6bfdfc3f6b6 GIT binary patch literal 92889 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

GHzRP{e+EnIiT3)~&g%Q8)ZEt*x3rGJpPy); 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≶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 rfKRgn*1)w|1%U}Mar%G(v=10.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", + "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/vscode": { + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", + "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", + "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/type-utils": "8.16.0", + "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", + "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", + "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", + "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/utils": "8.16.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", + "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", + "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", + "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", + "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vscode/test-cli": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.10.tgz", + "integrity": "sha512-B0mMH4ia+MOOtwNiLi79XhA+MLmUItIC8FckEuKrVAVriIuSWjt7vv4+bF8qVFiNFe4QRfzPaIZk39FZGWEwHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mocha": "^10.0.2", + "c8": "^9.1.0", + "chokidar": "^3.5.3", + "enhanced-resolve": "^5.15.0", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^10.2.0", + "supports-color": "^9.4.0", + "yargs": "^17.7.2" + }, + "bin": { + "vscode-test": "out/bin.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^7.0.1", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/c8": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz", + "integrity": "sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=14.14.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combinations": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/combinations/-/combinations-1.0.0.tgz", + "integrity": "sha512-aVgTfI/dewHblSn4gF+NZHvS7wtwg9YAPF2EknHMdH+xLsXLLIMpmHkSj64Zxs/R2m9VAAgn3bENjssrn7V4vQ==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.66", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.66.tgz", + "integrity": "sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.5", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/joi-to-json": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/joi-to-json/-/joi-to-json-4.3.0.tgz", + "integrity": "sha512-j6wV/liW2CmPJBJCAsRHegS91JV2QQtg2J/Z/67VfdSvuE65njCx6DrYZY1cw0BXwlxHewpVtiDnY8W0aaNr+A==", + "license": "MIT", + "dependencies": { + "combinations": "^1.0.0", + "lodash": "^4.17.21", + "semver-compare": "^1.0.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.2.tgz", + "integrity": "sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b508c75 --- /dev/null +++ b/package.json @@ -0,0 +1,67 @@ +{ + "name": "app-developer-copilot", + "displayName": "App Developer Copilot", + "description": "Extension using Copilot to create apps", + "version": "0.0.1", + "engines": { + "vscode": "^1.95.0" + }, + "categories": [ + "Other" + ], + "activationEvents": [], + "main": "./dist/extension.js", + "contributes": { + "chatParticipants": [ + { + "id": "app-developer.mobile", + "fullName": "Mobile App Developer", + "name": "app-developer-mobile", + "description": "I will help you build mobile apps", + "isSticky": true, + "commands": [ + { + "name": "create", + "description": "What would you like to create?" + }, + { + "name": "run", + "description": "Run the app" + } + ] + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run package", + "compile": "webpack", + "watch": "webpack --watch", + "package": "webpack --mode production --devtool hidden-source-map", + "compile-tests": "tsc -p . --outDir out", + "watch-tests": "tsc -p . -w --outDir out", + "pretest": "npm run compile-tests && npm run compile && npm run lint", + "lint": "eslint src", + "test": "vscode-test" + }, + "devDependencies": { + "@types/mocha": "^10.0.9", + "@types/node": "20.x", + "@types/vscode": "^1.95.0", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.4.1", + "eslint": "^9.13.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "^3.4.1", + "ts-loader": "^9.5.1", + "typescript": "^5.6.3", + "webpack": "^5.95.0", + "webpack-cli": "^5.1.4" + }, + "dependencies": { + "joi": "^17.13.3", + "joi-to-json": "^4.3.0" + } +} diff --git a/src/builder/app.ts b/src/builder/app.ts new file mode 100644 index 0000000..a8ee84e --- /dev/null +++ b/src/builder/app.ts @@ -0,0 +1,179 @@ +import * as vscode from 'vscode'; +import { + IInitializeAppResponse, + IResponseBase, + IGenerateCodeResponse, +} from './types'; + +export enum AppStage { + None, + PreCheck, + Initialize, + Design, + GenerateCode, + Build, + Run, + Deploy, + Cancelled, +} + +export interface IAppStageOutput { + messages: vscode.LanguageModelChatMessage[]; + output: T; +} + +export interface IAppStageInput { + previousMessages: vscode.LanguageModelChatMessage[]; + previousOutput: T; +} + +/** + * Base class for the app builder. Works with copilot model to build app in stages. + */ + +export class App { + protected stage: AppStage; + protected model: vscode.LanguageModelChat; + protected stream: vscode.ChatResponseStream; + protected token: vscode.CancellationToken; + private isExecuting: boolean; + private initialInput: string; + + constructor( + model: vscode.LanguageModelChat, + stream: vscode.ChatResponseStream, + token: vscode.CancellationToken, + initialInput: string, + ) { + this.model = model; + this.stream = stream; + this.token = token; + this.initialInput = initialInput; + this.stage = AppStage.None; + this.isExecuting = false; + } + + getStages(): AppStage[] { + // TODO: Add more stages as we implement + return [AppStage.PreCheck, AppStage.Initialize, AppStage.GenerateCode]; + } + + async execute(): Promise { + if (this.isExecuting) { + console.warn('Execution already in progress'); + return; + } + const stages = this.getStages(); + // check if current stage is the last stage + if (this.stage === stages[stages.length - 1]) { + console.warn('Execution already completed'); + return; + } + if (this.stage === AppStage.Cancelled) { + console.warn('Execution cancelled'); + return; + } + if (this.stage === AppStage.None) { + this.isExecuting = true; + } + // start executing stages + try { + const success = await this.precheck(); + if (!success) { + console.error('Precheck failed'); + this.isExecuting = false; + this.setStage(AppStage.Cancelled); + return; + } + + let stageOutput: IAppStageOutput | undefined = undefined; + + for (const stage of stages) { + if (stage === this.stage) { + continue; + } + let currentOutput; + switch (stage) { + case AppStage.Initialize: + currentOutput = await this.initialize(this.initialInput); + break; + case AppStage.GenerateCode: + if (!stageOutput) { + this.setStage(AppStage.Cancelled); + this.isExecuting = false; + throw new Error('No previous output to generate code'); + } + currentOutput = await this.generateCode({ + previousMessages: stageOutput.messages, + previousOutput: stageOutput.output as IInitializeAppResponse, + }); + break; + } + stageOutput = currentOutput; + } + this.isExecuting = false; + } catch (error) { + console.error('Error executing app:', error); + this.stage = AppStage.Cancelled; + throw error; + } + } + + precheck(): Promise { + // Check for pre-requisites + throw new Error('Method not implemented.'); + } + + initialize( + _userMessage: string, + ): Promise> { + // Initialize the application + throw new Error('Method not implemented.'); + } + + // design( + // _input: IAppStageInput, + // ): Promise> { + // // Generate class diagram + // // Generate projet structure + // throw new Error('Method not implemented.'); + // } + + generateCode( + _input: IAppStageInput, + ): Promise> { + // Generate code + throw new Error('Method not implemented.'); + } + + build() { + // Check for errors + throw new Error('Method not implemented.'); + } + + run() { + // Run the application + throw new Error('Method not implemented.'); + } + + deploy() { + // Deploy the application + throw new Error('Method not implemented.'); + } + + setStage(stage: AppStage) { + this.stage = stage; + } + + progress(message: string) { + if (this.stream) { + this.stream.progress(message); + } + } + + markdown(message: string) { + if (this.stream) { + this.stream.markdown(message); + } + } +} diff --git a/src/builder/constants.ts b/src/builder/constants.ts new file mode 100644 index 0000000..7d21c8f --- /dev/null +++ b/src/builder/constants.ts @@ -0,0 +1,5 @@ +export const APP_NAME = 'appdeveloper'; +export const APP_CONFIG_FILE = 'appdev.json'; +export const APP_ARCHITECTURE_DIAGRAM_FILE = 'architecture.md'; +export const CLASS_DIAGRAM_FILE = 'classDiagram.md'; +export const PROJECT_TREE_DIAGRAM_FILE = 'projectTreeDiagram.md'; diff --git a/src/builder/mobile/mobileApp.ts b/src/builder/mobile/mobileApp.ts new file mode 100644 index 0000000..d4ba4ea --- /dev/null +++ b/src/builder/mobile/mobileApp.ts @@ -0,0 +1,297 @@ +import * as vscode from 'vscode'; +import { App, AppStage, IAppStageInput, IAppStageOutput } from '../app'; +import { + convertToMermaidMarkdown, + isMermaidMarkdown, + parseResponse, + sortComponentsByDependency, +} from '../utils/contentUtil'; +import { GenerateCodeForComponentPrompt, InitializeAppPrompt } from '../prompt'; +import { + IGenerateCodeForComponentResponse, + IGenerateCodeResponse, + IInitializeAppResponse, +} from '../types'; +import { + createExpoApp, + installNPMDependencies, + resetExpoProject, +} from '../terminalHelper'; +import { FileParser } from '../utils/fileParser'; +import { + APP_ARCHITECTURE_DIAGRAM_FILE, + CLASS_DIAGRAM_FILE, +} from '../constants'; +import { checkNodeInstallation } from '../utils/nodeUtil'; +import { AppType, createAppConfig } from '../utils/appconfigHelper'; + +const MOBILE_BUILDER_INSTRUCTION = `You are an expert at building mobile apps using react native and expo. +You create apps that uses local storage and doesn't require authentication. +You will write a very long answer. Make sure that every detail of the architecture is, in the end, implemented as code. +Make sure the architecure is simple and straightforward. Use expo-router for navigation. +Do not respond until you receive the request. User will first request design and then code generation. +If the user asks a non-programming question, politely decline to respond.`; + +/** + * Mobile app builder + */ +export class MobileApp extends App { + async precheck(): Promise { + this.setStage(AppStage.PreCheck); + // Check if node is installed + const nodeCheck = await checkNodeInstallation(); + if (!nodeCheck.installed) { + this.markdown( + 'Node.js is not installed. Please install Node.js to proceed', + ); + this.setStage(AppStage.Cancelled); + return false; + } + if (!nodeCheck.meetsMinimum) { + this.markdown( + `Node.js version ${nodeCheck.version} is not supported. Please install Node.js version 16.0.0 or higher to proceed`, + ); + this.setStage(AppStage.Cancelled); + return false; + } + return true; + } + + async initialize( + userMessage?: string, + ): Promise> { + if (!userMessage) { + this.markdown( + 'Please provide a valid input to start building a mobile app', + ); + this.setStage(AppStage.Cancelled); + throw new Error('Invalid input'); + } + this.setStage(AppStage.Initialize); + this.markdown('Lets start building a mobile app'); + + const initializeAppPrompt = new InitializeAppPrompt({ + userMessage: userMessage, + }); + + const initializeAppMessages = [ + vscode.LanguageModelChatMessage.Assistant(MOBILE_BUILDER_INSTRUCTION), + // Add the user's message + vscode.LanguageModelChatMessage.User(initializeAppPrompt.getPromptText()), + ]; + + // send the request + this.progress('Analyzing app requirements'); + let createAppResponse, createAppResponseObj; + try { + [createAppResponse, createAppResponseObj] = + await parseResponse( + this.model, + initializeAppMessages, + this.token, + initializeAppPrompt, + ); + initializeAppMessages.push( + vscode.LanguageModelChatMessage.Assistant(createAppResponse), + ); + } catch (error) { + console.error('MobileBuilder: Error parsing response', error); + throw error; + } + + this.markdown(`Let's call the app: ${createAppResponseObj.name}`); + console.warn(`${JSON.stringify(createAppResponseObj.components)}`); + + this.progress(`Creating app ${createAppResponseObj.name}`); + const formattedAppName = createAppResponseObj.name + .replace(/\s/g, '-') + .toLowerCase(); + // fix app name + createAppResponseObj.name = formattedAppName; + + await this.postInitialize(createAppResponseObj); + + // Create app config + await createAppConfig({ + name: createAppResponseObj.name, + initialPrompt: userMessage, + type: AppType.MOBILE, + }); + + return { + messages: initializeAppMessages, + output: createAppResponseObj, + }; + } + + async postInitialize(createAppResponseObj: IInitializeAppResponse) { + // Create expo project + await createExpoApp(createAppResponseObj.name); + //reset expo project + await resetExpoProject(createAppResponseObj.name); + this.markdown(`Created expo project: ${createAppResponseObj.name}`); + // Design the app + this.progress('Writing the design diagram to the file'); + let designDiagram = createAppResponseObj.design; + if (!isMermaidMarkdown(designDiagram)) { + designDiagram = convertToMermaidMarkdown(designDiagram); + } + await FileParser.parseAndCreateFiles( + [ + { + path: APP_ARCHITECTURE_DIAGRAM_FILE, + content: designDiagram, + }, + ], + createAppResponseObj.name, + ); + this.markdown('Design Diagram saved successfully'); + } + + async generateCode({ + previousMessages, + previousOutput, + }: IAppStageInput): Promise< + IAppStageOutput + > { + const { name: appName, features, components, design } = previousOutput; + this.setStage(AppStage.GenerateCode); + + // Generate code for each component + this.progress('Generating code for components'); + // Generate code for individual components first + const sortedComponents = sortComponentsByDependency(components); + + // Generate code for all components + const generatedCodeByComponent: Map< + string, + IGenerateCodeForComponentResponse + > = new Map(); + let error = false; + const installedDependencies: string[] = []; + + const codeGenerationMessages = [ + ...previousMessages, + vscode.LanguageModelChatMessage.Assistant( + `Lets start generating code for the components one by one. + Do not create placeholder code. + Write the actual code that will be used in production. + Use typescript for the code. + Wait for the code generation request.`, + ), + ]; + + for (const component of sortedComponents) { + const dependentComponents = component.dependsOn || []; + const dependenciesWithContent = []; + // Get dependencies content + for (const dependency of dependentComponents) { + const dependencyContent = generatedCodeByComponent.get(dependency); + if (dependencyContent) { + dependenciesWithContent.push(dependencyContent); + } + } + // Generate code for the component + const codeGenerationPrompt = new GenerateCodeForComponentPrompt({ + name: component.name, + type: component.type, + purpose: component.purpose, + dependencies: dependenciesWithContent, + design, + techStack: + 'For navigation, we will use expo-router. For theming, we will use react-native-paper. Use default theme for the app. For storage, we will use AsyncStorage.', + }); + const messages = [ + ...codeGenerationMessages, + vscode.LanguageModelChatMessage.User( + codeGenerationPrompt.getPromptText(), + ), + ]; + + let codeGenerationResponse, codeGenerationResponseObj; + try { + this.progress(`Generating code for component ${component.name}`); + [codeGenerationResponse, codeGenerationResponseObj] = + await parseResponse( + this.model, + messages, + this.token, + codeGenerationPrompt, + ); + generatedCodeByComponent.set(component.name, codeGenerationResponseObj); + // codeGenerationMessages.push( + // vscode.LanguageModelChatMessage.Assistant(codeGenerationResponse), + // ); + console.info(`Received code for component ${component.name}`); + // Handle assets + if ( + codeGenerationResponseObj.assets && + codeGenerationResponseObj.assets.length > 0 + ) { + console.info(`Component ${component.name} has assets`); + // Save assets + this.progress('Saving assets'); + const files = []; + for (const asset of codeGenerationResponseObj.assets) { + files.push({ + path: asset.filePath, + content: asset.content, + }); + } + await FileParser.parseAndCreateFiles(files, appName); + this.markdown( + 'Assets saved successfully for component: ' + component.name, + ); + } + console.info( + `Component path: ${component.path} \n Received path: ${codeGenerationResponseObj.filePath}`, + ); + //console.info(codeGenerationResponse); + } catch (error) { + console.error( + 'MobileBuilder: Error parsing code generation response for component', + component.name, + error, + ); + this.markdown(`Error generating code for component ${component.name}`); + throw error; + } + + this.markdown( + `Successfully generated the code for component ${component.name}`, + ); + this.progress( + `Writing the code to the file for component ${component.name}`, + ); + + const files = [ + { + path: codeGenerationResponseObj.filePath, + content: codeGenerationResponseObj.content, + }, + ]; + await FileParser.parseAndCreateFiles(files, appName); + + // Install npm dependencies + this.progress('Installing npm dependencies'); + const npmDependencies = codeGenerationResponseObj.libraries || []; + installNPMDependencies(appName, npmDependencies, installedDependencies); + + // TODO: Check if there are any errors + } + this.progress('Components created successfully'); + + return { + messages: codeGenerationMessages, + output: { + appName, + features, + design, + components, + generatedCode: Array.from(generatedCodeByComponent.values()), + error: error ? 'Error generating code for components' : undefined, + summary: 'Successfully generated code for all components', + }, + }; + } +} diff --git a/src/builder/prompt.ts b/src/builder/prompt.ts new file mode 100644 index 0000000..656f7d4 --- /dev/null +++ b/src/builder/prompt.ts @@ -0,0 +1,71 @@ +import Joi from 'joi'; +import parse from 'joi-to-json'; +import { + IInitializeAppResponse, + InitializeAppResponseSchema, + IInitializeAppInput, + IGenerateCodeForComponentInput, + IGenerateCodeForComponentResponse, + GenerateCodeForComponentResponseSchema, +} from './types'; + +export class PromptBase { + protected input: TInput; + /* User message to the LM */ + protected instructions: string; + /* Format for the LM response */ + protected responseSchema: Joi.Schema; + + constructor( + input: TInput, + instructions: string, + responseSchema: Joi.Schema, + ) { + this.input = input; + this.instructions = instructions; + this.responseSchema = responseSchema; + } + + getPromptText(): string { + const responseSchema = parse(this.responseSchema); + return `${this.instructions} Response must be JSON using the following schema: ${JSON.stringify(responseSchema)}`; + } + + validateResponse(response: any): Joi.ValidationResult { + return this.responseSchema.validate(response); + } +} + +export class InitializeAppPrompt extends PromptBase< + IInitializeAppInput, + IInitializeAppResponse +> { + constructor(input: IInitializeAppInput) { + const instructions = ` + First think through the problem and design the app. You don't have to add authentication to the app. + Use default theme for the app and do not configure or create any custom theme. + First, analyse the problem. Decide on features and design the architecture of the app as a mermaid diagram. + Then to implement the app, think through and create components for the app. + Make sure there are no circular dependencies between components. + Make sure the app uses expo-router for navigation and file path of the components are correct. + Assume the app is initialized using 'npx create-expo-app' and uses expo-router with typescript template. + Create app for: ${input.userMessage}.`; + super(input, instructions, InitializeAppResponseSchema); + } +} + +export class GenerateCodeForComponentPrompt extends PromptBase< + IGenerateCodeForComponentInput, + IGenerateCodeForComponentResponse +> { + constructor(input: IGenerateCodeForComponentInput) { + const instructions = `Request: Generate code for component ${input.name}. Purpose of the component: ${input.purpose}. Type: ${input.type}. + Do not create placeholder code. Write the actual code that will be used in production. + If the code uses any media like image, sound etc.. include the media as assets in the code. + This component is part of an expo app. Design of the expo app: ${input.design}. + Reuse code from dependencies if possible. + Component Dependencies: ${JSON.stringify(input.dependencies)}. + Tech stack: ${input.techStack}.`; + super(input, instructions, GenerateCodeForComponentResponseSchema); + } +} diff --git a/src/builder/terminalHelper.ts b/src/builder/terminalHelper.ts new file mode 100644 index 0000000..ba8a459 --- /dev/null +++ b/src/builder/terminalHelper.ts @@ -0,0 +1,51 @@ +import * as vscode from 'vscode'; + +export async function installNPMDependencies( + folderName: string, + dependencies: string[], + installedDependencies: string[], +): Promise { + vscode.window.showInformationMessage('Installing dependencies...'); + for (const dependency of dependencies) { + if (installedDependencies.includes(dependency)) { + console.info(`Dependency ${dependency} already installed`); + continue; + } + await runCommandWithPromise(`npm install ${dependency}`, folderName); + installedDependencies.push(dependency); + } +} + +export async function createExpoApp(appName: string): Promise { + return runCommandWithPromise(`npx create-expo-app ${appName}`); +} + +export async function resetExpoProject(folderName: string): Promise { + return runCommandWithPromise(`npm run reset-project`, folderName); +} + +export async function runExpoProject(folderName: string): Promise { + return runCommandWithPromise(`npm run start`, folderName); +} + +function runCommandWithPromise( + command: string, + folder?: string, +): Promise { + const terminal = vscode.window.createTerminal(); + terminal.show(); + if (folder) { + terminal.sendText(`cd ${folder}`); + } + terminal.sendText(command); + return new Promise((resolve) => { + const disposable = vscode.window.onDidEndTerminalShellExecution((e) => { + if (e.exitCode === 0 && e.terminal.processId === terminal.processId) { + disposable.dispose(); + resolve(); + } else { + throw new Error('Failed to run command: ' + command); + } + }); + }); +} diff --git a/src/builder/types.ts b/src/builder/types.ts new file mode 100644 index 0000000..c62810a --- /dev/null +++ b/src/builder/types.ts @@ -0,0 +1,154 @@ +import Joi from 'joi'; + +export interface IResponseBase { + summary: string; + error?: string; +} + +export const ResponseBaseSchema = Joi.object({ + summary: Joi.string().optional().description('Summary of the user message'), + error: Joi.string() + .optional() + .description( + 'Error message if any if not able to respond to message in the suggested format', + ) + .allow(null), +}); + +export enum ComponetType { + Util = 'util', + Factory = 'factory', + Service = 'service', + UI = 'ui_component', + Screen = 'screen', + Config = 'config', + Model = 'model', + Layout = 'layout', + Media = 'media', +} + +export interface ICodeComponent { + name: string; + type: ComponetType; + purpose: string; + path: string; + dependsOn?: string[]; +} + +export const CodeComponentSchema = Joi.object({ + name: Joi.string().required().description('Name of the component'), + type: Joi.string() + .valid(...Object.values(ComponetType)) + .required() + .description('Type of the component'), + purpose: Joi.string().required().description('Purpose of the component'), + path: Joi.string().required().description('Path of the component'), + dependsOn: Joi.array() + .items(Joi.string()) + .optional() + .description('List of components this component depends on'), +}); + +export interface IInitializeAppInput { + userMessage: string; +} + +export interface IInitializeAppResponse extends IResponseBase { + name: string; + features: string[]; + design: string; + components: ICodeComponent[]; +} + +export const InitializeAppResponseSchema = Joi.object({ + name: Joi.string().required().description('Name of the app'), + features: Joi.array() + .items(Joi.string()) + .required() + .description('Minimum features of the app'), //TODO: Generate advanced features after the MVP + design: Joi.string() + .required() + .description('Design of the app as a mermaid diagram'), + components: Joi.array() + .items(CodeComponentSchema) + .required() + .description('Components of the app'), + summary: Joi.string().optional().description('Summary of the user message'), + error: Joi.string() + .optional() + .description( + 'Error message if any if not able to respond to message in the suggested format', + ) + .allow(null), +}); + +export interface ICodeFile { + componentName: string; + filePath: string; + content: string; +} + +export interface IGenerateCodeForComponentInput { + name: string; + type: string; + purpose: string; + dependencies: IGenerateCodeForComponentResponse[]; + projectStructure?: string; + design: string; + techStack: string; +} + +export interface IGenerateCodeForComponentResponse extends IResponseBase { + componentName: string; + filePath: string; + content: string; + assets?: ICodeFile[]; + libraries: string[]; +} + +export const GenerateCodeForComponentResponseSchema = + Joi.object({ + componentName: Joi.string().required().description('Name of the component'), + filePath: Joi.string().required().description('File path of the component'), + content: Joi.string() + .required() + .description( + 'Generated code for the component. Escape the string before sending.', + ), + assets: Joi.array() + .optional() + .items( + Joi.object({ + componentName: Joi.string() + .required() + .description('Name of the asset'), + filePath: Joi.string() + .required() + .description('File path of the asset'), + content: Joi.string() + .required() + .description( + 'Content of the asset. Escape the string before sending.', + ), + }), + ), + libraries: Joi.array() + .items(Joi.string()) + .optional() + .description('List of external libraries used in the component'), + summary: Joi.string().optional().description('Summary of the component'), + error: Joi.string() + .optional() + .description( + 'Error message if any if not able to respond to message in the suggested format', + ) + .allow(null), + }); + +export interface IGenerateCodeResponse extends IResponseBase { + appName: string; + features: string[]; + design: string; + components: ICodeComponent[]; + generatedCode: IGenerateCodeForComponentResponse[]; +} diff --git a/src/builder/utils/appconfigHelper.ts b/src/builder/utils/appconfigHelper.ts new file mode 100644 index 0000000..d92fb4e --- /dev/null +++ b/src/builder/utils/appconfigHelper.ts @@ -0,0 +1,61 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; + +import { APP_CONFIG_FILE } from '../constants'; +import { FileParser } from './fileParser'; + +export enum AppType { + MOBILE = 'mobile', + WEB = 'web', + API = 'api', +} + +export interface AppConfig { + name: string; + initialPrompt: string; + type: AppType; + hasDatabase?: boolean; + hasAuth?: boolean; +} + +export async function createAppConfig(app: AppConfig) { + // create a file with the app manifest + const appManifest: AppConfig = { + name: app.name, + initialPrompt: app.initialPrompt, + type: app.type, + }; + const content = JSON.stringify(appManifest, null, 2); + await FileParser.parseAndCreateFiles( + [ + { + path: APP_CONFIG_FILE, + content, + }, + ], + app.name, + ); +} + +export async function getAppConfig(appName: string): Promise { + const workspaceFolder = await FileParser.getWorkspaceFolder(); + if (!workspaceFolder) { + throw new Error('No workspace folder selected'); + } + try { + const content = await FileParser.readFile( + path.join(workspaceFolder, appName, APP_CONFIG_FILE), + ); + return JSON.parse(content); + } catch (error) { + console.error('Failed to read app config:', error); + return {} as AppConfig; + } +} + +export async function readAppConfigFromFile( + appConfigFilePath: string, +): Promise { + const content = await FileParser.readFile(appConfigFilePath); + return JSON.parse(content); +} diff --git a/src/builder/utils/contentUtil.ts b/src/builder/utils/contentUtil.ts new file mode 100644 index 0000000..f1ebcf2 --- /dev/null +++ b/src/builder/utils/contentUtil.ts @@ -0,0 +1,157 @@ +import * as vscode from 'vscode'; +import { PromptBase } from '../prompt'; +import { ICodeComponent } from '../types'; + +const MAX_RETRY_COUNT = 1; + +export function isMarkdown(response: string): boolean { + const markdownPatterns = [ + /^#{1,6}\s+/m, // Headers (e.g., # Header, ## Header) + /```[\s\S]*?```/m, // Code blocks (e.g., ```code```) + /^\s*[-*+]\s+/m, // Unordered lists (e.g., - item, * item, + item) + /^\s*\d+\.\s+/m, // Ordered lists (e.g., 1. item, 2. item) + /\[.*?\]\(.*?\)/m, // Links (e.g., [text](url)) + /!\[.*?\]\(.*?\)/m, // Images (e.g., ![alt](url)) + />\s+/m, // Blockquotes (e.g., > quote) + /`[^`]*`/m, // Inline code (e.g., `code`) + ]; + + return markdownPatterns.some((pattern) => pattern.test(response)); +} + +const codeBlockRegex = /^```[\s\S]*(.+)```$/m; + +export function isCodeBlock(response: string): boolean { + return codeBlockRegex.test(response); +} + +export function extractJsonFromMarkdown(markdown: string): any { + const jsonRegex = /```json\s*([\s\S]*?)\s*```(?![\s\S]*```)/; + + const match = markdown.match(jsonRegex); + + if (match && match[1]) { + try { + const jsonString = match[1].trim(); + return JSON.parse(jsonString); + } catch (error) { + console.error('Failed to parse JSON:', error); + return null; + } + } + + console.error('No JSON found in the Markdown string.'); + return null; +} + +export function extractCodeFromMarkdown(markdown: string): string { + const match = markdown.match(codeBlockRegex); + + if (match && match[1]) { + return match[1].trim(); + } + + console.error('No code block found in the Markdown string.'); + return ''; +} + +export function isMermaidMarkdown(response: string): boolean { + return response.trim().startsWith('```mermaid'); +} + +export function convertToMermaidMarkdown(diagram: string): string { + const mermaidMarkdown = '```mermaid\n' + diagram + '\n```'; + return mermaidMarkdown; +} + +export async function parseResponse( + model: vscode.LanguageModelChat, + messages: vscode.LanguageModelChatMessage[], + token: vscode.CancellationToken, + prompt: PromptBase<{}, T>, + retryCount: number = 0, +): Promise<[string, T]> { + if (retryCount > MAX_RETRY_COUNT) { + throw new Error('Failed to parse response after multiple attempts'); + } + // make request to the LM + const response = await model.sendRequest(messages, {}, token); + + let responseContent = ''; + for await (const fragment of response.text) { + responseContent += fragment; + } + + // Check if the response is in Markdown format + let jsonResponse: any = null; + try { + jsonResponse = JSON.parse(responseContent); + } catch (error) { + console.warn('Failed to parse code response as JSON:', error); + console.info('Checking if response is in Markdown format...'); + if (isMarkdown(responseContent)) { + jsonResponse = extractJsonFromMarkdown(responseContent); + } else { + console.error( + 'Response is not in JSON markdown format. Attempting retry', + responseContent, + ); + // TODO: try adding a fix message here + return parseResponse(model, messages, token, prompt, retryCount + 1); + } + } + + // check if response is valid schema + const validationResult = prompt.validateResponse(jsonResponse); + if (validationResult.error) { + console.error('Invalid response schema:', validationResult.error.message); + // Continue with the response even if it's not a valid schema + //throw new Error('Invalid response schema'); + console.error(responseContent); + } + + const parsedResponse = validationResult.value as T; + return [responseContent, parsedResponse]; +} + +export function sortComponentsByDependency( + nodes: ICodeComponent[], +): ICodeComponent[] { + const componentMap = new Map(); + nodes.forEach((node) => { + componentMap.set(node.name, node); + }); + + const sortedNodes: ICodeComponent[] = []; + while (nodes.length > sortedNodes.length) { + for (const node of nodes) { + // Check if the node is sorted + if (sortedNodes.find((sortedNode) => node.name === sortedNode.name)) { + continue; + } + + const dependencies = node.dependsOn || []; + if (!dependencies || dependencies.length === 0) { + sortedNodes.push(node); + continue; + } + let dependeciesFound = true; + for (const dependency of dependencies) { + // check if the dependency is on one of the nodes + if (!componentMap.has(dependency)) { + continue; // External dependency. Skip checking in sorted nodes + } + // check if the dependency is already sorted + if (sortedNodes.some((sortedNode) => sortedNode.name === dependency)) { + continue; + } + dependeciesFound = false; + break; // dependency not sorted yet + } + if (dependeciesFound) { + sortedNodes.push(node); + } + } + } + return sortedNodes; +} diff --git a/src/builder/utils/fileParser.ts b/src/builder/utils/fileParser.ts new file mode 100644 index 0000000..2293fce --- /dev/null +++ b/src/builder/utils/fileParser.ts @@ -0,0 +1,130 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import { extractCodeFromMarkdown, isCodeBlock } from './contentUtil'; + +interface ParsedFile { + path: string; + content: string; +} + +export interface IFile { + path: string; + content: string; +} + +export class FileParser { + /** + * Create or replace files in the workspace based on the response + * @param files List of files to create/replace + * @param pathPrefix Files must be prefixed with this path + * @param baseDir + */ + static async parseAndCreateFiles( + files: IFile[], + pathPrefix: string, + baseDir?: string, + ): Promise { + // Get workspace directory if not provided + if (!baseDir) { + const workspaceFolder = await FileParser.getWorkspaceFolder(); + if (!workspaceFolder) { + throw new Error('No workspace folder selected'); + } + baseDir = workspaceFolder; + } + + // Create files + for (const file of files) { + // check if file path is prefixed with pathPrefix + if (!file.path.startsWith(pathPrefix)) { + const newPath = path.join(pathPrefix, file.path); + console.info(`Converting ${file.path} to ${newPath}`); + file.path = newPath; + } + await FileParser.createFile(baseDir, file); + } + } + + static async getWorkspaceFolder(): Promise { + const workspaceFolders = vscode.workspace.workspaceFolders; + + if (!workspaceFolders) { + const selected = await vscode.window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + title: 'Select folder for generated files', + }); + return selected?.[0].fsPath; + } + + if (workspaceFolders.length === 1) { + return workspaceFolders[0].uri.fsPath; + } + + const selected = await vscode.window.showQuickPick( + workspaceFolders.map((folder) => ({ + label: folder.name, + uri: folder.uri, + })), + { placeHolder: 'Select workspace folder' }, + ); + + return selected?.uri.fsPath; + } + + private static async createFile( + baseDir: string, + file: ParsedFile, + ): Promise { + const fullPath = path.join(baseDir, file.path); + + // Create directory if it doesn't exist + const dirPath = path.dirname(fullPath); + await vscode.workspace.fs.createDirectory(vscode.Uri.file(dirPath)); + console.info(`Created directory: ${dirPath}`); + + // Create file + const uri = vscode.Uri.file(fullPath); + // check if the file content is a markdown + let fileContent = file.content; + if (isCodeBlock(file.content)) { + fileContent = extractCodeFromMarkdown(file.content); + } + if (!fileContent) { + console.error(`No content found for file: ${file.path}`); + } + const content = new TextEncoder().encode(file.content); + + await vscode.workspace.fs.writeFile(uri, content); + + // Open the file + const doc = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(doc, { preview: false }); + + // Format document if possible + try { + await vscode.commands.executeCommand('editor.action.formatDocument'); + } catch (error) { + // Ignore formatting errors + } finally { + // Save file + await doc.save(); + } + console.info(`Created file: ${fullPath}`); + } + + static async readFile(filePath: string): Promise { + return new Promise((resolve, reject) => { + vscode.workspace.fs.readFile(vscode.Uri.file(filePath)).then( + (data) => { + const content = new TextDecoder().decode(data); + resolve(content); + }, + (error) => { + reject(error); + }, + ); + }); + } +} diff --git a/src/builder/utils/nodeUtil.ts b/src/builder/utils/nodeUtil.ts new file mode 100644 index 0000000..c673d89 --- /dev/null +++ b/src/builder/utils/nodeUtil.ts @@ -0,0 +1,47 @@ +import { exec } from 'child_process'; +import { promisify } from 'util'; + +const execAsync = promisify(exec); + +interface NodeVersionCheck { + installed: boolean; + version?: string; + error?: string; + meetsMinimum: boolean; +} + +export async function checkNodeInstallation( + minVersion: string = '16.0.0', +): Promise { + try { + // Check node version + const { stdout } = await execAsync('node --version'); + const version = stdout.trim().replace('v', ''); + + // Compare versions + const meetsMinimum = compareVersions(version, minVersion) >= 0; + + return { + installed: true, + version, + meetsMinimum, + }; + } catch (error: any) { + return { + installed: false, + error: error && error.message ? error.message : error, + meetsMinimum: false, + }; + } +} + +function compareVersions(a: string, b: string): number { + const partsA = a.split('.').map(Number); + const partsB = b.split('.').map(Number); + + for (let i = 0; i < 3; i++) { + if (partsA[i] > partsB[i]) return 1; + if (partsA[i] < partsB[i]) return -1; + } + return 0; +} diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..d0c74af --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,75 @@ +import * as vscode from 'vscode'; +import { MobileApp } from './builder/mobile/mobileApp'; +import { FileParser } from './builder/utils/fileParser'; +import { APP_CONFIG_FILE } from './builder/constants'; +import { runExpoProject } from './builder/terminalHelper'; +import { readAppConfigFromFile } from './builder/utils/appconfigHelper'; + +export function activate(context: vscode.ExtensionContext) { + registerChatParticipants(context); +} + +function registerChatParticipants(context: vscode.ExtensionContext) { + const mobileAppHanlder: vscode.ChatRequestHandler = async ( + request: vscode.ChatRequest, + _context: vscode.ChatContext, + stream: vscode.ChatResponseStream, + token: vscode.CancellationToken, + ) => { + if (request.command === 'create') { + console.log('MobileBuilder: Create command called'); + await handleCreateMobileApp(stream, request, token); + } else if (request.command === 'run') { + const workspaceFolder = await FileParser.getWorkspaceFolder(); + if (!workspaceFolder) { + stream.markdown('MobileBuilder: No workspace folder selected'); + return; + } + await vscode.workspace + .findFiles(`**/${APP_CONFIG_FILE}`) + .then(async (files) => { + if (files.length === 0) { + stream.markdown('MobileBuilder: No app.json found'); + return; + } + const appJsonPath = files[0].fsPath; + const appJson = await readAppConfigFromFile(appJsonPath); + const appName = appJson.name; + stream.markdown(`MobileBuilder: Running app ${appName}`); + runExpoProject(appName); + }); + } else { + console.log('MobileBuilder: No command found'); + const chatResponse = await request.model.sendRequest( + [vscode.LanguageModelChatMessage.User(request.prompt)], + {}, + token, + ); + for await (const fragment of chatResponse.text) { + stream.markdown(fragment); + } + } + return; + }; + + const mobileBuilder = vscode.chat.createChatParticipant( + 'app-developer.mobile', + mobileAppHanlder, + ); + mobileBuilder.iconPath = vscode.Uri.joinPath( + context.extensionUri, + 'builder.jpeg', + ); +} + +async function handleCreateMobileApp( + stream: vscode.ChatResponseStream, + request: vscode.ChatRequest, + token: vscode.CancellationToken, +) { + console.log('MobileBuilder: Create command called'); + const app = new MobileApp(request.model, stream, token, request.prompt); + await app.execute(); +} + +export function deactivate() {} diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts new file mode 100644 index 0000000..4ca0ab4 --- /dev/null +++ b/src/test/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.strictEqual(-1, [1, 2, 3].indexOf(5)); + assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ad7e465 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "outDir": "dist", + "lib": ["ES2020"], + "sourceMap": true, + "rootDir": "src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUnusedParameters": true + }, + "exclude": ["node_modules", ".vscode-test"] +} diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md new file mode 100644 index 0000000..f518bb8 --- /dev/null +++ b/vsc-extension-quickstart.md @@ -0,0 +1,48 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your extension. +* `package.json` - this is the manifest file in which you declare your extension and command. + * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. +* `src/extension.ts` - this is the main file where you will provide the implementation of your command. + * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. + * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. + +## Setup + +* install the recommended extensions (amodio.tsl-problem-matcher, ms-vscode.extension-test-runner, and dbaeumer.vscode-eslint) + + +## Get up and running straight away + +* Press `F5` to open a new window with your extension loaded. +* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. +* Set breakpoints in your code inside `src/extension.ts` to debug your extension. +* Find output from your extension in the debug console. + +## Make changes + +* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + + +## Explore the API + +* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. + +## Run tests + +* Install the [Extension Test Runner](https://marketplace.visualstudio.com/items?itemName=ms-vscode.extension-test-runner) +* Run the "watch" task via the **Tasks: Run Task** command. Make sure this is running, or tests might not be discovered. +* Open the Testing view from the activity bar and click the Run Test" button, or use the hotkey `Ctrl/Cmd + ; A` +* See the output of the test result in the Test Results view. +* Make changes to `src/test/extension.test.ts` or create new test files inside the `test` folder. + * The provided test runner will only consider files matching the name pattern `**.test.ts`. + * You can create folders inside the `test` folder to structure your tests any way you want. + +## Go further + +* Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). +* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. +* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..37d7024 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,48 @@ +//@ts-check + +'use strict'; + +const path = require('path'); + +//@ts-check +/** @typedef {import('webpack').Configuration} WebpackConfig **/ + +/** @type WebpackConfig */ +const extensionConfig = { + target: 'node', // VS Code extensions run in a Node.js-context πŸ“– -> https://webpack.js.org/configuration/node/ + mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + + entry: './src/extension.ts', // the entry point of this extension, πŸ“– -> https://webpack.js.org/configuration/entry-context/ + output: { + // the bundle is stored in the 'dist' folder (check package.json), πŸ“– -> https://webpack.js.org/configuration/output/ + path: path.resolve(__dirname, 'dist'), + filename: 'extension.js', + libraryTarget: 'commonjs2' + }, + externals: { + vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, πŸ“– -> https://webpack.js.org/configuration/externals/ + // modules added here also need to be added in the .vscodeignore file + }, + resolve: { + // support reading TypeScript and JavaScript files, πŸ“– -> https://github.com/TypeStrong/ts-loader + extensions: ['.ts', '.js'] + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + devtool: 'nosources-source-map', + infrastructureLogging: { + level: "log", // enables logging required for problem matchers + }, +}; +module.exports = [ extensionConfig ]; \ No newline at end of file