From 32ff6d6d11b883a26fe1df000cbd2bbfe4a42f56 Mon Sep 17 00:00:00 2001 From: Cristiam Da Silva Date: Mon, 15 Jul 2024 17:06:45 +0200 Subject: [PATCH 01/67] Release 0.0.32 (#40) * 3 cli setup testing framework (#35) * test: setup jest configuration with typescript * refactor: removed path alias and changed simulator service toa class injected in the command declaration * test: added init action adn command tests * docs: added testing section on readme file * fix: handle Fetch Error (Mac M3) * refactor: improved function response * fix: await for runSimulator async function * fix: added init action test * fix: solving conflicts * test: added reset docker images and containers calls from init * 33 cli add a warning at init to say that the config is going to be overwritten (#38) * feat: added initial warning about reseting the setup * test: added a test for new step introduced * 37 cli run simulator on certain branch (#39) * feat: added initial warning about reseting the setup * test: added a test for new step introduced * feat: added optional branch when fetching the simulator from github * feat: added branch name on init and up commands * test: added tests for branch option on init command * 41 cli add beta releases for staging branch (#42) * chore: added npm command for beta release * ci: added github action for beta release * Release v0.0.32-beta.0 [skip ci] * 43 cli fix missing endpoints and simulator response (#44) * fix: removed non existing simulator endpoint * refactor: adapted ping simulator response for current and next version * tests: removed non existing simulator endpoint test * Release v0.0.32-beta.1 [skip ci] * 43 cli fix missing endpoints and simulator response (#45) * fix: removed non existing simulator endpoint * refactor: adapted ping simulator response for current and next version * tests: removed non existing simulator endpoint test * Release v0.0.32-beta.2 [skip ci] --------- Co-authored-by: github-actions[bot] --- .github/workflows/publish-beta.yml | 41 ++ CHANGELOG.md | 6 + README.md | 28 ++ jest.config.js | 6 +- package-lock.json | 194 +++++---- package.json | 11 +- src/commands/general/index.ts | 15 +- src/commands/general/init.ts | 92 ++--- src/commands/general/start.ts | 67 +--- src/lib/clients/system.ts | 2 +- src/lib/interfaces/ISimulatorService.ts | 36 ++ src/lib/services/simulator.ts | 406 +++++++++---------- src/types/node-fetch.d.ts | 1 + tests/actions/init.test.ts | 508 ++++++++++++++++++++++++ tests/commands/init.test.ts | 39 +- tests/utils.ts | 4 +- tsconfig.json | 12 +- 17 files changed, 1056 insertions(+), 412 deletions(-) create mode 100644 .github/workflows/publish-beta.yml create mode 100644 src/lib/interfaces/ISimulatorService.ts create mode 100644 src/types/node-fetch.d.ts create mode 100644 tests/actions/init.test.ts diff --git a/.github/workflows/publish-beta.yml b/.github/workflows/publish-beta.yml new file mode 100644 index 00000000..77678e39 --- /dev/null +++ b/.github/workflows/publish-beta.yml @@ -0,0 +1,41 @@ +name: Release & Publish Beta version of the Package to NPM with @beta tag + +on: + workflow_dispatch: + push: + branches: + - staging + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Get CI Bot Token + uses: tibdex/github-app-token@v1 + id: ci_bot_token + with: + app_id: ${{ secrets.CI_BOT_APP_ID }} + private_key: ${{ secrets.CI_BOT_SECRET }} + + - name: Checkout source code + uses: actions/checkout@v4 + with: + token: ${{ steps.ci_bot_token.outputs.token }} + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: "18" + - name: Install the dependencies + run: npm ci + - name: Initialize Git User + run: | + git config --global user.email "github-actions[bot]@genlayer.com" + git config --global user.name "github-actions[bot]" + - name: Initialize the NPM configuration + run: npm config set //registry.npmjs.org/:_authToken=$NPM_AUTH_TOKEN + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + - run: npm run release-beta + env: + GITHUB_TOKEN: ${{ steps.ci_bot_token.outputs.token }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index dea86730..e2441d1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ +## 0.0.32-beta.2 (2024-07-03) + +## 0.0.32-beta.1 (2024-07-03) + +## 0.0.32-beta.0 (2024-07-03) + ## 0.0.31 (2024-05-27) diff --git a/README.md b/README.md index 33e2a067..acc096aa 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,12 @@ Contributions to the GenLayer CLI are welcome! Please feel free to fork the repo ### Running the CLI from the repository First, install the dependencies and start the build process + ```bash npm install npm run dev ``` + This will continuously rebuild the CLI from the source Then in another window execute the CLI commands like so: @@ -41,6 +43,32 @@ Then in another window execute the CLI commands like so: node dist/index.js init ``` +## Testing + +### Overview + +The GenLayer CLI uses Jest in combination with ts-jest to handle testing of TypeScript files. The configuration is tailored to support ES Modules (ESM), aligning with the latest JavaScript standards and ensuring compatibility with modern tooling and Node.js features. + +### Running Tests + +To run the tests, use the following command: + +```bash +npm run test +``` + +This command sets the appropriate Node.js options to handle ES Modules and watches for changes in the test files, making it suitable for development. + +### Test Configuration + +Our `jest.config.js` is set up as follows: + +- ES Module Support: Configured to treat .ts files as ES Modules. +- Test Environment: Uses Node.js as the testing environment. +- Transformation: Utilizes ts-jest with an ESM preset to process TypeScript files. + +Tests are located in the tests/ directory and should be named using the following pattern: [filename].test.ts. When writing tests, you can use all Jest functionalities such as describe, test, expect, and Jest mocks for testing asynchronous functions, component interactions, or API calls. + ## License This project is licensed under the ... License - see the [LICENSE](LICENSE) file for details. diff --git a/jest.config.js b/jest.config.js index 2ab4265c..c91a9aa8 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,8 +1,4 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", - moduleNameMapper: { - "^@/(.*)$": "/src/$1", - }, + preset: "ts-jest/presets/default-esm", }; diff --git a/package-lock.json b/package-lock.json index 830877a9..4fcfd216 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "genlayer", - "version": "0.0.31", + "version": "0.0.32-beta.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.0.31", + "version": "0.0.32-beta.2", "license": "ISC", "dependencies": { "commander": "^12.0.0", "dotenv": "^16.4.5", "inquirer": "^9.2.19", - "node-fetch": "^3.3.2", + "node-fetch": "^2.7.0", "open": "^10.1.0", "uuid": "^9.0.1" }, @@ -37,7 +37,7 @@ "jest": "^29.7.0", "prettier": "^3.2.5", "release-it": "^17.2.0", - "ts-jest": "^29.1.2", + "ts-jest": "^29.1.3", "ts-node": "^10.9.2", "typescript": "^5.4.5" } @@ -97,21 +97,21 @@ } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -148,12 +148,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -259,16 +259,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -278,33 +278,33 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -320,9 +320,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -338,14 +338,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -438,9 +438,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -641,19 +641,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -671,13 +671,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3548,6 +3548,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, "engines": { "node": ">= 12" } @@ -4641,6 +4642,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, "funding": [ { "type": "github", @@ -4765,6 +4767,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -7206,6 +7209,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, "funding": [ { "type": "github", @@ -7221,20 +7225,22 @@ } }, "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "4.x || >=6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-int64": { @@ -8529,6 +8535,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/release-it/node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -9577,6 +9601,11 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -9590,9 +9619,9 @@ } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz", + "integrity": "sha512-6L9qz3ginTd1NKhOxmkP0qU3FyKjj5CPoY+anszfVn6Pmv/RIKzhiMCsH7Yb7UvJR9I2A64rm4zQl531s2F1iw==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -9608,10 +9637,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -9621,6 +9651,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -10087,10 +10120,25 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, "engines": { "node": ">= 8" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 17175a89..79936d8b 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,17 @@ { "name": "genlayer", - "version": "0.0.31", + "version": "0.0.32-beta.2", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { "genlayer": "./dist/index.js" }, "scripts": { - "test": "jest", + "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --watch", "dev": "cross-env NODE_ENV=development node esbuild.config.js", "build": "cross-env NODE_ENV=production node esbuild.config.js", - "release": "release-it --ci" + "release": "release-it --ci", + "release-beta": "release-it --ci --preRelease=beta" }, "repository": { "type": "git", @@ -47,7 +48,7 @@ "jest": "^29.7.0", "prettier": "^3.2.5", "release-it": "^17.2.0", - "ts-jest": "^29.1.2", + "ts-jest": "^29.1.3", "ts-node": "^10.9.2", "typescript": "^5.4.5" }, @@ -55,7 +56,7 @@ "commander": "^12.0.0", "dotenv": "^16.4.5", "inquirer": "^9.2.19", - "node-fetch": "^3.3.2", + "node-fetch": "^2.7.0", "open": "^10.1.0", "uuid": "^9.0.1" } diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 5769be59..764ec6af 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -1,22 +1,25 @@ import {Command} from "commander"; -import {initAction} from "./init"; -import {startAction} from "./start"; +import simulatorService from "../../lib/services/simulator"; + +import {initAction, InitActionOptions} from "./init"; +import {startAction, StartActionOptions} from "./start"; export function initializeGeneralCommands(program: Command) { program .command("init") .description("Initialize the GenLayer Environment") - .option("-n, --numValidators ", "Number of validators", "5") - .action(initAction); + .option("--numValidators ", "Number of validators", "5") + .option("--branch ", "Branch", "main") + .action((options: InitActionOptions) => initAction(options, simulatorService)); program .command("up") .description("Starts GenLayer's simulator") - .option("--no-reset-accounts", "Don't restart the database for accouts and transactions", true) .option("--reset-validators", "Remove all current validators and create new random ones", false) .option("--numValidators ", "Number of validators", "5") - .action(startAction); + .option("--branch ", "Branch", "main") + .action((options: StartActionOptions) => startAction(options, simulatorService)); return program; } diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 140caaf0..a85ee730 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -1,27 +1,10 @@ import inquirer from "inquirer"; -import {AI_PROVIDERS_CONFIG, AiProviders} from "@/lib/config/simulator"; -import { - initializeDatabase, - checkRequirements, - downloadSimulator, - configSimulator, - runSimulator, - waitForSimulatorToBeReady, - updateSimulator, - clearAccountsAndTransactionsDatabase, - createRandomValidators, - deleteAllValidators, - pullOllamaModel, - getAiProvidersOptions, - getSimulatorLocation, - getFrontendUrl, - openFrontend, - resetDockerContainers, - resetDockerImages, -} from "@/lib/services/simulator"; +import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; +import {AI_PROVIDERS_CONFIG, AiProviders} from "../../lib/config/simulator"; export interface InitActionOptions { numValidators: number; + branch: string; } function getRequirementsErrorMessage({git, docker}: Record): string { @@ -37,12 +20,10 @@ function getRequirementsErrorMessage({git, docker}: Record): st return ""; } -export async function initAction(options: InitActionOptions) { - console.log(`Initializing GenLayer CLI with ${options.numValidators} validators`); - +export async function initAction(options: InitActionOptions, simulatorService: ISimulatorService) { // Check if git and docker are installed try { - const {git, docker} = await checkRequirements(); + const {git, docker} = await simulatorService.checkRequirements(); const errorMessage = getRequirementsErrorMessage({git, docker}); if (errorMessage) { console.log( @@ -56,11 +37,28 @@ export async function initAction(options: InitActionOptions) { return; } + // Ask for confirmation on reseting the GenLayer Simulator from GitHub + const resetAnswers = await inquirer.prompt([ + { + type: "confirm", + name: "confirmReset", + message: `This command is going to reset GenLayer docker images and containers, providers API Keys, and GenLayer database (accounts, transactions, and validators). Do you want to continue?`, + default: true, + }, + ]); + + if (!resetAnswers.confirmReset) { + console.log("Aborted!"); + return; + } + + console.log(`Initializing GenLayer CLI with ${options.numValidators} validators`); + // Reset Docker containers and images console.log(`Resetting Docker containers and images...`); try { - await resetDockerContainers(); - await resetDockerImages(); + await simulatorService.resetDockerContainers(); + await simulatorService.resetDockerImages(); } catch (error) { console.error(error); return; @@ -71,7 +69,7 @@ export async function initAction(options: InitActionOptions) { { type: "confirm", name: "confirmDownload", - message: `This action is going to download the GenLayer Simulator from GitHub into "${getSimulatorLocation()}". Do you want to continue?`, + message: `This action is going to download the GenLayer Simulator from GitHub (branch ${options.branch}) into "${simulatorService.getSimulatorLocation()}". Do you want to continue?`, default: true, }, ]); @@ -84,9 +82,9 @@ export async function initAction(options: InitActionOptions) { // Download the GenLayer Simulator from GitHub console.log(`Downloading GenLayer Simulator from GitHub...`); try { - const {wasInstalled} = await downloadSimulator(); + const {wasInstalled} = await simulatorService.downloadSimulator(options.branch); if (wasInstalled) { - await updateSimulator(); + await simulatorService.updateSimulator(options.branch); } } catch (error) { console.error(error); @@ -99,7 +97,7 @@ export async function initAction(options: InitActionOptions) { type: "checkbox", name: "selectedLlmProviders", message: "Select which LLM providers do you want to use:", - choices: getAiProvidersOptions(true), + choices: simulatorService.getAiProvidersOptions(true), validate: function (answer: string[]) { if (answer.length < 1) { return "You must choose at least one option."; @@ -141,7 +139,7 @@ export async function initAction(options: InitActionOptions) { console.log("Configuring GenLayer Simulator environment..."); try { - await configSimulator(aiProvidersEnvVars); + await simulatorService.configSimulator(aiProvidersEnvVars); } catch (error) { console.error(error); return; @@ -150,14 +148,15 @@ export async function initAction(options: InitActionOptions) { // Run the GenLayer Simulator console.log("Running the GenLayer Simulator..."); try { - runSimulator(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + await simulatorService.runSimulator(); } catch (error) { console.error(error); return; } try { - const {initialized, errorCode, errorMessage} = await waitForSimulatorToBeReady(); + const {initialized, errorCode, errorMessage} = await simulatorService.waitForSimulatorToBeReady(); if (!initialized && errorCode === "ERROR") { console.log(errorMessage); console.error("Unable to initialize the GenLayer simulator. Please try again."); @@ -178,32 +177,16 @@ export async function initAction(options: InitActionOptions) { // Ollama doesn't need changes in configuration, we just run it if (selectedLlmProviders.includes("ollama")) { console.log("Pulling llama3 from Ollama..."); - await pullOllamaModel(); - } - - // Initialize the database - console.log("Initializing the database..."); - try { - //remove everything from the database - await clearAccountsAndTransactionsDatabase(); - - const {createResponse, tablesResponse} = await initializeDatabase(); - if (!createResponse || !tablesResponse) { - console.error("Unable to initialize the database. Please try again."); - return; - } - } catch (error) { - console.error(error); - return; + await simulatorService.pullOllamaModel(); } // Initializing validators console.log("Initializing validators..."); try { //remove all validators - await deleteAllValidators(); + await simulatorService.deleteAllValidators(); // create random validators - await createRandomValidators(Number(options.numValidators), selectedLlmProviders); + await simulatorService.createRandomValidators(Number(options.numValidators), selectedLlmProviders); } catch (error) { console.error("Unable to initialize the validators."); console.error(error); @@ -212,10 +195,11 @@ export async function initAction(options: InitActionOptions) { // Simulator ready console.log( - `GenLayer simulator initialized successfully! Go to ${getFrontendUrl()} in your browser to access it.`, + `GenLayer simulator initialized successfully! Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`, ); try { - openFrontend(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + simulatorService.openFrontend(); } catch (error) { console.error(error); } diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index b49d18a6..b8031a53 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -1,41 +1,26 @@ import inquirer from "inquirer"; -import { - updateSimulator, - runSimulator, - waitForSimulatorToBeReady, - deleteAllValidators, - createRandomValidators, - clearAccountsAndTransactionsDatabase, - initializeDatabase, - getFrontendUrl, - openFrontend, - getAiProvidersOptions, -} from "@/lib/services/simulator"; +import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; export interface StartActionOptions { - resetAccounts: string; resetValidators: string; numValidators: number; + branch: string; } -export async function startAction(options: StartActionOptions) { - const {resetAccounts, resetValidators, numValidators} = options; - - const restartAccountsHintText = resetAccounts - ? "restarting the accounts and transactions database" - : "keeping the accounts and transactions records"; +export async function startAction(options: StartActionOptions, simulatorService: ISimulatorService) { + const {resetValidators, numValidators, branch} = options; const restartValidatorsHintText = resetValidators - ? `and creating new ${numValidators} random validators` - : "and keeping the existing validators"; + ? `creating new ${numValidators} random validators` + : "keeping the existing validators"; - console.log(`Starting GenLayer simulator ${restartAccountsHintText} ${restartValidatorsHintText}`); + console.log(`Starting GenLayer simulator ${restartValidatorsHintText}`); // Update the simulator to the latest version console.log(`Updating GenLayer Simulator...`); try { - await updateSimulator(); + await simulatorService.updateSimulator(branch); } catch (error) { console.error(error); return; @@ -44,14 +29,14 @@ export async function startAction(options: StartActionOptions) { // Run the GenLayer Simulator console.log("Running the GenLayer Simulator..."); try { - runSimulator(); + await simulatorService.runSimulator(); } catch (error) { console.error(error); return; } try { - const {initialized, errorCode, errorMessage} = await waitForSimulatorToBeReady(); + const {initialized, errorCode, errorMessage} = await simulatorService.waitForSimulatorToBeReady(); if (!initialized && errorCode === "ERROR") { console.log(errorMessage); console.error("Unable to initialize the GenLayer simulator. Please try again."); @@ -69,37 +54,18 @@ export async function startAction(options: StartActionOptions) { return; } - if (resetAccounts) { - // Initialize the database - console.log("Initializing the database..."); - try { - //remove everything from the database - await clearAccountsAndTransactionsDatabase(); - - const {createResponse, tablesResponse} = await initializeDatabase(); - if (!createResponse || !tablesResponse) { - console.error("Unable to initialize the database. Please try again."); - return; - } - } catch (error) { - console.error(error); - return; - } - console.log("Database successfully reset..."); - } - if (resetValidators) { // Initializing validators console.log("Initializing validators..."); try { //remove all validators - await deleteAllValidators(); + await simulatorService.deleteAllValidators(); const questions = [ { type: "checkbox", name: "selectedLlmProviders", message: "Select which LLM providers do you want to use:", - choices: getAiProvidersOptions(false), + choices: simulatorService.getAiProvidersOptions(false), validate: function (answer: string[]) { if (answer.length < 1) { return "You must choose at least one option."; @@ -113,7 +79,10 @@ export async function startAction(options: StartActionOptions) { const llmProvidersAnswer = await inquirer.prompt(questions); // create random validators - await createRandomValidators(Number(options.numValidators), llmProvidersAnswer.selectedLlmProviders); + await simulatorService.createRandomValidators( + Number(options.numValidators), + llmProvidersAnswer.selectedLlmProviders, + ); } catch (error) { console.error("Unable to initialize the validators."); console.error(error); @@ -124,10 +93,10 @@ export async function startAction(options: StartActionOptions) { // Simulator ready console.log( - `GenLayer simulator initialized successfully! Go to ${getFrontendUrl()} in your browser to access it.`, + `GenLayer simulator initialized successfully! Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`, ); try { - openFrontend(); + simulatorService.openFrontend(); } catch (error) { console.error(error); } diff --git a/src/lib/clients/system.ts b/src/lib/clients/system.ts index 09b482e9..addb0ab5 100644 --- a/src/lib/clients/system.ts +++ b/src/lib/clients/system.ts @@ -3,7 +3,7 @@ import {ChildProcess, PromiseWithChild, exec} from "child_process"; import os from "os"; import open from "open"; -import {RunningPlatform, AVAILABLE_PLATFORMS} from "@/lib/config/simulator"; +import {RunningPlatform, AVAILABLE_PLATFORMS} from "../config/simulator"; import {MissingRequirementError} from "../errors/missingRequirement"; const asyncExec = util.promisify(exec); diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts new file mode 100644 index 00000000..7b3e132f --- /dev/null +++ b/src/lib/interfaces/ISimulatorService.ts @@ -0,0 +1,36 @@ +import {AiProviders} from "../config/simulator"; + +export interface ISimulatorService { + getSimulatorLocation(): string; + readEnvConfigValue(key: string): string; + addConfigToEnvFile(newConfig: Record): void; + checkRequirements(): Promise>; + downloadSimulator(branch?: string): Promise; + updateSimulator(branch?: string): Promise; + pullOllamaModel(): Promise; + configSimulator(newConfig: Record): Promise; + runSimulator(): Promise<{stdout: string; stderr: string}>; + waitForSimulatorToBeReady(retries?: number): Promise; + createRandomValidators(numValidators: number, llmProviders: AiProviders[]): Promise; + deleteAllValidators(): Promise; + getAiProvidersOptions(withHint: boolean): Array<{name: string; value: string}>; + getFrontendUrl(): string; + openFrontend(): Promise; + resetDockerContainers(): Promise; + resetDockerImages(): Promise; +} + +export type DownloadSimulatorResultType = { + wasInstalled: boolean; +}; + +export type WaitForSimulatorToBeReadyResultType = { + initialized: boolean; + errorCode?: "TIMEOUT" | "ERROR"; + errorMessage?: string; +}; + +export type InitializeDatabaseResultType = { + createResponse: any; + tablesResponse: any; +}; diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index d5c74a72..abe7130f 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -2,7 +2,7 @@ import * as fs from "fs"; import * as dotenv from "dotenv"; import * as path from "path"; -import {rpcClient} from "@/lib/clients/jsonRpcClient"; +import {rpcClient} from "../clients/jsonRpcClient"; import { DEFAULT_REPO_GH_URL, DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, @@ -13,7 +13,7 @@ import { STARTING_TIMEOUT_ATTEMPTS, AI_PROVIDERS_CONFIG, AiProviders, -} from "@/lib/config/simulator"; +} from "../config/simulator"; import { checkCommand, getHomeDirectory, @@ -24,243 +24,245 @@ import { removeDockerContainer, listDockerImages, removeDockerImage, -} from "@/lib/clients/system"; +} from "../clients/system"; import {MissingRequirementError} from "../errors/missingRequirement"; -// Private helper functions -export function getSimulatorLocation(): string { - return path.join(getHomeDirectory(), "genlayer-simulator"); -} - -export function readEnvConfigValue(key: string): string { - const simulatorLocation = getSimulatorLocation(); - const envFilePath = path.join(simulatorLocation, ".env"); - // Transform the config string to object - const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); - return envConfig[key]; -} +import { + ISimulatorService, + DownloadSimulatorResultType, + WaitForSimulatorToBeReadyResultType, + InitializeDatabaseResultType, +} from "../interfaces/ISimulatorService"; function sleep(millliseconds: number): Promise { return new Promise(resolve => setTimeout(resolve, millliseconds)); } -function addConfigToEnvFile(newConfig: Record): void { - const simulatorLocation = getSimulatorLocation(); - const envFilePath = path.join(simulatorLocation, ".env"); +export class SimulatorService implements ISimulatorService { + public getSimulatorLocation(): string { + return path.join(getHomeDirectory(), "genlayer-simulator"); + } - // Create a backup of the original .env file - fs.writeFileSync(`${envFilePath}.bak`, fs.readFileSync(envFilePath)); + public readEnvConfigValue(key: string): string { + const simulatorLocation = this.getSimulatorLocation(); + const envFilePath = path.join(simulatorLocation, ".env"); + // Transform the config string to object + const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); + return envConfig[key]; + } - // Transform the config string to object - const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); - Object.keys(newConfig).forEach(key => { - envConfig[key] = newConfig[key]; - }); + public addConfigToEnvFile(newConfig: Record): void { + const simulatorLocation = this.getSimulatorLocation(); + const envFilePath = path.join(simulatorLocation, ".env"); - // Transform the updated config object back into a string - const updatedConfig = Object.keys(envConfig) - .map(key => { - return `${key}=${envConfig[key]}`; - }) - .join("\n"); + // Create a backup of the original .env file + fs.writeFileSync(`${envFilePath}.bak`, fs.readFileSync(envFilePath)); - // Write the new .env file - fs.writeFileSync(envFilePath, updatedConfig); -} + // Transform the config string to object + const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); + Object.keys(newConfig).forEach(key => { + envConfig[key] = newConfig[key]; + }); -// Public functions -export async function checkRequirements(): Promise> { - const requirementsInstalled = { - git: false, - docker: false, - }; - - try { - await checkCommand("git --version", "git"); - requirementsInstalled.git = true; - } catch (error) { - if (!(error instanceof MissingRequirementError)) { - throw error; - } - } - try { - await checkCommand("docker --version", "docker"); - requirementsInstalled.docker = true; - } catch (error: any) { - if (!(error instanceof MissingRequirementError)) { - throw error; - } + // Transform the updated config object back into a string + const updatedConfig = Object.keys(envConfig) + .map(key => { + return `${key}=${envConfig[key]}`; + }) + .join("\n"); + + // Write the new .env file + fs.writeFileSync(envFilePath, updatedConfig); } - if (requirementsInstalled.docker) { + public async checkRequirements(): Promise> { + const requirementsInstalled = { + git: false, + docker: false, + }; + try { - await checkCommand("docker ps", "docker"); + await checkCommand("git --version", "git"); + requirementsInstalled.git = true; + } catch (error) { + if (!(error instanceof MissingRequirementError)) { + throw error; + } + } + try { + await checkCommand("docker --version", "docker"); + requirementsInstalled.docker = true; } catch (error: any) { - await executeCommand(DEFAULT_RUN_DOCKER_COMMAND); + if (!(error instanceof MissingRequirementError)) { + throw error; + } + } + + if (requirementsInstalled.docker) { + try { + await checkCommand("docker ps", "docker"); + } catch (error: any) { + await executeCommand(DEFAULT_RUN_DOCKER_COMMAND); + } } + + return requirementsInstalled; } - return requirementsInstalled; -} + public async downloadSimulator(branch: string = "main"): Promise { + const simulatorLocation = this.getSimulatorLocation(); -type DownloadSimulatorResultType = { - wasInstalled: boolean; -}; - -export async function downloadSimulator(): Promise { - const simulatorLocation = getSimulatorLocation(); - - try { - const gitCommand = `git clone ${DEFAULT_REPO_GH_URL} ${simulatorLocation}`; - const cmdsByPlatform = {darwin: gitCommand, win32: gitCommand, linux: gitCommand}; - await executeCommand(cmdsByPlatform, "git"); - } catch (error: any) { - const simulatorLocationExists = fs.existsSync(simulatorLocation); - if (simulatorLocationExists) { - return {wasInstalled: true}; + try { + const gitCommand = `git clone -b ${branch} ${DEFAULT_REPO_GH_URL} ${simulatorLocation}`; + const cmdsByPlatform = {darwin: gitCommand, win32: gitCommand, linux: gitCommand}; + await executeCommand(cmdsByPlatform, "git"); + } catch (error: any) { + const simulatorLocationExists = fs.existsSync(simulatorLocation); + if (simulatorLocationExists) { + return {wasInstalled: true}; + } + throw error; } - throw error; + return {wasInstalled: false}; } - return {wasInstalled: false}; -} -export async function updateSimulator(): Promise { - const simulatorLocation = getSimulatorLocation(); - const gitCommand = `git -C "${simulatorLocation}" pull`; - const cmdsByPlatform = {darwin: gitCommand, win32: gitCommand, linux: gitCommand}; - await executeCommand(cmdsByPlatform, "git"); - return {wasInstalled: false}; -} + public async updateSimulator(branch: string = "main"): Promise { + const simulatorLocation = this.getSimulatorLocation(); + const gitCleanCommand = `git -C "${simulatorLocation}" clean -f`; + const cleanCmdsByPlatform = {darwin: gitCleanCommand, win32: gitCleanCommand, linux: gitCleanCommand}; + await executeCommand(cleanCmdsByPlatform, "git"); + + const gitFetchCommand = `git -C "${simulatorLocation}" fetch`; + const fetchCmdsByPlatform = {darwin: gitFetchCommand, win32: gitFetchCommand, linux: gitFetchCommand}; + await executeCommand(fetchCmdsByPlatform, "git"); + + const gitCheckoutCommand = `git -C "${simulatorLocation}" checkout ${branch}`; + const checkoutCmdsByPlatform = { + darwin: gitCheckoutCommand, + win32: gitCheckoutCommand, + linux: gitCheckoutCommand, + }; + await executeCommand(checkoutCmdsByPlatform, "git"); -export async function pullOllamaModel(): Promise { - const simulatorLocation = getSimulatorLocation(); - const cmdsByPlatform = DEFAULT_PULL_OLLAMA_COMMAND(simulatorLocation); - await executeCommand(cmdsByPlatform); - return true; -} + const gitPullCommand = `git -C "${simulatorLocation}" pull`; + const pullCmdsByPlatform = {darwin: gitPullCommand, win32: gitPullCommand, linux: gitPullCommand}; + await executeCommand(pullCmdsByPlatform, "git"); + return true; + } -export async function configSimulator(newConfig: Record): Promise { - const simulatorLocation = getSimulatorLocation(); - const envExample = path.join(simulatorLocation, ".env.example"); - const envFilePath = path.join(simulatorLocation, ".env"); - fs.copyFileSync(envExample, envFilePath); - addConfigToEnvFile(newConfig); - return true; -} + public async pullOllamaModel(): Promise { + const simulatorLocation = this.getSimulatorLocation(); + const cmdsByPlatform = DEFAULT_PULL_OLLAMA_COMMAND(simulatorLocation); + await executeCommand(cmdsByPlatform); + return true; + } -export function runSimulator(): Promise<{stdout: string; stderr: string}> { - const simulatorLocation = getSimulatorLocation(); - const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(simulatorLocation); - return executeCommand(commandsByPlatform); -} + public async configSimulator(newConfig: Record): Promise { + const simulatorLocation = this.getSimulatorLocation(); + const envExample = path.join(simulatorLocation, ".env.example"); + const envFilePath = path.join(simulatorLocation, ".env"); + fs.copyFileSync(envExample, envFilePath); + this.addConfigToEnvFile(newConfig); + return true; + } -type WaitForSimulatorToBeReadyResultType = { - initialized: boolean; - errorCode?: "TIMEOUT" | "ERROR"; - errorMessage?: string; -}; - -export async function waitForSimulatorToBeReady( - retries: number = STARTING_TIMEOUT_ATTEMPTS, -): Promise { - console.log("Waiting for the simulator to start up..."); - try { - const response = await rpcClient.request({method: "ping", params: []}); - if (response && response.result.status === "OK") { - return {initialized: true}; - } - if (retries > 0) { - await sleep(STARTING_TIMEOUT_WAIT_CYLCE); - return waitForSimulatorToBeReady(retries - 1); - } - } catch (error: any) { - if ( - (error.name === "FetchError" || - error.message.includes("Fetch Error") || - error.message.includes("ECONNRESET") || - error.message.includes("ECONNREFUSED") || - error.message.includes("socket hang up")) && - retries > 0 - ) { - await sleep(STARTING_TIMEOUT_WAIT_CYLCE * 2); - return waitForSimulatorToBeReady(retries - 1); - } - return {initialized: false, errorCode: "ERROR", errorMessage: error.message}; + public runSimulator(): Promise<{stdout: string; stderr: string}> { + const simulatorLocation = this.getSimulatorLocation(); + const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(simulatorLocation); + return executeCommand(commandsByPlatform); } - return {initialized: false, errorCode: "TIMEOUT"}; -} + public async waitForSimulatorToBeReady( + retries: number = STARTING_TIMEOUT_ATTEMPTS, + ): Promise { + console.log("Waiting for the simulator to start up..."); + try { + const response = await rpcClient.request({method: "ping", params: []}); + + //Compatibility with current simulator version + if (response && (response.result.status === "OK" || response.result.data.status === "OK")) { + return {initialized: true}; + } + if (retries > 0) { + await sleep(STARTING_TIMEOUT_WAIT_CYLCE); + return this.waitForSimulatorToBeReady(retries - 1); + } + } catch (error: any) { + if ( + (error.name === "FetchError" || + error.message.includes("Fetch Error") || + error.message.includes("ECONNRESET") || + error.message.includes("ECONNREFUSED") || + error.message.includes("socket hang up")) && + retries > 0 + ) { + await sleep(STARTING_TIMEOUT_WAIT_CYLCE * 2); + return this.waitForSimulatorToBeReady(retries - 1); + } + return {initialized: false, errorCode: "ERROR", errorMessage: error.message}; + } -export function clearAccountsAndTransactionsDatabase(): Promise { - return rpcClient.request({method: "clear_account_and_transactions_tables", params: []}); -} + return {initialized: false, errorCode: "TIMEOUT"}; + } -type InitializeDatabaseResultType = { - createResponse: any; - tablesResponse: any; -}; + public createRandomValidators(numValidators: number, llmProviders: AiProviders[]): Promise { + return rpcClient.request({ + method: "create_random_validators", + params: [numValidators, 1, 10, llmProviders], + }); + } -export async function initializeDatabase(): Promise { - const createResponse = await rpcClient.request({method: "create_db", params: []}); - const tablesResponse = await rpcClient.request({method: "create_tables", params: []}); - return {createResponse, tablesResponse}; -} + public deleteAllValidators(): Promise { + return rpcClient.request({method: "delete_all_validators", params: []}); + } -export function createRandomValidators(numValidators: number, llmProviders: AiProviders[]): Promise { - return rpcClient.request({ - method: "create_random_validators", - params: [numValidators, 1, 10, llmProviders], - }); -} + public getAiProvidersOptions(withHint: boolean = true): Array<{name: string; value: string}> { + return Object.values(AI_PROVIDERS_CONFIG).map(providerConfig => { + return { + name: `${providerConfig.name}${withHint ? ` ${providerConfig.hint}` : ""}`, + value: providerConfig.cliOptionValue, + }; + }); + } -export function deleteAllValidators(): Promise { - return rpcClient.request({method: "delete_all_validators", params: []}); -} + public getFrontendUrl(): string { + const frontendPort = this.readEnvConfigValue("FRONTEND_PORT"); + return `http://localhost:${frontendPort}`; + } -export function getAiProvidersOptions(withHint: boolean = true): Array<{name: string; value: string}> { - return Object.values(AI_PROVIDERS_CONFIG).map(providerConfig => { - return { - name: `${providerConfig.name}${withHint ? ` ${providerConfig.hint}` : ""}`, - value: providerConfig.cliOptionValue, - }; - }); -} + public async openFrontend(): Promise { + await openUrl(this.getFrontendUrl()); + return true; + } -export function getFrontendUrl(): string { - const frontendPort = readEnvConfigValue("FRONTEND_PORT"); - return `http://localhost:${frontendPort}`; -} + public async resetDockerContainers(): Promise { + const containers = await listDockerContainers(); + const genlayerContainers = containers.filter((container: string) => + container.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX), + ); + const containersStopPromises = genlayerContainers.map((container: string) => + stopDockerContainer(container), + ); + await Promise.all(containersStopPromises); + + const containersRemovePromises = genlayerContainers.map((container: string) => + removeDockerContainer(container), + ); + await Promise.all(containersRemovePromises); + + return true; + } -export async function openFrontend(): Promise { - await openUrl(getFrontendUrl()); - return true; -} + public async resetDockerImages(): Promise { + const images = await listDockerImages(); + const genlayerImages = images.filter((image: string) => + image.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX), + ); + const imagesRemovePromises = genlayerImages.map((image: string) => removeDockerImage(image)); + await Promise.all(imagesRemovePromises); -export async function resetDockerContainers(): Promise { - const containers = await listDockerContainers(); - const genlayerContainers = containers.filter((container: string) => - container.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX), - ); - const containersStopPromises = genlayerContainers.map((container: string) => - stopDockerContainer(container), - ); - await Promise.all(containersStopPromises); - - const containersRemovePromises = genlayerContainers.map((container: string) => - removeDockerContainer(container), - ); - await Promise.all(containersRemovePromises); - - return true; + return true; + } } -export async function resetDockerImages(): Promise { - const images = await listDockerImages(); - const genlayerImages = images.filter((image: string) => - image.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX), - ); - const imagesRemovePromises = genlayerImages.map((image: string) => removeDockerImage(image)); - await Promise.all(imagesRemovePromises); - - return true; -} +export default new SimulatorService(); diff --git a/src/types/node-fetch.d.ts b/src/types/node-fetch.d.ts new file mode 100644 index 00000000..d468e89f --- /dev/null +++ b/src/types/node-fetch.d.ts @@ -0,0 +1 @@ +declare module "node-fetch"; diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts new file mode 100644 index 00000000..62b783d9 --- /dev/null +++ b/tests/actions/init.test.ts @@ -0,0 +1,508 @@ +/* eslint-disable import/no-named-as-default-member */ +import {jest} from "@jest/globals"; +import inquirer from "inquirer"; + +import simulatorService from "../../src/lib/services/simulator"; +import {initAction} from "../../src/commands/general/init"; + +// Default options for the action +const defaultActionOptions = {numValidators: 5, branch: "main"}; + +describe("init action", () => { + let error: jest.Mock; + let log: jest.Mock; + let inquirerPrompt: jest.Mock; + + let simServCheckRequirements: jest.Mock; + let simServResetDockerContainers: jest.Mock; + let simServResetDockerImages: jest.Mock; + let simServDownloadSimulator: jest.Mock; + let simServUpdateSimulator: jest.Mock; + let simServgetAiProvidersOptions: jest.Mock; + let simServConfigSimulator: jest.Mock; + let simServRunSimulator: jest.Mock; + let simServWaitForSimulator: jest.Mock; + let simServPullOllamaModel: jest.Mock; + let simServDeleteAllValidators: jest.Mock; + let simServCreateRandomValidators: jest.Mock; + let simServOpenFrontend: jest.Mock; + let simServRedEnvConfigVariable: jest.Mock; + + beforeEach(() => { + jest.clearAllMocks(); + + error = jest.spyOn(console, "error").mockImplementation(() => {}) as jest.Mock; + log = jest.spyOn(console, "log").mockImplementation(() => {}) as jest.Mock; + inquirerPrompt = jest.spyOn(inquirer, "prompt") as jest.Mock; + + simServCheckRequirements = jest.spyOn(simulatorService, "checkRequirements") as jest.Mock; + simServResetDockerContainers = jest.spyOn(simulatorService, "resetDockerContainers") as jest.Mock; + simServResetDockerImages = jest.spyOn(simulatorService, "resetDockerImages") as jest.Mock; + simServDownloadSimulator = jest.spyOn(simulatorService, "downloadSimulator") as jest.Mock; + simServUpdateSimulator = jest.spyOn(simulatorService, "updateSimulator") as jest.Mock; + simServConfigSimulator = jest.spyOn(simulatorService, "configSimulator") as jest.Mock; + simServgetAiProvidersOptions = jest.spyOn(simulatorService, "getAiProvidersOptions") as jest.Mock; + simServRunSimulator = jest.spyOn(simulatorService, "runSimulator") as jest.Mock; + simServWaitForSimulator = jest.spyOn(simulatorService, "waitForSimulatorToBeReady") as jest.Mock; + simServPullOllamaModel = jest.spyOn(simulatorService, "pullOllamaModel") as jest.Mock; + simServDeleteAllValidators = jest.spyOn(simulatorService, "deleteAllValidators") as jest.Mock; + simServCreateRandomValidators = jest.spyOn(simulatorService, "createRandomValidators") as jest.Mock; + simServOpenFrontend = jest.spyOn(simulatorService, "openFrontend") as jest.Mock; + simServRedEnvConfigVariable = jest.spyOn(simulatorService, "readEnvConfigValue") as jest.Mock; + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + test("if both requirements are missing, then the execution fails", async () => { + // Given + simServCheckRequirements.mockResolvedValue({git: false, docker: false}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith( + "Git and Docker are not installed. Please install them and try again.\n", + ); + }); + + test("if only docker is missing, then the execution fails", async () => { + // Given + simServCheckRequirements.mockResolvedValue({git: true, docker: false}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith("Docker is not installed. Please install Docker and try again.\n"); + }); + + test("if only git is missing, then the execution fails", async () => { + // Given + simServCheckRequirements.mockResolvedValue({git: false, docker: true}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith("Git is not installed. Please install Git and try again.\n"); + }); + + test("if check requirements fail, then the execution aborts", async () => { + // Given + simServCheckRequirements.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith(new Error("Error")); + }); + + test("if reset is not confirmed, abort", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: false}); + simServCheckRequirements.mockResolvedValue({git: true, docker: true}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(log).toHaveBeenCalledTimes(1); + expect(log).toHaveBeenNthCalledWith(1, "Aborted!"); + }); + + test("if resetDockerContainers fail, then the execution aborts", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: true}); + simServResetDockerContainers.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith(new Error("Error")); + }); + + test("if resetDockerImages fail, then the execution aborts", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: true}); + simServResetDockerImages.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith(new Error("Error")); + }); + + test("if download is not confirmed, abort", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: false}); + simServCheckRequirements.mockResolvedValue({git: true, docker: true}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(log).toHaveBeenCalledTimes(3); + expect(log).toHaveBeenNthCalledWith(3, "Aborted!"); + }); + + test("if not already installed, it should download and install the simulator", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); + simServDownloadSimulator.mockResolvedValue({wasInstalled: false}); + simServConfigSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(simulatorService.downloadSimulator).toHaveBeenCalled(); + expect(simulatorService.updateSimulator).not.toHaveBeenCalled(); + }); + + test("if already installed, it should update the simulator", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); + simServDownloadSimulator.mockResolvedValue({wasInstalled: true}); + simServUpdateSimulator.mockResolvedValue(true); + simServConfigSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(simulatorService.downloadSimulator).toHaveBeenCalled(); + expect(simulatorService.updateSimulator).toHaveBeenCalled(); + }); + + test("should prompt for LLM providers and call configSimulator with selected providers", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(inquirerPrompt).toHaveBeenNthCalledWith(3, [ + { + type: "checkbox", + name: "selectedLlmProviders", + message: "Select which LLM providers do you want to use:", + choices: [ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ], + validate: expect.any(Function), + }, + ]); + expect(simulatorService.configSimulator).toHaveBeenCalledWith({ + OPENAIKEY: "API_KEY1", + HEURISTAIAPIKEY: "API_KEY2", + }); + }); + + test("if configSimulator fails, then the execution aborts", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); + simServConfigSimulator.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith(new Error("Error")); + }); + + test("if runSimulator fails, then the execution aborts", async () => { + // Given + inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); + simServRunSimulator.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith(new Error("Error")); + }); + + test("should run the simulator after all configurations", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(simulatorService.runSimulator).toHaveBeenCalled(); + }); + + test("should abort if waiting for the simulator returns ERROR", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ + initialized: false, + errorCode: "ERROR", + errorMessage: "errorMessage", + }); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(log).toHaveBeenCalledWith("errorMessage"); + expect(error).toHaveBeenCalledWith("Unable to initialize the GenLayer simulator. Please try again."); + }); + + test("should abort if waiting for the simulator returns TIMEOUT", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ + initialized: false, + errorCode: "TIMEOUT", + errorMessage: "errorMessage", + }); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledWith( + "The simulator is taking too long to initialize. Please try again after the simulator is ready.", + ); + }); + + test("should abort if waiting for the simulator throws an error", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledWith(new Error("Error")); + }); + + test("should pull llama3 from Ollama if ollama is in providers", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai", "ollama"], + openai: "API_KEY1", + heuristai: "API_KEY2", + ollama: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + {name: "Ollama", value: "ollama"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ + initialized: true, + }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockRejectedValue(new Error("Error")); // This will stop the execution + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(simServPullOllamaModel).toHaveBeenCalled(); + }); + + test("shouldn't pull llama3 from Ollama if ollama is not in providers", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ + initialized: true, + }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockRejectedValue(new Error("Error")); // This will stop the execution + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(simServPullOllamaModel).not.toHaveBeenCalled(); + }); + + test("should abort if deleteAllValidators throws an error", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ + initialized: true, + }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledWith("Unable to initialize the validators."); + }); + + test("should abort if createRandomValidators throws an error", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ + initialized: true, + }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockResolvedValue(true); + simServCreateRandomValidators.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledWith("Unable to initialize the validators."); + }); + + test("should open the frontend if everything went well", async () => { + // Given + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + {name: "OpenAI", value: "openai"}, + {name: "Heurist", value: "heuristai"}, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ + initialized: true, + }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockResolvedValue(true); + simServCreateRandomValidators.mockResolvedValue(true); + simServOpenFrontend.mockResolvedValue(true); + simServRedEnvConfigVariable.mockReturnValue("8080"); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + const frontendUrl = simulatorService.getFrontendUrl(); + expect(log).toHaveBeenCalledWith( + `GenLayer simulator initialized successfully! Go to ${frontendUrl} in your browser to access it.`, + ); + }); +}); diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index 8e74a045..9b535387 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -1,19 +1,26 @@ -import {program} from "commander"; - +import {Command} from "commander"; +import {jest} from "@jest/globals"; import {initializeGeneralCommands} from "../../src/commands/general"; import {getCommand, getCommandOption} from "../utils"; jest.mock("inquirer", () => ({ - prompt: jest.fn().mockResolvedValue({}), + prompt: jest.fn(() => {}), })); const action = jest.fn(); describe("init command", () => { - initializeGeneralCommands(program); - const initCommand = getCommand("init"); - initCommand?.action(action); + let initCommand: Command; + let program: Command; beforeEach(() => { + program = new Command(); + initializeGeneralCommands(program); + + initCommand = getCommand(program, "init"); + initCommand?.action(async args => { + action(args); + }); + jest.clearAllMocks(); }); @@ -21,21 +28,30 @@ describe("init command", () => { jest.restoreAllMocks(); }); - test("doesn't have required arguments nor options", () => { + test("doesn't have required arguments nor options", async () => { expect(() => program.parse(["node", "test", "init"])).not.toThrow(); }); - test("option -n, --numValidators is accepted", () => { - expect(() => program.parse(["node", "test", "init", "-n", "10"])).not.toThrow(); + test("option --numValidators is accepted", async () => { expect(() => program.parse(["node", "test", "init", "--numValidators", "10"])).not.toThrow(); }); - test("option -n, --numValidators default value is 5", async () => { + test("option --numValidators default value is 5", async () => { // Given // When const numValidatorsOption = getCommandOption(initCommand, "--numValidators"); expect(numValidatorsOption?.defaultValue).toBe("5"); }); + test("option --branch is accepted", async () => { + expect(() => program.parse(["node", "test", "init", "--branch", "example"])).not.toThrow(); + }); + + test("option --branch default value is main", async () => { + // Given // When + const numValidatorsOption = getCommandOption(initCommand, "--branch"); + expect(numValidatorsOption?.defaultValue).toBe("main"); + }); + test("random option is not accepted", async () => { initCommand?.exitOverride(); expect(() => program.parse(["node", "test", "init", "-random"])).toThrow( @@ -46,10 +62,11 @@ describe("init command", () => { ); }); - test("action is called", () => { + test("action is called", async () => { // Given When program.parse(["node", "test", "init"]); // Then expect(action).toHaveBeenCalledTimes(1); + expect(action).toHaveBeenCalledWith({numValidators: "5", branch: "main"}); }); }); diff --git a/tests/utils.ts b/tests/utils.ts index 860b6a5c..b60621cb 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -1,6 +1,6 @@ -import {Command, Option, program} from "commander"; +import {Command, Option} from "commander"; -export function getCommand(commandName: string): Command { +export function getCommand(program: Command, commandName: string): Command { const command = program.commands.find(command => command.name() === commandName); if (!command) { throw new Error(`Command ${commandName} not found`); diff --git a/tsconfig.json b/tsconfig.json index 5c23d36d..fbaa85cd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "ES2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "target": "ES2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ @@ -25,9 +25,9 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, + "module": "ES2022" /* Specify what module code is generated. */, // "rootDir": /* Specify the root folder within your source files. */, - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ "paths": { "@/*": ["./src/*"], @@ -38,7 +38,11 @@ "./tests" ] /* Allow multiple folders to be treated as one when resolving modules. */, // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + "types": [ + "jest", + "node", + "@types/jest" + ] /* Specify type package names to be included without being referenced in a source file. */, // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ From 86ca56ec67d44ebf0e977f247cf1d0711fa6cace Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 15 Jul 2024 15:08:29 +0000 Subject: [PATCH 02/67] Release v0.0.32 [skip ci] --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2441d1f..51b65de3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ +## 0.0.32 (2024-07-15) + ## 0.0.32-beta.2 (2024-07-03) ## 0.0.32-beta.1 (2024-07-03) diff --git a/package-lock.json b/package-lock.json index 4fcfd216..2f97ef85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.0.32-beta.2", + "version": "0.0.32", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.0.32-beta.2", + "version": "0.0.32", "license": "ISC", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 79936d8b..52edce01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.0.32-beta.2", + "version": "0.0.32", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 09c824f8b7ac1fff5355317d046752fbf58ab162 Mon Sep 17 00:00:00 2001 From: kstroobants <130580298+kstroobants@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:41:13 +0100 Subject: [PATCH 03/67] fix: response check (#78) --- src/lib/services/simulator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index abe7130f..e34c3ded 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -180,7 +180,7 @@ export class SimulatorService implements ISimulatorService { const response = await rpcClient.request({method: "ping", params: []}); //Compatibility with current simulator version - if (response && (response.result.status === "OK" || response.result.data.status === "OK")) { + if (response && (response.result === "OK" || response.result.status === "OK" || response.result.data.status === "OK")) { return {initialized: true}; } if (retries > 0) { From 371000845d3def29a5f645b0c1f28e28bbc17406 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 14:41:42 +0000 Subject: [PATCH 04/67] Release v0.0.33 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51b65de3..3a84252f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.0.33 (2024-10-22) + + +### Bug Fixes + +* response check ([#78](https://github.com/yeagerai/genlayer-cli/issues/78)) ([09c824f](https://github.com/yeagerai/genlayer-cli/commit/09c824f8b7ac1fff5355317d046752fbf58ab162)) + ## 0.0.32 (2024-07-15) ## 0.0.32-beta.2 (2024-07-03) diff --git a/package-lock.json b/package-lock.json index 2f97ef85..5451ba2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.0.32", + "version": "0.0.33", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.0.32", + "version": "0.0.33", "license": "ISC", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 52edce01..5bdece3a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.0.32", + "version": "0.0.33", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 64744b41527f05355f31e46ba20346e36b52bf4b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:44:06 +0200 Subject: [PATCH 05/67] Add renovate.json (#75) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..5db72dd6 --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ] +} From 90c72f86fa7b8e3d3e4d03eb992abbf190b87f92 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 14:44:34 +0000 Subject: [PATCH 06/67] Release v0.0.34 [skip ci] --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a84252f..5380101d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ +## 0.0.34 (2024-10-22) + ## 0.0.33 (2024-10-22) diff --git a/package-lock.json b/package-lock.json index 5451ba2c..63e723d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.0.33", + "version": "0.0.34", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.0.33", + "version": "0.0.34", "license": "ISC", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 5bdece3a..aae132af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.0.33", + "version": "0.0.34", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From cb4d63ee580c7c1cbc6a7d89742363b8e78a9bed Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:38:31 -0300 Subject: [PATCH 07/67] chore: update dependencies (#91) * chore(deps): update dependency prettier to v3.3.3 (#90) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @release-it/conventional-changelog to v8.0.2 (#79) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/jest to v29.5.14 (#80) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint to v8.57.1 (#82) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-import-resolver-typescript to v3.6.3 (#83) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v20.17.0 (#85) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency esbuild to ^0.24.0 (#87) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-plugin-import to v2.31.0 (#89) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/jest to v29.5.14 (#93) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 779 ++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 677 insertions(+), 104 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63e723d6..ab4a3b5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", "cross-env": "^7.0.3", - "esbuild": "^0.20.2", + "esbuild": "^0.24.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", @@ -702,20 +702,412 @@ "node": ">=12" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -788,21 +1180,24 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -1394,6 +1789,16 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@octokit/auth-token": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", @@ -1621,23 +2026,131 @@ } }, "node_modules/@release-it/conventional-changelog": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-8.0.1.tgz", - "integrity": "sha512-pwc9jaBYDaSX5TXw6rEnPfqDkKJN2sFBhYpON1kBi9T3sA9EOBncC4ed0Bv3L1ciNb6eqEJXPfp+tQMqVlv/eg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-8.0.2.tgz", + "integrity": "sha512-WpnWWRr7O0JeLoiejLrPEWnnwFhCscBn1wBTAXeitiz2/Ifaol0s+t8otf/HYq/OiQOri2iH8d0CnVb72tBdIQ==", "dev": true, + "license": "MIT", "dependencies": { "concat-stream": "^2.0.0", "conventional-changelog": "^5.1.0", "conventional-recommended-bump": "^9.0.0", - "semver": "^7.5.4" + "git-semver-tags": "^8.0.0", + "semver": "^7.6.3" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || ^22.0.0" }, "peerDependencies": { "release-it": "^17.0.0" } }, + "node_modules/@release-it/conventional-changelog/node_modules/@conventional-changelog/git-client": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz", + "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/semver": "^7.5.5", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.0.0.tgz", + "integrity": "sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@release-it/conventional-changelog/node_modules/git-semver-tags": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz", + "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^1.0.0", + "meow": "^13.0.0" + }, + "bin": { + "git-semver-tags": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@release-it/conventional-changelog/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@release-it/conventional-changelog/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/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1819,10 +2332,11 @@ } }, "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -1841,12 +2355,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.17.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.0.tgz", + "integrity": "sha512-a7zRo0f0eLo9K5X9Wp5cAqTUNGzuFLDG2R7C4HY2BhcMAsxgSPuRvAC1ZB6QkuUQXf0YZAgfOX2ZyrBa2n4nHQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/normalize-package-data": { @@ -3605,12 +4120,13 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4079,41 +4595,43 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/escalade": { @@ -4171,16 +4689,18 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -4258,17 +4778,19 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", "dev": true, + "license": "ISC", "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", "is-glob": "^4.0.3" }, "engines": { @@ -4279,14 +4801,24 @@ }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -4309,34 +4841,37 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -4344,6 +4879,7 @@ "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" @@ -4354,6 +4890,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -4363,6 +4900,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4375,6 +4913,7 @@ "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" }, @@ -4387,6 +4926,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4424,6 +4964,7 @@ "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" @@ -4434,6 +4975,7 @@ "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" }, @@ -4931,10 +5473,11 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -5623,6 +6166,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, + "node_modules/is-bun-module/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/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -5648,12 +6214,16 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "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.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7144,10 +7714,11 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "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/mute-stream": { "version": "1.0.0", @@ -7814,10 +8385,11 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -9909,10 +10481,11 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "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/unicorn-magic": { "version": "0.1.0", diff --git a/package.json b/package.json index aae132af..f2318eef 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", "cross-env": "^7.0.3", - "esbuild": "^0.20.2", + "esbuild": "^0.24.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", From 8de4a7655b7170700e59c74d429ec80f78fe9dfc Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:38:54 -0300 Subject: [PATCH 08/67] 46 cli add node and docker version (#47) (#88) * add node and docker version checks * remove redundant check * set correct version numbers, add todo * use config constant for versions * refactor methods and improve error handling * implement PR comments: split install and version checks in two separate checks, move checkVersion method to simulator service * add tests for version checks on init command * flip version issue evalution * separate checks in two steps * remove console log --------- Co-authored-by: den <26140541+denishacquin@users.noreply.github.com> Co-authored-by: Den --- src/commands/general/init.ts | 43 ++++++++++--- src/lib/clients/system.ts | 24 ++++++++ src/lib/config/simulator.ts | 5 ++ src/lib/errors/versionRequired.ts | 9 +++ src/lib/interfaces/ISimulatorService.ts | 3 +- src/lib/services/simulator.ts | 42 ++++++++++++- tests/actions/init.test.ts | 80 ++++++++++++++++++++++--- 7 files changed, 187 insertions(+), 19 deletions(-) create mode 100644 src/lib/errors/versionRequired.ts diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index a85ee730..03244939 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -17,19 +17,46 @@ function getRequirementsErrorMessage({git, docker}: Record): st if (!docker) { return "Docker is not installed. Please install Docker and try again.\n"; } + return ""; } +function getVersionErrorMessage({docker, node}: Record): string { + let message = ""; + + if (docker) { + message += `Docker version ${docker} or higher is required. Please update Docker and try again.\n`; + } + + if (node) { + message += `Node version ${node} or higher is required. Please update Node and try again.\n`; + } + + return message; +} + export async function initAction(options: InitActionOptions, simulatorService: ISimulatorService) { - // Check if git and docker are installed + // Check if requirements are installed try { - const {git, docker} = await simulatorService.checkRequirements(); - const errorMessage = getRequirementsErrorMessage({git, docker}); - if (errorMessage) { - console.log( - "There was a problem running the docker service. Please start the docker service and try again.", - ); - console.error(errorMessage); + const requirementsInstalled = await simulatorService.checkInstallRequirements(); + const requirementErrorMessage = getRequirementsErrorMessage(requirementsInstalled); + + if (requirementErrorMessage) { + console.error(requirementErrorMessage); + return; + } + } catch (error) { + console.error(error); + return; + } + + // Check if the versions are correct + try { + const missingVersions = await simulatorService.checkVersionRequirements(); + const versionErrorMessage = getVersionErrorMessage(missingVersions); + + if (versionErrorMessage) { + console.error(versionErrorMessage); return; } } catch (error) { diff --git a/src/lib/clients/system.ts b/src/lib/clients/system.ts index addb0ab5..2d2d3ae4 100644 --- a/src/lib/clients/system.ts +++ b/src/lib/clients/system.ts @@ -5,6 +5,7 @@ import open from "open"; import {RunningPlatform, AVAILABLE_PLATFORMS} from "../config/simulator"; import {MissingRequirementError} from "../errors/missingRequirement"; +import {VersionRequiredError} from "../errors/versionRequired"; const asyncExec = util.promisify(exec); @@ -53,6 +54,29 @@ export function openUrl(url: string): Promise { return open(url); } +export async function getVersion(toolName: string): Promise { + try { + const toolResponse = await asyncExec(`${toolName} --version`); + + if (toolResponse.stderr) { + throw new Error(toolResponse.stderr); + } + + try { + const versionMatch = toolResponse.stdout.match(/(\d+\.\d+\.\d+)/); + if (versionMatch) { + return versionMatch[1]; + } + } catch (err) { + throw new Error(`Could not parse ${toolName} version.`); + } + } catch (error) { + throw new Error(`Error getting ${toolName} version.`); + } + + return ""; +} + export async function listDockerContainers(): Promise { try { const dockerResponse = await asyncExec("docker ps -a --format '{{.Names}}'"); diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index a532a598..49dfb732 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -17,6 +17,11 @@ export const DEFAULT_RUN_DOCKER_COMMAND = { linux: "sudo systemctl start docker", }; +export const VERSION_REQUIREMENTS = { + docker: "25.0.0", + node: "18.0.0", +}; + export const AVAILABLE_PLATFORMS = ["darwin", "win32", "linux"] as const; export type RunningPlatform = (typeof AVAILABLE_PLATFORMS)[number]; export const STARTING_TIMEOUT_WAIT_CYLCE = 2000; diff --git a/src/lib/errors/versionRequired.ts b/src/lib/errors/versionRequired.ts new file mode 100644 index 00000000..c8609150 --- /dev/null +++ b/src/lib/errors/versionRequired.ts @@ -0,0 +1,9 @@ +export class VersionRequiredError extends Error { + tool: string; + + constructor(tool: string, requiredVersion: string) { + super(`${tool} version ${requiredVersion} or higher is required. Please update ${tool}.`); + this.name = "VersionRequired"; + this.tool = tool; + } +} diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index 7b3e132f..efdd2b08 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -4,7 +4,8 @@ export interface ISimulatorService { getSimulatorLocation(): string; readEnvConfigValue(key: string): string; addConfigToEnvFile(newConfig: Record): void; - checkRequirements(): Promise>; + checkInstallRequirements(): Promise>; + checkVersionRequirements(): Promise>; downloadSimulator(branch?: string): Promise; updateSimulator(branch?: string): Promise; pullOllamaModel(): Promise; diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index e34c3ded..c0e84ef9 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -1,6 +1,7 @@ import * as fs from "fs"; import * as dotenv from "dotenv"; import * as path from "path"; +import * as semver from "semver"; import {rpcClient} from "../clients/jsonRpcClient"; import { @@ -13,9 +14,11 @@ import { STARTING_TIMEOUT_ATTEMPTS, AI_PROVIDERS_CONFIG, AiProviders, + VERSION_REQUIREMENTS, } from "../config/simulator"; import { checkCommand, + getVersion, getHomeDirectory, executeCommand, openUrl, @@ -33,6 +36,7 @@ import { WaitForSimulatorToBeReadyResultType, InitializeDatabaseResultType, } from "../interfaces/ISimulatorService"; +import {VersionRequiredError} from "../errors/versionRequired"; function sleep(millliseconds: number): Promise { return new Promise(resolve => setTimeout(resolve, millliseconds)); @@ -75,7 +79,7 @@ export class SimulatorService implements ISimulatorService { fs.writeFileSync(envFilePath, updatedConfig); } - public async checkRequirements(): Promise> { + public async checkInstallRequirements(): Promise> { const requirementsInstalled = { git: false, docker: false, @@ -89,6 +93,7 @@ export class SimulatorService implements ISimulatorService { throw error; } } + try { await checkCommand("docker --version", "docker"); requirementsInstalled.docker = true; @@ -109,6 +114,41 @@ export class SimulatorService implements ISimulatorService { return requirementsInstalled; } + public async checkVersionRequirements(): Promise> { + const missingVersions = { + docker: '', + node: '', + }; + + try { + await this.checkVersion(VERSION_REQUIREMENTS.node, "node"); + } catch (error: any) { + missingVersions.node = VERSION_REQUIREMENTS.node; + if (!(error instanceof VersionRequiredError)) { + throw error; + } + } + + try { + await this.checkVersion(VERSION_REQUIREMENTS.docker, "docker"); + } catch (error: any) { + missingVersions.docker = VERSION_REQUIREMENTS.docker; + if (!(error instanceof VersionRequiredError)) { + throw error; + } + } + + return missingVersions; + } + + public async checkVersion(minVersion: string, toolName: string): Promise { + const version = await getVersion(toolName); + + if (!semver.satisfies(version, `>=${minVersion}`)) { + throw new VersionRequiredError(toolName, minVersion); + } + } + public async downloadSimulator(branch: string = "main"): Promise { const simulatorLocation = this.getSimulatorLocation(); diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 62b783d9..9f1c27fb 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -13,7 +13,8 @@ describe("init action", () => { let log: jest.Mock; let inquirerPrompt: jest.Mock; - let simServCheckRequirements: jest.Mock; + let simServCheckInstallRequirements: jest.Mock; + let simServCheckVersionRequirements: jest.Mock; let simServResetDockerContainers: jest.Mock; let simServResetDockerImages: jest.Mock; let simServDownloadSimulator: jest.Mock; @@ -35,7 +36,8 @@ describe("init action", () => { log = jest.spyOn(console, "log").mockImplementation(() => {}) as jest.Mock; inquirerPrompt = jest.spyOn(inquirer, "prompt") as jest.Mock; - simServCheckRequirements = jest.spyOn(simulatorService, "checkRequirements") as jest.Mock; + simServCheckInstallRequirements = jest.spyOn(simulatorService, "checkInstallRequirements") as jest.Mock; + simServCheckVersionRequirements = jest.spyOn(simulatorService, "checkVersionRequirements") as jest.Mock; simServResetDockerContainers = jest.spyOn(simulatorService, "resetDockerContainers") as jest.Mock; simServResetDockerImages = jest.spyOn(simulatorService, "resetDockerImages") as jest.Mock; simServDownloadSimulator = jest.spyOn(simulatorService, "downloadSimulator") as jest.Mock; @@ -57,7 +59,7 @@ describe("init action", () => { test("if both requirements are missing, then the execution fails", async () => { // Given - simServCheckRequirements.mockResolvedValue({git: false, docker: false}); + simServCheckInstallRequirements.mockResolvedValue({git: false, docker: false}); // When await initAction(defaultActionOptions, simulatorService); @@ -71,7 +73,7 @@ describe("init action", () => { test("if only docker is missing, then the execution fails", async () => { // Given - simServCheckRequirements.mockResolvedValue({git: true, docker: false}); + simServCheckInstallRequirements.mockResolvedValue({git: true, docker: false}); // When await initAction(defaultActionOptions, simulatorService); @@ -83,7 +85,7 @@ describe("init action", () => { test("if only git is missing, then the execution fails", async () => { // Given - simServCheckRequirements.mockResolvedValue({git: false, docker: true}); + simServCheckInstallRequirements.mockResolvedValue({git: false, docker: true}); // When await initAction(defaultActionOptions, simulatorService); @@ -93,9 +95,69 @@ describe("init action", () => { expect(error).toHaveBeenCalledWith("Git is not installed. Please install Git and try again.\n"); }); - test("if check requirements fail, then the execution aborts", async () => { + test("if check install requirements fail, then the execution aborts", async () => { // Given - simServCheckRequirements.mockRejectedValue(new Error("Error")); + simServCheckInstallRequirements.mockRejectedValue(new Error("Error")); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith(new Error("Error")); + }); + + test("if both versions are too low, then the execution fails", async () => { + const mockVersionNumber = "99.9.9"; + + // Given + simServCheckVersionRequirements.mockResolvedValue({node: mockVersionNumber, docker: mockVersionNumber}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith( + `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\nNode version ${mockVersionNumber} or higher is required. Please update Node and try again.\n`, + ); + }); + + test("if only docker version is too low, then the execution fails", async () => { + const mockVersionNumber = "99.9.9"; + + // Given + simServCheckVersionRequirements.mockResolvedValue({node: "", docker: mockVersionNumber}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith( + `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\n`, + ); + }); + + test("if only node version is too low, then the execution fails", async () => { + const mockVersionNumber = "99.9.9"; + + // Given + simServCheckVersionRequirements.mockResolvedValue({node: mockVersionNumber, docker: ""}); + + // When + await initAction(defaultActionOptions, simulatorService); + + // Then + expect(error).toHaveBeenCalledTimes(1); + expect(error).toHaveBeenCalledWith( + `Node version ${mockVersionNumber} or higher is required. Please update Node and try again.\n`, + ); + }); + + test("if check version requirements fail, then the execution aborts", async () => { + // Given + simServCheckVersionRequirements.mockRejectedValue(new Error("Error")); // When await initAction(defaultActionOptions, simulatorService); @@ -108,7 +170,7 @@ describe("init action", () => { test("if reset is not confirmed, abort", async () => { // Given inquirerPrompt.mockResolvedValue({confirmReset: false}); - simServCheckRequirements.mockResolvedValue({git: true, docker: true}); + simServCheckInstallRequirements.mockResolvedValue({git: true, docker: true}); // When await initAction(defaultActionOptions, simulatorService); @@ -147,7 +209,7 @@ describe("init action", () => { test("if download is not confirmed, abort", async () => { // Given inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: false}); - simServCheckRequirements.mockResolvedValue({git: true, docker: true}); + simServCheckInstallRequirements.mockResolvedValue({git: true, docker: true}); // When await initAction(defaultActionOptions, simulatorService); From 63cf9d39b72da79cc412c924341d6fd2cba7e1b6 Mon Sep 17 00:00:00 2001 From: Cristiam Da Silva Date: Wed, 6 Nov 2024 09:44:30 +0100 Subject: [PATCH 09/67] feat: improve install location behavior (#86) * 3 cli setup testing framework (#35) * test: setup jest configuration with typescript * refactor: removed path alias and changed simulator service toa class injected in the command declaration * test: added init action adn command tests * docs: added testing section on readme file * fix: handle Fetch Error (Mac M3) * refactor: improved function response * fix: await for runSimulator async function * fix: added init action test * fix: solving conflicts * test: added reset docker images and containers calls from init * 33 cli add a warning at init to say that the config is going to be overwritten (#38) * feat: added initial warning about reseting the setup * test: added a test for new step introduced * 37 cli run simulator on certain branch (#39) * feat: added initial warning about reseting the setup * test: added a test for new step introduced * feat: added optional branch when fetching the simulator from github * feat: added branch name on init and up commands * test: added tests for branch option on init command * 41 cli add beta releases for staging branch (#42) * chore: added npm command for beta release * ci: added github action for beta release * Release v0.0.32-beta.0 [skip ci] * 43 cli fix missing endpoints and simulator response (#44) * fix: removed non existing simulator endpoint * refactor: adapted ping simulator response for current and next version * tests: removed non existing simulator endpoint test * Release v0.0.32-beta.1 [skip ci] * 43 cli fix missing endpoints and simulator response (#45) * fix: removed non existing simulator endpoint * refactor: adapted ping simulator response for current and next version * tests: removed non existing simulator endpoint test * Release v0.0.32-beta.2 [skip ci] * 46 cli add node and docker version (#47) * add node and docker version checks * remove redundant check * set correct version numbers, add todo * use config constant for versions * refactor methods and improve error handling * implement PR comments: split install and version checks in two separate checks, move checkVersion method to simulator service * add tests for version checks on init command * flip version issue evalution * separate checks in two steps * remove console log --------- Co-authored-by: Den * Release v0.0.32-beta.3 [skip ci] * fix: removed unused import * fix: removed unused import * fix: updated license in package.json * tests: added jest setup for globals * feat: added location for init and up commands * fix: fixed default location and related tests * fix: removing genlayer-simulator folder * fix: removing unused code --------- Co-authored-by: github-actions[bot] Co-authored-by: den <26140541+denishacquin@users.noreply.github.com> Co-authored-by: Den Co-authored-by: Edinaldo Junior --- CHANGELOG.md | 5 +++ jest.config.js | 1 + jest.setup.js | 1 + package-lock.json | 2 +- package.json | 2 +- src/commands/general/index.ts | 2 + src/commands/general/init.ts | 6 +++ src/commands/general/start.ts | 9 +++- src/lib/clients/system.ts | 5 --- src/lib/interfaces/ISimulatorService.ts | 3 +- src/lib/services/simulator.ts | 57 +++++++++++++------------ tests/actions/init.test.ts | 15 +++++-- tests/commands/init.test.ts | 14 +++++- 13 files changed, 79 insertions(+), 43 deletions(-) create mode 100644 jest.setup.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 5380101d..2a45ce44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ + + + ## 0.0.34 (2024-10-22) ## 0.0.33 (2024-10-22) @@ -9,6 +12,8 @@ * response check ([#78](https://github.com/yeagerai/genlayer-cli/issues/78)) ([09c824f](https://github.com/yeagerai/genlayer-cli/commit/09c824f8b7ac1fff5355317d046752fbf58ab162)) +## 0.0.32-beta.3 (2024-07-26) + ## 0.0.32 (2024-07-15) ## 0.0.32-beta.2 (2024-07-03) diff --git a/jest.config.js b/jest.config.js index c91a9aa8..4c77edb9 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,5 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { preset: "ts-jest/presets/default-esm", + setupFiles: ["./jest.setup.js"], }; diff --git a/jest.setup.js b/jest.setup.js new file mode 100644 index 00000000..3f298db2 --- /dev/null +++ b/jest.setup.js @@ -0,0 +1 @@ +global.__dirname = "~/current/directory"; diff --git a/package-lock.json b/package-lock.json index ab4a3b5e..d2f6892c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "genlayer", - "version": "0.0.34", + "version": "0.0.34" "license": "ISC", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index f2318eef..67eae925 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "cli" ], "author": "GenLayer", - "license": "ISC", + "license": "MIT", "bugs": { "url": "https://github.com/yeagerai/genlayer-cli/issues" }, diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 764ec6af..a1f81a3a 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -11,6 +11,7 @@ export function initializeGeneralCommands(program: Command) { .description("Initialize the GenLayer Environment") .option("--numValidators ", "Number of validators", "5") .option("--branch ", "Branch", "main") + .option("--location ", "Location where it will be installed", process.cwd()) .action((options: InitActionOptions) => initAction(options, simulatorService)); program @@ -19,6 +20,7 @@ export function initializeGeneralCommands(program: Command) { .option("--reset-validators", "Remove all current validators and create new random ones", false) .option("--numValidators ", "Number of validators", "5") .option("--branch ", "Branch", "main") + .option("--location ", "Location where it will be installed", process.cwd()) .action((options: StartActionOptions) => startAction(options, simulatorService)); return program; diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 03244939..e8983c27 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -5,6 +5,8 @@ import {AI_PROVIDERS_CONFIG, AiProviders} from "../../lib/config/simulator"; export interface InitActionOptions { numValidators: number; branch: string; + location: string; + } function getRequirementsErrorMessage({git, docker}: Record): string { @@ -36,6 +38,10 @@ function getVersionErrorMessage({docker, node}: Record): string } export async function initAction(options: InitActionOptions, simulatorService: ISimulatorService) { + // Update simulator location with user input + simulatorService.setSimulatorLocation(options.location); + + // Check if requirements are installed try { const requirementsInstalled = await simulatorService.checkInstallRequirements(); diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index b8031a53..0dcb7905 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -6,10 +6,14 @@ export interface StartActionOptions { resetValidators: string; numValidators: number; branch: string; + location: string; } export async function startAction(options: StartActionOptions, simulatorService: ISimulatorService) { - const {resetValidators, numValidators, branch} = options; + const {resetValidators, numValidators, branch, location} = options; + // Update simulator location with user input + simulatorService.setSimulatorLocation(location); + const restartValidatorsHintText = resetValidators ? `creating new ${numValidators} random validators` @@ -96,7 +100,8 @@ export async function startAction(options: StartActionOptions, simulatorService: `GenLayer simulator initialized successfully! Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`, ); try { - simulatorService.openFrontend(); + await simulatorService.openFrontend(); + } catch (error) { console.error(error); } diff --git a/src/lib/clients/system.ts b/src/lib/clients/system.ts index 2d2d3ae4..92f67c08 100644 --- a/src/lib/clients/system.ts +++ b/src/lib/clients/system.ts @@ -1,6 +1,5 @@ import util from "node:util"; import {ChildProcess, PromiseWithChild, exec} from "child_process"; -import os from "os"; import open from "open"; import {RunningPlatform, AVAILABLE_PLATFORMS} from "../config/simulator"; @@ -38,10 +37,6 @@ export function executeCommand( } } -export function getHomeDirectory(): string { - return os.homedir(); -} - function getPlatform(): RunningPlatform { const currentPlatform = process.platform as RunningPlatform; if (!AVAILABLE_PLATFORMS.includes(currentPlatform)) { diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index efdd2b08..875014da 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -1,9 +1,8 @@ import {AiProviders} from "../config/simulator"; export interface ISimulatorService { + setSimulatorLocation(location: string): void; getSimulatorLocation(): string; - readEnvConfigValue(key: string): string; - addConfigToEnvFile(newConfig: Record): void; checkInstallRequirements(): Promise>; checkVersionRequirements(): Promise>; downloadSimulator(branch?: string): Promise; diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index c0e84ef9..f6e87126 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -19,7 +19,6 @@ import { import { checkCommand, getVersion, - getHomeDirectory, executeCommand, openUrl, listDockerContainers, @@ -34,7 +33,6 @@ import { ISimulatorService, DownloadSimulatorResultType, WaitForSimulatorToBeReadyResultType, - InitializeDatabaseResultType, } from "../interfaces/ISimulatorService"; import {VersionRequiredError} from "../errors/versionRequired"; @@ -43,21 +41,29 @@ function sleep(millliseconds: number): Promise { } export class SimulatorService implements ISimulatorService { + public simulatorLocation: string; + + constructor() { + this.simulatorLocation = ""; + } + + public setSimulatorLocation(location: string): void { + this.simulatorLocation = location; + } + public getSimulatorLocation(): string { - return path.join(getHomeDirectory(), "genlayer-simulator"); + return this.simulatorLocation; } - public readEnvConfigValue(key: string): string { - const simulatorLocation = this.getSimulatorLocation(); - const envFilePath = path.join(simulatorLocation, ".env"); + private readEnvConfigValue(key: string): string { + const envFilePath = path.join(this.simulatorLocation, ".env"); // Transform the config string to object const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); return envConfig[key]; } - public addConfigToEnvFile(newConfig: Record): void { - const simulatorLocation = this.getSimulatorLocation(); - const envFilePath = path.join(simulatorLocation, ".env"); + private addConfigToEnvFile(newConfig: Record): void { + const envFilePath = path.join(this.simulatorLocation, ".env"); // Create a backup of the original .env file fs.writeFileSync(`${envFilePath}.bak`, fs.readFileSync(envFilePath)); @@ -103,6 +109,7 @@ export class SimulatorService implements ISimulatorService { } } + if (requirementsInstalled.docker) { try { await checkCommand("docker ps", "docker"); @@ -116,8 +123,8 @@ export class SimulatorService implements ISimulatorService { public async checkVersionRequirements(): Promise> { const missingVersions = { - docker: '', - node: '', + docker: "", + node: "", }; try { @@ -150,14 +157,12 @@ export class SimulatorService implements ISimulatorService { } public async downloadSimulator(branch: string = "main"): Promise { - const simulatorLocation = this.getSimulatorLocation(); - try { - const gitCommand = `git clone -b ${branch} ${DEFAULT_REPO_GH_URL} ${simulatorLocation}`; + const gitCommand = `git clone -b ${branch} ${DEFAULT_REPO_GH_URL} ${this.simulatorLocation}`; const cmdsByPlatform = {darwin: gitCommand, win32: gitCommand, linux: gitCommand}; await executeCommand(cmdsByPlatform, "git"); } catch (error: any) { - const simulatorLocationExists = fs.existsSync(simulatorLocation); + const simulatorLocationExists = fs.existsSync(this.simulatorLocation); if (simulatorLocationExists) { return {wasInstalled: true}; } @@ -167,16 +172,15 @@ export class SimulatorService implements ISimulatorService { } public async updateSimulator(branch: string = "main"): Promise { - const simulatorLocation = this.getSimulatorLocation(); - const gitCleanCommand = `git -C "${simulatorLocation}" clean -f`; + const gitCleanCommand = `git -C "${this.simulatorLocation}" clean -f`; const cleanCmdsByPlatform = {darwin: gitCleanCommand, win32: gitCleanCommand, linux: gitCleanCommand}; await executeCommand(cleanCmdsByPlatform, "git"); - const gitFetchCommand = `git -C "${simulatorLocation}" fetch`; + const gitFetchCommand = `git -C "${this.simulatorLocation}" fetch`; const fetchCmdsByPlatform = {darwin: gitFetchCommand, win32: gitFetchCommand, linux: gitFetchCommand}; await executeCommand(fetchCmdsByPlatform, "git"); - const gitCheckoutCommand = `git -C "${simulatorLocation}" checkout ${branch}`; + const gitCheckoutCommand = `git -C "${this.simulatorLocation}" checkout ${branch}`; const checkoutCmdsByPlatform = { darwin: gitCheckoutCommand, win32: gitCheckoutCommand, @@ -184,31 +188,28 @@ export class SimulatorService implements ISimulatorService { }; await executeCommand(checkoutCmdsByPlatform, "git"); - const gitPullCommand = `git -C "${simulatorLocation}" pull`; + const gitPullCommand = `git -C "${this.simulatorLocation}" pull`; const pullCmdsByPlatform = {darwin: gitPullCommand, win32: gitPullCommand, linux: gitPullCommand}; await executeCommand(pullCmdsByPlatform, "git"); return true; } public async pullOllamaModel(): Promise { - const simulatorLocation = this.getSimulatorLocation(); - const cmdsByPlatform = DEFAULT_PULL_OLLAMA_COMMAND(simulatorLocation); + const cmdsByPlatform = DEFAULT_PULL_OLLAMA_COMMAND(this.simulatorLocation); await executeCommand(cmdsByPlatform); return true; } public async configSimulator(newConfig: Record): Promise { - const simulatorLocation = this.getSimulatorLocation(); - const envExample = path.join(simulatorLocation, ".env.example"); - const envFilePath = path.join(simulatorLocation, ".env"); + const envExample = path.join(this.simulatorLocation, ".env.example"); + const envFilePath = path.join(this.simulatorLocation, ".env"); fs.copyFileSync(envExample, envFilePath); this.addConfigToEnvFile(newConfig); return true; } public runSimulator(): Promise<{stdout: string; stderr: string}> { - const simulatorLocation = this.getSimulatorLocation(); - const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(simulatorLocation); + const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(this.simulatorLocation); return executeCommand(commandsByPlatform); } @@ -220,7 +221,7 @@ export class SimulatorService implements ISimulatorService { const response = await rpcClient.request({method: "ping", params: []}); //Compatibility with current simulator version - if (response && (response.result === "OK" || response.result.status === "OK" || response.result.data.status === "OK")) { + if (response && (response.result.status === "OK" || response.result.data.status === "OK")) { return {initialized: true}; } if (retries > 0) { diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 9f1c27fb..3aa40b39 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -5,8 +5,10 @@ import inquirer from "inquirer"; import simulatorService from "../../src/lib/services/simulator"; import {initAction} from "../../src/commands/general/init"; +const __dirname = "/current-dir"; // Default options for the action -const defaultActionOptions = {numValidators: 5, branch: "main"}; +const defaultActionOptions = {numValidators: 5, branch: "main", location: __dirname}; + describe("init action", () => { let error: jest.Mock; @@ -36,8 +38,15 @@ describe("init action", () => { log = jest.spyOn(console, "log").mockImplementation(() => {}) as jest.Mock; inquirerPrompt = jest.spyOn(inquirer, "prompt") as jest.Mock; - simServCheckInstallRequirements = jest.spyOn(simulatorService, "checkInstallRequirements") as jest.Mock; - simServCheckVersionRequirements = jest.spyOn(simulatorService, "checkVersionRequirements") as jest.Mock; + simServCheckInstallRequirements = jest.spyOn( + simulatorService, + "checkInstallRequirements", + ) as jest.Mock; + simServCheckVersionRequirements = jest.spyOn( + simulatorService, + "checkVersionRequirements", + ) as jest.Mock; + simServResetDockerContainers = jest.spyOn(simulatorService, "resetDockerContainers") as jest.Mock; simServResetDockerImages = jest.spyOn(simulatorService, "resetDockerImages") as jest.Mock; simServDownloadSimulator = jest.spyOn(simulatorService, "downloadSimulator") as jest.Mock; diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index 9b535387..d266c61b 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -52,6 +52,17 @@ describe("init command", () => { expect(numValidatorsOption?.defaultValue).toBe("main"); }); + test("option --location is accepted", async () => { + expect(() => program.parse(["node", "test", "init", "--location", "./current-dir"])).not.toThrow(); + }); + + test("option --location default value is user's current directory", async () => { + // Given // When + const locationOption = getCommandOption(initCommand, "--location"); + expect(locationOption?.defaultValue).toBe(process.cwd()); + }); + + test("random option is not accepted", async () => { initCommand?.exitOverride(); expect(() => program.parse(["node", "test", "init", "-random"])).toThrow( @@ -67,6 +78,7 @@ describe("init command", () => { program.parse(["node", "test", "init"]); // Then expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({numValidators: "5", branch: "main"}); + expect(action).toHaveBeenCalledWith({numValidators: "5", branch: "main", location: process.cwd()}); + }); }); From 07ff0c38e092a779c975fd2e5115142fcbeb0e4e Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:29:05 -0300 Subject: [PATCH 10/67] refactor: init command and action now covering 100% using vitest (#115) * feat: jest to vitest * refactor: init command and action now covering 100% using vitest * refactor: removing unused comments * test: adding 2 new tests - if only node version is too low AND if only docker version is too low * fix: test always cloning a new repo and trying to checkout AND .gitignore converage folder * fix: remove comments * fix: removing redundant test and line description --- .gitignore | 4 +- jest.config.js | 5 - jest.setup.js | 1 - package-lock.json | 2320 ++++++++++++++++++++++++++++++++--- package.json | 12 +- tests/actions/init.test.ts | 612 ++++----- tests/commands/init.test.ts | 44 +- tsconfig.json | 2 +- vitest.config.ts | 11 + 9 files changed, 2385 insertions(+), 626 deletions(-) delete mode 100644 jest.config.js delete mode 100644 jest.setup.js create mode 100644 vitest.config.ts diff --git a/.gitignore b/.gitignore index 80647510..72660f9e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ node_modules .env .DS_Store -dist \ No newline at end of file +dist +.idea +coverage \ No newline at end of file diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 4c77edb9..00000000 --- a/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: "ts-jest/presets/default-esm", - setupFiles: ["./jest.setup.js"], -}; diff --git a/jest.setup.js b/jest.setup.js deleted file mode 100644 index 3f298db2..00000000 --- a/jest.setup.js +++ /dev/null @@ -1 +0,0 @@ -global.__dirname = "~/current/directory"; diff --git a/package-lock.json b/package-lock.json index d2f6892c..810f24cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "vitest": "^2.1.4" }, "bin": { "genlayer": "dist/index.js" @@ -28,6 +29,7 @@ "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", + "@vitest/coverage-v8": "^2.1.4", "cross-env": "^7.0.3", "esbuild": "^0.24.0", "eslint": "^8.57.0", @@ -35,6 +37,7 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "jest": "^29.7.0", + "jsdom": "^25.0.1", "prettier": "^3.2.5", "release-it": "^17.2.0", "ts-jest": "^29.1.3", @@ -311,19 +314,21 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -438,10 +443,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -671,14 +680,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1269,6 +1278,109 @@ "node": ">=18" } }, + "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/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/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/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1728,10 +1840,10 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", @@ -1984,6 +2096,17 @@ "@octokit/openapi-types": "^22.1.0" } }, + "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/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -2144,92 +2267,326 @@ "node": ">=10" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz", + "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz", + "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz", + "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz", + "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz", + "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz", + "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz", + "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz", + "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz", + "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@tsconfig/node14": { + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz", + "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz", + "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz", + "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz", + "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz", + "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz", + "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz", + "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz", + "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz", + "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", @@ -2282,6 +2639,12 @@ "@babel/types": "^7.20.7" } }, + "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==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -2358,7 +2721,7 @@ "version": "20.17.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.0.tgz", "integrity": "sha512-a7zRo0f0eLo9K5X9Wp5cAqTUNGzuFLDG2R7C4HY2BhcMAsxgSPuRvAC1ZB6QkuUQXf0YZAgfOX2ZyrBa2n4nHQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -2623,81 +2986,282 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "node_modules/@vitest/coverage-v8": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.4.tgz", + "integrity": "sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.7.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, - "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, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@vitest/browser": "2.1.4", + "vitest": "2.1.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "node_modules/@vitest/coverage-v8/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, - "engines": { - "node": ">=0.4.0" + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "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==", + "node_modules/@vitest/coverage-v8/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": { - "debug": "^4.3.4" + "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" }, - "engines": { - "node": ">= 14" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, + "license": "BSD-3-Clause", "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" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=10" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { - "string-width": "^4.1.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", + "node_modules/@vitest/expect": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz", + "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==", + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz", + "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==", + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", + "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz", + "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==", + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.4", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz", + "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==", + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.4", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz", + "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==", + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", + "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.4", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "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, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "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==", + "devOptional": true, + "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, + "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/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { @@ -2917,6 +3481,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -2938,6 +3511,13 @@ "retry": "0.13.1" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "devOptional": true, + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -3373,6 +3953,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -3456,6 +4045,22 @@ } ] }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3485,6 +4090,15 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -3619,6 +4233,19 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", @@ -4047,6 +4674,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cssstyle": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.7.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/dargs": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", @@ -4068,6 +4708,57 @@ "node": ">= 12" } }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -4123,7 +4814,6 @@ "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" @@ -4137,6 +4827,13 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "devOptional": true, + "license": "MIT" + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -4178,6 +4875,15 @@ } } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -4306,6 +5012,16 @@ "node": ">= 14" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", @@ -4419,6 +5135,19 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -5046,6 +5775,15 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5103,6 +5841,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -5296,30 +6043,75 @@ "is-callable": "^1.1.3" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "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": { - "fetch-blob": "^3.1.2" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=12.20.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "node_modules/foreground-child/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/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { @@ -5341,7 +6133,6 @@ "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, "optional": true, "os": [ @@ -5846,6 +6637,19 @@ "node": "14 || >=16.14" } }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5862,7 +6666,7 @@ "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, + "devOptional": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -5885,10 +6689,11 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "devOptional": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6445,6 +7250,13 @@ "node": ">=8" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -6725,6 +7537,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -7313,6 +8141,84 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, + "node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -7542,6 +8448,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "license": "MIT" + }, "node_modules/lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -7578,6 +8490,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -7652,7 +8585,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.6" } @@ -7661,7 +8594,7 @@ "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, + "devOptional": true, "dependencies": { "mime-db": "1.52.0" }, @@ -7713,11 +8646,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/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/mute-stream": { @@ -7728,6 +8670,24 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7874,6 +8834,13 @@ "node": ">=8" } }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -8160,6 +9127,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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/package-json/node_modules/got": { "version": "12.6.1", "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", @@ -8233,6 +9207,19 @@ "parse-path": "^7.0.0" } }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8266,6 +9253,30 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "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/path-scurry/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/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -8275,11 +9286,26 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8375,6 +9401,34 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8509,7 +9563,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -9524,6 +10578,50 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz", + "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.4", + "@rollup/rollup-android-arm64": "4.24.4", + "@rollup/rollup-darwin-arm64": "4.24.4", + "@rollup/rollup-darwin-x64": "4.24.4", + "@rollup/rollup-freebsd-arm64": "4.24.4", + "@rollup/rollup-freebsd-x64": "4.24.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.4", + "@rollup/rollup-linux-arm-musleabihf": "4.24.4", + "@rollup/rollup-linux-arm64-gnu": "4.24.4", + "@rollup/rollup-linux-arm64-musl": "4.24.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4", + "@rollup/rollup-linux-riscv64-gnu": "4.24.4", + "@rollup/rollup-linux-s390x-gnu": "4.24.4", + "@rollup/rollup-linux-x64-gnu": "4.24.4", + "@rollup/rollup-linux-x64-musl": "4.24.4", + "@rollup/rollup-win32-arm64-msvc": "4.24.4", + "@rollup/rollup-win32-ia32-msvc": "4.24.4", + "@rollup/rollup-win32-x64-msvc": "4.24.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -9633,6 +10731,19 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -9750,6 +10861,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "license": "ISC" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -9817,6 +10934,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -9895,6 +11021,18 @@ "node": ">=8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "license": "MIT" + }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -9953,6 +11091,22 @@ "node": ">=8" } }, + "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.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -10013,6 +11167,20 @@ "node": ">=8" } }, + "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-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -10066,6 +11234,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -10135,16 +11310,75 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.58", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.58.tgz", + "integrity": "sha512-MQJrJhjHOYGYb8DobR6Y4AdDbd4TYkyQ+KBDVc5ODzs1cbrvPpfN1IemYi9jfipJ/vR1YWvrDli0hg1y19VRoA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.58" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.58", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.58.tgz", + "integrity": "sha512-dR936xmhBm7AeqHIhCWwK765gZ7dFyL+IqLSFAjJbFlUXGMLCb8i2PzlzaOuWBuplBTaBYseSb565nk/ZEM0Bg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } }, "node_modules/tmpl": { "version": "1.0.5", @@ -10152,15 +11386,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10173,6 +11398,19 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -10484,7 +11722,7 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/unicorn-magic": { @@ -10672,6 +11910,570 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vite": { + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", + "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz", + "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==", + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz", + "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==", + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.4", + "@vitest/mocker": "2.1.4", + "@vitest/pretty-format": "^2.1.4", + "@vitest/runner": "2.1.4", + "@vitest/snapshot": "2.1.4", + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.4", + "@vitest/ui": "2.1.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -10703,6 +12505,42 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -10762,6 +12600,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -10867,6 +12721,25 @@ "node": ">=8" } }, + "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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -10886,6 +12759,28 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", @@ -10898,6 +12793,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 67eae925..b224d239 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "genlayer": "./dist/index.js" }, "scripts": { - "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --watch", + "test": "vitest", + "test:watch": "vitest --watch", + "test:coverage": "vitest run --coverage", "dev": "cross-env NODE_ENV=development node esbuild.config.js", "build": "cross-env NODE_ENV=production node esbuild.config.js", "release": "release-it --ci", @@ -33,22 +35,21 @@ "devDependencies": { "@release-it/conventional-changelog": "^8.0.1", "@types/inquirer": "^9.0.7", - "@types/jest": "^29.5.12", "@types/node": "^20.12.7", "@types/sinon": "^17.0.3", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", + "@vitest/coverage-v8": "^2.1.4", "cross-env": "^7.0.3", "esbuild": "^0.24.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", - "jest": "^29.7.0", + "jsdom": "^25.0.1", "prettier": "^3.2.5", "release-it": "^17.2.0", - "ts-jest": "^29.1.3", "ts-node": "^10.9.2", "typescript": "^5.4.5" }, @@ -58,6 +59,7 @@ "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "vitest": "^2.1.4" } } diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 3aa40b39..27196745 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -1,264 +1,154 @@ -/* eslint-disable import/no-named-as-default-member */ -import {jest} from "@jest/globals"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import inquirer from "inquirer"; - import simulatorService from "../../src/lib/services/simulator"; -import {initAction} from "../../src/commands/general/init"; - -const __dirname = "/current-dir"; -// Default options for the action -const defaultActionOptions = {numValidators: 5, branch: "main", location: __dirname}; +import { initAction } from "../../src/commands/general/init"; +import { tmpdir } from "os"; +import {mkdtempSync} from "fs"; +import {join} from "path"; +const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); +const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir }; describe("init action", () => { - let error: jest.Mock; - let log: jest.Mock; - let inquirerPrompt: jest.Mock; - - let simServCheckInstallRequirements: jest.Mock; - let simServCheckVersionRequirements: jest.Mock; - let simServResetDockerContainers: jest.Mock; - let simServResetDockerImages: jest.Mock; - let simServDownloadSimulator: jest.Mock; - let simServUpdateSimulator: jest.Mock; - let simServgetAiProvidersOptions: jest.Mock; - let simServConfigSimulator: jest.Mock; - let simServRunSimulator: jest.Mock; - let simServWaitForSimulator: jest.Mock; - let simServPullOllamaModel: jest.Mock; - let simServDeleteAllValidators: jest.Mock; - let simServCreateRandomValidators: jest.Mock; - let simServOpenFrontend: jest.Mock; - let simServRedEnvConfigVariable: jest.Mock; + let error: ReturnType; + let log: ReturnType; + let inquirerPrompt: ReturnType; + + let simServCheckInstallRequirements: ReturnType; + let simServCheckVersionRequirements: ReturnType; + let simServResetDockerContainers: ReturnType; + let simServResetDockerImages: ReturnType; + let simServDownloadSimulator: ReturnType; + let simServgetAiProvidersOptions: ReturnType; + let simServConfigSimulator: ReturnType; + let simServRunSimulator: ReturnType; + let simServWaitForSimulator: ReturnType; + let simServPullOllamaModel: ReturnType; + let simServDeleteAllValidators: ReturnType; + let simServCreateRandomValidators: ReturnType; + let simServOpenFrontend: ReturnType; + let simGetSimulatorUrl: ReturnType; beforeEach(() => { - jest.clearAllMocks(); - - error = jest.spyOn(console, "error").mockImplementation(() => {}) as jest.Mock; - log = jest.spyOn(console, "log").mockImplementation(() => {}) as jest.Mock; - inquirerPrompt = jest.spyOn(inquirer, "prompt") as jest.Mock; - - simServCheckInstallRequirements = jest.spyOn( - simulatorService, - "checkInstallRequirements", - ) as jest.Mock; - simServCheckVersionRequirements = jest.spyOn( - simulatorService, - "checkVersionRequirements", - ) as jest.Mock; - - simServResetDockerContainers = jest.spyOn(simulatorService, "resetDockerContainers") as jest.Mock; - simServResetDockerImages = jest.spyOn(simulatorService, "resetDockerImages") as jest.Mock; - simServDownloadSimulator = jest.spyOn(simulatorService, "downloadSimulator") as jest.Mock; - simServUpdateSimulator = jest.spyOn(simulatorService, "updateSimulator") as jest.Mock; - simServConfigSimulator = jest.spyOn(simulatorService, "configSimulator") as jest.Mock; - simServgetAiProvidersOptions = jest.spyOn(simulatorService, "getAiProvidersOptions") as jest.Mock; - simServRunSimulator = jest.spyOn(simulatorService, "runSimulator") as jest.Mock; - simServWaitForSimulator = jest.spyOn(simulatorService, "waitForSimulatorToBeReady") as jest.Mock; - simServPullOllamaModel = jest.spyOn(simulatorService, "pullOllamaModel") as jest.Mock; - simServDeleteAllValidators = jest.spyOn(simulatorService, "deleteAllValidators") as jest.Mock; - simServCreateRandomValidators = jest.spyOn(simulatorService, "createRandomValidators") as jest.Mock; - simServOpenFrontend = jest.spyOn(simulatorService, "openFrontend") as jest.Mock; - simServRedEnvConfigVariable = jest.spyOn(simulatorService, "readEnvConfigValue") as jest.Mock; + vi.clearAllMocks(); + + error = vi.spyOn(console, "error").mockImplementation(() => {}); + log = vi.spyOn(console, "log").mockImplementation(() => {}); + inquirerPrompt = vi.spyOn(inquirer, "prompt"); + + simServCheckInstallRequirements = vi.spyOn(simulatorService, "checkInstallRequirements"); + simServCheckVersionRequirements = vi.spyOn(simulatorService, "checkVersionRequirements"); + simServResetDockerContainers = vi.spyOn(simulatorService, "resetDockerContainers"); + simServResetDockerImages = vi.spyOn(simulatorService, "resetDockerImages"); + simServDownloadSimulator = vi.spyOn(simulatorService, "downloadSimulator"); + simServConfigSimulator = vi.spyOn(simulatorService, "configSimulator"); + simServgetAiProvidersOptions = vi.spyOn(simulatorService, "getAiProvidersOptions"); + simServRunSimulator = vi.spyOn(simulatorService, "runSimulator"); + simServWaitForSimulator = vi.spyOn(simulatorService, "waitForSimulatorToBeReady"); + simServPullOllamaModel = vi.spyOn(simulatorService, "pullOllamaModel"); + simServDeleteAllValidators = vi.spyOn(simulatorService, "deleteAllValidators"); + simServCreateRandomValidators = vi.spyOn(simulatorService, "createRandomValidators"); + simServOpenFrontend = vi.spyOn(simulatorService, "openFrontend"); + simGetSimulatorUrl = vi.spyOn(simulatorService, "getFrontendUrl") }); afterEach(() => { - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); test("if both requirements are missing, then the execution fails", async () => { - // Given - simServCheckInstallRequirements.mockResolvedValue({git: false, docker: false}); + simServCheckInstallRequirements.mockResolvedValue({ git: false, docker: false }); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith( - "Git and Docker are not installed. Please install them and try again.\n", + "Git and Docker are not installed. Please install them and try again.\n" ); }); test("if only docker is missing, then the execution fails", async () => { - // Given - simServCheckInstallRequirements.mockResolvedValue({git: true, docker: false}); + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: false }); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith("Docker is not installed. Please install Docker and try again.\n"); }); test("if only git is missing, then the execution fails", async () => { - // Given - simServCheckInstallRequirements.mockResolvedValue({git: false, docker: true}); + simServCheckInstallRequirements.mockResolvedValue({ git: false, docker: true }); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith("Git is not installed. Please install Git and try again.\n"); }); test("if check install requirements fail, then the execution aborts", async () => { - // Given simServCheckInstallRequirements.mockRejectedValue(new Error("Error")); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith(new Error("Error")); }); test("if both versions are too low, then the execution fails", async () => { const mockVersionNumber = "99.9.9"; + simServCheckVersionRequirements.mockResolvedValue({ + node: mockVersionNumber, + docker: mockVersionNumber, + }); - // Given - simServCheckVersionRequirements.mockResolvedValue({node: mockVersionNumber, docker: mockVersionNumber}); - - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith( - `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\nNode version ${mockVersionNumber} or higher is required. Please update Node and try again.\n`, + `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\nNode version ${mockVersionNumber} or higher is required. Please update Node and try again.\n` ); }); test("if only docker version is too low, then the execution fails", async () => { const mockVersionNumber = "99.9.9"; + simServCheckVersionRequirements.mockResolvedValue({ + docker: mockVersionNumber, + }); - // Given - simServCheckVersionRequirements.mockResolvedValue({node: "", docker: mockVersionNumber}); - - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith( - `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\n`, + `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\n` ); }); test("if only node version is too low, then the execution fails", async () => { const mockVersionNumber = "99.9.9"; + simServCheckVersionRequirements.mockResolvedValue({ + node: mockVersionNumber + }); - // Given - simServCheckVersionRequirements.mockResolvedValue({node: mockVersionNumber, docker: ""}); - - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith( - `Node version ${mockVersionNumber} or higher is required. Please update Node and try again.\n`, + `Node version ${mockVersionNumber} or higher is required. Please update Node and try again.\n` ); }); - test("if check version requirements fail, then the execution aborts", async () => { - // Given - simServCheckVersionRequirements.mockRejectedValue(new Error("Error")); - - // When - await initAction(defaultActionOptions, simulatorService); - - // Then - expect(error).toHaveBeenCalledTimes(1); - expect(error).toHaveBeenCalledWith(new Error("Error")); - }); - test("if reset is not confirmed, abort", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: false}); - simServCheckInstallRequirements.mockResolvedValue({git: true, docker: true}); + inquirerPrompt.mockResolvedValue({ confirmReset: false }); + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(log).toHaveBeenCalledTimes(1); - expect(log).toHaveBeenNthCalledWith(1, "Aborted!"); + expect(log).toHaveBeenCalledWith("Aborted!"); }); test("if resetDockerContainers fail, then the execution aborts", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: true}); + inquirerPrompt.mockResolvedValue({ confirmReset: true }); simServResetDockerContainers.mockRejectedValue(new Error("Error")); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith(new Error("Error")); }); - test("if resetDockerImages fail, then the execution aborts", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: true}); - simServResetDockerImages.mockRejectedValue(new Error("Error")); - - // When - await initAction(defaultActionOptions, simulatorService); - - // Then - expect(error).toHaveBeenCalledTimes(1); - expect(error).toHaveBeenCalledWith(new Error("Error")); - }); - - test("if download is not confirmed, abort", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: false}); - simServCheckInstallRequirements.mockResolvedValue({git: true, docker: true}); - - // When - await initAction(defaultActionOptions, simulatorService); - - // Then - expect(log).toHaveBeenCalledTimes(3); - expect(log).toHaveBeenNthCalledWith(3, "Aborted!"); - }); - - test("if not already installed, it should download and install the simulator", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); - simServDownloadSimulator.mockResolvedValue({wasInstalled: false}); - simServConfigSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution - - // When - await initAction(defaultActionOptions, simulatorService); - - // Then - expect(simulatorService.downloadSimulator).toHaveBeenCalled(); - expect(simulatorService.updateSimulator).not.toHaveBeenCalled(); - }); - - test("if already installed, it should update the simulator", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); - simServDownloadSimulator.mockResolvedValue({wasInstalled: true}); - simServUpdateSimulator.mockResolvedValue(true); - simServConfigSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution - - // When - await initAction(defaultActionOptions, simulatorService); - - // Then - expect(simulatorService.downloadSimulator).toHaveBeenCalled(); - expect(simulatorService.updateSimulator).toHaveBeenCalled(); - }); - - test("should prompt for LLM providers and call configSimulator with selected providers", async () => { - // Given + test("should open the frontend if everything went well", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, @@ -267,313 +157,269 @@ describe("init action", () => { heuristai: "API_KEY2", }); simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, + { name: "OpenAI", value: "openai" }, + { name: "Heurist", value: "heuristai" }, ]); simServConfigSimulator.mockResolvedValue(true); - simServRunSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ initialized: true }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockResolvedValue(true); + simServCreateRandomValidators.mockResolvedValue(true); + simServOpenFrontend.mockResolvedValue(true); + simGetSimulatorUrl.mockResolvedValue('http://localhost:8080/'); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(inquirerPrompt).toHaveBeenNthCalledWith(3, [ - { - type: "checkbox", - name: "selectedLlmProviders", - message: "Select which LLM providers do you want to use:", - choices: [ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ], - validate: expect.any(Function), - }, - ]); - expect(simulatorService.configSimulator).toHaveBeenCalledWith({ - OPENAIKEY: "API_KEY1", - HEURISTAIAPIKEY: "API_KEY2", - }); + const frontendUrl = simulatorService.getFrontendUrl(); + expect(log).toHaveBeenCalledWith( + `GenLayer simulator initialized successfully! Go to ${frontendUrl} in your browser to access it.` + ); }); test("if configSimulator fails, then the execution aborts", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); + inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] }); simServConfigSimulator.mockRejectedValue(new Error("Error")); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith(new Error("Error")); }); test("if runSimulator fails, then the execution aborts", async () => { - // Given - inquirerPrompt.mockResolvedValue({confirmReset: true, confirmDownload: true, selectedLlmProviders: []}); + inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] }); simServRunSimulator.mockRejectedValue(new Error("Error")); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledTimes(1); expect(error).toHaveBeenCalledWith(new Error("Error")); }); - test("should run the simulator after all configurations", async () => { - // Given + test("should pull Ollama model if 'ollama' is in providers", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], + selectedLlmProviders: ["openai", "heuristai", "ollama"], openai: "API_KEY1", heuristai: "API_KEY2", + ollama: "API_KEY3", }); simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, + { name: "OpenAI", value: "openai" }, + { name: "Heurist", value: "heuristai" }, + { name: "Ollama", value: "ollama" }, ]); simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockRejectedValue(new Error("Error")); // This will stop the execution + simServWaitForSimulator.mockResolvedValue({ initialized: true }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockResolvedValue(true); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(simulatorService.runSimulator).toHaveBeenCalled(); + expect(simServPullOllamaModel).toHaveBeenCalled(); }); - test("should abort if waiting for the simulator returns ERROR", async () => { - // Given - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", - }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ]); - simServConfigSimulator.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ - initialized: false, - errorCode: "ERROR", - errorMessage: "errorMessage", - }); + test("logs error if checkVersionRequirements throws", async () => { + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + const errorMsg = new Error("checkVersionRequirements error"); + simServCheckVersionRequirements.mockRejectedValueOnce(errorMsg); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(log).toHaveBeenCalledWith("errorMessage"); - expect(error).toHaveBeenCalledWith("Unable to initialize the GenLayer simulator. Please try again."); + expect(error).toHaveBeenCalledWith(errorMsg); }); - test("should abort if waiting for the simulator returns TIMEOUT", async () => { - // Given - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", - }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ]); - simServConfigSimulator.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ - initialized: false, - errorCode: "TIMEOUT", - errorMessage: "errorMessage", - }); + test("logs 'Aborted!' if confirmDownload is false", async () => { + inquirerPrompt + .mockResolvedValueOnce({ confirmReset: true }) + .mockResolvedValueOnce({ confirmDownload: false }); + + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledWith( - "The simulator is taking too long to initialize. Please try again after the simulator is ready.", - ); + expect(log).toHaveBeenCalledWith("Aborted!"); }); - test("should abort if waiting for the simulator throws an error", async () => { - // Given - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", - }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ]); + test("logs error if resetDockerContainers throws", async () => { + inquirerPrompt.mockResolvedValue({ confirmReset: true }); + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + const errorMsg = new Error("resetDockerContainers error"); + simServResetDockerContainers.mockRejectedValueOnce(errorMsg); + + await initAction(defaultActionOptions, simulatorService); + + expect(error).toHaveBeenCalledWith(errorMsg); + }); + + test("prompts for LLM providers and validates that at least one is selected", async () => { + inquirerPrompt + .mockResolvedValueOnce({ confirmReset: true }) + .mockResolvedValueOnce({ confirmDownload: true }) + .mockImplementation((questions: any) => { + if (questions[0].type === "checkbox") { + const validateFunction = questions[0].validate; + expect(validateFunction([])).toBe("You must choose at least one option."); + expect(validateFunction(["openai"])).toBe(true); + return Promise.resolve({ selectedLlmProviders: ["openai"] }); + } + + if (questions[0].type === "input") { + const validateFunction = questions[0].validate; + expect(validateFunction("")).toBe("Please enter a valid API Key for OpenAI."); + expect(validateFunction("API_KEY1")).toBe(true); + return Promise.resolve({ openai: "API_KEY1" }); + } + }); + + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockRejectedValue(new Error("Error")); + simServWaitForSimulator.mockResolvedValue({ initialized: true }); + simServDeleteAllValidators.mockResolvedValue(true); + simServCreateRandomValidators.mockResolvedValue(true); + simServOpenFrontend.mockResolvedValue(true); - // When await initAction(defaultActionOptions, simulatorService); + }); - // Then - expect(error).toHaveBeenCalledWith(new Error("Error")); + test("logs error if downloadSimulator throws", async () => { + inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true }); + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + const errorMsg = new Error("downloadSimulator error"); + simServDownloadSimulator.mockRejectedValueOnce(errorMsg); + + await initAction(defaultActionOptions, simulatorService); + + expect(error).toHaveBeenCalledWith(errorMsg); }); - test("should pull llama3 from Ollama if ollama is in providers", async () => { - // Given - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai", "ollama"], - openai: "API_KEY1", - heuristai: "API_KEY2", - ollama: "API_KEY2", - }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - {name: "Ollama", value: "ollama"}, - ]); + test("logs error message if simulator fails to initialize with ERROR code", async () => { + inquirerPrompt + .mockResolvedValueOnce({ confirmReset: true }) + .mockResolvedValueOnce({ confirmDownload: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY1" }); + + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ - initialized: true, + initialized: false, + errorCode: "ERROR", + errorMessage: "Simulator failed to initialize due to configuration error.", }); - simServPullOllamaModel.mockResolvedValue(true); - simServDeleteAllValidators.mockRejectedValue(new Error("Error")); // This will stop the execution - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(simServPullOllamaModel).toHaveBeenCalled(); + expect(log).toHaveBeenCalledWith("Simulator failed to initialize due to configuration error."); + expect(error).toHaveBeenCalledWith("Unable to initialize the GenLayer simulator. Please try again."); }); - test("shouldn't pull llama3 from Ollama if ollama is not in providers", async () => { - // Given + test("logs error if runSimulator throws", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], + selectedLlmProviders: ["openai"], openai: "API_KEY1", - heuristai: "API_KEY2", }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ]); + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); simServConfigSimulator.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ - initialized: true, - }); - simServPullOllamaModel.mockResolvedValue(true); - simServDeleteAllValidators.mockRejectedValue(new Error("Error")); // This will stop the execution + const errorMsg = new Error("runSimulator error"); + simServRunSimulator.mockRejectedValueOnce(errorMsg); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(simServPullOllamaModel).not.toHaveBeenCalled(); + expect(error).toHaveBeenCalledWith(errorMsg); }); - test("should abort if deleteAllValidators throws an error", async () => { - // Given + test("logs specific message if waitForSimulatorToBeReady returns TIMEOUT errorCode", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], + selectedLlmProviders: ["openai"], openai: "API_KEY1", - heuristai: "API_KEY2", }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ]); + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ - initialized: true, + initialized: false, + errorCode: "TIMEOUT", + errorMessage: "errorMessage", }); - simServPullOllamaModel.mockResolvedValue(true); - simServDeleteAllValidators.mockRejectedValue(new Error("Error")); - // When await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledWith("Unable to initialize the validators."); + expect(error).toHaveBeenCalledWith( + "The simulator is taking too long to initialize. Please try again after the simulator is ready." + ); }); - test("should abort if createRandomValidators throws an error", async () => { - // Given - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", - }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ]); + test("catches and logs error if waitForSimulatorToBeReady throws an exception", async () => { + inquirerPrompt + .mockResolvedValueOnce({ confirmReset: true }) + .mockResolvedValueOnce({ confirmDownload: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY1" }); + + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ - initialized: true, - }); - simServPullOllamaModel.mockResolvedValue(true); - simServDeleteAllValidators.mockResolvedValue(true); - simServCreateRandomValidators.mockRejectedValue(new Error("Error")); - // When + const errorMsg = new Error("Unexpected simulator error"); + simServWaitForSimulator.mockRejectedValueOnce(errorMsg); + await initAction(defaultActionOptions, simulatorService); - // Then - expect(error).toHaveBeenCalledWith("Unable to initialize the validators."); + expect(error).toHaveBeenCalledWith(errorMsg); }); - test("should open the frontend if everything went well", async () => { - // Given - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", - }); - simServgetAiProvidersOptions.mockReturnValue([ - {name: "OpenAI", value: "openai"}, - {name: "Heurist", value: "heuristai"}, - ]); + test("catches and logs error if openFrontend throws an exception", async () => { + inquirerPrompt + .mockResolvedValueOnce({ confirmReset: true }) + .mockResolvedValueOnce({ confirmDownload: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY1" }); + + simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ - initialized: true, - }); - simServPullOllamaModel.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServDeleteAllValidators.mockResolvedValue(true); simServCreateRandomValidators.mockResolvedValue(true); - simServOpenFrontend.mockResolvedValue(true); - simServRedEnvConfigVariable.mockReturnValue("8080"); - // When + const errorMsg = new Error("Failed to open frontend"); + simServOpenFrontend.mockImplementationOnce(() => { + throw errorMsg; + }); + await initAction(defaultActionOptions, simulatorService); - // Then - const frontendUrl = simulatorService.getFrontendUrl(); - expect(log).toHaveBeenCalledWith( - `GenLayer simulator initialized successfully! Go to ${frontendUrl} in your browser to access it.`, - ); + expect(error).toHaveBeenCalledWith(errorMsg); }); }); diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index d266c61b..0030a679 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -1,12 +1,13 @@ -import {Command} from "commander"; -import {jest} from "@jest/globals"; -import {initializeGeneralCommands} from "../../src/commands/general"; -import {getCommand, getCommandOption} from "../utils"; +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeGeneralCommands } from "../../src/commands/general"; +import { getCommand, getCommandOption } from "../utils"; -jest.mock("inquirer", () => ({ - prompt: jest.fn(() => {}), +vi.mock("inquirer", () => ({ + prompt: vi.fn(() => {}), })); -const action = jest.fn(); + +const action = vi.fn(); describe("init command", () => { let initCommand: Command; @@ -17,15 +18,15 @@ describe("init command", () => { initializeGeneralCommands(program); initCommand = getCommand(program, "init"); - initCommand?.action(async args => { + initCommand?.action(async (args) => { action(args); }); - jest.clearAllMocks(); + vi.clearAllMocks(); }); afterEach(() => { - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); test("doesn't have required arguments nor options", async () => { @@ -37,7 +38,6 @@ describe("init command", () => { }); test("option --numValidators default value is 5", async () => { - // Given // When const numValidatorsOption = getCommandOption(initCommand, "--numValidators"); expect(numValidatorsOption?.defaultValue).toBe("5"); }); @@ -47,13 +47,8 @@ describe("init command", () => { }); test("option --branch default value is main", async () => { - // Given // When - const numValidatorsOption = getCommandOption(initCommand, "--branch"); - expect(numValidatorsOption?.defaultValue).toBe("main"); - }); - - test("option --location is accepted", async () => { - expect(() => program.parse(["node", "test", "init", "--location", "./current-dir"])).not.toThrow(); + const branchOption = getCommandOption(initCommand, "--branch"); + expect(branchOption?.defaultValue).toBe("main"); }); test("option --location default value is user's current directory", async () => { @@ -65,20 +60,17 @@ describe("init command", () => { test("random option is not accepted", async () => { initCommand?.exitOverride(); - expect(() => program.parse(["node", "test", "init", "-random"])).toThrow( - "error: unknown option '-random'", + expect(() => program.parse(["node", "test", "init", "-random"])).toThrowError( + "error: unknown option '-random'" ); - expect(() => program.parse(["node", "test", "init", "--randomOption"])).toThrow( - "error: unknown option '--randomOption'", + expect(() => program.parse(["node", "test", "init", "--randomOption"])).toThrowError( + "error: unknown option '--randomOption'" ); }); test("action is called", async () => { - // Given When program.parse(["node", "test", "init"]); - // Then expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({numValidators: "5", branch: "main", location: process.cwd()}); - + expect(action).toHaveBeenCalledWith({ numValidators: "5", branch: "main", location: process.cwd() }); }); }); diff --git a/tsconfig.json b/tsconfig.json index fbaa85cd..ef290c69 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -116,5 +116,5 @@ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, - "include": ["src/**/*", "tests/**/*"] + "include": ["src/**/*", "tests/**/*", "./vitest.config.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..e4b9cc7d --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import {configDefaults, defineConfig} from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + environment: 'jsdom', + coverage: { + exclude: [...configDefaults.exclude, '*.js', 'src/index.ts', 'tests/**/*.ts', 'src/types'], + } + } +}); \ No newline at end of file From efe5dbf5015af92f431775b84f51dc98356100a9 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:02:46 -0300 Subject: [PATCH 11/67] test: up command (#105) * feat: jest to vitest * refactor: init command and action now covering 100% using vitest * refactor: removing unused comments * test: testing up command * fix: interface types * fix: removing coverage folder * test: adding 2 new tests - if only node version is too low AND if only docker version is too low * fix: test always cloning a new repo and trying to checkout AND .gitignore converage folder * fix: including location in two tests --- package-lock.json | 14461 +++++++++++--------------------- src/commands/general/start.ts | 4 +- tests/commands/up.test.ts | 94 + 3 files changed, 5121 insertions(+), 9438 deletions(-) create mode 100644 tests/commands/up.test.ts diff --git a/package-lock.json b/package-lock.json index 810f24cc..cd333de5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,8 +6,8 @@ "packages": { "": { "name": "genlayer", - "version": "0.0.34" - "license": "ISC", + "version": "0.0.34", + "license": "MIT", "dependencies": { "commander": "^12.0.0", "dotenv": "^16.4.5", @@ -23,7 +23,6 @@ "devDependencies": { "@release-it/conventional-changelog": "^8.0.1", "@types/inquirer": "^9.0.7", - "@types/jest": "^29.5.12", "@types/node": "^20.12.7", "@types/sinon": "^17.0.3", "@types/uuid": "^9.0.8", @@ -36,29 +35,25 @@ "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", - "jest": "^29.7.0", "jsdom": "^25.0.1", "prettier": "^3.2.5", "release-it": "^17.2.0", - "ts-jest": "^29.1.3", "ts-node": "^10.9.2", "typescript": "^5.4.5" } }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -69,9 +64,8 @@ }, "node_modules/@ampproject/remapping/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" @@ -79,9 +73,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" @@ -90,233 +83,8 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/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, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { @@ -325,42 +93,16 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/highlight": { "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -373,9 +115,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -385,9 +126,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -399,42 +139,37 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -444,8 +179,6 @@ }, "node_modules/@babel/parser": { "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -458,5708 +191,2741 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/types": { + "version": "7.26.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@jridgewell/trace-mapping": "0.3.9" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=12" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "brace-expansion": "^1.1.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "*" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@eslint/js": { + "version": "8.57.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "brace-expansion": "^1.1.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "*" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=12.22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hutson/parse-repository-url": { + "version": "5.0.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10.13.0" } }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "node_modules/@iarna/toml": { + "version": "2.2.5", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, + "license": "ISC" + }, + "node_modules/@inquirer/figures": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", "dev": true, + "license": "ISC", "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", - "debug": "^4.3.1", - "globals": "^11.1.0" + "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": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "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/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", - "cpu": [ - "ppc64" - ], + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", - "cpu": [ - "arm" - ], + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", - "cpu": [ - "x64" - ], + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", - "cpu": [ - "arm64" - ], + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", - "cpu": [ - "x64" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", - "cpu": [ - "arm64" - ], + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", - "cpu": [ - "x64" - ], + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", - "cpu": [ - "arm" - ], + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", - "cpu": [ - "arm64" - ], + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", - "cpu": [ - "ia32" - ], + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", - "cpu": [ - "loong64" - ], + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=12.4.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", - "cpu": [ - "mips64el" - ], + "node_modules/@octokit/auth-token": { + "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@octokit/core": { + "version": "5.2.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.3.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", - "cpu": [ - "riscv64" - ], + "node_modules/@octokit/endpoint": { + "version": "9.0.5", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", - "cpu": [ - "s390x" - ], + "node_modules/@octokit/graphql": { + "version": "7.1.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@octokit/request": "^8.3.0", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/openapi-types": { + "version": "22.1.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.2.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@octokit/types": "^12.6.0" + }, "engines": { - "node": ">=18" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "20.0.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "12.6.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@octokit/openapi-types": "^20.0.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/plugin-request-log": { + "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], "engines": { - "node": ">=18" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", - "cpu": [ - "arm64" - ], + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "10.4.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@octokit/types": "^12.6.0" + }, "engines": { - "node": ">=18" + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", - "cpu": [ - "ia32" - ], + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "20.0.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", - "cpu": [ - "x64" - ], + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "12.6.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@octokit/openapi-types": "^20.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@octokit/request": { + "version": "8.4.0", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">= 18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@octokit/request-error": { + "version": "5.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 18" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@octokit/rest": { + "version": "20.1.0", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.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" + "@octokit/core": "^5.0.2", + "@octokit/plugin-paginate-rest": "^9.1.5", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^10.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 18" } }, - "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==", + "node_modules/@octokit/types": { + "version": "13.4.1", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@octokit/openapi-types": "^22.1.0" } }, - "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==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", + "optional": true, "engines": { - "node": "*" + "node": ">=14" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12.22.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "graceful-fs": "4.2.10" }, "engines": { - "node": ">=10.10.0" + "node": ">=12.22.0" } }, - "node_modules/@humanwhocodes/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==", + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", "dev": true, + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@humanwhocodes/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==", + "node_modules/@release-it/conventional-changelog": { + "version": "8.0.2", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "concat-stream": "^2.0.0", + "conventional-changelog": "^5.1.0", + "conventional-recommended-bump": "^9.0.0", + "git-semver-tags": "^8.0.0", + "semver": "^7.6.3" }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || ^22.0.0" + }, + "peerDependencies": { + "release-it": "^17.0.0" } }, - "node_modules/@humanwhocodes/module-importer": { + "node_modules/@release-it/conventional-changelog/node_modules/@conventional-changelog/git-client": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "MIT", + "dependencies": { + "@types/semver": "^7.5.5", + "semver": "^7.5.2" + }, "engines": { - "node": ">=12.22" + "node": ">=18" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "node_modules/@hutson/parse-repository-url": { + "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-filter": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", - "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==", "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=10.13.0" + "node": ">=18" } }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "node_modules/@inquirer/figures": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.1.tgz", - "integrity": "sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==", + "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-parser": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, "engines": { "node": ">=18" } }, - "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==", + "node_modules/@release-it/conventional-changelog/node_modules/git-semver-tags": { + "version": "8.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "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" + "@conventional-changelog/git-client": "^1.0.0", + "meow": "^13.0.0" + }, + "bin": { + "git-semver-tags": "src/cli.js" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@release-it/conventional-changelog/node_modules/meow": { + "version": "13.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/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==", + "node_modules/@release-it/conventional-changelog/node_modules/semver": { + "version": "7.6.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=10" } }, - "node_modules/@isaacs/cliui/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==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.4", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", "dev": true, "license": "MIT" }, - "node_modules/@isaacs/cliui/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==", + "node_modules/@sindresorhus/is": { + "version": "5.6.0", "dev": true, "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@isaacs/cliui/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==", + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/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==", + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=14.16" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@tsconfig/node10": { + "version": "1.0.11", "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@tsconfig/node12": { + "version": "1.0.11", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@tsconfig/node16": { + "version": "1.0.4", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@types/estree": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@types/inquirer": { + "version": "9.0.7", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "@types/through": "*", + "rxjs": "^7.2.0" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@types/json-schema": { + "version": "7.0.15", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "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==", + "node_modules/@types/json5": { + "version": "0.0.29", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sinon": { + "version": "17.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/through": { + "version": "0.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@types/uuid": { + "version": "9.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.7.0", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/type-utils": "7.7.0", + "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { - "node-notifier": { + "typescript": { "optional": true } } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@typescript-eslint/parser": { + "version": "7.7.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", + "debug": "^4.3.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "node": "^18.18.0 || >=20.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.7.0", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@typescript-eslint/type-utils": { + "version": "7.7.0", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/utils": "7.7.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@typescript-eslint/types": { + "version": "7.7.0", "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.7.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { - "node-notifier": { + "typescript": { "optional": true } } }, - "node_modules/@jest/reporters/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==", + "node_modules/@typescript-eslint/utils": { + "version": "7.7.0", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.7.0", "dev": true, + "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@typescript-eslint/types": "7.7.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitest/coverage-v8": { + "version": "2.1.4", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.7.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.4", + "vitest": "2.1.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "node_modules/@vitest/coverage-v8/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/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@vitest/coverage-v8/node_modules/glob": { + "version": "10.4.5", "dev": true, + "license": "ISC", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "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" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { + "version": "7.0.1", "dev": true, + "license": "ISC", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jest/transform/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, + "node_modules/@vitest/expect": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, + "node_modules/@vitest/mocker": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@vitest/spy": "2.1.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "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, + "node_modules/@vitest/pretty-format": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@jridgewell/gen-mapping/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, + "node_modules/@vitest/runner": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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, - "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, - "engines": { - "node": ">=6.0.0" + "@vitest/utils": "2.1.4", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "node_modules/@vitest/snapshot": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@vitest/pretty-format": "2.1.4", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "node_modules/@vitest/spy": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "tinyspy": "^3.0.2" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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, + "node_modules/@vitest/utils": { + "version": "2.1.4", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@vitest/pretty-format": "2.1.4", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" }, - "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, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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==", + "node_modules/acorn": { + "version": "8.11.3", "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 8" + "node": ">=0.4.0" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.4.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "node_modules/acorn-walk": { + "version": "8.3.2", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">=0.4.0" } }, - "node_modules/@octokit/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", + "node_modules/add-stream": { + "version": "1.0.0", "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.1", + "devOptional": true, + "license": "MIT", "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "debug": "^4.3.4" }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, - "node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", + "node_modules/ajv": { + "version": "6.12.6", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">= 18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@octokit/graphql": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", + "node_modules/ansi-align": { + "version": "3.0.1", "dev": true, + "license": "ISC", "dependencies": { - "@octokit/request": "^8.3.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" + "string-width": "^4.1.0" } }, - "node_modules/@octokit/openapi-types": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.1.0.tgz", - "integrity": "sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", - "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", - "dev": true, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", "dependencies": { - "@octokit/types": "^12.6.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">= 18" + "node": ">=8" }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^20.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", - "dev": true, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 18" + "node": ">=10" }, - "peerDependencies": { - "@octokit/core": "5" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", - "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", - "dev": true, - "dependencies": { - "@octokit/types": "^12.6.0" - }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" }, - "peerDependencies": { - "@octokit/core": "5" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "dev": true + "node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "node_modules/argparse": { + "version": "2.0.1", "dev": true, - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } + "license": "Python-2.0" }, - "node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">= 18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", + "node_modules/array-ify": { + "version": "1.0.0", "dev": true, - "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } + "license": "MIT" }, - "node_modules/@octokit/rest": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.0.tgz", - "integrity": "sha512-STVO3itHQLrp80lvcYB2UIKoeil5Ctsgd2s1AM+du3HqZIR35ZH7WE9HLwUOLXH0myA0y3AGNPo8gZtcgIbw0g==", + "node_modules/array-includes": { + "version": "3.1.8", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "^9.1.5", - "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "^10.2.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" }, "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.4.1.tgz", - "integrity": "sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^22.1.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/array-union": { + "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=12.22.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=12.22.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", "dev": true, + "license": "MIT", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@release-it/conventional-changelog": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-8.0.2.tgz", - "integrity": "sha512-WpnWWRr7O0JeLoiejLrPEWnnwFhCscBn1wBTAXeitiz2/Ifaol0s+t8otf/HYq/OiQOri2iH8d0CnVb72tBdIQ==", + "node_modules/array.prototype.map": { + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog": "^5.1.0", - "conventional-recommended-bump": "^9.0.0", - "git-semver-tags": "^8.0.0", - "semver": "^7.6.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || ^22.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "release-it": "^17.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@release-it/conventional-changelog/node_modules/@conventional-changelog/git-client": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz", - "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "@types/semver": "^7.5.5", - "semver": "^7.5.2" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "conventional-commits-filter": { - "optional": true - }, - "conventional-commits-parser": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", - "dev": true, + "node_modules/assertion-error": { + "version": "2.0.1", "license": "MIT", - "optional": true, - "peer": true, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.0.0.tgz", - "integrity": "sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==", + "node_modules/ast-types": { + "version": "0.13.4", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "meow": "^13.0.0" - }, - "bin": { - "conventional-commits-parser": "dist/cli/index.js" + "tslib": "^2.0.1" }, "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/@release-it/conventional-changelog/node_modules/git-semver-tags": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz", - "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==", + "node_modules/async-retry": { + "version": "1.3.3", "dev": true, "license": "MIT", "dependencies": { - "@conventional-changelog/git-client": "^1.0.0", - "meow": "^13.0.0" - }, - "bin": { - "git-semver-tags": "src/cli.js" - }, - "engines": { - "node": ">=18" + "retry": "0.13.1" } }, - "node_modules/@release-it/conventional-changelog/node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "node_modules/asynckit": { + "version": "0.4.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", "dev": true, "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@release-it/conventional-changelog/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/balanced-match": { + "version": "1.0.2", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz", - "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz", - "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz", - "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz", - "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz", - "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz", - "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz", - "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz", - "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz", - "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz", - "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz", - "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz", - "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz", - "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz", - "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz", - "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz", - "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz", - "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz", - "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "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==", "license": "MIT" }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/inquirer": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", - "dev": true, - "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" - } - }, - "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 - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "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 - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.17.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.0.tgz", - "integrity": "sha512-a7zRo0f0eLo9K5X9Wp5cAqTUNGzuFLDG2R7C4HY2BhcMAsxgSPuRvAC1ZB6QkuUQXf0YZAgfOX2ZyrBa2n4nHQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/sinon": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", - "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", - "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz", - "integrity": "sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/type-utils": "7.7.0", - "@typescript-eslint/utils": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", - "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz", - "integrity": "sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/utils": "7.7.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "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.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.0.tgz", - "integrity": "sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitest/coverage-v8": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.4.tgz", - "integrity": "sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.7", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.12", - "magicast": "^0.3.5", - "std-env": "^3.7.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "2.1.4", - "vitest": "2.1.4" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, - "node_modules/@vitest/coverage-v8/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/@vitest/coverage-v8/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/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/expect": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz", - "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==", - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz", - "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==", - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", - "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz", - "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==", - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.1.4", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz", - "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==", - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.4", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz", - "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==", - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", - "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.4", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "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, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "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==", - "devOptional": true, - "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, - "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/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "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==", - "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, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "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 - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.7.tgz", - "integrity": "sha512-XpcFfLoBEAhezrrNw1V+yLXkE7M6uR7xJEsxbG6c/V9v043qurwVJB9r9UTnoSioFDoz1i1VOydpWGmJpfVZbg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.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 - }, - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/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, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/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 - }, - "node_modules/boxen/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, - "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/boxen/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, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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, - "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/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, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "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" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "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 - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001611", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz", - "integrity": "sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==", - "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" - } - ] - }, - "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" - } - }, - "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, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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, - "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": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "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==", - "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==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "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 - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/configstore/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/conventional-changelog": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-5.1.0.tgz", - "integrity": "sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^7.0.0", - "conventional-changelog-atom": "^4.0.0", - "conventional-changelog-codemirror": "^4.0.0", - "conventional-changelog-conventionalcommits": "^7.0.2", - "conventional-changelog-core": "^7.0.0", - "conventional-changelog-ember": "^4.0.0", - "conventional-changelog-eslint": "^5.0.0", - "conventional-changelog-express": "^4.0.0", - "conventional-changelog-jquery": "^5.0.0", - "conventional-changelog-jshint": "^4.0.0", - "conventional-changelog-preset-loader": "^4.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz", - "integrity": "sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz", - "integrity": "sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz", - "integrity": "sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==", - "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^5.0.0", - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^7.0.0", - "conventional-commits-parser": "^5.0.0", - "git-raw-commits": "^4.0.0", - "git-semver-tags": "^7.0.0", - "hosted-git-info": "^7.0.0", - "normalize-package-data": "^6.0.0", - "read-pkg": "^8.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz", - "integrity": "sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz", - "integrity": "sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-express": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz", - "integrity": "sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz", - "integrity": "sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz", - "integrity": "sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", - "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", - "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^4.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "meow": "^12.0.1", - "semver": "^7.5.2", - "split2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-commits-filter": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", - "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", - "dev": true, - "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-9.0.0.tgz", - "integrity": "sha512-HR1yD0G5HgYAu6K0wJjLd7QGRK8MQDqqj6Tn1n/ja1dFwBCE6QmV+iSgQ5F7hkx7OUR/8bHpxJqYtXj2f/opPQ==", - "dev": true, - "dependencies": { - "conventional-changelog-preset-loader": "^4.1.0", - "conventional-commits-filter": "^4.0.0", - "conventional-commits-parser": "^5.0.0", - "git-raw-commits": "^4.0.0", - "git-semver-tags": "^7.0.0", - "meow": "^12.0.1" - }, - "bin": { - "conventional-recommended-bump": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "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 - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.7.1" - }, - "engines": { - "node": ">=18" - } + "node_modules/base64-js": { + "version": "1.5.1", + "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/dargs": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", - "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "node_modules/basic-ftp": { + "version": "5.0.5", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.0.0" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "node_modules/before-after-hook": { + "version": "2.2.3", "dev": true, - "engines": { - "node": ">= 12" - } + "license": "Apache-2.0" }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "devOptional": true, + "node_modules/bl": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "devOptional": true, + "node_modules/boxen": { + "version": "7.1.1", + "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.3.1" + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" }, "engines": { - "node": ">=18" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "devOptional": true, - "license": "BSD-2-Clause", + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, + "license": "MIT", "dependencies": { - "mimic-response": "^3.1.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, - "engines": { - "node": ">=4.0.0" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "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 - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/braces": { + "version": "3.0.2", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "license": "MIT", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" + "fill-range": "^7.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/buffer": { + "version": "5.7.1", + "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": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/buffer-from": { + "version": "1.1.2", "dev": true, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/bundle-name": { + "version": "4.1.0", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "run-applescript": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/cac": { + "version": "6.7.14", + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/cacheable-lookup": { + "version": "7.0.0", "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.16" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/cacheable-request": { + "version": "10.2.14", "dev": true, + "license": "MIT", "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">= 14" + "node": ">=14.16" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "devOptional": true, + "node_modules/call-bind": { + "version": "1.0.7", "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/detect-newline": { + "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, + "node_modules/chai": { + "version": "5.1.2", + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, + "node_modules/chardet": { + "version": "0.7.0", + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 16" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" + "node": ">=8" } }, - "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 - }, - "node_modules/electron-to-chromium": { - "version": "1.4.743", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.743.tgz", - "integrity": "sha512-AYgFmGUanfwZd4QmlGl9KBjoHRvJi6FUnbmfSr6NUk2JKCdHRHpljFGgxLp7L5h0p7uANrLzv0OgHo4TaCk4gA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/cli-boxes": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==" - }, - "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "dev": true, + "node_modules/cli-cursor": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "devOptional": true, - "license": "BSD-2-Clause", + "node_modules/cli-spinners": { + "version": "2.9.2", + "license": "MIT", "engines": { - "node": ">=0.12" + "node": ">=6" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, + "node_modules/cli-width": { + "version": "4.1.0", + "license": "ISC", "engines": { - "node": ">=6" + "node": ">= 12" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" + "node_modules/clone": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=0.8" } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=7.0.0" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "devOptional": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/commander": { + "version": "12.0.0", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "node_modules/compare-func": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/config-chain": { + "version": "1.1.13", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "hasown": "^2.0.0" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/configstore/node_modules/dot-prop": { + "version": "6.0.1", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-obj": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/conventional-changelog": { + "version": "5.1.0", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-changelog-atom": "^4.0.0", + "conventional-changelog-codemirror": "^4.0.0", + "conventional-changelog-conventionalcommits": "^7.0.2", + "conventional-changelog-core": "^7.0.0", + "conventional-changelog-ember": "^4.0.0", + "conventional-changelog-eslint": "^5.0.0", + "conventional-changelog-express": "^4.0.0", + "conventional-changelog-jquery": "^5.0.0", + "conventional-changelog-jshint": "^4.0.0", + "conventional-changelog-preset-loader": "^4.1.0" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "node": ">=16" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=16" } }, - "node_modules/escape-goat": { + "node_modules/conventional-changelog-atom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", "dev": true, + "license": "ISC", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16" } }, - "node_modules/escape-string-regexp": { + "node_modules/conventional-changelog-codemirror": { "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": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", "dev": true, + "license": "ISC", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=16" } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "node_modules/conventional-changelog-core": { + "version": "7.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "dependencies": { + "@hutson/parse-repository-url": "^5.0.0", + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^7.0.0", + "conventional-commits-parser": "^5.0.0", + "git-raw-commits": "^4.0.0", + "git-semver-tags": "^7.0.0", + "hosted-git-info": "^7.0.0", + "normalize-package-data": "^6.0.0", + "read-pkg": "^8.0.0", + "read-pkg-up": "^10.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=16" } }, - "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==", + "node_modules/conventional-changelog-ember": { + "version": "4.0.0", "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "license": "ISC", + "engines": { + "node": ">=16" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/conventional-changelog-eslint": { + "version": "5.0.0", "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "license": "ISC", + "engines": { + "node": ">=16" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/conventional-changelog-express": { + "version": "4.0.0", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "license": "ISC", + "engines": { + "node": ">=16" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", - "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "node_modules/conventional-changelog-jquery": { + "version": "5.0.0", "dev": true, "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", - "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3" - }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } + "node": ">=16" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "node_modules/conventional-changelog-jshint": { + "version": "4.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "debug": "^3.2.7" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=16" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/conventional-changelog-preset-loader": { + "version": "4.1.0", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "license": "MIT", + "engines": { + "node": ">=16" } }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "node_modules/conventional-changelog-writer": { + "version": "7.0.1", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" + "conventional-commits-filter": "^4.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^12.0.1", + "semver": "^7.5.2", + "split2": "^4.0.0" }, - "engines": { - "node": ">=4" + "bin": { + "conventional-changelog-writer": "cli.mjs" }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "engines": { + "node": ">=16" } }, - "node_modules/eslint-plugin-import/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==", + "node_modules/conventional-commits-filter": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=16" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/conventional-commits-parser": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/conventional-recommended-bump": { + "version": "9.0.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "conventional-changelog-preset-loader": "^4.1.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "git-raw-commits": "^4.0.0", + "git-semver-tags": "^7.0.0", + "meow": "^12.0.1" + }, + "bin": { + "conventional-recommended-bump": "cli.mjs" }, "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/cosmiconfig": { + "version": "9.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": "*" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/create-require": { + "version": "1.1.1", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, "bin": { - "semver": "bin/semver.js" + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/cross-spawn": { + "version": "7.0.3", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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, + "node_modules/cssstyle": { + "version": "4.1.0", + "devOptional": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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" + "rrweb-cssom": "^0.7.1" }, "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/dargs": { + "version": "8.1.0", "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { + "node_modules/data-uri-to-buffer": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 12" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, + "node_modules/data-urls": { + "version": "5.0.0", + "devOptional": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=18" } }, - "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, + "node_modules/data-urls/node_modules/tr46": { + "version": "5.0.0", + "devOptional": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "punycode": "^2.3.1" }, "engines": { - "node": ">=4.0" + "node": ">=18" } }, - "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, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "devOptional": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=4.0" + "node": ">=12" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.0.0", + "devOptional": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.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, + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/data-view-buffer": { + "version": "1.0.1", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/debug": { + "version": "4.3.7", + "license": "MIT", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "ms": "^2.1.3" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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 + "node_modules/decimal.js": { + "version": "10.4.3", + "devOptional": true, + "license": "MIT" }, - "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==", + "node_modules/decompress-response": { + "version": "6.0.0", "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" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-glob/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==", + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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 - }, - "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 - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" + "node_modules/deep-eql": { + "version": "5.0.2", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/deep-extend": { + "version": "0.6.0", "dev": true, - "dependencies": { - "bser": "2.1.1" + "license": "MIT", + "engines": { + "node": ">=4.0.0" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "node_modules/deep-is": { + "version": "0.1.4", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.2.1", + "license": "MIT", "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": "^12.20 || >= 14.13" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, + "node_modules/defaults": { + "version": "1.0.4", + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" + "clone": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/defer-to-connect": { + "version": "2.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/define-properties": { + "version": "1.2.1", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/degenerator": { + "version": "5.0.1", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 14" } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "node_modules/delayed-stream": { + "version": "1.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/deprecation": { + "version": "2.3.1", "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } + "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==", + "node_modules/dir-glob": { + "version": "3.0.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "path-type": "^4.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/foreground-child/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==", + "node_modules/doctrine": { + "version": "3.0.0", "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "devOptional": true, + "node_modules/dot-prop": { + "version": "5.3.0", + "dev": true, "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "is-obj": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, + "node_modules/dotenv": { + "version": "16.4.5", + "license": "BSD-2-Clause", "engines": { - "node": ">= 14.17" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "node_modules/eastasianwidth": { + "version": "0.2.0", "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } + "license": "MIT" }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=14.14" + "node": ">=10.13.0" } }, - "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 + "node_modules/entities": { + "version": "4.5.0", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6" } }, - "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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/es-abstract": { + "version": "1.23.3", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -6168,93 +2934,87 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, + "node_modules/es-define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" } }, - "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, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 0.4" } }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "node_modules/es-get-iterator": { + "version": "1.1.3", "dev": true, - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/es-object-atoms": { + "version": "1.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/es-set-tostringtag": { + "version": "2.0.3", "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "node_modules/es-to-primitive": { + "version": "1.2.1", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6263,784 +3023,725 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "node_modules/esbuild": { + "version": "0.24.0", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", - "dev": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 14" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "node_modules/escape-goat": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-raw-commits": { + "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", - "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", "dev": true, - "dependencies": { - "dargs": "^8.0.0", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.mjs" - }, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-semver-tags": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz", - "integrity": "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==", + "node_modules/escodegen": { + "version": "2.1.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "meow": "^12.0.1", - "semver": "^7.5.2" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" }, "bin": { - "git-semver-tags": "cli.mjs" + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=16" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", - "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/eslint": { + "version": "8.57.1", "dev": true, + "license": "MIT", "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" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/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==", + "node_modules/eslint-config-prettier": { + "version": "9.1.0", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "engines": { - "node": ">=10.13.0" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/glob/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==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "ms": "^2.1.1" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.3", "dev": true, + "license": "ISC", "dependencies": { - "ini": "2.0.0" + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint-module-utils": { + "version": "2.12.0", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "debug": "^3.2.7" }, "engines": { - "node": ">=8" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "^2.1.1" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/eslint-plugin-import": { + "version": "2.31.0", "dev": true, + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=10" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "ms": "^2.1.1" } }, - "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 - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", "dev": true, + "license": "Apache-2.0", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "esutils": "^2.0.2" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">=0.10.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "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==", - "engines": { - "node": ">=8" + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "es-define-property": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", "dependencies": { - "function-bind": "^1.1.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" + "node": "*" } }, - "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "node_modules/espree": { + "version": "9.6.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "lru-cache": "^10.0.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "node_modules/esprima": { + "version": "4.0.1", "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": "14 || >=16.14" + "node": ">=4" } }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "devOptional": true, - "license": "MIT", + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "whatwg-encoding": "^3.1.1" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=18" + "node": ">=0.10" } }, - "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 - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "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==", - "devOptional": true, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 14" + "node": ">=4.0" } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "node_modules/estraverse": { + "version": "5.3.0", "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=10.19.0" + "node": ">=4.0" } }, - "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==", - "devOptional": true, + "node_modules/estree-walker": { + "version": "3.0.3", "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" + "@types/estree": "^1.0.0" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/esutils": { + "version": "2.0.3", "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=10.17.0" + "node": ">=0.10.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, + "node_modules/expect-type": { + "version": "1.1.0", + "license": "Apache-2.0", "engines": { - "node": ">= 4" + "node": ">=12.0.0" } }, - "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, + "node_modules/external-editor": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/fast-glob": { + "version": "3.3.2", "dev": true, + "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "@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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 6" } }, - "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==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", "dev": true, + "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "reusify": "^1.0.4" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "node_modules/fetch-blob": { + "version": "3.2.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, "engines": { - "node": ">=10" + "node": "^12.20 || >= 14.13" } }, - "node_modules/inquirer": { - "version": "9.2.19", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.19.tgz", - "integrity": "sha512-WpxOT71HGsFya6/mj5PUue0sWwbpbiPfAR+332zLj/siB0QA1PZM8v3GepegFV1Op189UxHUCF6y8AySdtOMVA==", + "node_modules/figures": { + "version": "3.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.1", - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.8.0" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/file-entry-cache": { + "version": "6.0.1", "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, "engines": { - "node": ">= 0.10" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "node_modules/fill-range": { + "version": "7.0.1", "dev": true, + "license": "MIT", "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 12" + "node": ">=8" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/find-up": { + "version": "5.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "node_modules/flat-cache": { + "version": "3.2.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/for-each": { + "version": "0.3.3", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-callable": "^1.1.3" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/foreground-child": { + "version": "3.3.0", "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-bun-module": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", - "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.6.3" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-bun-module/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" + "node_modules/form-data": { + "version": "4.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/form-data-encoder": { + "version": "2.1.4", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14.17" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", "dev": true, + "license": "MIT", "dependencies": { - "ci-info": "^3.2.0" + "fetch-blob": "^3.1.2" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">=12.20.0" } }, - "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==", + "node_modules/fs-extra": { + "version": "11.2.0", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "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", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "node_modules/function.prototype.name": { + "version": "1.1.6", "dev": true, + "license": "MIT", "dependencies": { - "is-typed-array": "^1.1.13" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -7049,13 +3750,34 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -7064,220 +3786,199 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" - }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/get-symbol-description": { + "version": "1.0.2", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, "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==", - "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/get-tsconfig": { + "version": "4.8.1", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "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==", + "node_modules/get-uri": { + "version": "6.0.3", "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/is-in-ci": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-0.1.0.tgz", - "integrity": "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==", + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", "dev": true, - "bin": { - "is-in-ci": "cli.js" - }, + "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/git-raw-commits": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "is-docker": "^3.0.0" + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" }, "bin": { - "is-inside-container": "cli.js" + "git-raw-commits": "cli.mjs" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/git-semver-tags": { + "version": "7.0.1", "dev": true, + "license": "MIT", "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "meow": "^12.0.1", + "semver": "^7.5.2" }, - "engines": { - "node": ">=10" + "bin": { + "git-semver-tags": "cli.mjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/git-up": { + "version": "7.0.0", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/git-url-parse": { + "version": "14.0.0", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "git-up": "^7.0.0" } }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "node_modules/glob": { + "version": "7.2.3", "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": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=0.12.0" + "node": ">=10.13.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/global-dirs": { + "version": "3.0.1", "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/globals": { + "version": "13.24.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "node_modules/globalthis": { + "version": "1.0.3", "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, "engines": { "node": ">= 0.4" }, @@ -7285,1766 +3986,1162 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "node_modules/globby": { + "version": "11.1.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "protocols": "^2.0.1" + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/got": { + "version": "13.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">= 0.4" + "node": ">=0.4.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/has-bigints": { + "version": "1.0.2", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", - "dev": true, - "dependencies": { - "text-extensions": "^2.0.0" - }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "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==", + "node_modules/has-proto": { + "version": "1.0.3", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "is-inside-container": "^1.0.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.0.tgz", - "integrity": "sha512-jgAw78HO3gs9UrKqJNQvfDj9Ouy8Mhu40fbEJ8yXff4MW8+/Fcn9iFjyWUQ6SKbX8ipPk3X5A3AyfYHRu6uVLw==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" + "function-bind": "^1.1.2" }, "engines": { - "node": "^18.17 || >=20.6.1" - } - }, - "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, - "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "node_modules/hosted-git-info": { + "version": "7.0.1", "dev": true, + "license": "ISC", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "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==", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.2.0", "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, + "license": "ISC", "engines": { - "node": ">=10" + "node": "14 || >=16.14" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "devOptional": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "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==", + "node_modules/html-escaper": { + "version": "2.0.2", "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "node_modules/http-cache-semantics": { + "version": "4.1.1", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "BSD-2-Clause" }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "devOptional": true, + "license": "MIT", "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 14" } }, - "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==", + "node_modules/http2-wrapper": { + "version": "2.2.1", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">=10.19.0" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "devOptional": true, + "license": "MIT", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "node_modules/human-signals": { + "version": "2.1.0", "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10.17.0" } }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "ts-node": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + ], + "license": "BSD-3-Clause" }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "node_modules/ignore": { + "version": "5.3.1", "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 4" } }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "node_modules/import-fresh": { + "version": "3.3.0", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "node": ">=6" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "node_modules/import-lazy": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "node": ">=0.8.19" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "node_modules/inflight": { + "version": "1.0.6", "dev": true, + "license": "ISC", "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "node_modules/ini": { + "version": "2.0.0", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, + "license": "ISC", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, + "node_modules/inquirer": { + "version": "9.2.19", + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "@inquirer/figures": "^1.0.1", + "@ljharb/through": "^2.3.13", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "node_modules/internal-slot": { + "version": "1.0.7", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "node_modules/interpret": { + "version": "1.4.0", "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.10" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "node_modules/ip-address": { + "version": "9.0.5", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 12" } }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", "dev": true, - "engines": { - "node": ">=8" - } + "license": "BSD-3-Clause" }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "node_modules/is-arguments": { + "version": "1.1.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/is-array-buffer": { + "version": "3.0.4", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "node_modules/is-arrayish": { + "version": "0.2.1", "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/is-bigint": { + "version": "1.0.4", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "node_modules/is-boolean-object": { + "version": "1.1.2", "dev": true, + "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/is-bun-module": { + "version": "1.2.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "semver": "^7.6.3" } }, - "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==", + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.6.3", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "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==", + "node_modules/is-callable": { + "version": "1.2.7", "dev": true, - "dependencies": { - "argparse": "^2.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jsdom": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", - "devOptional": true, + "node_modules/is-ci": { + "version": "3.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "cssstyle": "^4.1.0", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "node_modules/jsdom/node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "devOptional": true, + "node_modules/is-core-module": { + "version": "2.15.1", + "dev": true, "license": "MIT", "dependencies": { - "punycode": "^2.3.1" + "hasown": "^2.0.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "devOptional": true, - "license": "BSD-2-Clause", + "node_modules/is-data-view": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "devOptional": true, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, "license": "MIT", "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, + "node_modules/is-docker": { + "version": "3.0.0", + "license": "MIT", "bin": { - "jsesc": "bin/jsesc" + "is-docker": "cli.js" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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 - }, - "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 - }, - "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 - }, - "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 + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "is-extglob": "^2.1.1" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/is-in-ci": { + "version": "0.1.0", "dev": true, - "dependencies": { - "universalify": "^2.0.0" + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, + "node_modules/is-inside-container": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "is-docker": "^3.0.0" }, "bin": { - "JSONStream": "bin.js" + "is-inside-container": "cli.js" }, "engines": { - "node": "*" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/is-installed-globally": { + "version": "0.4.0", "dev": true, + "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, + "node_modules/is-interactive": { + "version": "1.0.0", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "node_modules/is-map": { + "version": "2.0.3", "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, + "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/is-negative-zero": { + "version": "2.0.3", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-npm": { + "version": "6.0.0", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "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==", + "node_modules/is-number-object": { + "version": "1.0.7", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "node_modules/is-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "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 + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "devOptional": 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==", + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "license": "MIT" - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/is-set": { + "version": "2.0.3", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "call-bind": "^1.0.7" }, "engines": { - "node": ">=10" - } - }, - "node_modules/macos-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.2.0.tgz", - "integrity": "sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "node_modules/is-ssh": { + "version": "1.4.0", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "protocols": "^2.0.1" } }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "node_modules/is-stream": { + "version": "2.0.1", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/is-string": { + "version": "1.0.7", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/is-symbol": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", - "dev": true, + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">=16.10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/merge-stream": { + "node_modules/is-text-path": { "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 - }, - "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", + "dependencies": { + "text-extensions": "^2.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/is-typed-array": { + "version": "1.1.13", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "which-typed-array": "^1.1.14" }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "devOptional": true, + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "devOptional": true, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "call-bind": "^1.0.2" }, - "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==", - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, + "node_modules/is-wsl": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/issue-parser": { + "version": "7.0.0", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.17 || >=20.6.1" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "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==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/iterate-iterator": { + "version": "1.0.2", + "dev": true, "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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 - }, - "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 - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "node_modules/iterate-value": { + "version": "1.0.2", "dev": true, - "engines": { - "node": ">= 0.4.0" + "license": "MIT", + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "node_modules/jackspeak": { + "version": "3.4.3", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "type-fest": "^2.5.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/js-tokens": { + "version": "4.0.0", "dev": true, - "engines": { - "node": ">=12.20" + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "node_modules/jsbn": { + "version": "1.1.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } + "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/jsdom": { + "version": "25.0.1", + "devOptional": true, + "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=18" }, "peerDependencies": { - "encoding": "^0.1.0" + "canvas": "^2.11.2" }, "peerDependenciesMeta": { - "encoding": { + "canvas": { "optional": true } } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", - "dev": true, + "node_modules/jsdom/node_modules/tr46": { + "version": "5.0.0", + "devOptional": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "punycode": "^2.3.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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, - "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "dev": true, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "devOptional": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.0.0", + "devOptional": true, + "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/nwsapi": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", - "devOptional": true, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, "license": "MIT" }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "node_modules/json-stringify-safe": { + "version": "5.0.1", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "node_modules/json5": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "minimist": "^1.2.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "node_modules/jsonfile": { + "version": "6.1.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "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==", + "node_modules/jsonparse": { + "version": "1.3.1", "dev": true, - "dependencies": { - "wrappy": "1" - } + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/JSONStream": { + "version": "1.3.5", + "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "bin": { + "JSONStream": "bin.js" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "node_modules/keyv": { + "version": "4.5.4", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "json-buffer": "3.0.1" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/latest-version": { + "version": "7.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "package-json": "^8.1.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-name": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", - "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", + "node_modules/levn": { + "version": "0.4.1", "dev": true, + "license": "MIT", "dependencies": { - "macos-release": "^3.1.0", - "windows-release": "^5.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/lines-and-columns": { + "version": "1.2.4", "dev": true, - "engines": { - "node": ">=12.20" - } + "license": "MIT" }, - "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==", + "node_modules/locate-path": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "p-locate": "^5.0.0" }, "engines": { "node": ">=10" @@ -9053,708 +5150,537 @@ "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==", + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "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==", + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "node_modules/lodash.isplainobject": { + "version": "4.0.6", "dev": true, - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } + "license": "MIT" }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/lodash.isstring": { + "version": "4.0.1", "dev": true, - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } + "license": "MIT" }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "node_modules/lodash.merge": { + "version": "4.6.2", "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "license": "MIT", "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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/loupe": { + "version": "3.1.2", + "license": "MIT" }, - "node_modules/package-json/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "node_modules/lowercase-keys": { + "version": "3.0.0", "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=14.16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/lru-cache": { + "version": "6.0.0", "dev": true, + "license": "ISC", "dependencies": { - "callsites": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/macos-release": { + "version": "3.2.0", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, + "node_modules/magic-string": { + "version": "0.30.12", + "license": "MIT", "dependencies": { - "protocols": "^2.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "node_modules/magicast": { + "version": "0.3.5", "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "devOptional": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" } }, - "node_modules/path-exists": { + "node_modules/make-dir": { "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, - "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, - "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, - "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 - }, - "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", + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-scurry/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==", + "node_modules/make-error": { + "version": "1.3.6", "dev": true, "license": "ISC" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/meow": { + "version": "12.1.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16" + "node": ">= 8" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/micromatch": { + "version": "4.0.5", "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, "engines": { "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", + "devOptional": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 0.6" } }, - "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, + "node_modules/mime-types": { + "version": "2.1.35", + "devOptional": true, + "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "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==", + "node_modules/mimic-response": { + "version": "4.0.0", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/minimatch": { + "version": "9.0.4", "dev": true, + "license": "ISC", "dependencies": { - "p-try": "^2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/minimist": { + "version": "1.2.8", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/possible-typed-array-names": { + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/mute-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "node_modules/nanoid": { + "version": "3.3.7", "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "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==", + "node_modules/natural-compare": { + "version": "1.4.0", "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "license": "MIT" }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">= 0.4.0" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/new-github-release-url": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "type-fest": "^2.5.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.19.0", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/promise.allsettled": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.7.tgz", - "integrity": "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==", + "node_modules/node-domexception": { + "version": "1.0.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "iterate-value": "^1.0.2" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/normalize-package-data": { + "version": "6.0.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">= 6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "node_modules/normalize-url": { + "version": "8.0.1", "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/nwsapi": { + "version": "2.2.13", + "devOptional": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.1", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "devOptional": true, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "node_modules/object.assign": { + "version": "4.1.5", "dev": true, + "license": "MIT", "dependencies": { - "escape-goat": "^4.0.0" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=12.20" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "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" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/object.fromentries": { + "version": "2.0.8", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/object.groupby": { + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "node_modules/object.values": { + "version": "1.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", - "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", + "node_modules/once": { + "version": "1.4.0", "dev": true, + "license": "ISC", "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.1.0", - "type-fest": "^4.2.0" + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=16" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, + "node_modules/open": { + "version": "10.1.0", + "license": "MIT", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/optionator": { + "version": "0.9.3", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^6.0.0" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, + "node_modules/ora": { + "version": "5.4.1", + "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/os-name": { + "version": "5.1.0", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" + "macos-release": "^3.1.0", + "windows-release": "^5.0.1" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -9763,81 +5689,89 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.16.0.tgz", - "integrity": "sha512-z7Rf5PXxIhbI6eJBTwdqe5bO02nUUmctq4WqviFSstBAWV0YNtEQRhEnZw73WJ8sZOqgFG6Jdl8gYZu7NBJZnA==", + "node_modules/p-cancelable": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.20" } }, - "node_modules/read-pkg-up/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "node_modules/p-limit": { + "version": "3.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=12.20" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "node_modules/p-locate": { + "version": "5.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "node_modules/pac-proxy-agent": { + "version": "7.0.1", "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 14" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "node_modules/pac-resolver": { + "version": "7.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" + "degenerator": "^5.0.0", + "netmask": "^2.0.2" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "node_modules/package-json": { + "version": "8.1.1", "dev": true, + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, "engines": { "node": ">=14.16" }, @@ -9845,927 +5779,866 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.16.0.tgz", - "integrity": "sha512-z7Rf5PXxIhbI6eJBTwdqe5bO02nUUmctq4WqviFSstBAWV0YNtEQRhEnZw73WJ8sZOqgFG6Jdl8gYZu7NBJZnA==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BlueOak-1.0.0" }, - "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==", + "node_modules/package-json/node_modules/got": { + "version": "12.6.1", + "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, + "license": "MIT", "dependencies": { - "resolve": "^1.1.6" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "node_modules/parse-json": { + "version": "5.2.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "node_modules/parse-path": { + "version": "7.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" + "protocols": "^2.0.0" } }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "node_modules/parse-url": { + "version": "8.1.0", "dev": true, + "license": "MIT", "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" + "parse-path": "^7.0.0" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/release-it": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-17.2.0.tgz", - "integrity": "sha512-Cidaq5W4apZSpdEDQd2TJhH7GZAwfaG+ewe60p7B7+txyCHYR/T6lGvkKinJmePpdHsM0fzA05yGGXKCiHJHmA==", + "node_modules/path-exists": { + "version": "4.0.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/webpro" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/webpro" - } - ], - "dependencies": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "20.1.0", - "async-retry": "1.3.3", - "chalk": "5.3.0", - "cosmiconfig": "9.0.0", - "execa": "8.0.1", - "git-url-parse": "14.0.0", - "globby": "14.0.1", - "got": "13.0.0", - "inquirer": "9.2.17", - "is-ci": "3.0.1", - "issue-parser": "7.0.0", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "new-github-release-url": "2.0.0", - "node-fetch": "3.3.2", - "open": "10.1.0", - "ora": "8.0.1", - "os-name": "5.1.0", - "promise.allsettled": "1.0.7", - "proxy-agent": "6.4.0", - "semver": "7.6.0", - "shelljs": "0.8.5", - "update-notifier": "7.0.0", - "url-join": "5.0.0", - "wildcard-match": "5.1.3", - "yargs-parser": "21.1.1" - }, - "bin": { - "release-it": "bin/release-it.js" - }, + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.8.0 || ^21.0.0" + "node": ">=8" } }, - "node_modules/release-it/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/release-it/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, + "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/release-it/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" }, - "node_modules/release-it/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/path-scurry": { + "version": "1.11.1", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16.17" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/release-it/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/release-it/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "node_modules/pathe": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/release-it/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=16.17.0" + "node": ">= 0.4" } }, - "node_modules/release-it/node_modules/inquirer": { - "version": "9.2.17", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.17.tgz", - "integrity": "sha512-Vr3Ia2ud5sGnioURkE69endl4SkeJcMzTF6SosKcX5GALJfId7C+JvO5ZZb6y1LOXnEofCPbwzoQ1q0e8Gaduw==", - "dev": true, + "node_modules/postcss": { + "version": "8.4.47", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "figures": "^3.2.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=18" + "node": "^10 || ^12 || >=14" } }, - "node_modules/release-it/node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/release-it/node_modules/inquirer/node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/promise.allsettled": { + "version": "1.0.7", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "iterate-value": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/proto-list": { + "version": "1.2.4", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "license": "ISC" + }, + "node_modules/protocols": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 14" } }, - "node_modules/release-it/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", "dev": true, + "license": "ISC", "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/proxy-from-env": { + "version": "1.1.0", "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "devOptional": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "node": ">=6" } }, - "node_modules/release-it/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/pupa": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "escape-goat": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/queue-microtask": { + "version": "1.2.3", "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, + "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/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "node_modules/rc": { + "version": "1.2.8", "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "rc": "cli.js" } }, - "node_modules/release-it/node_modules/ora/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==", + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", "dev": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/release-it/node_modules/ora/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==", + "node_modules/read-pkg": { + "version": "8.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, "engines": { - "node": ">=12" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/ora/node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "node_modules/read-pkg-up": { + "version": "10.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^8.1.0", + "type-fest": "^4.2.0" + }, "engines": { - "node": ">=18" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "6.3.0", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/ora/node_modules/log-symbols/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==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "7.2.0", "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/ora/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/ora/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==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "5.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/release-it/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.16.0", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/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==", + "node_modules/read-pkg-up/node_modules/yocto-queue": { + "version": "1.0.0", "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/restore-cursor/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==", + "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/read-pkg/node_modules/lines-and-columns": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "7.1.1", "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" }, "engines": { - "node": ">=6" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/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 - }, - "node_modules/release-it/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==", + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=14" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.16.0", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, "engines": { - "node": ">=12" + "node": ">= 0.10" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/registry-auth-token": { + "version": "5.0.2", "dev": true, + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/registry-url": { + "version": "6.0.1", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "rc": "1.2.8" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "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==", + "node_modules/release-it": { + "version": "17.2.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/webpro" + } + ], + "license": "MIT", "dependencies": { - "resolve-from": "^5.0.0" + "@iarna/toml": "2.2.5", + "@octokit/rest": "20.1.0", + "async-retry": "1.3.3", + "chalk": "5.3.0", + "cosmiconfig": "9.0.0", + "execa": "8.0.1", + "git-url-parse": "14.0.0", + "globby": "14.0.1", + "got": "13.0.0", + "inquirer": "9.2.17", + "is-ci": "3.0.1", + "issue-parser": "7.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "new-github-release-url": "2.0.0", + "node-fetch": "3.3.2", + "open": "10.1.0", + "ora": "8.0.1", + "os-name": "5.1.0", + "promise.allsettled": "1.0.7", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "shelljs": "0.8.5", + "update-notifier": "7.0.0", + "url-join": "5.0.0", + "wildcard-match": "5.1.3", + "yargs-parser": "21.1.1" + }, + "bin": { + "release-it": "bin/release-it.js" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.8.0 || ^21.0.0" } }, - "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==", + "node_modules/release-it/node_modules/ansi-regex": { + "version": "6.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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==", + "node_modules/release-it/node_modules/chalk": { + "version": "5.3.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/release-it/node_modules/emoji-regex": { + "version": "10.3.0", "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } + "license": "MIT" }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "node_modules/release-it/node_modules/execa": { + "version": "8.0.1", "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/release-it/node_modules/get-stream": { + "version": "8.0.1", "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/release-it/node_modules/globby": { + "version": "14.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/release-it/node_modules/human-signals": { + "version": "5.0.0", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 4" + "node": ">=16.17.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/release-it/node_modules/inquirer": { + "version": "9.2.17", "dev": true, + "license": "MIT", + "dependencies": { + "@ljharb/through": "^2.3.13", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^3.2.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/release-it/node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rollup": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz", - "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==", + "node_modules/release-it/node_modules/inquirer/node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">=10" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.4", - "@rollup/rollup-android-arm64": "4.24.4", - "@rollup/rollup-darwin-arm64": "4.24.4", - "@rollup/rollup-darwin-x64": "4.24.4", - "@rollup/rollup-freebsd-arm64": "4.24.4", - "@rollup/rollup-freebsd-x64": "4.24.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.4", - "@rollup/rollup-linux-arm-musleabihf": "4.24.4", - "@rollup/rollup-linux-arm64-gnu": "4.24.4", - "@rollup/rollup-linux-arm64-musl": "4.24.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4", - "@rollup/rollup-linux-riscv64-gnu": "4.24.4", - "@rollup/rollup-linux-s390x-gnu": "4.24.4", - "@rollup/rollup-linux-x64-gnu": "4.24.4", - "@rollup/rollup-linux-x64-musl": "4.24.4", - "@rollup/rollup-win32-arm64-msvc": "4.24.4", - "@rollup/rollup-win32-ia32-msvc": "4.24.4", - "@rollup/rollup-win32-x64-msvc": "4.24.4", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "node_modules/release-it/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "engines": { - "node": ">=0.12.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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "node_modules/release-it/node_modules/mimic-fn": { + "version": "4.0.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, + "license": "MIT", "engines": { - "node": ">=0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "node_modules/release-it/node_modules/node-fetch": { + "version": "3.3.2", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/release-it/node_modules/npm-run-path": { + "version": "5.3.0", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "path-key": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "node_modules/release-it/node_modules/onetime": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.3.5" + "mimic-fn": "^4.0.0" }, "engines": { "node": ">=12" @@ -10774,459 +6647,440 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/release-it/node_modules/ora": { + "version": "8.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/release-it/node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { + "node_modules/release-it/node_modules/ora/node_modules/is-interactive": { "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, - "dependencies": { - "shebang-regex": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/release-it/node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" + "node": ">=18" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/release-it/node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "license": "ISC" - }, - "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==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/release-it/node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "node_modules/release-it/node_modules/ora/node_modules/string-width": { + "version": "7.1.0", "dev": true, + "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "node_modules/release-it/node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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==", + "node_modules/release-it/node_modules/path-key": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "node_modules/release-it/node_modules/path-type": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/release-it/node_modules/restore-cursor": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "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/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "node_modules/release-it/node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/release-it/node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", "dev": true, + "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">= 10.x" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "node_modules/release-it/node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/release-it/node_modules/signal-exit": { + "version": "4.1.0", "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/release-it/node_modules/slash": { + "version": "5.1.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "license": "MIT" - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "node_modules/release-it/node_modules/strip-final-newline": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "node_modules/resolve": { + "version": "1.22.8", "dev": true, + "license": "MIT", "dependencies": { - "internal-slot": "^1.0.4" + "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-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "node_modules/responselike": { + "version": "3.0.0", "dev": true, + "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "lowercase-keys": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, - "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==", + "node_modules/retry": { + "version": "0.13.1", "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": ">= 4" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "node_modules/reusify": { + "version": "1.0.4", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "node_modules/rimraf": { + "version": "3.0.2", "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, + "node_modules/rollup": { + "version": "4.24.4", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.4", + "@rollup/rollup-android-arm64": "4.24.4", + "@rollup/rollup-darwin-arm64": "4.24.4", + "@rollup/rollup-darwin-x64": "4.24.4", + "@rollup/rollup-freebsd-arm64": "4.24.4", + "@rollup/rollup-freebsd-x64": "4.24.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.4", + "@rollup/rollup-linux-arm-musleabihf": "4.24.4", + "@rollup/rollup-linux-arm64-gnu": "4.24.4", + "@rollup/rollup-linux-arm64-musl": "4.24.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4", + "@rollup/rollup-linux-riscv64-gnu": "4.24.4", + "@rollup/rollup-linux-s390x-gnu": "4.24.4", + "@rollup/rollup-linux-x64-gnu": "4.24.4", + "@rollup/rollup-linux-x64-musl": "4.24.4", + "@rollup/rollup-win32-arm64-msvc": "4.24.4", + "@rollup/rollup-win32-ia32-msvc": "4.24.4", + "@rollup/rollup-win32-x64-msvc": "4.24.4", + "fsevents": "~2.3.2" } }, - "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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "devOptional": true, + "license": "MIT" }, - "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, + "node_modules/run-applescript": { + "version": "7.0.0", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-bom": { + "node_modules/run-async": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.12.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/run-parallel": { + "version": "1.2.0", "dev": true, - "engines": { - "node": ">=6" + "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/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==", + "node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=8" + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "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/safe-regex-test": { + "version": "1.0.3", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" }, - "engines": { - "node": ">=8" - } - }, - "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, "engines": { "node": ">= 0.4" }, @@ -11234,386 +7088,304 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "devOptional": true, + "node_modules/safer-buffer": { + "version": "2.1.2", "license": "MIT" }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/test-exclude": { + "node_modules/saxes": { "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, + "devOptional": true, + "license": "ISC", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "xmlchars": "^2.2.0" }, "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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=v12.22.7" } }, - "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==", + "node_modules/semver": { + "version": "7.6.0", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/text-extensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", - "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "node_modules/semver-diff": { + "version": "4.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "node_modules/set-function-length": { + "version": "1.2.2", "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" } }, - "node_modules/tldts": { - "version": "6.1.58", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.58.tgz", - "integrity": "sha512-MQJrJhjHOYGYb8DobR6Y4AdDbd4TYkyQ+KBDVc5ODzs1cbrvPpfN1IemYi9jfipJ/vR1YWvrDli0hg1y19VRoA==", - "devOptional": true, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.58" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, - "bin": { - "tldts": "bin/cli.js" + "engines": { + "node": ">= 0.4" } }, - "node_modules/tldts-core": { - "version": "6.1.58", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.58.tgz", - "integrity": "sha512-dR936xmhBm7AeqHIhCWwK765gZ7dFyL+IqLSFAjJbFlUXGMLCb8i2PzlzaOuWBuplBTaBYseSb565nk/ZEM0Bg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "os-tmpdir": "~1.0.2" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=8" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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==", + "node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/tough-cookie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", - "devOptional": true, + "node_modules/shelljs": { + "version": "0.8.5", + "dev": true, "license": "BSD-3-Clause", "dependencies": { - "tldts": "^6.1.32" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" }, "engines": { - "node": ">=16" + "node": ">=4" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "node_modules/side-channel": { + "version": "1.0.6", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ts-jest": { - "version": "29.1.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz", - "integrity": "sha512-6L9qz3ginTd1NKhOxmkP0qU3FyKjj5CPoY+anszfVn6Pmv/RIKzhiMCsH7Yb7UvJR9I2A64rm4zQl531s2F1iw==", + "node_modules/siginfo": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } + "node": ">=8" } }, - "node_modules/ts-jest/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/smart-buffer": { + "version": "4.2.0", "dev": true, - "bin": { - "json5": "lib/cli.js" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/socks": { + "version": "2.8.3", "dev": true, + "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/socks-proxy-agent": { + "version": "8.0.3", "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, "engines": { - "node": ">=0.3.1" + "node": ">= 14" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" }, - "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==", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "4.2.0", "dev": true, + "license": "ISC", "engines": { - "node": ">=4" + "node": ">= 10.x" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/stackback": { + "version": "0.0.2", + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.7.0", + "license": "MIT" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "internal-slot": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "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": { + "name": "string-width", + "version": "4.2.3", + "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.prototype.trim": { + "version": "1.2.9", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -11622,38 +7394,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "node_modules/string.prototype.trimend": { + "version": "1.0.8", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -11662,697 +7423,618 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=14.17" + "node": ">=8" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/strip-bom": { + "version": "3.0.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "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==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "node_modules/strip-final-newline": { + "version": "2.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=8" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", "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" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/update-notifier": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.0.0.tgz", - "integrity": "sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==", + "node_modules/symbol-tree": { + "version": "3.2.4", + "devOptional": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", "dev": true, - "dependencies": { - "boxen": "^7.1.1", - "chalk": "^5.3.0", - "configstore": "^6.0.0", - "import-lazy": "^4.0.0", - "is-in-ci": "^0.1.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.5.4", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, + "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" + "node": ">=6" } }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/text-extensions": { + "version": "2.4.0", "dev": true, + "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/text-table": { + "version": "0.2.0", "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } + "license": "MIT" }, - "node_modules/url-join": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "node_modules/through": { + "version": "2.3.8", "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^18.0.0 || >=20.0.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==" + "node_modules/tinyrainbow": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/tinyspy": { + "version": "3.0.2", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.58", + "devOptional": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.58" + }, "bin": { - "uuid": "dist/bin/uuid" + "tldts": "bin/cli.js" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "node_modules/tldts-core": { + "version": "6.1.58", + "devOptional": true, + "license": "MIT" }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, + "node_modules/tmp": { + "version": "0.0.33", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=10.12.0" + "node": ">=0.6.0" } }, - "node_modules/v8-to-istanbul/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==", + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, + "node_modules/tough-cookie": { + "version": "5.0.0", + "devOptional": true, + "license": "BSD-3-Clause", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" } }, - "node_modules/vite": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", - "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=16" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "typescript": ">=4.2.0" } }, - "node_modules/vite-node": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz", - "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==", + "node_modules/ts-node": { + "version": "10.9.2", + "dev": true, "license": "MIT", "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "pathe": "^1.1.2", - "vite": "^5.0.0" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "funding": { - "url": "https://opencollective.com/vitest" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">=0.3.1" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/typed-array-length": { + "version": "1.0.6", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/typedarray": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/typescript": { + "version": "5.4.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=12" + "node": ">=14.17" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "license": "MIT", + "node_modules/uglify-js": { + "version": "3.17.4", + "dev": true, + "license": "BSD-2-Clause", "optional": true, - "os": [ - "linux" - ], + "bin": { + "uglifyjs": "bin/uglifyjs" + }, "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/undici-types": { + "version": "6.19.8", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/unique-string": { + "version": "3.0.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "crypto-random-string": "^4.0.0" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/universal-user-agent": { + "version": "6.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 10.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/update-notifier": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.1.1", + "chalk": "^5.3.0", + "configstore": "^6.0.0", + "import-lazy": "^4.0.0", + "is-in-ci": "^0.1.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.5.4", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/url-join": { + "version": "5.0.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "5.4.10", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/vite-node": { + "version": "2.1.4", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=12" @@ -12360,8 +8042,6 @@ }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -12398,8 +8078,6 @@ }, "node_modules/vitest": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz", - "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==", "license": "MIT", "dependencies": { "@vitest/expect": "2.1.4", @@ -12463,8 +8141,6 @@ }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12474,41 +8150,27 @@ "node": ">=18" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/web-streams-polyfill": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "license": "BSD-2-Clause" }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12520,8 +8182,6 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -12533,8 +8193,6 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "devOptional": true, "license": "MIT", "engines": { @@ -12543,8 +8201,7 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12552,9 +8209,8 @@ }, "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" }, @@ -12567,9 +8223,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -12583,9 +8238,8 @@ }, "node_modules/which-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -12602,8 +8256,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "license": "MIT", "dependencies": { "siginfo": "^2.0.0", @@ -12618,9 +8270,8 @@ }, "node_modules/widest-line": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^5.0.1" }, @@ -12633,9 +8284,8 @@ }, "node_modules/widest-line/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -12645,15 +8295,13 @@ }, "node_modules/widest-line/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 + "dev": true, + "license": "MIT" }, "node_modules/widest-line/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", @@ -12668,9 +8316,8 @@ }, "node_modules/widest-line/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" }, @@ -12683,15 +8330,13 @@ }, "node_modules/wildcard-match": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.3.tgz", - "integrity": "sha512-a95hPUk+BNzSGLntNXYxsjz2Hooi5oL7xOfJR6CKwSsSALh7vUNuTlzsrZowtYy38JNduYFRVhFv19ocqNOZlg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/windows-release": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", - "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.1.1" }, @@ -12704,14 +8349,12 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12724,8 +8367,6 @@ "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": { @@ -12742,27 +8383,11 @@ }, "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 - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "ISC" }, "node_modules/ws": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "devOptional": true, "license": "MIT", "engines": { @@ -12783,9 +8408,8 @@ }, "node_modules/xdg-basedir": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -12795,8 +8419,6 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -12805,67 +8427,34 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "devOptional": true, "license": "MIT" }, - "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, - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "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, - "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" - } + "license": "ISC" }, "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/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "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" }, diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index 0dcb7905..131111f3 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -3,8 +3,8 @@ import inquirer from "inquirer"; import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; export interface StartActionOptions { - resetValidators: string; - numValidators: number; + resetValidators: boolean; + numValidators: string; branch: string; location: string; } diff --git a/tests/commands/up.test.ts b/tests/commands/up.test.ts new file mode 100644 index 00000000..82d05cd9 --- /dev/null +++ b/tests/commands/up.test.ts @@ -0,0 +1,94 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeGeneralCommands } from "../../src/commands/general"; +import { getCommand, getCommandOption } from "../utils"; + +const action = vi.fn(); + +describe("up command", () => { + let upCommand: Command; + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeGeneralCommands(program); + + upCommand = getCommand(program, "up"); + upCommand?.action(async (args) => { + action(args); + }); + + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("doesn't require arguments or options", async () => { + expect(() => program.parse(["node", "test", "up"])).not.toThrow(); + }); + + test("option --reset-validators is accepted", async () => { + expect(() => program.parse(["node", "test", "up", "--reset-validators"])).not.toThrow(); + }); + + test("option --reset-validators default value is false", async () => { + const resetValidatorsOption = getCommandOption(upCommand, "--reset-validators"); + expect(resetValidatorsOption?.defaultValue).toBe(false); + }); + + test("option --numValidators is accepted", async () => { + expect(() => program.parse(["node", "test", "up", "--numValidators", "10"])).not.toThrow(); + }); + + test("option --numValidators default value is 5", async () => { + const numValidatorsOption = getCommandOption(upCommand, "--numValidators"); + expect(numValidatorsOption?.defaultValue).toBe("5"); + }); + + test("option --branch is accepted", async () => { + expect(() => program.parse(["node", "test", "up", "--branch", "development"])).not.toThrow(); + }); + + test("option --branch default value is main", async () => { + const branchOption = getCommandOption(upCommand, "--branch"); + expect(branchOption?.defaultValue).toBe("main"); + }); + + test("unrecognized option is not accepted", async () => { + upCommand?.exitOverride(); + expect(() => program.parse(["node", "test", "up", "-unknown"])).toThrowError( + "error: unknown option '-unknown'" + ); + expect(() => program.parse(["node", "test", "up", "--unknownOption"])).toThrowError( + "error: unknown option '--unknownOption'" + ); + }); + + test("action is called with default options", async () => { + program.parse(["node", "test", "up"]); + expect(action).toHaveBeenCalledTimes(1); + expect(action).toHaveBeenCalledWith({ resetValidators: false, numValidators: "5", branch: "main", location: process.cwd() }); + }); + + test("action is called with custom options", async () => { + program.parse([ + "node", + "test", + "up", + "--reset-validators", + "--numValidators", + "10", + "--branch", + "development", + ]); + expect(action).toHaveBeenCalledTimes(1); + expect(action).toHaveBeenCalledWith({ + resetValidators: true, + numValidators: "10", + branch: "development", + location: process.cwd(), + }); + }); +}); From 9f0d981f37aa5d64c64017e7d79924f2022150f8 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:10:10 -0300 Subject: [PATCH 12/67] test: start action (#111) * feat: jest to vitest * refactor: init command and action now covering 100% using vitest * refactor: removing unused comments * test: start action * refactor: removing comments * test: adding 2 new tests - if only node version is too low AND if only docker version is too low * fix: test always cloning a new repo and trying to checkout AND .gitignore converage folder * fix: adding setSimulatorLocation --------- Co-authored-by: Cristiam Da Silva --- src/commands/general/start.ts | 2 +- tests/actions/start.test.ts | 172 ++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 tests/actions/start.test.ts diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index 131111f3..e3e1efbf 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -4,7 +4,7 @@ import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; export interface StartActionOptions { resetValidators: boolean; - numValidators: string; + numValidators: number; branch: string; location: string; } diff --git a/tests/actions/start.test.ts b/tests/actions/start.test.ts new file mode 100644 index 00000000..3ae9e6f4 --- /dev/null +++ b/tests/actions/start.test.ts @@ -0,0 +1,172 @@ +import { describe, beforeEach, afterEach, test, expect, vi, Mock } from "vitest"; +import inquirer from "inquirer"; +import { startAction, StartActionOptions } from "../../src/commands/general/start"; +import { ISimulatorService } from "../../src/lib/interfaces/ISimulatorService"; + +describe("startAction - Additional Tests", () => { + let simulatorService: ISimulatorService; + let logSpy: ReturnType; + let errorSpy: ReturnType; + let promptSpy: ReturnType; + + const defaultOptions: StartActionOptions = { + resetValidators: false, + numValidators: 5, + branch: "main", + location: '' + }; + + beforeEach(() => { + logSpy = vi.spyOn(console, "log").mockImplementation(() => {}); + errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); + promptSpy = vi.spyOn(inquirer, "prompt"); + + simulatorService = { + updateSimulator: vi.fn().mockResolvedValue(undefined), + runSimulator: vi.fn().mockResolvedValue(undefined), + waitForSimulatorToBeReady: vi.fn().mockResolvedValue({ initialized: true }), + deleteAllValidators: vi.fn().mockResolvedValue(undefined), + createRandomValidators: vi.fn().mockResolvedValue(undefined), + openFrontend: vi.fn().mockResolvedValue(undefined), + setSimulatorLocation: vi.fn().mockResolvedValue(undefined), + getAiProvidersOptions: vi.fn(() => [ + { name: "Provider A", value: "providerA" }, + { name: "Provider B", value: "providerB" }, + ]), + getFrontendUrl: vi.fn(() => "http://localhost:8080"), + } as unknown as ISimulatorService; + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("runs successfully with default options and keeps existing validators", async () => { + await startAction(defaultOptions, simulatorService); + + expect(simulatorService.updateSimulator).toHaveBeenCalledWith("main"); + expect(simulatorService.runSimulator).toHaveBeenCalled(); + expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled(); + + expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators"); + expect(logSpy).toHaveBeenCalledWith("Updating GenLayer Simulator..."); + expect(logSpy).toHaveBeenCalledWith("Running the GenLayer Simulator..."); + expect(logSpy).toHaveBeenCalledWith("Simulator is running!"); + expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! Go to http://localhost:8080 in your browser to access it."); + + expect(simulatorService.openFrontend).toHaveBeenCalled(); + }); + + test("logs error and stops if updateSimulator fails", async () => { + const errorMsg = new Error("updateSimulator error"); + (simulatorService.updateSimulator as Mock).mockRejectedValueOnce(errorMsg); + + await startAction(defaultOptions, simulatorService); + + expect(errorSpy).toHaveBeenCalledWith(errorMsg); + expect(simulatorService.runSimulator).not.toHaveBeenCalled(); + }); + + test("logs error and stops if runSimulator fails", async () => { + const errorMsg = new Error("runSimulator error"); + (simulatorService.runSimulator as Mock).mockRejectedValueOnce(errorMsg); + + await startAction(defaultOptions, simulatorService); + + expect(errorSpy).toHaveBeenCalledWith(errorMsg); + expect(simulatorService.waitForSimulatorToBeReady).not.toHaveBeenCalled(); + }); + + test("handles resetfValidators correctly by deleting and creating new validators", async () => { + promptSpy.mockResolvedValueOnce({ selectedLlmProviders: ["providerA"] }); + const optionsWithReset: StartActionOptions = { ...defaultOptions, resetValidators: true }; + + await startAction(optionsWithReset, simulatorService); + + expect(simulatorService.deleteAllValidators).toHaveBeenCalled(); + expect(simulatorService.createRandomValidators).toHaveBeenCalledWith(5, ["providerA"]); + expect(logSpy).toHaveBeenCalledWith("New random validators successfully created..."); + }); + + test("logs error if deleteAllValidators fails when resetValidators is true", async () => { + const errorMsg = new Error("deleteAllValidators error"); + (simulatorService.deleteAllValidators as Mock).mockRejectedValueOnce(errorMsg); + const optionsWithReset: StartActionOptions = { ...defaultOptions, resetValidators: true }; + + await startAction(optionsWithReset, simulatorService); + + expect(errorSpy).toHaveBeenCalledWith("Unable to initialize the validators."); + expect(errorSpy).toHaveBeenCalledWith(errorMsg); + expect(simulatorService.createRandomValidators).not.toHaveBeenCalled(); + }); + + test("prompts for LLM providers and validates at least one option is selected", async () => { + const aiProviders = simulatorService.getAiProvidersOptions(false); + expect(aiProviders).toEqual([ + { name: "Provider A", value: "providerA" }, + { name: "Provider B", value: "providerB" }, + ]); + + promptSpy.mockImplementation(async (questions: any) => { + const validateFunction = questions[0].validate; + + expect(validateFunction([])).toBe("You must choose at least one option."); + expect(validateFunction(["providerA"])).toBe(true); + + return { selectedLlmProviders: ["providerA"] }; + }); + + const optionsWithReset: StartActionOptions = { ...defaultOptions, resetValidators: true }; + await startAction(optionsWithReset, simulatorService); + + expect(promptSpy).toHaveBeenCalled(); + expect(simulatorService.createRandomValidators).toHaveBeenCalledWith(5, ["providerA"]); + }); + + test("logs specific message if waitForSimulatorToBeReady returns TIMEOUT errorCode", async () => { + (simulatorService.waitForSimulatorToBeReady as Mock).mockResolvedValue({ + initialized: false, + errorCode: "TIMEOUT", + errorMessage: "Initialization timed out", + }); + + await startAction(defaultOptions, simulatorService); + + expect(errorSpy).toHaveBeenCalledWith( + "The simulator is taking too long to initialize. Please try again after the simulator is ready." + ); + }); + + test("logs error message if simulator fails to initialize with ERROR code", async () => { + (simulatorService.waitForSimulatorToBeReady as Mock).mockResolvedValue({ + initialized: false, + errorCode: "ERROR", + errorMessage: "Initialization failed", + }); + + await startAction(defaultOptions, simulatorService); + + expect(logSpy).toHaveBeenCalledWith("Initialization failed"); + expect(errorSpy).toHaveBeenCalledWith("Unable to initialize the GenLayer simulator. Please try again."); + }); + + test("catches and logs error if waitForSimulatorToBeReady throws an exception", async () => { + const errorMsg = new Error("Unexpected initialization error"); + (simulatorService.waitForSimulatorToBeReady as Mock).mockRejectedValueOnce(errorMsg); + + await startAction(defaultOptions, simulatorService); + + expect(errorSpy).toHaveBeenCalledWith(errorMsg); + }); + + test("catches and logs error if openFrontend throws an exception", async () => { + const errorMsg = new Error("Failed to open frontend"); + (simulatorService.openFrontend as Mock).mockImplementationOnce(() => { + throw errorMsg; + }); + + await startAction(defaultOptions, simulatorService); + + expect(errorSpy).toHaveBeenCalledWith(errorMsg); + }); +}); From c4983698ac4120e5f147bf3d529da2210d178770 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:10:49 -0300 Subject: [PATCH 13/67] feat: group all non major updates (#113) --- renovate.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/renovate.json b/renovate.json index 5db72dd6..110e0148 100644 --- a/renovate.json +++ b/renovate.json @@ -2,5 +2,19 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:recommended" + ], + "packageRules": [ + { + "groupName": "all non-major dependencies", + "groupSlug": "all-minor-patch", + "matchPackageNames": [ + "*" + ], + "matchUpdateTypes": [ + "minor", + "patch" + ], + "matchConfidence": ["very high", "high"] + } ] } From d05d8742aeb682189388f416bec3c76dcba9ca2b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Nov 2024 18:11:22 +0000 Subject: [PATCH 14/67] Release v0.1.0 [skip ci] --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a45ce44..2cfff1d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,11 @@ +## 0.1.0 (2024-11-08) +### Features + +* group all non major updates ([#113](https://github.com/yeagerai/genlayer-cli/issues/113)) ([c498369](https://github.com/yeagerai/genlayer-cli/commit/c4983698ac4120e5f147bf3d529da2210d178770)) ## 0.0.34 (2024-10-22) diff --git a/package-lock.json b/package-lock.json index cd333de5..c7a09f12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.0.34", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.0.34", + "version": "0.1.0", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index b224d239..d8a01b92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.0.34", + "version": "0.1.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From a2d04c15aed3b60899118d0262701887c700d32a Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:12:10 -0300 Subject: [PATCH 15/67] test: jsonRpcClient test 100% (#116) * feat: jest to vitest * refactor: init command and action now covering 100% using vitest * refactor: removing unused comments * test: jsonRpcClient test 100% * test: changing test to cover line 39 * refactor: changing folders name * test: adding 2 new tests - if only node version is too low AND if only docker version is too low * fix: test always cloning a new repo and trying to checkout AND .gitignore converage folder --- tests/libs/jsonRpcClient.test.ts | 60 ++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 tests/libs/jsonRpcClient.test.ts diff --git a/tests/libs/jsonRpcClient.test.ts b/tests/libs/jsonRpcClient.test.ts new file mode 100644 index 00000000..95de7452 --- /dev/null +++ b/tests/libs/jsonRpcClient.test.ts @@ -0,0 +1,60 @@ +import { describe, beforeEach, test, expect, vi, Mock } from "vitest"; +import fetch from "node-fetch"; +import { JsonRpcClient, JsonRPCParams } from "../../src/lib/clients/jsonRpcClient"; + +vi.mock("node-fetch", () => ({ + default: vi.fn(), +})); + +describe("JsonRpcClient - Successful and Unsuccessful Requests", () => { + let rpcClient: JsonRpcClient; + const mockServerUrl = "http://mock-server-url.com"; + + beforeEach(() => { + rpcClient = new JsonRpcClient(mockServerUrl); + }); + + test("should make a successful JSON-RPC request and return the JSON response", async () => { + const mockResponse = { result: "success" }; + + (fetch as Mock).mockResolvedValueOnce({ + ok: true, + json: async () => mockResponse, + }); + + const params: JsonRPCParams = { + method: "testMethod", + params: ["param1", "param2"], + }; + + const response = await rpcClient.request(params); + + expect(fetch).toHaveBeenCalledWith(mockServerUrl, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: expect.stringContaining('"method":"testMethod"'), + }); + expect(response).toEqual(mockResponse); + }); + + test("should return null when the fetch response is not ok", async () => { + (fetch as Mock).mockResolvedValueOnce({ + ok: false, + json: async () => ({ error: "Something went wrong" }), + }); + + const params: JsonRPCParams = { + method: "testMethod", + params: ["param1", "param2"], + }; + + const response = await rpcClient.request(params); + + expect(response).toBeNull(); + expect(fetch).toHaveBeenCalledWith(mockServerUrl, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: expect.stringContaining('"method":"testMethod"'), + }); + }); +}); From 89eb7498a0f430ded1782cf3e3396792db04c7ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Nov 2024 18:12:41 +0000 Subject: [PATCH 16/67] Release v0.1.1 [skip ci] --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cfff1d0..9de9b465 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ +## 0.1.1 (2024-11-08) + ## 0.1.0 (2024-11-08) diff --git a/package-lock.json b/package-lock.json index c7a09f12..e0597af9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index d8a01b92..cadcbbfc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.1.0", + "version": "0.1.1", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From a1945c4d7da8124a67b6a4c0ad809f2c140f10c8 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:32:03 -0300 Subject: [PATCH 17/67] test: 100% coverage on system.ts (#125) --- src/lib/clients/system.ts | 25 ++--- tests/libs/system.test.ts | 223 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+), 15 deletions(-) create mode 100644 tests/libs/system.test.ts diff --git a/src/lib/clients/system.ts b/src/lib/clients/system.ts index 92f67c08..804d7cbf 100644 --- a/src/lib/clients/system.ts +++ b/src/lib/clients/system.ts @@ -4,12 +4,9 @@ import open from "open"; import {RunningPlatform, AVAILABLE_PLATFORMS} from "../config/simulator"; import {MissingRequirementError} from "../errors/missingRequirement"; -import {VersionRequiredError} from "../errors/versionRequired"; - -const asyncExec = util.promisify(exec); export async function checkCommand(command: string, toolName: string): Promise { - const {stderr} = await asyncExec(command); + const {stderr} = await util.promisify(exec)(command); if (stderr) { throw new MissingRequirementError(toolName); } @@ -24,14 +21,14 @@ type ExecuteCommandByPlatformInput = { [key in RunningPlatform]: string; }; -export function executeCommand( +export async function executeCommand( cmdsByPlatform: ExecuteCommandByPlatformInput, toolName?: string, -): PromiseWithChild { +): Promise { const runningPlatform = getPlatform(); const command = cmdsByPlatform[runningPlatform]; try { - return asyncExec(command); + return await util.promisify(exec)(command); } catch (error: any) { throw new Error(`Error executing ${toolName || command}: ${error.message}.`); } @@ -51,7 +48,7 @@ export function openUrl(url: string): Promise { export async function getVersion(toolName: string): Promise { try { - const toolResponse = await asyncExec(`${toolName} --version`); + const toolResponse = await util.promisify(exec)(`${toolName} --version`); if (toolResponse.stderr) { throw new Error(toolResponse.stderr); @@ -74,29 +71,27 @@ export async function getVersion(toolName: string): Promise { export async function listDockerContainers(): Promise { try { - const dockerResponse = await asyncExec("docker ps -a --format '{{.Names}}'"); + const dockerResponse = await util.promisify(exec)("docker ps -a --format '{{.Names}}'"); const dockerContainers = dockerResponse.stdout.split("\n"); return dockerContainers; } catch (error) { throw new Error("Error listing Docker containers."); } - return []; } export async function listDockerImages(): Promise { try { - const dockerResponse = await asyncExec("docker images --format '{{.Repository}}'"); + const dockerResponse = await util.promisify(exec)("docker images --format '{{.Repository}}'"); const dockerImages = dockerResponse.stdout.split("\n"); return dockerImages; } catch (error) { throw new Error("Error listing Docker images."); } - return []; } export async function stopDockerContainer(containerName: string): Promise { try { - await asyncExec(`docker stop ${containerName}`); + await util.promisify(exec)(`docker stop ${containerName}`); } catch (error) { throw new Error(`Error stopping Docker container ${containerName}.`); } @@ -104,7 +99,7 @@ export async function stopDockerContainer(containerName: string): Promise export async function removeDockerContainer(containerName: string) { try { - await asyncExec(`docker rm ${containerName}`); + await util.promisify(exec)(`docker rm ${containerName}`); } catch (error) { throw new Error(`Error removing container ${containerName}.`); } @@ -112,7 +107,7 @@ export async function removeDockerContainer(containerName: string) { export async function removeDockerImage(imageName: string) { try { - await asyncExec(`docker rmi ${imageName}`); + await util.promisify(exec)(`docker rmi ${imageName}`); } catch (error) { throw new Error(`Error removing image ${imageName}.`); } diff --git a/tests/libs/system.test.ts b/tests/libs/system.test.ts new file mode 100644 index 00000000..d759a5bd --- /dev/null +++ b/tests/libs/system.test.ts @@ -0,0 +1,223 @@ +import { describe, test, expect, vi, beforeEach } from "vitest"; +import util from "node:util"; +import { + checkCommand, + executeCommand, + openUrl, + getVersion, + listDockerContainers, + listDockerImages, + stopDockerContainer, + removeDockerContainer, + removeDockerImage +} from "../../src/lib/clients/system"; +import { MissingRequirementError } from "../../src/lib/errors/missingRequirement"; +import open from "open"; + +vi.mock("open"); +vi.mock("util"); + +describe("System Functions - Success Paths", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("openUrl opens URL successfully", async () => { + const openSpy = vi.mocked(open).mockResolvedValue({} as any); + const url = "https://example.com"; + await openUrl(url); + expect(openSpy).toHaveBeenCalledWith(url); + }); + + test("getVersion retrieves tool version", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + stdout: "git v1.2.3", + stderr: "" + })); + const version = await getVersion("git"); + expect(version).toBe("1.2.3"); + }); + + test("checkCommand verifies a command exists", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ stdout: "", stderr: "" })); + const result = await checkCommand("node --version", "node"); + expect(result).toBe(undefined); + }); + + test("executeCommand executes a command successfully", async () => { + const platformSpy = vi.spyOn(process, "platform", "get").mockReturnValue("linux"); + vi.mocked(util.promisify).mockReturnValueOnce((param: string) => Promise.resolve({ + stdout: param, + stderr: "" + })); + const result = await executeCommand({ + linux: "echo linux", + win32: "echo win32", + darwin: "echo darwin", + }, + "echo"); + expect(result.stdout).toBe("echo linux"); + platformSpy.mockRestore(); + }); + + test("listDockerContainers retrieves a list of containers", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + stdout: "container1\ncontainer2", + stderr: "" + })); + const containers = await listDockerContainers(); + expect(containers).toEqual(["container1", "container2"]); + }); + + test("listDockerImages retrieves a list of images", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + stdout: "image1\nimage2", + stderr: "" + })); + const images = await listDockerImages(); + expect(images).toEqual(["image1", "image2"]); + }); + + test("stopDockerContainer stops a container", async () => { + const containerId = "container123"; + const execMock = vi.fn().mockResolvedValue({ stdout: "", stderr: "" }); + vi.mocked(util.promisify).mockReturnValue(execMock); + await stopDockerContainer(containerId); + expect(execMock).toHaveBeenCalledWith(`docker stop ${containerId}`); + }); + + test("removeDockerContainer removes a container", async () => { + const containerId = "container123"; + const execMock = vi.fn().mockResolvedValue({ stdout: "", stderr: "" }); + vi.mocked(util.promisify).mockReturnValue(execMock); + await removeDockerContainer(containerId); + expect(execMock).toHaveBeenCalledWith(`docker rm ${containerId}`); + }); + + test("removeDockerImage removes an image", async () => { + const imageId = "image123"; + const execMock = vi.fn().mockResolvedValue({ stdout: "", stderr: "" }); + vi.mocked(util.promisify).mockReturnValue(execMock); + await removeDockerImage(imageId); + expect(execMock).toHaveBeenCalledWith(`docker rmi ${imageId}`); + }); +}); + +describe("System Functions - Error Paths", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + test("getVersion throws an error if the command fails", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + stdout: "", + stderr: "command not found" + })); + const toolName = "nonexistent"; + await expect(getVersion(toolName)).rejects.toThrow(`Error getting ${toolName} version.`); + }); + + test("getVersion returns '' if stdout is empty", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + stdout: "", + stderr: "" + })); + const result = await getVersion('git'); + expect(result).toBe(""); + }); + + test("getVersion throw error if stdout undefined", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + stderr: "" + })); + const toolName = "nonexistent"; + await expect(getVersion(toolName)).rejects.toThrow(`Error getting ${toolName} version.`); + }); + + test("checkCommand returns false if the command does not exist", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + stdout: "", + stderr: "command not found" + })); + const toolName = 'nonexistent'; + await expect(checkCommand(`${toolName} --version`, toolName)).rejects.toThrow(new MissingRequirementError(toolName)); + }); + + test("executeCommand throws an error if the command fails", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error("Execution failed"))); + await expect(executeCommand({ + linux: "echo hello", + win32: "echo hello", + darwin: "echo hello", + }, + "echo")).rejects.toThrow("Execution failed"); + }); + + test("stopDockerContainer throws an error if stopping fails", async () => { + const containerId = "container123"; + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); + await expect(stopDockerContainer(containerId)).rejects.toThrow("Error stopping Docker container container123"); + }); + + test("removeDockerContainer throws an error if removal fails", async () => { + const containerId = "container123"; + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); + await expect(removeDockerContainer(containerId)).rejects.toThrow("Error removing container container123."); + }); + + test("removeDockerImage throws an error if image removal fails", async () => { + const imageId = "image123"; + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); + await expect(removeDockerImage(imageId)).rejects.toThrow("Error removing image image123."); + }); + + test("throws error when command fails", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); + await expect(listDockerContainers()).rejects.toThrow("Error listing Docker containers."); + }); + + test("throws error when command fails", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); + await expect(listDockerImages()).rejects.toThrow("Error listing Docker images."); + }); + + test("throws error when command execution fails", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error("Execution error."))); + await expect(executeCommand({ + linux: "echo no toolname", + win32: "echo no toolname", + darwin: "echo no toolname", + })).rejects.toThrow( + "Error executing echo no toolname: Execution error." + ); + }); + + test("throws error when command execution fails (toolname)", async () => { + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error("Execution error."))); + await expect(executeCommand({ + linux: "echo linux", + win32: "echo win32", + darwin: "echo darwin", + }, + "echo")).rejects.toThrow( + "Error executing echo: Execution error." + ); + }); + + test("throws an error for unsupported platform in executeCommand", () => { + const unsupportedPlatform = "unsupportedOS"; + const originalPlatform = process.platform; + Object.defineProperty(process, "platform", { + value: unsupportedPlatform, + }); + const cmdsByPlatform = { + linux: "echo Linux", + darwin: "echo macOS", + win32: "echo Windows", + }; + expect(executeCommand(cmdsByPlatform)).rejects.toThrow( + `Unsupported platform: ${unsupportedPlatform}.` + ); + Object.defineProperty(process, "platform", { value: originalPlatform }); + }); +}); From e7decaff2b8cd30d26f0363852b10daefe60c2aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Nov 2024 18:37:34 +0000 Subject: [PATCH 18/67] Release v0.1.2 [skip ci] --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9de9b465..c7747958 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ +## 0.1.2 (2024-11-08) + ## 0.1.1 (2024-11-08) ## 0.1.0 (2024-11-08) diff --git a/package-lock.json b/package-lock.json index e0597af9..9b147308 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.1.1", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index cadcbbfc..e625f132 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.1.1", + "version": "0.1.2", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 7741604a7e2cdcb80f859ec7705bd7dfad958e81 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:44:52 -0300 Subject: [PATCH 19/67] test: simulator service tests 100% (#124) --- src/lib/services/simulator.ts | 4 +- tests/services/simulator.test.ts | 283 +++++++++++++++++++++++++++++++ 2 files changed, 285 insertions(+), 2 deletions(-) create mode 100644 tests/services/simulator.test.ts diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index f6e87126..97e07468 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -221,8 +221,8 @@ export class SimulatorService implements ISimulatorService { const response = await rpcClient.request({method: "ping", params: []}); //Compatibility with current simulator version - if (response && (response.result.status === "OK" || response.result.data.status === "OK")) { - return {initialized: true}; + if (response?.result?.status === "OK" || response?.result?.data?.status === "OK") { + return { initialized: true }; } if (retries > 0) { await sleep(STARTING_TIMEOUT_WAIT_CYLCE); diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts new file mode 100644 index 00000000..f84f26e6 --- /dev/null +++ b/tests/services/simulator.test.ts @@ -0,0 +1,283 @@ +import { describe, beforeEach, test, expect, vi, Mock } from "vitest"; +import * as path from "path"; +import * as fs from "fs"; +import * as dotenv from "dotenv"; +import simulatorService from "../../src/lib/services/simulator"; +import { + getVersion, + executeCommand, + openUrl, + checkCommand, + stopDockerContainer, + removeDockerContainer, listDockerContainers, +} from "../../src/lib/clients/system"; +import { + DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, + VERSION_REQUIREMENTS, +} from "../../src/lib/config/simulator"; +import { + STARTING_TIMEOUT_ATTEMPTS, + DEFAULT_RUN_SIMULATOR_COMMAND, + DEFAULT_RUN_DOCKER_COMMAND, + DEFAULT_PULL_OLLAMA_COMMAND +} from "../../src/lib/config/simulator"; +import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; +import * as semver from "semver"; + + +vi.mock("fs"); +vi.mock("path"); +vi.mock("dotenv"); +vi.mock("semver", () => ({ + satisfies: vi.fn(), +})); +vi.mock("../../src/lib/clients/system", () => ({ + checkCommand: vi.fn(), + getVersion: vi.fn(), + executeCommand: vi.fn(), + openUrl: vi.fn(), + listDockerContainers: vi.fn(), + stopDockerContainer: vi.fn(), + removeDockerContainer: vi.fn(), +})); + +vi.mock("../../src/lib/clients/jsonRpcClient", () => ({ + rpcClient: { + request: vi.fn(), + }, +})); + +describe("SimulatorService - Basic Tests", () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(path.join).mockImplementation((...args) => args.join("/")); + }); + + test("should return the correct simulator location path", () => { + const expectedPath = "/mock/home/genlayer-simulator"; + simulatorService.setSimulatorLocation("/mock/home/genlayer-simulator"); + const simulatorLocation = simulatorService.getSimulatorLocation(); + expect(simulatorLocation).toBe(expectedPath); + }); + + test("should read the correct frontend URL from .env config", () => { + const mockEnvFilePath = "/mock/home/genlayer-simulator/.env"; + const mockEnvContent = "FRONTEND_PORT=8080"; + const mockEnvConfig = { FRONTEND_PORT: "8080" }; + vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); + vi.mocked(dotenv.parse).mockReturnValue(mockEnvConfig); + simulatorService.setSimulatorLocation("/mock/home/genlayer-simulator"); + const frontendUrl = simulatorService.getFrontendUrl(); + expect(frontendUrl).toBe("http://localhost:8080"); + expect(fs.readFileSync).toHaveBeenCalledWith(mockEnvFilePath, "utf8"); + }); + + test("should check version requirements and return missing versions", async () => { + vi.mocked(getVersion).mockResolvedValueOnce("12.0.0").mockResolvedValueOnce("18.0.0"); + vi.mocked(semver.satisfies).mockImplementation((version, range) => { + if (range === VERSION_REQUIREMENTS.node) return version === "18.0.0"; + return false; + }); + const missingVersions = await simulatorService.checkVersionRequirements(); + expect(missingVersions.node).toBe(VERSION_REQUIREMENTS.node); + expect(missingVersions.docker).toBe(VERSION_REQUIREMENTS.docker); + }); + + test("should handle error when checkVersion throws VersionRequiredError", async () => { + vi.mocked(getVersion).mockResolvedValueOnce("10.0.0"); + vi.mocked(semver.satisfies).mockReturnValue(false); + await expect(simulatorService.checkVersion("14.0.0", "node")).rejects.toThrow(); + }); + + test("should download simulator if not already installed", async () => { + const result = await simulatorService.downloadSimulator(); + expect(result.wasInstalled).toBe(false); + expect(executeCommand).toHaveBeenCalled(); + }); + + test("should skip download if simulator is already installed", async () => { + vi.mocked(executeCommand).mockRejectedValueOnce(new Error("Mocked command error")); + vi.spyOn(fs, "existsSync").mockReturnValue(true); + const result = await simulatorService.downloadSimulator(); + expect(result.wasInstalled).toBe(true); + expect(executeCommand).toHaveBeenCalled(); + expect(fs.existsSync).toHaveBeenCalled(); + }); + + test("should return initialized true when simulator responds with OK", async () => { + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: {status: 'OK'} }); + const result = await simulatorService.waitForSimulatorToBeReady(STARTING_TIMEOUT_ATTEMPTS); + expect(result).toEqual({ initialized: true }); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "ping", params: [] }); + }); + + test("should return initialized true when simulator responds with OK (different json structure)", async () => { + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: {data: {status: 'OK'}} }); + const result = await simulatorService.waitForSimulatorToBeReady(STARTING_TIMEOUT_ATTEMPTS); + expect(result).toEqual({ initialized: true }); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "ping", params: [] }); + }); + + test("should return initialized false with errorCode TIMEOUT after retries", async () => { + vi.mocked(rpcClient.request).mockResolvedValue(undefined); + const result = await simulatorService.waitForSimulatorToBeReady(1); + expect(result).toEqual({ initialized: false, errorCode: "TIMEOUT" }); + }); + + test("should return initialized false with errorCode ERROR on non-retryable error", async () => { + const nonRetryableError = new Error("Unexpected error"); + vi.mocked(rpcClient.request).mockRejectedValue(nonRetryableError); + const result = await simulatorService.waitForSimulatorToBeReady(STARTING_TIMEOUT_ATTEMPTS); + expect(result).toEqual({ initialized: false, errorCode: "ERROR", errorMessage: nonRetryableError.message }); + }); + + test("should execute the correct pull command based on simulator location", async () => { + const expectedCommand = DEFAULT_PULL_OLLAMA_COMMAND("/mock/home/genlayer-simulator"); + vi.mocked(executeCommand).mockResolvedValueOnce({ + stdout: "success", + stderr: "", + }); + const result = await simulatorService.pullOllamaModel(); + expect(result).toBe(true); + expect(executeCommand).toHaveBeenCalledWith(expectedCommand); + }); + + test("should execute the correct run simulator command based on simulator location", async () => { + (executeCommand as Mock).mockResolvedValue({ + stdout: "Simulator started", + stderr: "", + }); + const result = await simulatorService.runSimulator(); + const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND("/mock/home/genlayer-simulator"); + expect(executeCommand).toHaveBeenCalledWith(expectedCommand); + expect(result).toEqual({ stdout: "Simulator started", stderr: "" }); + }); + + test("should open the frontend URL and return true", async () => { + vi.spyOn(simulatorService, "getFrontendUrl").mockReturnValue("http://localhost:8080"); + const result = await simulatorService.openFrontend(); + expect(simulatorService.getFrontendUrl).toHaveBeenCalled(); + expect(openUrl).toHaveBeenCalledWith("http://localhost:8080"); + expect(result).toBe(true); + }); + + test("should call rpcClient.request with correct parameters and return the response", async () => { + const mockResponse = { success: true }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + const result = await simulatorService.deleteAllValidators(); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "delete_all_validators", params: [] }); + expect(result).toBe(mockResponse); + }); + + test("should throw an unexpected error when checking node version requirements", async () => { + const unexpectedError = new Error("Unexpected error (node)"); + vi.spyOn(simulatorService, "checkVersion").mockRejectedValueOnce(unexpectedError); + await expect(simulatorService.checkVersionRequirements()).rejects.toThrow("Unexpected error (node)"); + }); + + test("should throw an unexpected error when checking docker version requirements", async () => { + vi.spyOn(simulatorService, "checkVersion") + .mockResolvedValueOnce(undefined) + .mockRejectedValueOnce(new Error("Unexpected error (docker)")); + await expect(simulatorService.checkVersionRequirements()).rejects.toThrow("Unexpected error (docker)"); + }); + + test("should throw an unexpected error when checking git installation requirement", async () => { + vi.mocked(checkCommand).mockRejectedValueOnce(new Error("Unexpected git error")); + await expect(simulatorService.checkInstallRequirements()).rejects.toThrow("Unexpected git error"); + const requirementsInstalled = { git: false, docker: false }; + expect(requirementsInstalled.git).toBe(false); + }); + + test("should throw an unexpected error when checking docker installation requirement", async () => { + vi.mocked(checkCommand) + .mockResolvedValueOnce(undefined) + .mockRejectedValueOnce(new Error("Unexpected docker error")); + await expect(simulatorService.checkInstallRequirements()).rejects.toThrow("Unexpected docker error"); + const requirementsInstalled = { git: false, docker: false }; + expect(requirementsInstalled.docker).toBe(false); + }); + + test("should stop and remove Docker containers with the specified prefix", async () => { + const mockContainers = [ + DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "1", + DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "2" + ]; + vi.mocked(listDockerContainers).mockResolvedValue(mockContainers); + vi.mocked(stopDockerContainer).mockResolvedValue(undefined); + vi.mocked(removeDockerContainer).mockResolvedValue(undefined); + const result = await simulatorService.resetDockerContainers(); + expect(result).toBe(true); + expect(stopDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "1"); + expect(stopDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "2"); + expect(removeDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "1"); + expect(removeDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "2"); + }); + + test("should retry when response is not 'OK' and reach sleep path", async () => { + vi.mocked(rpcClient.request).mockResolvedValue({ result: { status: "NOT_OK" } }); + const result = await simulatorService.waitForSimulatorToBeReady(1); + expect(result).toEqual({ initialized: false, errorCode: "TIMEOUT" }); + }); + + test("should retry on fetch error and reach sleep path", async () => { + const fetchError = new Error("Fetch Error"); + fetchError.name = "FetchError"; + vi.mocked(rpcClient.request).mockRejectedValue(fetchError); + const result = await simulatorService.waitForSimulatorToBeReady(1); + expect(result).toEqual({ initialized: false, errorCode: "ERROR", errorMessage: fetchError.message }); + }); + + test("should throw an error if executeCommand fails and simulator location does not exist", async () => { + const mockError = new Error("git clone failed"); + vi.mocked(executeCommand).mockRejectedValueOnce(mockError); + vi.mocked(fs.existsSync).mockReturnValue(false); + await expect(simulatorService.downloadSimulator()).rejects.toThrow("git clone failed"); + expect(executeCommand).toHaveBeenCalled(); + expect(fs.existsSync).toHaveBeenCalledWith("/mock/home/genlayer-simulator"); + }); + + test("should call executeCommand if docker ps command fails", async () => { + vi.mocked(checkCommand) + .mockResolvedValueOnce(undefined) + .mockResolvedValueOnce(undefined) + .mockRejectedValueOnce(new Error("docker ps failed")); + vi.mocked(executeCommand).mockResolvedValueOnce({ + stdout: '', + stderr: '' + }); + const result = await simulatorService.checkInstallRequirements(); + expect(executeCommand).toHaveBeenCalledWith(DEFAULT_RUN_DOCKER_COMMAND); + expect(result.docker).toBe(true); + expect(result.git).toBe(true); + }); + + test("should update envConfig with newConfig values", () => { + const envFilePath = path.join("/mock/home/genlayer-simulator", ".env"); + const originalEnvContent = "KEY1=value1\nKEY2=value2"; + const envConfig = { KEY1: "value1", KEY2: "value2" }; + const newConfig = { KEY2: "new_value2", KEY3: "value3" }; + vi.mocked(fs.readFileSync) + .mockReturnValueOnce(originalEnvContent) + .mockReturnValueOnce(originalEnvContent); + vi.mocked(dotenv.parse).mockReturnValue(envConfig); + const writeFileSyncSpy = vi.spyOn(fs, "writeFileSync"); + simulatorService["addConfigToEnvFile"](newConfig); + expect(envConfig).toEqual({ + KEY1: "value1", + KEY2: "new_value2", + KEY3: "value3", + }); + expect(writeFileSyncSpy).toHaveBeenCalledWith(`${envFilePath}.bak`, originalEnvContent); + expect(writeFileSyncSpy).toHaveBeenCalledWith( + envFilePath, + "KEY1=value1\nKEY2=new_value2\nKEY3=value3" + ); + }); + + test("should return providers without errors", () => { + expect(simulatorService.getAiProvidersOptions(true)).toEqual(expect.any(Array)); + expect(simulatorService.getAiProvidersOptions(false)).toEqual(expect.any(Array)); + }); + +}); From 070f9bc7737b48aa2dfaf676824caf1c79e0d8eb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Nov 2024 18:45:24 +0000 Subject: [PATCH 20/67] Release v0.1.3 [skip ci] --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7747958..b36dc65d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ +## 0.1.3 (2024-11-08) + ## 0.1.2 (2024-11-08) ## 0.1.1 (2024-11-08) diff --git a/package-lock.json b/package-lock.json index 9b147308..aceeded5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.1.2", + "version": "0.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.1.2", + "version": "0.1.3", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index e625f132..18fbc9e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.1.2", + "version": "0.1.3", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 721eebfea758a0897f23afd60b5767c59d593eb1 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:23:05 -0300 Subject: [PATCH 21/67] fix: changing linux command to fix display issue and fixing waiting simulator issue (#127) --- src/lib/config/simulator.ts | 2 +- src/lib/services/simulator.ts | 2 +- tests/services/simulator.test.ts | 11 +++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index 49dfb732..186af499 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -4,7 +4,7 @@ export const DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX = "genlayer-simulator-"; export const DEFAULT_RUN_SIMULATOR_COMMAND = (simulatorLocation: string) => ({ darwin: `osascript -e 'tell application "Terminal" to do script "cd ${simulatorLocation} && docker compose build && docker compose up"'`, win32: `start cmd.exe /c "cd /d ${simulatorLocation} && docker compose build && docker compose up && pause"`, - linux: `x-terminal-emulator -e bash -c 'cd ${simulatorLocation} && docker compose build && docker compose up; echo "Press enter to exit"; read'`, + linux: `nohup bash -c 'cd ${simulatorLocation} && docker compose build && docker compose up -d'`, }); export const DEFAULT_PULL_OLLAMA_COMMAND = (simulatorLocation: string) => ({ darwin: `cd ${simulatorLocation} && docker exec ollama ollama pull llama3`, diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 97e07468..71f6cab3 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -221,7 +221,7 @@ export class SimulatorService implements ISimulatorService { const response = await rpcClient.request({method: "ping", params: []}); //Compatibility with current simulator version - if (response?.result?.status === "OK" || response?.result?.data?.status === "OK") { + if (response?.result === "OK" || response?.result?.status === "OK" || response?.result?.data?.status === "OK") { return { initialized: true }; } if (retries > 0) { diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index f84f26e6..b750ae25 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -104,20 +104,27 @@ describe("SimulatorService - Basic Tests", () => { expect(fs.existsSync).toHaveBeenCalled(); }); - test("should return initialized true when simulator responds with OK", async () => { + test("should return initialized true when simulator responds with OK (result.status = OK)", async () => { vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: {status: 'OK'} }); const result = await simulatorService.waitForSimulatorToBeReady(STARTING_TIMEOUT_ATTEMPTS); expect(result).toEqual({ initialized: true }); expect(rpcClient.request).toHaveBeenCalledWith({ method: "ping", params: [] }); }); - test("should return initialized true when simulator responds with OK (different json structure)", async () => { + test("should return initialized true when simulator responds with OK (result.data.status = OK)", async () => { vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: {data: {status: 'OK'}} }); const result = await simulatorService.waitForSimulatorToBeReady(STARTING_TIMEOUT_ATTEMPTS); expect(result).toEqual({ initialized: true }); expect(rpcClient.request).toHaveBeenCalledWith({ method: "ping", params: [] }); }); + test("should return initialized true when simulator responds with OK (result = OK)", async () => { + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: 'OK' }); + const result = await simulatorService.waitForSimulatorToBeReady(STARTING_TIMEOUT_ATTEMPTS); + expect(result).toEqual({ initialized: true }); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "ping", params: [] }); + }); + test("should return initialized false with errorCode TIMEOUT after retries", async () => { vi.mocked(rpcClient.request).mockResolvedValue(undefined); const result = await simulatorService.waitForSimulatorToBeReady(1); From 0b866bb86f91726e7315fccfe4721ffe256b75d3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 12 Nov 2024 13:23:39 +0000 Subject: [PATCH 22/67] Release v0.1.4 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b36dc65d..05309ed3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.1.4 (2024-11-12) + + +### Bug Fixes + +* changing linux command to fix display issue and fixing waiting simulator issue ([#127](https://github.com/yeagerai/genlayer-cli/issues/127)) ([721eebf](https://github.com/yeagerai/genlayer-cli/commit/721eebfea758a0897f23afd60b5767c59d593eb1)) + ## 0.1.3 (2024-11-08) ## 0.1.2 (2024-11-08) diff --git a/package-lock.json b/package-lock.json index aceeded5..73b0ca73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.1.3", + "version": "0.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.1.3", + "version": "0.1.4", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 18fbc9e4..35aac884 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.1.3", + "version": "0.1.4", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From d9bfbc2dc2bcb8a4673f419d868f2c41d8396bd8 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:03:39 -0300 Subject: [PATCH 23/67] feat: adding headless option to cli (#128) --- src/commands/general/index.ts | 2 ++ src/commands/general/init.ts | 10 +++++----- src/commands/general/start.ts | 8 ++++++-- src/lib/config/simulator.ts | 8 ++++---- src/lib/interfaces/ISimulatorService.ts | 2 ++ src/lib/services/simulator.ts | 12 +++++++++++- tests/actions/init.test.ts | 4 ++-- tests/actions/start.test.ts | 4 +++- tests/commands/init.test.ts | 12 +++++++++++- tests/commands/up.test.ts | 9 ++++++++- tests/services/simulator.test.ts | 16 +++++++++++++++- 11 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index a1f81a3a..98ce4644 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -12,6 +12,7 @@ export function initializeGeneralCommands(program: Command) { .option("--numValidators ", "Number of validators", "5") .option("--branch ", "Branch", "main") .option("--location ", "Location where it will be installed", process.cwd()) + .option("--headless", "Headless mode", false) .action((options: InitActionOptions) => initAction(options, simulatorService)); program @@ -21,6 +22,7 @@ export function initializeGeneralCommands(program: Command) { .option("--numValidators ", "Number of validators", "5") .option("--branch ", "Branch", "main") .option("--location ", "Location where it will be installed", process.cwd()) + .option("--headless", "Headless mode", false) .action((options: StartActionOptions) => startAction(options, simulatorService)); return program; diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index e8983c27..cde41a1d 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -6,7 +6,7 @@ export interface InitActionOptions { numValidators: number; branch: string; location: string; - + headless: boolean; } function getRequirementsErrorMessage({git, docker}: Record): string { @@ -38,9 +38,8 @@ function getVersionErrorMessage({docker, node}: Record): string } export async function initAction(options: InitActionOptions, simulatorService: ISimulatorService) { - // Update simulator location with user input simulatorService.setSimulatorLocation(options.location); - + simulatorService.setComposeOptions(options.headless); // Check if requirements are installed try { @@ -231,8 +230,9 @@ export async function initAction(options: InitActionOptions, simulatorService: I `GenLayer simulator initialized successfully! Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`, ); try { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - simulatorService.openFrontend(); + if(!options.headless){ + await simulatorService.openFrontend(); + } } catch (error) { console.error(error); } diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index e3e1efbf..11d20309 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -7,11 +7,13 @@ export interface StartActionOptions { numValidators: number; branch: string; location: string; + headless: boolean; } export async function startAction(options: StartActionOptions, simulatorService: ISimulatorService) { - const {resetValidators, numValidators, branch, location} = options; + const {resetValidators, numValidators, branch, location, headless} = options; // Update simulator location with user input + simulatorService.setComposeOptions(headless); simulatorService.setSimulatorLocation(location); @@ -100,7 +102,9 @@ export async function startAction(options: StartActionOptions, simulatorService: `GenLayer simulator initialized successfully! Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`, ); try { - await simulatorService.openFrontend(); + if(!headless) { + await simulatorService.openFrontend(); + } } catch (error) { console.error(error); diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index 186af499..c5aeb281 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -1,10 +1,10 @@ export const DEFAULT_JSON_RPC_URL = "http://localhost:4000/api"; export const DEFAULT_REPO_GH_URL = "https://github.com/yeagerai/genlayer-simulator.git"; export const DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX = "genlayer-simulator-"; -export const DEFAULT_RUN_SIMULATOR_COMMAND = (simulatorLocation: string) => ({ - darwin: `osascript -e 'tell application "Terminal" to do script "cd ${simulatorLocation} && docker compose build && docker compose up"'`, - win32: `start cmd.exe /c "cd /d ${simulatorLocation} && docker compose build && docker compose up && pause"`, - linux: `nohup bash -c 'cd ${simulatorLocation} && docker compose build && docker compose up -d'`, +export const DEFAULT_RUN_SIMULATOR_COMMAND = (simulatorLocation: string, options: string) => ({ + darwin: `osascript -e 'tell application "Terminal" to do script "cd ${simulatorLocation} && docker compose build && docker compose up ${options}"'`, + win32: `start cmd.exe /c "cd /d ${simulatorLocation} && docker compose build && docker compose up && pause ${options}"`, + linux: `nohup bash -c 'cd ${simulatorLocation} && docker compose build && docker compose up -d ${options}'`, }); export const DEFAULT_PULL_OLLAMA_COMMAND = (simulatorLocation: string) => ({ darwin: `cd ${simulatorLocation} && docker exec ollama ollama pull llama3`, diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index 875014da..9f8c474f 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -3,6 +3,8 @@ import {AiProviders} from "../config/simulator"; export interface ISimulatorService { setSimulatorLocation(location: string): void; getSimulatorLocation(): string; + setComposeOptions(headless: boolean): void; + getComposeOptions(): string; checkInstallRequirements(): Promise>; checkVersionRequirements(): Promise>; downloadSimulator(branch?: string): Promise; diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 71f6cab3..d9145fe8 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -41,10 +41,12 @@ function sleep(millliseconds: number): Promise { } export class SimulatorService implements ISimulatorService { + private composeOptions: string public simulatorLocation: string; constructor() { this.simulatorLocation = ""; + this.composeOptions = ""; } public setSimulatorLocation(location: string): void { @@ -55,6 +57,14 @@ export class SimulatorService implements ISimulatorService { return this.simulatorLocation; } + public setComposeOptions(headless: boolean): void { + this.composeOptions = headless ? '--scale frontend=0' : ''; + } + + public getComposeOptions(): string { + return this.composeOptions; + } + private readEnvConfigValue(key: string): string { const envFilePath = path.join(this.simulatorLocation, ".env"); // Transform the config string to object @@ -209,7 +219,7 @@ export class SimulatorService implements ISimulatorService { } public runSimulator(): Promise<{stdout: string; stderr: string}> { - const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(this.simulatorLocation); + const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(this.simulatorLocation, this.getComposeOptions()); return executeCommand(commandsByPlatform); } diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 27196745..80d2a25c 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -7,7 +7,7 @@ import {mkdtempSync} from "fs"; import {join} from "path"; const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); -const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir }; +const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false }; describe("init action", () => { let error: ReturnType; @@ -422,4 +422,4 @@ describe("init action", () => { expect(error).toHaveBeenCalledWith(errorMsg); }); -}); +}); \ No newline at end of file diff --git a/tests/actions/start.test.ts b/tests/actions/start.test.ts index 3ae9e6f4..fc522470 100644 --- a/tests/actions/start.test.ts +++ b/tests/actions/start.test.ts @@ -13,7 +13,8 @@ describe("startAction - Additional Tests", () => { resetValidators: false, numValidators: 5, branch: "main", - location: '' + location: '', + headless: false, }; beforeEach(() => { @@ -29,6 +30,7 @@ describe("startAction - Additional Tests", () => { createRandomValidators: vi.fn().mockResolvedValue(undefined), openFrontend: vi.fn().mockResolvedValue(undefined), setSimulatorLocation: vi.fn().mockResolvedValue(undefined), + setComposeOptions: vi.fn(), getAiProvidersOptions: vi.fn(() => [ { name: "Provider A", value: "providerA" }, { name: "Provider B", value: "providerB" }, diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index 0030a679..cb8575bd 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -2,6 +2,9 @@ import { Command } from "commander"; import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import { initializeGeneralCommands } from "../../src/commands/general"; import { getCommand, getCommandOption } from "../utils"; +import simulatorService from '../../src/lib/services/simulator' + +const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); vi.mock("inquirer", () => ({ prompt: vi.fn(() => {}), @@ -71,6 +74,13 @@ describe("init command", () => { test("action is called", async () => { program.parse(["node", "test", "init"]); expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({ numValidators: "5", branch: "main", location: process.cwd() }); + expect(action).toHaveBeenCalledWith({ numValidators: "5", branch: "main", location: process.cwd(), headless: false }); + }); + + test("option --headless is accepted", async () => { + program.parse(["node", "test", "init", "--headless"]); + expect(action).toHaveBeenCalledTimes(1); + expect(action).toHaveBeenCalledWith({ numValidators: "5", branch: "main", location: process.cwd(), headless: true }); + expect(openFrontendSpy).not.toHaveBeenCalled(); }); }); diff --git a/tests/commands/up.test.ts b/tests/commands/up.test.ts index 82d05cd9..7fbc466a 100644 --- a/tests/commands/up.test.ts +++ b/tests/commands/up.test.ts @@ -2,6 +2,9 @@ import { Command } from "commander"; import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import { initializeGeneralCommands } from "../../src/commands/general"; import { getCommand, getCommandOption } from "../utils"; +import simulatorService from '../../src/lib/services/simulator' + +const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); const action = vi.fn(); @@ -69,7 +72,7 @@ describe("up command", () => { test("action is called with default options", async () => { program.parse(["node", "test", "up"]); expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({ resetValidators: false, numValidators: "5", branch: "main", location: process.cwd() }); + expect(action).toHaveBeenCalledWith({ resetValidators: false, numValidators: "5", branch: "main", location: process.cwd(), headless: false }); }); test("action is called with custom options", async () => { @@ -82,6 +85,8 @@ describe("up command", () => { "10", "--branch", "development", + "--headless", + "true" ]); expect(action).toHaveBeenCalledTimes(1); expect(action).toHaveBeenCalledWith({ @@ -89,6 +94,8 @@ describe("up command", () => { numValidators: "10", branch: "development", location: process.cwd(), + headless: true, }); + expect(openFrontendSpy).not.toHaveBeenCalled(); }); }); diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index b750ae25..1e416ef3 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -23,6 +23,7 @@ import { } from "../../src/lib/config/simulator"; import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; import * as semver from "semver"; +import {getCommandOption} from "@@/tests/utils"; vi.mock("fs"); @@ -155,7 +156,20 @@ describe("SimulatorService - Basic Tests", () => { stderr: "", }); const result = await simulatorService.runSimulator(); - const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND("/mock/home/genlayer-simulator"); + const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND("/mock/home/genlayer-simulator", ''); + expect(executeCommand).toHaveBeenCalledWith(expectedCommand); + expect(result).toEqual({ stdout: "Simulator started", stderr: "" }); + }); + + test("should execute the correct run simulator command based on headless option", async () => { + (executeCommand as Mock).mockResolvedValue({ + stdout: "Simulator started", + stderr: "", + }); + simulatorService.setComposeOptions(true) + const commandOption = simulatorService.getComposeOptions(); + const result = await simulatorService.runSimulator(); + const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND("/mock/home/genlayer-simulator", commandOption); expect(executeCommand).toHaveBeenCalledWith(expectedCommand); expect(result).toEqual({ stdout: "Simulator started", stderr: "" }); }); From 65ba69558357c55141cf5971f44dede2e671c53f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 14 Nov 2024 18:04:30 +0000 Subject: [PATCH 24/67] Release v0.2.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05309ed3..282e21ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.2.0 (2024-11-14) + + +### Features + +* adding headless option to cli ([#128](https://github.com/yeagerai/genlayer-cli/issues/128)) ([d9bfbc2](https://github.com/yeagerai/genlayer-cli/commit/d9bfbc2dc2bcb8a4673f419d868f2c41d8396bd8)) + ## 0.1.4 (2024-11-12) diff --git a/package-lock.json b/package-lock.json index 73b0ca73..ab1cbb3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.1.4", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.1.4", + "version": "0.2.0", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 35aac884..f1f68b4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.1.4", + "version": "0.2.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 48985bb7ff81356c6b448996573d54472b45d58f Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:00:23 -0300 Subject: [PATCH 25/67] feat: abstract docker interaction (#129) * feat: docker abstraction (initial config) * fix: container name and unused var * test: docker tests * feat: adding docker ping and improving unit tests * fix: message and test adjustments * feat: adding docker.ping * test: 100% coverage --- esbuild.config.dev | 1 + esbuild.config.prod | 1 + package-lock.json | 231 ++++++++++++++++++++++++++++++- package.json | 2 + src/commands/general/init.ts | 6 +- src/commands/general/start.ts | 6 +- src/lib/clients/system.ts | 46 +----- src/lib/config/simulator.ts | 7 +- src/lib/services/simulator.ts | 55 ++++---- tests/actions/init.test.ts | 76 +++++++++- tests/actions/start.test.ts | 14 ++ tests/libs/system.test.ts | 77 +---------- tests/services/simulator.test.ts | 201 ++++++++++++++++++++------- 13 files changed, 512 insertions(+), 211 deletions(-) diff --git a/esbuild.config.dev b/esbuild.config.dev index a2944667..68b63ad0 100644 --- a/esbuild.config.dev +++ b/esbuild.config.dev @@ -10,6 +10,7 @@ module.exports = { banner: { js: "const _importMetaUrl=require('url').pathToFileURL(__filename)", }, + external: ['ssh2'], }, watch: true, }; diff --git a/esbuild.config.prod b/esbuild.config.prod index 42dae6e7..876ceada 100644 --- a/esbuild.config.prod +++ b/esbuild.config.prod @@ -10,6 +10,7 @@ module.exports = { banner: { js: "const _importMetaUrl=require('url').pathToFileURL(__filename)", }, + external: ['ssh2'], }, watch: false, }; diff --git a/package-lock.json b/package-lock.json index ab1cbb3f..e4ac449b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "commander": "^12.0.0", + "dockerode": "^4.0.2", "dotenv": "^16.4.5", "inquirer": "^9.2.19", "node-fetch": "^2.7.0", @@ -22,6 +23,7 @@ }, "devDependencies": { "@release-it/conventional-changelog": "^8.0.1", + "@types/dockerode": "^3.3.31", "@types/inquirer": "^9.0.7", "@types/node": "^20.12.7", "@types/sinon": "^17.0.3", @@ -203,6 +205,12 @@ "node": ">=6.9.0" } }, + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "license": "Apache-2.0" + }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "dev": true, @@ -968,6 +976,29 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/docker-modem": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", + "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/ssh2": "*" + } + }, + "node_modules/@types/dockerode": { + "version": "3.3.31", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.31.tgz", + "integrity": "sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/docker-modem": "*", + "@types/node": "*", + "@types/ssh2": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "license": "MIT" @@ -1027,6 +1058,33 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ssh2": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.1.tgz", + "integrity": "sha512-ZIbEqKAsi5gj35y4P4vkJYly642wIbY6PqoN0xiyQGshKUGXR9WQjF/iF9mXBQ8uBKy3ezfsCkcoHKhd0BzuDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/through": { "version": "0.0.33", "dev": true, @@ -1663,6 +1721,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "license": "MIT", @@ -1739,6 +1806,15 @@ "node": ">=10.0.0" } }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/before-after-hook": { "version": "2.2.3", "dev": true, @@ -1926,6 +2002,15 @@ "dev": true, "license": "MIT" }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/bundle-name": { "version": "4.1.0", "license": "MIT", @@ -2035,6 +2120,12 @@ "node": ">= 16" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, "node_modules/ci-info": { "version": "3.9.0", "dev": true, @@ -2429,6 +2520,20 @@ } } }, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "dev": true, @@ -2795,6 +2900,35 @@ "node": ">=8" } }, + "node_modules/docker-modem": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.3.tgz", + "integrity": "sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.15.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.2.tgz", + "integrity": "sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==", + "license": "Apache-2.0", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^5.0.3", + "tar-fs": "~2.0.1" + }, + "engines": { + "node": ">= 8.0" + } + }, "node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -2836,6 +2970,15 @@ "version": "8.0.0", "license": "MIT" }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.16.0", "dev": true, @@ -3697,6 +3840,12 @@ "node": ">=12.20.0" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, "node_modules/fs-extra": { "version": "11.2.0", "dev": true, @@ -5374,6 +5523,12 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "license": "MIT" @@ -5385,6 +5540,13 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.7", "funding": [ @@ -5602,7 +5764,6 @@ }, "node_modules/once": { "version": "1.4.0", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -6062,6 +6223,16 @@ "dev": true, "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "devOptional": true, @@ -7306,6 +7477,12 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "license": "ISC" + }, "node_modules/split2": { "version": "4.2.0", "dev": true, @@ -7314,6 +7491,23 @@ "node": ">= 10.x" } }, + "node_modules/ssh2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.20.0" + } + }, "node_modules/stackback": { "version": "0.0.2", "license": "MIT" @@ -7506,6 +7700,34 @@ "node": ">=6" } }, + "node_modules/tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/text-extensions": { "version": "2.4.0", "dev": true, @@ -7684,6 +7906,12 @@ "version": "2.6.2", "license": "0BSD" }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, "node_modules/type-check": { "version": "0.4.0", "dev": true, @@ -8383,7 +8611,6 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, "license": "ISC" }, "node_modules/ws": { diff --git a/package.json b/package.json index f1f68b4d..b591c630 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "homepage": "https://github.com/yeagerai/genlayer-cli#readme", "devDependencies": { "@release-it/conventional-changelog": "^8.0.1", + "@types/dockerode": "^3.3.31", "@types/inquirer": "^9.0.7", "@types/node": "^20.12.7", "@types/sinon": "^17.0.3", @@ -55,6 +56,7 @@ }, "dependencies": { "commander": "^12.0.0", + "dockerode": "^4.0.2", "dotenv": "^16.4.5", "inquirer": "^9.2.19", "node-fetch": "^2.7.0", diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index cde41a1d..730086f8 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -226,9 +226,9 @@ export async function initAction(options: InitActionOptions, simulatorService: I } // Simulator ready - console.log( - `GenLayer simulator initialized successfully! Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`, - ); + let successMessage = "GenLayer simulator initialized successfully! " + successMessage += options.headless ? '' : `Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`; + console.log(successMessage); try { if(!options.headless){ await simulatorService.openFrontend(); diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index 11d20309..38c0cc47 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -98,9 +98,9 @@ export async function startAction(options: StartActionOptions, simulatorService: } // Simulator ready - console.log( - `GenLayer simulator initialized successfully! Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`, - ); + let successMessage = "GenLayer simulator initialized successfully! " + successMessage += headless ? '' : `Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`; + console.log(successMessage); try { if(!headless) { await simulatorService.openFrontend(); diff --git a/src/lib/clients/system.ts b/src/lib/clients/system.ts index 804d7cbf..dc3fff67 100644 --- a/src/lib/clients/system.ts +++ b/src/lib/clients/system.ts @@ -1,5 +1,5 @@ import util from "node:util"; -import {ChildProcess, PromiseWithChild, exec} from "child_process"; +import {ChildProcess, exec} from "child_process"; import open from "open"; import {RunningPlatform, AVAILABLE_PLATFORMS} from "../config/simulator"; @@ -68,47 +68,3 @@ export async function getVersion(toolName: string): Promise { return ""; } - -export async function listDockerContainers(): Promise { - try { - const dockerResponse = await util.promisify(exec)("docker ps -a --format '{{.Names}}'"); - const dockerContainers = dockerResponse.stdout.split("\n"); - return dockerContainers; - } catch (error) { - throw new Error("Error listing Docker containers."); - } -} - -export async function listDockerImages(): Promise { - try { - const dockerResponse = await util.promisify(exec)("docker images --format '{{.Repository}}'"); - const dockerImages = dockerResponse.stdout.split("\n"); - return dockerImages; - } catch (error) { - throw new Error("Error listing Docker images."); - } -} - -export async function stopDockerContainer(containerName: string): Promise { - try { - await util.promisify(exec)(`docker stop ${containerName}`); - } catch (error) { - throw new Error(`Error stopping Docker container ${containerName}.`); - } -} - -export async function removeDockerContainer(containerName: string) { - try { - await util.promisify(exec)(`docker rm ${containerName}`); - } catch (error) { - throw new Error(`Error removing container ${containerName}.`); - } -} - -export async function removeDockerImage(imageName: string) { - try { - await util.promisify(exec)(`docker rmi ${imageName}`); - } catch (error) { - throw new Error(`Error removing image ${imageName}.`); - } -} diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index c5aeb281..1941dd87 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -1,16 +1,11 @@ export const DEFAULT_JSON_RPC_URL = "http://localhost:4000/api"; export const DEFAULT_REPO_GH_URL = "https://github.com/yeagerai/genlayer-simulator.git"; -export const DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX = "genlayer-simulator-"; +export const DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX = "/genlayer-simulator-"; export const DEFAULT_RUN_SIMULATOR_COMMAND = (simulatorLocation: string, options: string) => ({ darwin: `osascript -e 'tell application "Terminal" to do script "cd ${simulatorLocation} && docker compose build && docker compose up ${options}"'`, win32: `start cmd.exe /c "cd /d ${simulatorLocation} && docker compose build && docker compose up && pause ${options}"`, linux: `nohup bash -c 'cd ${simulatorLocation} && docker compose build && docker compose up -d ${options}'`, }); -export const DEFAULT_PULL_OLLAMA_COMMAND = (simulatorLocation: string) => ({ - darwin: `cd ${simulatorLocation} && docker exec ollama ollama pull llama3`, - win32: `cd /d ${simulatorLocation} && docker exec ollama ollama pull llama3`, - linux: `cd ${simulatorLocation} && docker exec ollama ollama pull llama3`, -}); export const DEFAULT_RUN_DOCKER_COMMAND = { darwin: "open -a Docker", win32: 'start "" "C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe"', diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index d9145fe8..ab0a9368 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -1,3 +1,4 @@ +import Docker from "dockerode" import * as fs from "fs"; import * as dotenv from "dotenv"; import * as path from "path"; @@ -9,7 +10,6 @@ import { DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, DEFAULT_RUN_SIMULATOR_COMMAND, DEFAULT_RUN_DOCKER_COMMAND, - DEFAULT_PULL_OLLAMA_COMMAND, STARTING_TIMEOUT_WAIT_CYLCE, STARTING_TIMEOUT_ATTEMPTS, AI_PROVIDERS_CONFIG, @@ -21,11 +21,6 @@ import { getVersion, executeCommand, openUrl, - listDockerContainers, - stopDockerContainer, - removeDockerContainer, - listDockerImages, - removeDockerImage, } from "../clients/system"; import {MissingRequirementError} from "../errors/missingRequirement"; @@ -36,17 +31,20 @@ import { } from "../interfaces/ISimulatorService"; import {VersionRequiredError} from "../errors/versionRequired"; + function sleep(millliseconds: number): Promise { return new Promise(resolve => setTimeout(resolve, millliseconds)); } export class SimulatorService implements ISimulatorService { private composeOptions: string + private docker: Docker; public simulatorLocation: string; constructor() { this.simulatorLocation = ""; this.composeOptions = ""; + this.docker = new Docker(); } public setSimulatorLocation(location: string): void { @@ -122,7 +120,7 @@ export class SimulatorService implements ISimulatorService { if (requirementsInstalled.docker) { try { - await checkCommand("docker ps", "docker"); + await this.docker.ping() } catch (error: any) { await executeCommand(DEFAULT_RUN_DOCKER_COMMAND); } @@ -205,8 +203,10 @@ export class SimulatorService implements ISimulatorService { } public async pullOllamaModel(): Promise { - const cmdsByPlatform = DEFAULT_PULL_OLLAMA_COMMAND(this.simulatorLocation); - await executeCommand(cmdsByPlatform); + const ollamaContainer = this.docker.getContainer("ollama"); + await ollamaContainer.exec({ + Cmd: ["ollama", "pull", "llama3"], + }); return true; } @@ -287,30 +287,33 @@ export class SimulatorService implements ISimulatorService { } public async resetDockerContainers(): Promise { - const containers = await listDockerContainers(); - const genlayerContainers = containers.filter((container: string) => - container.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX), - ); - const containersStopPromises = genlayerContainers.map((container: string) => - stopDockerContainer(container), - ); - await Promise.all(containersStopPromises); - - const containersRemovePromises = genlayerContainers.map((container: string) => - removeDockerContainer(container), + const containers = await this.docker.listContainers({ all: true }); + const genlayerContainers = containers.filter(container => + container.Names.some(name => + name.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX) + ) ); - await Promise.all(containersRemovePromises); + for (const containerInfo of genlayerContainers) { + const container = this.docker.getContainer(containerInfo.Id); + if (containerInfo.State === "running") { + await container.stop(); + } + await container.remove(); + } return true; } public async resetDockerImages(): Promise { - const images = await listDockerImages(); - const genlayerImages = images.filter((image: string) => - image.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX), + const images = await this.docker.listImages(); + const genlayerImages = images.filter(image => + image.RepoTags?.some(tag => tag.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX)) ); - const imagesRemovePromises = genlayerImages.map((image: string) => removeDockerImage(image)); - await Promise.all(imagesRemovePromises); + + for (const imageInfo of genlayerImages) { + const image = this.docker.getImage(imageInfo.Id); + await image.remove({force: true}); + } return true; } diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 80d2a25c..8cf167e9 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -1,4 +1,4 @@ -import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import {vi, describe, beforeEach, afterEach, test, expect} from "vitest"; import inquirer from "inquirer"; import simulatorService from "../../src/lib/services/simulator"; import { initAction } from "../../src/commands/general/init"; @@ -50,6 +50,15 @@ describe("init action", () => { simServCreateRandomValidators = vi.spyOn(simulatorService, "createRandomValidators"); simServOpenFrontend = vi.spyOn(simulatorService, "openFrontend"); simGetSimulatorUrl = vi.spyOn(simulatorService, "getFrontendUrl") + + simServCheckVersionRequirements.mockResolvedValue({ + node: '', + docker: '', + }); + simServCheckInstallRequirements.mockResolvedValue({ + git: true, + docker: true, + }) }); afterEach(() => { @@ -168,6 +177,8 @@ describe("init action", () => { simServCreateRandomValidators.mockResolvedValue(true); simServOpenFrontend.mockResolvedValue(true); simGetSimulatorUrl.mockResolvedValue('http://localhost:8080/'); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); await initAction(defaultActionOptions, simulatorService); @@ -177,9 +188,68 @@ describe("init action", () => { ); }); + test("should open the frontend if everything went well (headless mode)", async () => { + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + { name: "OpenAI", value: "openai" }, + { name: "Heurist", value: "heuristai" }, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ initialized: true }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockResolvedValue(true); + simServCreateRandomValidators.mockResolvedValue(true); + simServOpenFrontend.mockResolvedValue(true); + simGetSimulatorUrl.mockResolvedValue('http://localhost:8080/'); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + + await initAction({...defaultActionOptions, headless: true}, simulatorService); + + expect(log).toHaveBeenCalledWith( + `GenLayer simulator initialized successfully! ` + ); + }); + + test("should throw an error if validator are not initialized", async () => { + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai"], + openai: "API_KEY1", + heuristai: "API_KEY2", + }); + simServgetAiProvidersOptions.mockReturnValue([ + { name: "OpenAI", value: "openai" }, + { name: "Heurist", value: "heuristai" }, + ]); + simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ initialized: true }); + simServPullOllamaModel.mockResolvedValue(true); + simServDeleteAllValidators.mockResolvedValue(true); + simServCreateRandomValidators.mockRejectedValue(); + simServOpenFrontend.mockResolvedValue(true); + + await initAction({...defaultActionOptions, headless: true}, simulatorService); + + expect(log).toHaveBeenCalledWith('Initializing validators...'); + expect(error).toHaveBeenCalledWith('Unable to initialize the validators.'); + }); + + test("if configSimulator fails, then the execution aborts", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] }); simServConfigSimulator.mockRejectedValue(new Error("Error")); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); await initAction(defaultActionOptions, simulatorService); @@ -189,6 +259,8 @@ describe("init action", () => { test("if runSimulator fails, then the execution aborts", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] }); simServRunSimulator.mockRejectedValue(new Error("Error")); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); await initAction(defaultActionOptions, simulatorService); @@ -214,6 +286,8 @@ describe("init action", () => { simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServPullOllamaModel.mockResolvedValue(true); simServDeleteAllValidators.mockResolvedValue(true); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); await initAction(defaultActionOptions, simulatorService); diff --git a/tests/actions/start.test.ts b/tests/actions/start.test.ts index fc522470..7e349c96 100644 --- a/tests/actions/start.test.ts +++ b/tests/actions/start.test.ts @@ -59,6 +59,20 @@ describe("startAction - Additional Tests", () => { expect(simulatorService.openFrontend).toHaveBeenCalled(); }); + test("runs successfully with default options and keeps existing validators (headless)", async () => { + await startAction({...defaultOptions, headless: true}, simulatorService); + + expect(simulatorService.updateSimulator).toHaveBeenCalledWith("main"); + expect(simulatorService.runSimulator).toHaveBeenCalled(); + expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled(); + + expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators"); + expect(logSpy).toHaveBeenCalledWith("Updating GenLayer Simulator..."); + expect(logSpy).toHaveBeenCalledWith("Running the GenLayer Simulator..."); + expect(logSpy).toHaveBeenCalledWith("Simulator is running!"); + expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! "); + }); + test("logs error and stops if updateSimulator fails", async () => { const errorMsg = new Error("updateSimulator error"); (simulatorService.updateSimulator as Mock).mockRejectedValueOnce(errorMsg); diff --git a/tests/libs/system.test.ts b/tests/libs/system.test.ts index d759a5bd..db93dff1 100644 --- a/tests/libs/system.test.ts +++ b/tests/libs/system.test.ts @@ -4,12 +4,7 @@ import { checkCommand, executeCommand, openUrl, - getVersion, - listDockerContainers, - listDockerImages, - stopDockerContainer, - removeDockerContainer, - removeDockerImage + getVersion } from "../../src/lib/clients/system"; import { MissingRequirementError } from "../../src/lib/errors/missingRequirement"; import open from "open"; @@ -59,48 +54,6 @@ describe("System Functions - Success Paths", () => { expect(result.stdout).toBe("echo linux"); platformSpy.mockRestore(); }); - - test("listDockerContainers retrieves a list of containers", async () => { - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ - stdout: "container1\ncontainer2", - stderr: "" - })); - const containers = await listDockerContainers(); - expect(containers).toEqual(["container1", "container2"]); - }); - - test("listDockerImages retrieves a list of images", async () => { - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ - stdout: "image1\nimage2", - stderr: "" - })); - const images = await listDockerImages(); - expect(images).toEqual(["image1", "image2"]); - }); - - test("stopDockerContainer stops a container", async () => { - const containerId = "container123"; - const execMock = vi.fn().mockResolvedValue({ stdout: "", stderr: "" }); - vi.mocked(util.promisify).mockReturnValue(execMock); - await stopDockerContainer(containerId); - expect(execMock).toHaveBeenCalledWith(`docker stop ${containerId}`); - }); - - test("removeDockerContainer removes a container", async () => { - const containerId = "container123"; - const execMock = vi.fn().mockResolvedValue({ stdout: "", stderr: "" }); - vi.mocked(util.promisify).mockReturnValue(execMock); - await removeDockerContainer(containerId); - expect(execMock).toHaveBeenCalledWith(`docker rm ${containerId}`); - }); - - test("removeDockerImage removes an image", async () => { - const imageId = "image123"; - const execMock = vi.fn().mockResolvedValue({ stdout: "", stderr: "" }); - vi.mocked(util.promisify).mockReturnValue(execMock); - await removeDockerImage(imageId); - expect(execMock).toHaveBeenCalledWith(`docker rmi ${imageId}`); - }); }); describe("System Functions - Error Paths", () => { @@ -153,34 +106,6 @@ describe("System Functions - Error Paths", () => { "echo")).rejects.toThrow("Execution failed"); }); - test("stopDockerContainer throws an error if stopping fails", async () => { - const containerId = "container123"; - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); - await expect(stopDockerContainer(containerId)).rejects.toThrow("Error stopping Docker container container123"); - }); - - test("removeDockerContainer throws an error if removal fails", async () => { - const containerId = "container123"; - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); - await expect(removeDockerContainer(containerId)).rejects.toThrow("Error removing container container123."); - }); - - test("removeDockerImage throws an error if image removal fails", async () => { - const imageId = "image123"; - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); - await expect(removeDockerImage(imageId)).rejects.toThrow("Error removing image image123."); - }); - - test("throws error when command fails", async () => { - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); - await expect(listDockerContainers()).rejects.toThrow("Error listing Docker containers."); - }); - - test("throws error when command fails", async () => { - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error(""))); - await expect(listDockerImages()).rejects.toThrow("Error listing Docker images."); - }); - test("throws error when command execution fails", async () => { vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject(new Error("Execution error."))); await expect(executeCommand({ diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 1e416ef3..9a247405 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -8,8 +8,6 @@ import { executeCommand, openUrl, checkCommand, - stopDockerContainer, - removeDockerContainer, listDockerContainers, } from "../../src/lib/clients/system"; import { DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, @@ -18,14 +16,13 @@ import { import { STARTING_TIMEOUT_ATTEMPTS, DEFAULT_RUN_SIMULATOR_COMMAND, - DEFAULT_RUN_DOCKER_COMMAND, - DEFAULT_PULL_OLLAMA_COMMAND } from "../../src/lib/config/simulator"; import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; import * as semver from "semver"; -import {getCommandOption} from "@@/tests/utils"; - +import Docker from "dockerode"; +import {VersionRequiredError} from "../../src/lib/errors/versionRequired"; +vi.mock("dockerode"); vi.mock("fs"); vi.mock("path"); vi.mock("dotenv"); @@ -139,17 +136,6 @@ describe("SimulatorService - Basic Tests", () => { expect(result).toEqual({ initialized: false, errorCode: "ERROR", errorMessage: nonRetryableError.message }); }); - test("should execute the correct pull command based on simulator location", async () => { - const expectedCommand = DEFAULT_PULL_OLLAMA_COMMAND("/mock/home/genlayer-simulator"); - vi.mocked(executeCommand).mockResolvedValueOnce({ - stdout: "success", - stderr: "", - }); - const result = await simulatorService.pullOllamaModel(); - expect(result).toBe(true); - expect(executeCommand).toHaveBeenCalledWith(expectedCommand); - }); - test("should execute the correct run simulator command based on simulator location", async () => { (executeCommand as Mock).mockResolvedValue({ stdout: "Simulator started", @@ -190,6 +176,30 @@ describe("SimulatorService - Basic Tests", () => { expect(result).toBe(mockResponse); }); + test("should return node missing version", async () => { + const unexpectedError = new VersionRequiredError('node', VERSION_REQUIREMENTS.node); + vi.spyOn(simulatorService, "checkVersion") + .mockRejectedValueOnce(unexpectedError) + .mockResolvedValueOnce(); + + await expect(simulatorService.checkVersionRequirements()).resolves.toStrictEqual({ + "docker": "", + "node": VERSION_REQUIREMENTS.node + }) + }); + + test("should return docker missing version", async () => { + const unexpectedError = new VersionRequiredError('node', VERSION_REQUIREMENTS.docker); + vi.spyOn(simulatorService, "checkVersion") + .mockResolvedValueOnce() + .mockRejectedValueOnce(unexpectedError) + + await expect(simulatorService.checkVersionRequirements()).resolves.toStrictEqual({ + "docker": VERSION_REQUIREMENTS.docker, + "node": "" + }) + }); + test("should throw an unexpected error when checking node version requirements", async () => { const unexpectedError = new Error("Unexpected error (node)"); vi.spyOn(simulatorService, "checkVersion").mockRejectedValueOnce(unexpectedError); @@ -210,31 +220,6 @@ describe("SimulatorService - Basic Tests", () => { expect(requirementsInstalled.git).toBe(false); }); - test("should throw an unexpected error when checking docker installation requirement", async () => { - vi.mocked(checkCommand) - .mockResolvedValueOnce(undefined) - .mockRejectedValueOnce(new Error("Unexpected docker error")); - await expect(simulatorService.checkInstallRequirements()).rejects.toThrow("Unexpected docker error"); - const requirementsInstalled = { git: false, docker: false }; - expect(requirementsInstalled.docker).toBe(false); - }); - - test("should stop and remove Docker containers with the specified prefix", async () => { - const mockContainers = [ - DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "1", - DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "2" - ]; - vi.mocked(listDockerContainers).mockResolvedValue(mockContainers); - vi.mocked(stopDockerContainer).mockResolvedValue(undefined); - vi.mocked(removeDockerContainer).mockResolvedValue(undefined); - const result = await simulatorService.resetDockerContainers(); - expect(result).toBe(true); - expect(stopDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "1"); - expect(stopDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "2"); - expect(removeDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "1"); - expect(removeDockerContainer).toHaveBeenCalledWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX + "2"); - }); - test("should retry when response is not 'OK' and reach sleep path", async () => { vi.mocked(rpcClient.request).mockResolvedValue({ result: { status: "NOT_OK" } }); const result = await simulatorService.waitForSimulatorToBeReady(1); @@ -261,14 +246,9 @@ describe("SimulatorService - Basic Tests", () => { test("should call executeCommand if docker ps command fails", async () => { vi.mocked(checkCommand) .mockResolvedValueOnce(undefined) - .mockResolvedValueOnce(undefined) - .mockRejectedValueOnce(new Error("docker ps failed")); - vi.mocked(executeCommand).mockResolvedValueOnce({ - stdout: '', - stderr: '' - }); + + const result = await simulatorService.checkInstallRequirements(); - expect(executeCommand).toHaveBeenCalledWith(DEFAULT_RUN_DOCKER_COMMAND); expect(result.docker).toBe(true); expect(result.git).toBe(true); }); @@ -302,3 +282,126 @@ describe("SimulatorService - Basic Tests", () => { }); }); +describe("SimulatorService - Docker Tests", () => { + let mockExec: Mock; + let mockGetContainer: Mock; + let mockListContainers: Mock; + let mockListImages: Mock; + let mockGetImage: Mock; + let mockPing: Mock; + + beforeEach(() => { + vi.clearAllMocks(); + mockExec = vi.fn().mockResolvedValueOnce({}); + mockGetContainer = vi.mocked(Docker.prototype.getContainer); + mockListContainers = vi.mocked(Docker.prototype.listContainers); + mockListImages = vi.mocked(Docker.prototype.listImages); + mockGetImage = vi.mocked(Docker.prototype.getImage); + mockPing = vi.mocked(Docker.prototype.ping); + }); + + test("should pull the Ollama model", async () => { + mockGetContainer.mockReturnValueOnce({exec: mockExec} as unknown as Docker.Container); + + const result = await simulatorService.pullOllamaModel(); + + expect(result).toBe(true); + expect(mockGetContainer).toHaveBeenCalledWith("ollama"); + expect(mockExec).toHaveBeenCalledWith({ + Cmd: ["ollama", "pull", "llama3"], + }); + }); + + test("should stop and remove Docker containers with the specified prefix", async () => { + const mockContainers = [ + { + Id: "container1", + Names: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}container1`], + State: "running", + }, + { + Id: "container2", + Names: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}container2`], + State: "exited", + }, + { + Id: "container3", + Names: ["/unrelated-container"], + State: "running", + }, + ]; + + mockListContainers.mockResolvedValue(mockContainers); + + const mockStop = vi.fn().mockResolvedValue(undefined); + const mockRemove = vi.fn().mockResolvedValue(undefined); + mockGetContainer.mockImplementation(() => ({ + stop: mockStop, + remove: mockRemove, + } as unknown as Docker.Container)); + + const result = await simulatorService.resetDockerContainers(); + + expect(result).toBe(true); + expect(mockListContainers).toHaveBeenCalledWith({ all: true }); + + // Ensure only the relevant containers were stopped and removed + expect(mockGetContainer).toHaveBeenCalledWith("container1"); + expect(mockGetContainer).toHaveBeenCalledWith("container2"); + expect(mockGetContainer).not.toHaveBeenCalledWith("container3"); + + expect(mockStop).toHaveBeenCalledTimes(1); + expect(mockRemove).toHaveBeenCalledTimes(2); + }); + + test("should remove Docker images with the specified prefix", async () => { + const mockImages = [ + { + Id: "image1", + RepoTags: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}image1:latest`], + }, + { + Id: "image2", + RepoTags: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}image2:latest`], + }, + { + Id: "image3", + RepoTags: ["unrelated-image:latest"], + }, + ]; + + mockListImages.mockResolvedValue(mockImages); + + const mockRemove = vi.fn().mockResolvedValue(undefined); + mockGetImage.mockImplementation(() => ({ + remove: mockRemove, + } as unknown as Docker.Image)); + + const result = await simulatorService.resetDockerImages(); + + expect(result).toBe(true); + expect(mockListImages).toHaveBeenCalled(); + expect(mockGetImage).toHaveBeenCalledWith("image1"); + expect(mockGetImage).toHaveBeenCalledWith("image2"); + expect(mockGetImage).not.toHaveBeenCalledWith("image3"); + expect(mockRemove).toHaveBeenCalledTimes(2); + expect(mockRemove).toHaveBeenCalledWith({ force: true }); + }); + + test("should execute command when docker is installed but is not available", async () => { + vi.mocked(checkCommand) + .mockResolvedValueOnce(undefined) + + mockPing.mockRejectedValueOnce(""); + await simulatorService.checkInstallRequirements(); + expect(executeCommand).toHaveBeenCalledTimes(1); + }); + + test("should throw an unexpected error when checking docker installation requirement", async () => { + vi.mocked(checkCommand) + .mockResolvedValueOnce(undefined) + .mockRejectedValue(undefined); + mockPing.mockRejectedValueOnce("Unexpected docker error"); + await expect(simulatorService.checkInstallRequirements()).rejects.toThrow("Unexpected docker error"); + }); +}); From 5284302b80aa680682312b0660086990de57477d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 15 Nov 2024 17:01:04 +0000 Subject: [PATCH 26/67] Release v0.3.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 282e21ef..e1baa3e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.3.0 (2024-11-15) + + +### Features + +* abstract docker interaction ([#129](https://github.com/yeagerai/genlayer-cli/issues/129)) ([48985bb](https://github.com/yeagerai/genlayer-cli/commit/48985bb7ff81356c6b448996573d54472b45d58f)) + ## 0.2.0 (2024-11-14) diff --git a/package-lock.json b/package-lock.json index e4ac449b..c9ad1971 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.2.0", + "version": "0.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.2.0", + "version": "0.3.0", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index b591c630..76b9abb4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.2.0", + "version": "0.3.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From f5d1659d1fd2e7dac00edb3a4da99c7d13e4a8dc Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 19 Nov 2024 20:05:05 -0300 Subject: [PATCH 27/67] test: 100% coverage across all files (#138) --- src/index.ts | 14 ++++++++------ src/lib/errors/jsonRpcClientError.ts | 9 --------- tests/index.test.ts | 21 +++++++++++++++++++++ vitest.config.ts | 2 +- 4 files changed, 30 insertions(+), 16 deletions(-) delete mode 100644 src/lib/errors/jsonRpcClientError.ts create mode 100644 tests/index.test.ts diff --git a/src/index.ts b/src/index.ts index b1d92de6..bcc7dd1d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,13 @@ #!/usr/bin/env node import {program} from "commander"; import {version} from "../package.json"; -import {CLI_DESCRIPTION} from "@/lib/config/text"; -import {initializeGeneralCommands} from "@/commands/general"; +import {CLI_DESCRIPTION} from "../src/lib/config/text"; +import {initializeGeneralCommands} from "../src/commands/general"; -program.version(version).description(CLI_DESCRIPTION); +export function initializeCLI() { + program.version(version).description(CLI_DESCRIPTION); + initializeGeneralCommands(program); + program.parse(process.argv); +} -initializeGeneralCommands(program); - -program.parse(process.argv); +initializeCLI(); diff --git a/src/lib/errors/jsonRpcClientError.ts b/src/lib/errors/jsonRpcClientError.ts deleted file mode 100644 index 12236a81..00000000 --- a/src/lib/errors/jsonRpcClientError.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class MissingRequirementError extends Error { - requirement: string; - - constructor(requirement: string) { - super(`${requirement} is not installed. Please install ${requirement}.`); - this.name = "MissingRequirement"; - this.requirement = requirement; - } -} diff --git a/tests/index.test.ts b/tests/index.test.ts new file mode 100644 index 00000000..9451c88e --- /dev/null +++ b/tests/index.test.ts @@ -0,0 +1,21 @@ +import { describe, it, vi, expect } from "vitest"; +import { initializeCLI } from "../src/index"; + +vi.mock("commander", () => ({ + program: { + version: vi.fn().mockReturnThis(), + description: vi.fn().mockReturnThis(), + parse: vi.fn(), + }, +})); + +vi.mock("../src/commands/general", () => ({ + initializeGeneralCommands: vi.fn(), +})); + + +describe("CLI", () => { + it("should initialize CLI", () => { + expect(initializeCLI).not.toThrow(); + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts index e4b9cc7d..6f818b5c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ globals: true, environment: 'jsdom', coverage: { - exclude: [...configDefaults.exclude, '*.js', 'src/index.ts', 'tests/**/*.ts', 'src/types'], + exclude: [...configDefaults.exclude, '*.js', 'tests/**/*.ts', 'src/types'], } } }); \ No newline at end of file From fb62333e171764c85472ee6f19b4c28a51b332c9 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 19 Nov 2024 20:05:18 -0300 Subject: [PATCH 28/67] fix: removing paid feature (#137) --- renovate.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/renovate.json b/renovate.json index 110e0148..0bb1203a 100644 --- a/renovate.json +++ b/renovate.json @@ -13,8 +13,7 @@ "matchUpdateTypes": [ "minor", "patch" - ], - "matchConfidence": ["very high", "high"] + ] } ] } From d5cbd1f8541a8c2b549b8905319478d49561cf0e Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 22 Nov 2024 05:04:57 -0300 Subject: [PATCH 29/67] fix: fixing bug when the command does not exist (#141) --- src/lib/clients/system.ts | 9 ++++++--- tests/actions/init.test.ts | 2 ++ tests/libs/system.test.ts | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/clients/system.ts b/src/lib/clients/system.ts index dc3fff67..30cb4eb4 100644 --- a/src/lib/clients/system.ts +++ b/src/lib/clients/system.ts @@ -6,9 +6,12 @@ import {RunningPlatform, AVAILABLE_PLATFORMS} from "../config/simulator"; import {MissingRequirementError} from "../errors/missingRequirement"; export async function checkCommand(command: string, toolName: string): Promise { - const {stderr} = await util.promisify(exec)(command); - if (stderr) { - throw new MissingRequirementError(toolName); + try { + await util.promisify(exec)(command); + }catch (error:any) { + if (error.stderr) { + throw new MissingRequirementError(toolName); + } } } diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 8cf167e9..75b241cb 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -237,6 +237,8 @@ describe("init action", () => { simServDeleteAllValidators.mockResolvedValue(true); simServCreateRandomValidators.mockRejectedValue(); simServOpenFrontend.mockResolvedValue(true); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); await initAction({...defaultActionOptions, headless: true}, simulatorService); diff --git a/tests/libs/system.test.ts b/tests/libs/system.test.ts index db93dff1..5bcd80a4 100644 --- a/tests/libs/system.test.ts +++ b/tests/libs/system.test.ts @@ -88,7 +88,7 @@ describe("System Functions - Error Paths", () => { }); test("checkCommand returns false if the command does not exist", async () => { - vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.resolve({ + vi.mocked(util.promisify).mockReturnValueOnce(() => Promise.reject({ stdout: "", stderr: "command not found" })); From e3fed6437e7313002685258aeced710a6fd63f4f Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 22 Nov 2024 05:05:34 -0300 Subject: [PATCH 30/67] feat: new reset db option (#139) --- src/commands/general/index.ts | 2 ++ src/commands/general/init.ts | 5 +++++ src/commands/general/start.ts | 7 ++++++- src/lib/interfaces/ISimulatorService.ts | 1 + src/lib/services/simulator.ts | 11 +++++++++++ tests/actions/init.test.ts | 8 +++++--- tests/actions/start.test.ts | 6 ++++-- tests/commands/init.test.ts | 11 +++++++++-- tests/commands/up.test.ts | 20 ++++++++++++-------- tests/services/simulator.test.ts | 6 ++++++ 10 files changed, 61 insertions(+), 16 deletions(-) diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 98ce4644..766f48e2 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -13,6 +13,7 @@ export function initializeGeneralCommands(program: Command) { .option("--branch ", "Branch", "main") .option("--location ", "Location where it will be installed", process.cwd()) .option("--headless", "Headless mode", false) + .option("--reset-db", "Reset Database", false) .action((options: InitActionOptions) => initAction(options, simulatorService)); program @@ -23,6 +24,7 @@ export function initializeGeneralCommands(program: Command) { .option("--branch ", "Branch", "main") .option("--location ", "Location where it will be installed", process.cwd()) .option("--headless", "Headless mode", false) + .option("--reset-db", "Reset Database", false) .action((options: StartActionOptions) => startAction(options, simulatorService)); return program; diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 730086f8..5f87d366 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -7,6 +7,7 @@ export interface InitActionOptions { branch: string; location: string; headless: boolean; + resetDb: boolean; } function getRequirementsErrorMessage({git, docker}: Record): string { @@ -225,6 +226,10 @@ export async function initAction(options: InitActionOptions, simulatorService: I return; } + if(options.resetDb){ + await simulatorService.cleanDatabase() + } + // Simulator ready let successMessage = "GenLayer simulator initialized successfully! " successMessage += options.headless ? '' : `Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`; diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index 38c0cc47..8c9c85dd 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -8,10 +8,11 @@ export interface StartActionOptions { branch: string; location: string; headless: boolean; + resetDb: boolean } export async function startAction(options: StartActionOptions, simulatorService: ISimulatorService) { - const {resetValidators, numValidators, branch, location, headless} = options; + const {resetValidators, numValidators, branch, location, headless, resetDb} = options; // Update simulator location with user input simulatorService.setComposeOptions(headless); simulatorService.setSimulatorLocation(location); @@ -60,6 +61,10 @@ export async function startAction(options: StartActionOptions, simulatorService: return; } + if(resetDb){ + await simulatorService.cleanDatabase() + } + if (resetValidators) { // Initializing validators console.log("Initializing validators..."); diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index 9f8c474f..e6f580b5 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -20,6 +20,7 @@ export interface ISimulatorService { openFrontend(): Promise; resetDockerContainers(): Promise; resetDockerImages(): Promise; + cleanDatabase(): Promise; } export type DownloadSimulatorResultType = { diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index ab0a9368..0027e8d1 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -317,6 +317,17 @@ export class SimulatorService implements ISimulatorService { return true; } + + public async cleanDatabase(): Promise { + + try { + await rpcClient.request({method: "sim_clearDbTables", params: [['current_state', 'transactions']]}); + }catch (error) { + console.error(error); + } + return true; + } + } export default new SimulatorService(); diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 75b241cb..5e0998ca 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -7,7 +7,7 @@ import {mkdtempSync} from "fs"; import {join} from "path"; const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); -const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false }; +const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false }; describe("init action", () => { let error: ReturnType; @@ -188,7 +188,7 @@ describe("init action", () => { ); }); - test("should open the frontend if everything went well (headless mode)", async () => { + test("should open the frontend if everything went well (custom options)", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, @@ -211,7 +211,7 @@ describe("init action", () => { simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - await initAction({...defaultActionOptions, headless: true}, simulatorService); + await initAction({...defaultActionOptions, headless: true, resetDb: true}, simulatorService); expect(log).toHaveBeenCalledWith( `GenLayer simulator initialized successfully! ` @@ -235,6 +235,8 @@ describe("init action", () => { simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServPullOllamaModel.mockResolvedValue(true); simServDeleteAllValidators.mockResolvedValue(true); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); simServCreateRandomValidators.mockRejectedValue(); simServOpenFrontend.mockResolvedValue(true); simServResetDockerContainers.mockResolvedValue(true); diff --git a/tests/actions/start.test.ts b/tests/actions/start.test.ts index 7e349c96..b510553d 100644 --- a/tests/actions/start.test.ts +++ b/tests/actions/start.test.ts @@ -15,6 +15,7 @@ describe("startAction - Additional Tests", () => { branch: "main", location: '', headless: false, + resetDb: false }; beforeEach(() => { @@ -36,6 +37,7 @@ describe("startAction - Additional Tests", () => { { name: "Provider B", value: "providerB" }, ]), getFrontendUrl: vi.fn(() => "http://localhost:8080"), + cleanDatabase: vi.fn().mockResolvedValue(undefined), } as unknown as ISimulatorService; }); @@ -59,8 +61,8 @@ describe("startAction - Additional Tests", () => { expect(simulatorService.openFrontend).toHaveBeenCalled(); }); - test("runs successfully with default options and keeps existing validators (headless)", async () => { - await startAction({...defaultOptions, headless: true}, simulatorService); + test("runs successfully with custom options and keeps existing validators", async () => { + await startAction({...defaultOptions, headless: true, resetDb: true}, simulatorService); expect(simulatorService.updateSimulator).toHaveBeenCalledWith("main"); expect(simulatorService.runSimulator).toHaveBeenCalled(); diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index cb8575bd..c7b9d568 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -5,6 +5,13 @@ import { getCommand, getCommandOption } from "../utils"; import simulatorService from '../../src/lib/services/simulator' const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); +const defaultOptions = { + numValidators: "5", + branch: "main", + location: process.cwd(), + headless: false, + resetDb: false +} vi.mock("inquirer", () => ({ prompt: vi.fn(() => {}), @@ -74,13 +81,13 @@ describe("init command", () => { test("action is called", async () => { program.parse(["node", "test", "init"]); expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({ numValidators: "5", branch: "main", location: process.cwd(), headless: false }); + expect(action).toHaveBeenCalledWith(defaultOptions); }); test("option --headless is accepted", async () => { program.parse(["node", "test", "init", "--headless"]); expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({ numValidators: "5", branch: "main", location: process.cwd(), headless: true }); + expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true}); expect(openFrontendSpy).not.toHaveBeenCalled(); }); }); diff --git a/tests/commands/up.test.ts b/tests/commands/up.test.ts index 7fbc466a..c63a747c 100644 --- a/tests/commands/up.test.ts +++ b/tests/commands/up.test.ts @@ -7,6 +7,14 @@ import simulatorService from '../../src/lib/services/simulator' const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); const action = vi.fn(); +const defaultOptions = { + resetValidators: false, + numValidators: "5", + branch: "main", + location: process.cwd(), + headless: false , + resetDb: false +} describe("up command", () => { let upCommand: Command; @@ -72,7 +80,7 @@ describe("up command", () => { test("action is called with default options", async () => { program.parse(["node", "test", "up"]); expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({ resetValidators: false, numValidators: "5", branch: "main", location: process.cwd(), headless: false }); + expect(action).toHaveBeenCalledWith(defaultOptions); }); test("action is called with custom options", async () => { @@ -86,16 +94,12 @@ describe("up command", () => { "--branch", "development", "--headless", + "true", + "--reset-db", "true" ]); expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({ - resetValidators: true, - numValidators: "10", - branch: "development", - location: process.cwd(), - headless: true, - }); + expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true, branch: 'development', numValidators: '10', resetValidators: true, resetDb: true}); expect(openFrontendSpy).not.toHaveBeenCalled(); }); }); diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 9a247405..cf8d135d 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -281,6 +281,12 @@ describe("SimulatorService - Basic Tests", () => { expect(simulatorService.getAiProvidersOptions(false)).toEqual(expect.any(Array)); }); + test("clean simulator should success", async () => { + vi.mocked(rpcClient.request).mockResolvedValueOnce('Success'); + await expect(simulatorService.cleanDatabase).not.toThrow(); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_clearDbTables", params: [['current_state', 'transactions']] }); + }); + }); describe("SimulatorService - Docker Tests", () => { let mockExec: Mock; From 3b22154e04dc48cc9c06bee516d2210aa91f235a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 22 Nov 2024 08:06:10 +0000 Subject: [PATCH 31/67] Release v0.4.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1baa3e0..3d20378b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.4.0 (2024-11-22) + + +### Features + +* new reset db option ([#139](https://github.com/yeagerai/genlayer-cli/issues/139)) ([e3fed64](https://github.com/yeagerai/genlayer-cli/commit/e3fed6437e7313002685258aeced710a6fd63f4f)) + ## 0.3.0 (2024-11-15) diff --git a/package-lock.json b/package-lock.json index c9ad1971..5cdfb0c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.3.0", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.3.0", + "version": "0.4.0", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 76b9abb4..f33bd1f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.3.0", + "version": "0.4.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 00ada3b01ab8f727dbeadc2da0b810dc4211b6c9 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 3 Dec 2024 09:58:05 -0300 Subject: [PATCH 32/67] feat: chack cli version (#143) --- package-lock.json | 38 +++++++++++++++++--- package.json | 1 + src/commands/general/init.ts | 2 ++ src/commands/general/start.ts | 1 + src/lib/interfaces/ISimulatorService.ts | 1 + src/lib/services/simulator.ts | 9 +++++ tests/actions/start.test.ts | 1 + tests/services/simulator.test.ts | 48 +++++++++++++++++++++++++ 8 files changed, 96 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5cdfb0c8..11acb3bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", + "update-check": "^1.5.4", "uuid": "^9.0.1", "vitest": "^2.1.4" }, @@ -2769,7 +2770,6 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "dev": true, "license": "MIT", "engines": { "node": ">=4.0.0" @@ -5509,7 +5509,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6287,7 +6286,6 @@ }, "node_modules/rc": { "version": "1.2.8", - "dev": true, "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -6301,12 +6299,10 @@ }, "node_modules/rc/node_modules/ini": { "version": "1.3.8", - "dev": true, "license": "ISC" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8097,6 +8093,38 @@ "node": ">= 10.0.0" } }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "license": "MIT", + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "node_modules/update-check/node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "license": "MIT", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/update-check/node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "license": "MIT", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/update-notifier": { "version": "7.0.0", "dev": true, diff --git a/package.json b/package.json index f33bd1f3..3b4b8d8e 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", + "update-check": "^1.5.4", "uuid": "^9.0.1", "vitest": "^2.1.4" } diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 5f87d366..34e4ec95 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -42,6 +42,8 @@ export async function initAction(options: InitActionOptions, simulatorService: I simulatorService.setSimulatorLocation(options.location); simulatorService.setComposeOptions(options.headless); + await simulatorService.checkCliVersion(); + // Check if requirements are installed try { const requirementsInstalled = await simulatorService.checkInstallRequirements(); diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index 8c9c85dd..d78c4686 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -17,6 +17,7 @@ export async function startAction(options: StartActionOptions, simulatorService: simulatorService.setComposeOptions(headless); simulatorService.setSimulatorLocation(location); + await simulatorService.checkCliVersion(); const restartValidatorsHintText = resetValidators ? `creating new ${numValidators} random validators` diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index e6f580b5..aa6b1079 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -20,6 +20,7 @@ export interface ISimulatorService { openFrontend(): Promise; resetDockerContainers(): Promise; resetDockerImages(): Promise; + checkCliVersion(): Promise; cleanDatabase(): Promise; } diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 0027e8d1..400990fd 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -3,6 +3,8 @@ import * as fs from "fs"; import * as dotenv from "dotenv"; import * as path from "path"; import * as semver from "semver"; +import updateCheck from "update-check"; +import pkg from '../../../package.json' import {rpcClient} from "../clients/jsonRpcClient"; import { @@ -93,6 +95,13 @@ export class SimulatorService implements ISimulatorService { fs.writeFileSync(envFilePath, updatedConfig); } + public async checkCliVersion(): Promise { + const update = await updateCheck(pkg); + if (update && update.latest !== pkg.version) { + console.warn(`\nA new version (${update.latest}) is available! You're using version ${pkg.version}.\nRun npm install -g genlayer to update\n`); + } + } + public async checkInstallRequirements(): Promise> { const requirementsInstalled = { git: false, diff --git a/tests/actions/start.test.ts b/tests/actions/start.test.ts index b510553d..d379952d 100644 --- a/tests/actions/start.test.ts +++ b/tests/actions/start.test.ts @@ -32,6 +32,7 @@ describe("startAction - Additional Tests", () => { openFrontend: vi.fn().mockResolvedValue(undefined), setSimulatorLocation: vi.fn().mockResolvedValue(undefined), setComposeOptions: vi.fn(), + checkCliVersion: vi.fn(), getAiProvidersOptions: vi.fn(() => [ { name: "Provider A", value: "providerA" }, { name: "Provider B", value: "providerB" }, diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index cf8d135d..4352ca38 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -21,7 +21,15 @@ import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; import * as semver from "semver"; import Docker from "dockerode"; import {VersionRequiredError} from "../../src/lib/errors/versionRequired"; +import updateCheck from "update-check"; +vi.mock("../../package.json", () => ({ + default: { version: "1.0.0", name: "genlayer" }, +})); + +vi.mock("update-check", () => ({ + default: vi.fn(), +})); vi.mock("dockerode"); vi.mock("fs"); vi.mock("path"); @@ -410,4 +418,44 @@ describe("SimulatorService - Docker Tests", () => { mockPing.mockRejectedValueOnce("Unexpected docker error"); await expect(simulatorService.checkInstallRequirements()).rejects.toThrow("Unexpected docker error"); }); + + test("should warn the user when an update is available", async () => { + const update = { latest: "1.1.0" }; + (updateCheck as any).mockResolvedValue(update); + + const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + + await simulatorService.checkCliVersion(); + + expect(consoleWarnSpy).toHaveBeenCalledWith( + `\nA new version (${update.latest}) is available! You're using version 1.0.0.\nRun npm install -g genlayer to update\n` + ); + + consoleWarnSpy.mockRestore(); + }); + + test("should not warn the user when the CLI is up-to-date", async () => { + const update = { latest: "1.0.0" }; + (updateCheck as any).mockResolvedValue(update); + + const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + + await simulatorService.checkCliVersion(); + + expect(consoleWarnSpy).not.toHaveBeenCalled(); + + consoleWarnSpy.mockRestore(); + }); + + test("should handle update-check returning undefined", async () => { + (updateCheck as any).mockResolvedValue(undefined); + + const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + + await simulatorService.checkCliVersion(); + + expect(consoleWarnSpy).not.toHaveBeenCalled(); + + consoleWarnSpy.mockRestore(); + }); }); From 261ceed95963abb79b79cf9433217e0941425fef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Dec 2024 12:58:39 +0000 Subject: [PATCH 33/67] Release v0.5.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d20378b..c884cd00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.5.0 (2024-12-03) + + +### Features + +* chack cli version ([#143](https://github.com/yeagerai/genlayer-cli/issues/143)) ([00ada3b](https://github.com/yeagerai/genlayer-cli/commit/00ada3b01ab8f727dbeadc2da0b810dc4211b6c9)) + ## 0.4.0 (2024-11-22) diff --git a/package-lock.json b/package-lock.json index 11acb3bd..9ae178ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.4.0", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.4.0", + "version": "0.5.0", "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 3b4b8d8e..143b3367 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.4.0", + "version": "0.5.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 351dae18ba3bcc7b492d34ac01f7d5d3059f0d80 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 3 Dec 2024 11:31:16 -0300 Subject: [PATCH 34/67] feat: Refactor Docker Setup for CLI (#145) * feat: docker from registry * fix: changing container's prefix from simulator to cli * test: 100% coverage on tests * feat: new docker from registry working configuration and tests * Release v0.5.1-beta.0 [skip ci] --------- Co-authored-by: github-actions[bot] --- .env.example | 71 ++++++++++ .gitignore | 3 +- CHANGELOG.md | 7 + docker-compose.yml | 144 +++++++++++++++++++ package-lock.json | 5 +- package.json | 5 +- scripts/postinstall.js | 18 +++ src/commands/general/index.ts | 4 - src/commands/general/init.ts | 47 +------ src/commands/general/start.ts | 18 +-- src/lib/config/simulator.ts | 11 +- src/lib/interfaces/ISimulatorService.ts | 9 +- src/lib/services/simulator.ts | 138 +++++++------------ tests/actions/init.test.ts | 109 ++++----------- tests/actions/start.test.ts | 18 +-- tests/commands/init.test.ts | 17 --- tests/commands/up.test.ts | 14 +- tests/services/simulator.test.ts | 176 +++++++++++++++--------- vitest.config.ts | 2 +- 19 files changed, 447 insertions(+), 369 deletions(-) create mode 100644 .env.example create mode 100644 docker-compose.yml create mode 100644 scripts/postinstall.js diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..045d3de7 --- /dev/null +++ b/.env.example @@ -0,0 +1,71 @@ +# PostgreSQL database credentials +DBNAME=genlayer_state +DBUSER=postgres +DBPASSWORD=postgres +DBPORT=5432 +DBHOST='postgres' + +# Logging Configuration +LOGCONFIG='dev' # dev/prod +FLASK_LOG_LEVEL='ERROR' # DEBUG/INFO/WARNING/ERROR/CRITICAL +DISABLE_INFO_LOGS_ENDPOINTS='["ping", "eth_getTransactionByHash","gen_getContractSchemaForCode","gen_getContractSchema"]' + + +# JSON-RPC server details +RPCPORT=4000 +RPCDEBUGPORT=4678 +RPCHOST='jsonrpc' +RPCPROTOCOL='http' +JSONRPC_REPLICAS='1' # number of JsonRPC container replicas to run, used to scale up for production + + +# WebRequest Server Configuration +WEBREQUESTPORT=5000 +WEBREQUESTSELENIUMPORT=5001 +WEBREQUESTPROTOCOL='http' +WEBREQUESTHOST='webrequest' + + +# Ollama server details +OLAMAPROTOCOL='http' +OLAMAHOST='ollama' +OLAMAPORT='11434' + + +# Frontend details +FRONTEND_PORT=8080 +FRONTEND_BUILD_TARGET=final +VITE_JSON_RPC_SERVER_URL='http://127.0.0.1:4000/api' # if VITE_PROXY_ENABLED = 'true' change to '/api' +VITE_WS_SERVER_URL= 'ws://127.0.0.1:4000' # if VITE_PROXY_ENABLED = 'true' change to '/' +VITE_PLAUSIBLE_DOMAIN='studio.genlayer.com' + + +# GenVM Configuration +GENVM_BIN="/genvm/bin" + + +# Vite Proxy Configuration (for local development) +VITE_PROXY_ENABLED='false' +VITE_PROXY_JSON_RPC_SERVER_URL='http://jsonrpc:4000' +VITE_PROXY_WS_SERVER_URL='ws://jsonrpc:4000' +VITE_IS_HOSTED='false' + +# LLM Providers Configuration +# If you want to use OpenAI LLMs, add your key here +OPENAIKEY='' + +# If you want to use Anthropic AI LLMs, add your key here +ANTHROPIC_API_KEY='' + +# If you want to use Heurist AI LLMs, add your key here +HEURISTAIURL='https://llm-gateway.heurist.xyz' +HEURISTAIMODELSURL='https://raw.githubusercontent.com/heurist-network/heurist-models/main/models.json' +HEURISTAIAPIKEY='' + +# Validator Configuration +# JSON array of initial validators to be created on startup. +# Example: VALIDATORS_CONFIG_JSON = '[{"stake": 100, "provider": "openai", "model": "gpt-4o", "amount": 2}, {"stake": 200, "provider": "anthropic", "model": "claude-3-haiku-20240307", "amount": 1}]' +VALIDATORS_CONFIG_JSON='' + + +VSCODEDEBUG="false" diff --git a/.gitignore b/.gitignore index 72660f9e..bbf43fff 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ node_modules .DS_Store dist .idea -coverage \ No newline at end of file +coverage +.ollama \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c884cd00..c24d78b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.5.1-beta.0 (2024-12-03) + + +### Bug Fixes + +* merging main and resolving conflicts ([df23e36](https://github.com/yeagerai/genlayer-cli/commit/df23e365c4f481a153ae8b39051500aaad5b8b0e)) + ## 0.5.0 (2024-12-03) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..c542fbe2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,144 @@ +version: "3.8" + +services: + frontend: + image: yeagerai/simulator-frontend:latest + ports: + - "${FRONTEND_PORT:-8080}:8080" + environment: + - VITE_* + volumes: + - ./.env:/app/.env + depends_on: + jsonrpc: + condition: service_healthy + expose: + - "${FRONTEND_PORT:-8080}" + restart: always + security_opt: + - "no-new-privileges=true" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + + jsonrpc: + image: yeagerai/simulator-jsonrpc:latest + environment: + - FLASK_SERVER_PORT=${RPCPORT:-5000} + - PYTHONUNBUFFERED=1 + - RPCDEBUGPORT=${RPCDEBUGPORT:-5001} + - WEBREQUESTPORT=${WEBREQUESTPORT:-5002} + - WEBREQUESTHOST=${WEBREQUESTHOST:-localhost} + - WEBREQUESTPROTOCOL=${WEBREQUESTPROTOCOL:-http} + ports: + - "${RPCPORT:-5000}:${RPCPORT:-5000}" + - "${RPCDEBUGPORT:-5001}:${RPCDEBUGPORT:-5001}" + volumes: + - ./.env:/app/.env + healthcheck: + test: [ "CMD", "python", "backend/healthcheck.py", "--port", "${RPCPORT}" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + depends_on: + database-migration: + condition: service_completed_successfully + webrequest: + condition: service_healthy + expose: + - "${RPCPORT:-5000}" + restart: always + security_opt: + - "no-new-privileges=true" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + deploy: + replicas: ${JSONRPC_REPLICAS:-1} + + webrequest: + image: yeagerai/simulator-webrequest:latest + shm_size: 2gb + environment: + - FLASK_SERVER_PORT=${WEBREQUESTPORT:-5002} + - WEBREQUESTSELENIUMPORT=${WEBREQUESTSELENIUMPORT:-4444} + - PYTHONUNBUFFERED=1 + - WEBREQUESTPORT=${WEBREQUESTPORT} + - WEBREQUESTHOST=${WEBREQUESTHOST} + - WEBREQUESTPROTOCOL=${WEBREQUESTPROTOCOL} + expose: + - "${WEBREQUESTPORT:-5002}:${WEBREQUESTPORT:-5002}" + - "${WEBREQUESTSELENIUMPORT:-4444}:${WEBREQUESTSELENIUMPORT:-4444}" + volumes: + - ./.env:/app/webrequest/.env + depends_on: + ollama: + condition: service_started + restart: always + security_opt: + - "no-new-privileges=true" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + ollama: + image: ollama/ollama:0.3.11 + ports: + - 11434:11434 + container_name: ollama + tty: true + restart: always + security_opt: + - "no-new-privileges=true" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + postgres: + image: postgres:16-alpine + ports: + - "${DBPORT:-5432}:5432" + environment: + - POSTGRES_USER=${DBUSER:-postgres} + - POSTGRES_PASSWORD=${DBPASSWORD:-postgres} + - POSTGRES_DB=${DBNAME:-simulator_db} + healthcheck: + test: pg_isready -U ${DBUSER:-postgres} -d ${DBNAME:-simulator_db} + interval: 10s + timeout: 3s + retries: 3 + restart: always + security_opt: + - "no-new-privileges=true" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # Uncomment the following lines if you want your DB to persist + # volumes: + # - "./data/postgres:/var/lib/postgresql/data" + + database-migration: + image: yeagerai/simulator-database-migration:latest + environment: + - DB_URL=postgresql://${DBUSER:-postgres}:${DBPASSWORD:-postgres}@postgres/${DBNAME:-simulator_db} + - WEBREQUESTPORT=${WEBREQUESTPORT:-5002} + - WEBREQUESTHOST=${WEBREQUESTHOST:-localhost} + - WEBREQUESTPROTOCOL=${WEBREQUESTPROTOCOL:-http} + depends_on: + postgres: + condition: service_healthy + webrequest: + condition: service_healthy diff --git a/package-lock.json b/package-lock.json index 9ae178ec..ac38081c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "genlayer", - "version": "0.5.0", + "version": "0.5.1-beta.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.5.0", + "version": "0.5.1-beta.0", + "hasInstallScript": true, "license": "MIT", "dependencies": { "commander": "^12.0.0", diff --git a/package.json b/package.json index 143b3367..834a97d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.5.0", + "version": "0.5.1-beta.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { @@ -13,7 +13,8 @@ "dev": "cross-env NODE_ENV=development node esbuild.config.js", "build": "cross-env NODE_ENV=production node esbuild.config.js", "release": "release-it --ci", - "release-beta": "release-it --ci --preRelease=beta" + "release-beta": "release-it --ci --preRelease=beta", + "postinstall": "node ./scripts/postinstall.js" }, "repository": { "type": "git", diff --git a/scripts/postinstall.js b/scripts/postinstall.js new file mode 100644 index 00000000..d1f1326c --- /dev/null +++ b/scripts/postinstall.js @@ -0,0 +1,18 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +const envExamplePath = path.resolve(__dirname, '../.env.example'); +const envPath = path.resolve(__dirname, '../.env'); + +try { + if (fs.existsSync(envPath)) { + console.log(`⚠️ .env file already exists. Skipping creation.`); + } else { + fs.copyFileSync(envExamplePath, envPath); + console.log(`✅ .env file created successfully from .env.example.`); + } +} catch (error) { + console.error(`❌ Error during post-install script: ${error.message}`); +} diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 766f48e2..3b9f8333 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -10,8 +10,6 @@ export function initializeGeneralCommands(program: Command) { .command("init") .description("Initialize the GenLayer Environment") .option("--numValidators ", "Number of validators", "5") - .option("--branch ", "Branch", "main") - .option("--location ", "Location where it will be installed", process.cwd()) .option("--headless", "Headless mode", false) .option("--reset-db", "Reset Database", false) .action((options: InitActionOptions) => initAction(options, simulatorService)); @@ -21,8 +19,6 @@ export function initializeGeneralCommands(program: Command) { .description("Starts GenLayer's simulator") .option("--reset-validators", "Remove all current validators and create new random ones", false) .option("--numValidators ", "Number of validators", "5") - .option("--branch ", "Branch", "main") - .option("--location ", "Location where it will be installed", process.cwd()) .option("--headless", "Headless mode", false) .option("--reset-db", "Reset Database", false) .action((options: StartActionOptions) => startAction(options, simulatorService)); diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 34e4ec95..1cbff484 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -4,19 +4,12 @@ import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; import {AI_PROVIDERS_CONFIG, AiProviders} from "../../lib/config/simulator"; export interface InitActionOptions { numValidators: number; - branch: string; - location: string; headless: boolean; resetDb: boolean; } -function getRequirementsErrorMessage({git, docker}: Record): string { - if (!git && !docker) { - return "Git and Docker are not installed. Please install them and try again.\n"; - } - if (!git) { - return "Git is not installed. Please install Git and try again.\n"; - } +function getRequirementsErrorMessage({docker}: Record): string { + if (!docker) { return "Docker is not installed. Please install Docker and try again.\n"; } @@ -39,7 +32,6 @@ function getVersionErrorMessage({docker, node}: Record): string } export async function initAction(options: InitActionOptions, simulatorService: ISimulatorService) { - simulatorService.setSimulatorLocation(options.location); simulatorService.setComposeOptions(options.headless); await simulatorService.checkCliVersion(); @@ -99,33 +91,6 @@ export async function initAction(options: InitActionOptions, simulatorService: I return; } - // Ask for confirmation on downloading the GenLayer Simulator from GitHub - const answers = await inquirer.prompt([ - { - type: "confirm", - name: "confirmDownload", - message: `This action is going to download the GenLayer Simulator from GitHub (branch ${options.branch}) into "${simulatorService.getSimulatorLocation()}". Do you want to continue?`, - default: true, - }, - ]); - - if (!answers.confirmDownload) { - console.log("Aborted!"); - return; - } - - // Download the GenLayer Simulator from GitHub - console.log(`Downloading GenLayer Simulator from GitHub...`); - try { - const {wasInstalled} = await simulatorService.downloadSimulator(options.branch); - if (wasInstalled) { - await simulatorService.updateSimulator(options.branch); - } - } catch (error) { - console.error(error); - return; - } - // Check LLM configuration const questions = [ { @@ -173,12 +138,8 @@ export async function initAction(options: InitActionOptions, simulatorService: I } console.log("Configuring GenLayer Simulator environment..."); - try { - await simulatorService.configSimulator(aiProvidersEnvVars); - } catch (error) { - console.error(error); - return; - } + simulatorService.addConfigToEnvFile(aiProvidersEnvVars); + // Run the GenLayer Simulator console.log("Running the GenLayer Simulator..."); diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index d78c4686..e7c7cbfc 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -5,17 +5,14 @@ import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; export interface StartActionOptions { resetValidators: boolean; numValidators: number; - branch: string; - location: string; headless: boolean; resetDb: boolean } export async function startAction(options: StartActionOptions, simulatorService: ISimulatorService) { - const {resetValidators, numValidators, branch, location, headless, resetDb} = options; - // Update simulator location with user input + const {resetValidators, numValidators, headless, resetDb} = options; + simulatorService.setComposeOptions(headless); - simulatorService.setSimulatorLocation(location); await simulatorService.checkCliVersion(); @@ -25,17 +22,6 @@ export async function startAction(options: StartActionOptions, simulatorService: console.log(`Starting GenLayer simulator ${restartValidatorsHintText}`); - // Update the simulator to the latest version - console.log(`Updating GenLayer Simulator...`); - try { - await simulatorService.updateSimulator(branch); - } catch (error) { - console.error(error); - return; - } - - // Run the GenLayer Simulator - console.log("Running the GenLayer Simulator..."); try { await simulatorService.runSimulator(); } catch (error) { diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index 1941dd87..d9b56ac8 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -1,10 +1,9 @@ export const DEFAULT_JSON_RPC_URL = "http://localhost:4000/api"; -export const DEFAULT_REPO_GH_URL = "https://github.com/yeagerai/genlayer-simulator.git"; -export const DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX = "/genlayer-simulator-"; -export const DEFAULT_RUN_SIMULATOR_COMMAND = (simulatorLocation: string, options: string) => ({ - darwin: `osascript -e 'tell application "Terminal" to do script "cd ${simulatorLocation} && docker compose build && docker compose up ${options}"'`, - win32: `start cmd.exe /c "cd /d ${simulatorLocation} && docker compose build && docker compose up && pause ${options}"`, - linux: `nohup bash -c 'cd ${simulatorLocation} && docker compose build && docker compose up -d ${options}'`, +export const DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX = "/genlayer-cli-"; +export const DEFAULT_RUN_SIMULATOR_COMMAND = (location: string, options: string) => ({ + darwin: `osascript -e 'tell application "Terminal" to do script "cd ${location} && docker compose build && docker compose up ${options}"'`, + win32: `start cmd.exe /c "cd /d ${location} && docker compose build && docker compose up && pause ${options}"`, + linux: `nohup bash -c 'cd ${location} && docker compose build && docker compose up -d ${options}'`, }); export const DEFAULT_RUN_DOCKER_COMMAND = { darwin: "open -a Docker", diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index aa6b1079..1aa83ea1 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -1,16 +1,11 @@ import {AiProviders} from "../config/simulator"; export interface ISimulatorService { - setSimulatorLocation(location: string): void; - getSimulatorLocation(): string; setComposeOptions(headless: boolean): void; getComposeOptions(): string; checkInstallRequirements(): Promise>; checkVersionRequirements(): Promise>; - downloadSimulator(branch?: string): Promise; - updateSimulator(branch?: string): Promise; pullOllamaModel(): Promise; - configSimulator(newConfig: Record): Promise; runSimulator(): Promise<{stdout: string; stderr: string}>; waitForSimulatorToBeReady(retries?: number): Promise; createRandomValidators(numValidators: number, llmProviders: AiProviders[]): Promise; @@ -22,11 +17,9 @@ export interface ISimulatorService { resetDockerImages(): Promise; checkCliVersion(): Promise; cleanDatabase(): Promise; + addConfigToEnvFile(newConfig: Record): void; } -export type DownloadSimulatorResultType = { - wasInstalled: boolean; -}; export type WaitForSimulatorToBeReadyResultType = { initialized: boolean; diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 400990fd..85aaf5cd 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -8,7 +8,6 @@ import pkg from '../../../package.json' import {rpcClient} from "../clients/jsonRpcClient"; import { - DEFAULT_REPO_GH_URL, DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, DEFAULT_RUN_SIMULATOR_COMMAND, DEFAULT_RUN_DOCKER_COMMAND, @@ -28,7 +27,6 @@ import {MissingRequirementError} from "../errors/missingRequirement"; import { ISimulatorService, - DownloadSimulatorResultType, WaitForSimulatorToBeReadyResultType, } from "../interfaces/ISimulatorService"; import {VersionRequiredError} from "../errors/versionRequired"; @@ -41,39 +39,16 @@ function sleep(millliseconds: number): Promise { export class SimulatorService implements ISimulatorService { private composeOptions: string private docker: Docker; - public simulatorLocation: string; + public location: string; constructor() { - this.simulatorLocation = ""; + this.location = path.resolve(__dirname, '..'); this.composeOptions = ""; this.docker = new Docker(); } - public setSimulatorLocation(location: string): void { - this.simulatorLocation = location; - } - - public getSimulatorLocation(): string { - return this.simulatorLocation; - } - - public setComposeOptions(headless: boolean): void { - this.composeOptions = headless ? '--scale frontend=0' : ''; - } - - public getComposeOptions(): string { - return this.composeOptions; - } - - private readEnvConfigValue(key: string): string { - const envFilePath = path.join(this.simulatorLocation, ".env"); - // Transform the config string to object - const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); - return envConfig[key]; - } - - private addConfigToEnvFile(newConfig: Record): void { - const envFilePath = path.join(this.simulatorLocation, ".env"); + public addConfigToEnvFile(newConfig: Record): void { + const envFilePath = path.join(this.location, ".env"); // Create a backup of the original .env file fs.writeFileSync(`${envFilePath}.bak`, fs.readFileSync(envFilePath)); @@ -95,6 +70,21 @@ export class SimulatorService implements ISimulatorService { fs.writeFileSync(envFilePath, updatedConfig); } + public setComposeOptions(headless: boolean): void { + this.composeOptions = headless ? '--scale frontend=0' : ''; + } + + public getComposeOptions(): string { + return this.composeOptions; + } + + private readEnvConfigValue(key: string): string { + const envFilePath = path.join(this.location, ".env"); + // Transform the config string to object + const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); + return envConfig[key]; + } + public async checkCliVersion(): Promise { const update = await updateCheck(pkg); if (update && update.latest !== pkg.version) { @@ -104,19 +94,9 @@ export class SimulatorService implements ISimulatorService { public async checkInstallRequirements(): Promise> { const requirementsInstalled = { - git: false, docker: false, }; - try { - await checkCommand("git --version", "git"); - requirementsInstalled.git = true; - } catch (error) { - if (!(error instanceof MissingRequirementError)) { - throw error; - } - } - try { await checkCommand("docker --version", "docker"); requirementsInstalled.docker = true; @@ -126,7 +106,6 @@ export class SimulatorService implements ISimulatorService { } } - if (requirementsInstalled.docker) { try { await this.docker.ping() @@ -173,62 +152,41 @@ export class SimulatorService implements ISimulatorService { } } - public async downloadSimulator(branch: string = "main"): Promise { + public async pullOllamaModel(): Promise { try { - const gitCommand = `git clone -b ${branch} ${DEFAULT_REPO_GH_URL} ${this.simulatorLocation}`; - const cmdsByPlatform = {darwin: gitCommand, win32: gitCommand, linux: gitCommand}; - await executeCommand(cmdsByPlatform, "git"); - } catch (error: any) { - const simulatorLocationExists = fs.existsSync(this.simulatorLocation); - if (simulatorLocationExists) { - return {wasInstalled: true}; - } - throw error; + const ollamaContainer = this.docker.getContainer("ollama"); + + // Create the exec instance + const exec = await ollamaContainer.exec({ + Cmd: ["ollama", "pull", "llama3"], + AttachStdout: true, + AttachStderr: true, + }); + + // Start the exec instance and attach to the stream + const stream = await exec.start({ Detach: false, Tty: false }); + + // Collect and log the output + stream.on("data", (chunk) => { + console.log(chunk.toString()); + }); + + await new Promise((resolve, reject) => { + stream.on("end", resolve); + stream.on("error", reject); + }); + + console.log("Command executed successfully"); + return true; + } catch (error) { + console.error("Error executing ollama pull llama3:", error); + return false; } - return {wasInstalled: false}; } - public async updateSimulator(branch: string = "main"): Promise { - const gitCleanCommand = `git -C "${this.simulatorLocation}" clean -f`; - const cleanCmdsByPlatform = {darwin: gitCleanCommand, win32: gitCleanCommand, linux: gitCleanCommand}; - await executeCommand(cleanCmdsByPlatform, "git"); - - const gitFetchCommand = `git -C "${this.simulatorLocation}" fetch`; - const fetchCmdsByPlatform = {darwin: gitFetchCommand, win32: gitFetchCommand, linux: gitFetchCommand}; - await executeCommand(fetchCmdsByPlatform, "git"); - - const gitCheckoutCommand = `git -C "${this.simulatorLocation}" checkout ${branch}`; - const checkoutCmdsByPlatform = { - darwin: gitCheckoutCommand, - win32: gitCheckoutCommand, - linux: gitCheckoutCommand, - }; - await executeCommand(checkoutCmdsByPlatform, "git"); - - const gitPullCommand = `git -C "${this.simulatorLocation}" pull`; - const pullCmdsByPlatform = {darwin: gitPullCommand, win32: gitPullCommand, linux: gitPullCommand}; - await executeCommand(pullCmdsByPlatform, "git"); - return true; - } - - public async pullOllamaModel(): Promise { - const ollamaContainer = this.docker.getContainer("ollama"); - await ollamaContainer.exec({ - Cmd: ["ollama", "pull", "llama3"], - }); - return true; - } - - public async configSimulator(newConfig: Record): Promise { - const envExample = path.join(this.simulatorLocation, ".env.example"); - const envFilePath = path.join(this.simulatorLocation, ".env"); - fs.copyFileSync(envExample, envFilePath); - this.addConfigToEnvFile(newConfig); - return true; - } public runSimulator(): Promise<{stdout: string; stderr: string}> { - const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(this.simulatorLocation, this.getComposeOptions()); + const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(this.location, this.getComposeOptions()); return executeCommand(commandsByPlatform); } diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 5e0998ca..43d0671c 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -5,6 +5,13 @@ import { initAction } from "../../src/commands/general/init"; import { tmpdir } from "os"; import {mkdtempSync} from "fs"; import {join} from "path"; +import fs from "fs"; +import * as dotenv from "dotenv"; + + +vi.mock("fs"); +vi.mock("dotenv"); + const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false }; @@ -18,9 +25,7 @@ describe("init action", () => { let simServCheckVersionRequirements: ReturnType; let simServResetDockerContainers: ReturnType; let simServResetDockerImages: ReturnType; - let simServDownloadSimulator: ReturnType; let simServgetAiProvidersOptions: ReturnType; - let simServConfigSimulator: ReturnType; let simServRunSimulator: ReturnType; let simServWaitForSimulator: ReturnType; let simServPullOllamaModel: ReturnType; @@ -28,6 +33,7 @@ describe("init action", () => { let simServCreateRandomValidators: ReturnType; let simServOpenFrontend: ReturnType; let simGetSimulatorUrl: ReturnType; + let simAddConfigToEnvFile: ReturnType; beforeEach(() => { vi.clearAllMocks(); @@ -40,8 +46,6 @@ describe("init action", () => { simServCheckVersionRequirements = vi.spyOn(simulatorService, "checkVersionRequirements"); simServResetDockerContainers = vi.spyOn(simulatorService, "resetDockerContainers"); simServResetDockerImages = vi.spyOn(simulatorService, "resetDockerImages"); - simServDownloadSimulator = vi.spyOn(simulatorService, "downloadSimulator"); - simServConfigSimulator = vi.spyOn(simulatorService, "configSimulator"); simServgetAiProvidersOptions = vi.spyOn(simulatorService, "getAiProvidersOptions"); simServRunSimulator = vi.spyOn(simulatorService, "runSimulator"); simServWaitForSimulator = vi.spyOn(simulatorService, "waitForSimulatorToBeReady"); @@ -50,6 +54,7 @@ describe("init action", () => { simServCreateRandomValidators = vi.spyOn(simulatorService, "createRandomValidators"); simServOpenFrontend = vi.spyOn(simulatorService, "openFrontend"); simGetSimulatorUrl = vi.spyOn(simulatorService, "getFrontendUrl") + simAddConfigToEnvFile = vi.spyOn(simulatorService, "addConfigToEnvFile") simServCheckVersionRequirements.mockResolvedValue({ node: '', @@ -59,22 +64,17 @@ describe("init action", () => { git: true, docker: true, }) + simAddConfigToEnvFile.mockResolvedValue(true); + const mockEnvContent = "FRONTEND_PORT=8080"; + const mockEnvConfig = { FRONTEND_PORT: "8080" }; + vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); + vi.mocked(dotenv.parse).mockReturnValue(mockEnvConfig); }); afterEach(() => { vi.restoreAllMocks(); }); - test("if both requirements are missing, then the execution fails", async () => { - simServCheckInstallRequirements.mockResolvedValue({ git: false, docker: false }); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith( - "Git and Docker are not installed. Please install them and try again.\n" - ); - }); - test("if only docker is missing, then the execution fails", async () => { simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: false }); @@ -83,14 +83,6 @@ describe("init action", () => { expect(error).toHaveBeenCalledWith("Docker is not installed. Please install Docker and try again.\n"); }); - test("if only git is missing, then the execution fails", async () => { - simServCheckInstallRequirements.mockResolvedValue({ git: false, docker: true }); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith("Git is not installed. Please install Git and try again.\n"); - }); - test("if check install requirements fail, then the execution aborts", async () => { simServCheckInstallRequirements.mockRejectedValue(new Error("Error")); @@ -169,7 +161,6 @@ describe("init action", () => { { name: "OpenAI", value: "openai" }, { name: "Heurist", value: "heuristai" }, ]); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServPullOllamaModel.mockResolvedValue(true); @@ -200,7 +191,6 @@ describe("init action", () => { { name: "OpenAI", value: "openai" }, { name: "Heurist", value: "heuristai" }, ]); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServPullOllamaModel.mockResolvedValue(true); @@ -230,7 +220,6 @@ describe("init action", () => { { name: "OpenAI", value: "openai" }, { name: "Heurist", value: "heuristai" }, ]); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServPullOllamaModel.mockResolvedValue(true); @@ -248,18 +237,6 @@ describe("init action", () => { expect(error).toHaveBeenCalledWith('Unable to initialize the validators.'); }); - - test("if configSimulator fails, then the execution aborts", async () => { - inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] }); - simServConfigSimulator.mockRejectedValue(new Error("Error")); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(new Error("Error")); - }); - test("if runSimulator fails, then the execution aborts", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] }); simServRunSimulator.mockRejectedValue(new Error("Error")); @@ -285,7 +262,7 @@ describe("init action", () => { { name: "Heurist", value: "heuristai" }, { name: "Ollama", value: "ollama" }, ]); - simServConfigSimulator.mockResolvedValue(true); + simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServPullOllamaModel.mockResolvedValue(true); @@ -308,20 +285,6 @@ describe("init action", () => { expect(error).toHaveBeenCalledWith(errorMsg); }); - test("logs 'Aborted!' if confirmDownload is false", async () => { - inquirerPrompt - .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ confirmDownload: false }); - - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - - await initAction(defaultActionOptions, simulatorService); - - expect(log).toHaveBeenCalledWith("Aborted!"); - }); - test("logs error if resetDockerContainers throws", async () => { inquirerPrompt.mockResolvedValue({ confirmReset: true }); simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); @@ -334,9 +297,11 @@ describe("init action", () => { }); test("prompts for LLM providers and validates that at least one is selected", async () => { + const mockEnvContent = "FRONTEND_PORT=8080"; + vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); + inquirerPrompt .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ confirmDownload: true }) .mockImplementation((questions: any) => { if (questions[0].type === "checkbox") { const validateFunction = questions[0].validate; @@ -353,11 +318,9 @@ describe("init action", () => { } }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServCheckInstallRequirements.mockResolvedValue({ docker: true }); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServDeleteAllValidators.mockResolvedValue(true); @@ -367,31 +330,16 @@ describe("init action", () => { await initAction(defaultActionOptions, simulatorService); }); - test("logs error if downloadSimulator throws", async () => { - inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - const errorMsg = new Error("downloadSimulator error"); - simServDownloadSimulator.mockRejectedValueOnce(errorMsg); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(errorMsg); - }); test("logs error message if simulator fails to initialize with ERROR code", async () => { inquirerPrompt .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ confirmDownload: true }) .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) .mockResolvedValueOnce({ openai: "API_KEY1" }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServCheckInstallRequirements.mockResolvedValue({ docker: true }); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ @@ -416,8 +364,6 @@ describe("init action", () => { simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); - simServConfigSimulator.mockResolvedValue(true); const errorMsg = new Error("runSimulator error"); simServRunSimulator.mockRejectedValueOnce(errorMsg); @@ -436,8 +382,6 @@ describe("init action", () => { simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: false, @@ -455,15 +399,12 @@ describe("init action", () => { test("catches and logs error if waitForSimulatorToBeReady throws an exception", async () => { inquirerPrompt .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ confirmDownload: true }) .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) .mockResolvedValueOnce({ openai: "API_KEY1" }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServCheckInstallRequirements.mockResolvedValue({ docker: true }); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); const errorMsg = new Error("Unexpected simulator error"); @@ -475,17 +416,17 @@ describe("init action", () => { }); test("catches and logs error if openFrontend throws an exception", async () => { + const mockEnvContent = "FRONTEND_PORT=8080"; + vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); + inquirerPrompt .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ confirmDownload: true }) .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) .mockResolvedValueOnce({ openai: "API_KEY1" }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); + simServCheckInstallRequirements.mockResolvedValue({ docker: true }); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - simServDownloadSimulator.mockResolvedValue({ wasInstalled: false }); - simServConfigSimulator.mockResolvedValue(true); simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); simServDeleteAllValidators.mockResolvedValue(true); diff --git a/tests/actions/start.test.ts b/tests/actions/start.test.ts index d379952d..b3a14b98 100644 --- a/tests/actions/start.test.ts +++ b/tests/actions/start.test.ts @@ -12,8 +12,6 @@ describe("startAction - Additional Tests", () => { const defaultOptions: StartActionOptions = { resetValidators: false, numValidators: 5, - branch: "main", - location: '', headless: false, resetDb: false }; @@ -49,13 +47,10 @@ describe("startAction - Additional Tests", () => { test("runs successfully with default options and keeps existing validators", async () => { await startAction(defaultOptions, simulatorService); - expect(simulatorService.updateSimulator).toHaveBeenCalledWith("main"); expect(simulatorService.runSimulator).toHaveBeenCalled(); expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled(); expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators"); - expect(logSpy).toHaveBeenCalledWith("Updating GenLayer Simulator..."); - expect(logSpy).toHaveBeenCalledWith("Running the GenLayer Simulator..."); expect(logSpy).toHaveBeenCalledWith("Simulator is running!"); expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! Go to http://localhost:8080 in your browser to access it."); @@ -65,26 +60,15 @@ describe("startAction - Additional Tests", () => { test("runs successfully with custom options and keeps existing validators", async () => { await startAction({...defaultOptions, headless: true, resetDb: true}, simulatorService); - expect(simulatorService.updateSimulator).toHaveBeenCalledWith("main"); expect(simulatorService.runSimulator).toHaveBeenCalled(); expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled(); expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators"); - expect(logSpy).toHaveBeenCalledWith("Updating GenLayer Simulator..."); - expect(logSpy).toHaveBeenCalledWith("Running the GenLayer Simulator..."); + expect(logSpy).toHaveBeenCalledWith("Simulator is running!"); expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! "); }); - test("logs error and stops if updateSimulator fails", async () => { - const errorMsg = new Error("updateSimulator error"); - (simulatorService.updateSimulator as Mock).mockRejectedValueOnce(errorMsg); - - await startAction(defaultOptions, simulatorService); - - expect(errorSpy).toHaveBeenCalledWith(errorMsg); - expect(simulatorService.runSimulator).not.toHaveBeenCalled(); - }); test("logs error and stops if runSimulator fails", async () => { const errorMsg = new Error("runSimulator error"); diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index c7b9d568..70a2e1bd 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -7,8 +7,6 @@ import simulatorService from '../../src/lib/services/simulator' const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); const defaultOptions = { numValidators: "5", - branch: "main", - location: process.cwd(), headless: false, resetDb: false } @@ -52,21 +50,6 @@ describe("init command", () => { expect(numValidatorsOption?.defaultValue).toBe("5"); }); - test("option --branch is accepted", async () => { - expect(() => program.parse(["node", "test", "init", "--branch", "example"])).not.toThrow(); - }); - - test("option --branch default value is main", async () => { - const branchOption = getCommandOption(initCommand, "--branch"); - expect(branchOption?.defaultValue).toBe("main"); - }); - - test("option --location default value is user's current directory", async () => { - // Given // When - const locationOption = getCommandOption(initCommand, "--location"); - expect(locationOption?.defaultValue).toBe(process.cwd()); - }); - test("random option is not accepted", async () => { initCommand?.exitOverride(); diff --git a/tests/commands/up.test.ts b/tests/commands/up.test.ts index c63a747c..ca8f3bde 100644 --- a/tests/commands/up.test.ts +++ b/tests/commands/up.test.ts @@ -10,8 +10,6 @@ const action = vi.fn(); const defaultOptions = { resetValidators: false, numValidators: "5", - branch: "main", - location: process.cwd(), headless: false , resetDb: false } @@ -58,14 +56,6 @@ describe("up command", () => { expect(numValidatorsOption?.defaultValue).toBe("5"); }); - test("option --branch is accepted", async () => { - expect(() => program.parse(["node", "test", "up", "--branch", "development"])).not.toThrow(); - }); - - test("option --branch default value is main", async () => { - const branchOption = getCommandOption(upCommand, "--branch"); - expect(branchOption?.defaultValue).toBe("main"); - }); test("unrecognized option is not accepted", async () => { upCommand?.exitOverride(); @@ -91,15 +81,13 @@ describe("up command", () => { "--reset-validators", "--numValidators", "10", - "--branch", - "development", "--headless", "true", "--reset-db", "true" ]); expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true, branch: 'development', numValidators: '10', resetValidators: true, resetDb: true}); + expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true, numValidators: '10', resetValidators: true, resetDb: true}); expect(openFrontendSpy).not.toHaveBeenCalled(); }); }); diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 4352ca38..d47b6c15 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -12,8 +12,6 @@ import { import { DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, VERSION_REQUIREMENTS, -} from "../../src/lib/config/simulator"; -import { STARTING_TIMEOUT_ATTEMPTS, DEFAULT_RUN_SIMULATOR_COMMAND, } from "../../src/lib/config/simulator"; @@ -59,23 +57,14 @@ describe("SimulatorService - Basic Tests", () => { vi.mocked(path.join).mockImplementation((...args) => args.join("/")); }); - test("should return the correct simulator location path", () => { - const expectedPath = "/mock/home/genlayer-simulator"; - simulatorService.setSimulatorLocation("/mock/home/genlayer-simulator"); - const simulatorLocation = simulatorService.getSimulatorLocation(); - expect(simulatorLocation).toBe(expectedPath); - }); test("should read the correct frontend URL from .env config", () => { - const mockEnvFilePath = "/mock/home/genlayer-simulator/.env"; const mockEnvContent = "FRONTEND_PORT=8080"; const mockEnvConfig = { FRONTEND_PORT: "8080" }; vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); vi.mocked(dotenv.parse).mockReturnValue(mockEnvConfig); - simulatorService.setSimulatorLocation("/mock/home/genlayer-simulator"); const frontendUrl = simulatorService.getFrontendUrl(); expect(frontendUrl).toBe("http://localhost:8080"); - expect(fs.readFileSync).toHaveBeenCalledWith(mockEnvFilePath, "utf8"); }); test("should check version requirements and return missing versions", async () => { @@ -95,20 +84,6 @@ describe("SimulatorService - Basic Tests", () => { await expect(simulatorService.checkVersion("14.0.0", "node")).rejects.toThrow(); }); - test("should download simulator if not already installed", async () => { - const result = await simulatorService.downloadSimulator(); - expect(result.wasInstalled).toBe(false); - expect(executeCommand).toHaveBeenCalled(); - }); - - test("should skip download if simulator is already installed", async () => { - vi.mocked(executeCommand).mockRejectedValueOnce(new Error("Mocked command error")); - vi.spyOn(fs, "existsSync").mockReturnValue(true); - const result = await simulatorService.downloadSimulator(); - expect(result.wasInstalled).toBe(true); - expect(executeCommand).toHaveBeenCalled(); - expect(fs.existsSync).toHaveBeenCalled(); - }); test("should return initialized true when simulator responds with OK (result.status = OK)", async () => { vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: {status: 'OK'} }); @@ -150,7 +125,7 @@ describe("SimulatorService - Basic Tests", () => { stderr: "", }); const result = await simulatorService.runSimulator(); - const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND("/mock/home/genlayer-simulator", ''); + const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND(simulatorService.location, ''); expect(executeCommand).toHaveBeenCalledWith(expectedCommand); expect(result).toEqual({ stdout: "Simulator started", stderr: "" }); }); @@ -163,11 +138,57 @@ describe("SimulatorService - Basic Tests", () => { simulatorService.setComposeOptions(true) const commandOption = simulatorService.getComposeOptions(); const result = await simulatorService.runSimulator(); - const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND("/mock/home/genlayer-simulator", commandOption); + const expectedCommand = DEFAULT_RUN_SIMULATOR_COMMAND(simulatorService.location, commandOption); expect(executeCommand).toHaveBeenCalledWith(expectedCommand); expect(result).toEqual({ stdout: "Simulator started", stderr: "" }); }); + test("should create a backup of the .env file and add new config", () => { + const envFilePath = `/.env`; + const originalEnvContent = "KEY1=value1\nKEY2=value2"; + const parsedEnvConfig = { KEY1: "value1", KEY2: "value2" }; + const newConfig = { KEY3: "value3", KEY2: "newValue2" }; + + vi.mocked(fs.readFileSync).mockImplementation((filePath: any) => { + if (filePath === envFilePath) return originalEnvContent; + return ""; + }); + + vi.mocked(dotenv.parse).mockReturnValue(parsedEnvConfig); + const writeFileSyncMock = vi.mocked(fs.writeFileSync); + + simulatorService.addConfigToEnvFile(newConfig); + + const expectedUpdatedContent = `KEY1=value1\nKEY2=newValue2\nKEY3=value3`; + expect(writeFileSyncMock).toHaveBeenCalledWith(envFilePath, expectedUpdatedContent); + }); + + test("should handle empty .env file and add new config", () => { + const envFilePath = `/.env`; + const newConfig = { NEW_KEY: "newValue" }; + + vi.mocked(fs.readFileSync).mockReturnValue(""); + vi.mocked(dotenv.parse).mockReturnValue({}); + const writeFileSyncMock = vi.mocked(fs.writeFileSync); + + simulatorService.addConfigToEnvFile(newConfig); + + expect(writeFileSyncMock).toHaveBeenCalledWith(`${envFilePath}.bak`, ""); + const expectedUpdatedContent = `NEW_KEY=newValue`; + expect(writeFileSyncMock).toHaveBeenCalledWith(envFilePath, expectedUpdatedContent); + }); + + test("should throw error when .env file does not exist", () => { + vi.mocked(fs.readFileSync).mockImplementation(() => { + throw new Error("File not found"); + }); + + expect(() => simulatorService.addConfigToEnvFile({ KEY: "value" })).toThrow( + "File not found" + ); + }); + + test("should open the frontend URL and return true", async () => { vi.spyOn(simulatorService, "getFrontendUrl").mockReturnValue("http://localhost:8080"); const result = await simulatorService.openFrontend(); @@ -242,47 +263,14 @@ describe("SimulatorService - Basic Tests", () => { expect(result).toEqual({ initialized: false, errorCode: "ERROR", errorMessage: fetchError.message }); }); - test("should throw an error if executeCommand fails and simulator location does not exist", async () => { - const mockError = new Error("git clone failed"); - vi.mocked(executeCommand).mockRejectedValueOnce(mockError); - vi.mocked(fs.existsSync).mockReturnValue(false); - await expect(simulatorService.downloadSimulator()).rejects.toThrow("git clone failed"); - expect(executeCommand).toHaveBeenCalled(); - expect(fs.existsSync).toHaveBeenCalledWith("/mock/home/genlayer-simulator"); - }); - test("should call executeCommand if docker ps command fails", async () => { vi.mocked(checkCommand) .mockResolvedValueOnce(undefined) - const result = await simulatorService.checkInstallRequirements(); expect(result.docker).toBe(true); - expect(result.git).toBe(true); }); - test("should update envConfig with newConfig values", () => { - const envFilePath = path.join("/mock/home/genlayer-simulator", ".env"); - const originalEnvContent = "KEY1=value1\nKEY2=value2"; - const envConfig = { KEY1: "value1", KEY2: "value2" }; - const newConfig = { KEY2: "new_value2", KEY3: "value3" }; - vi.mocked(fs.readFileSync) - .mockReturnValueOnce(originalEnvContent) - .mockReturnValueOnce(originalEnvContent); - vi.mocked(dotenv.parse).mockReturnValue(envConfig); - const writeFileSyncSpy = vi.spyOn(fs, "writeFileSync"); - simulatorService["addConfigToEnvFile"](newConfig); - expect(envConfig).toEqual({ - KEY1: "value1", - KEY2: "new_value2", - KEY3: "value3", - }); - expect(writeFileSyncSpy).toHaveBeenCalledWith(`${envFilePath}.bak`, originalEnvContent); - expect(writeFileSyncSpy).toHaveBeenCalledWith( - envFilePath, - "KEY1=value1\nKEY2=new_value2\nKEY3=value3" - ); - }); test("should return providers without errors", () => { expect(simulatorService.getAiProvidersOptions(true)).toEqual(expect.any(Array)); @@ -314,8 +302,60 @@ describe("SimulatorService - Docker Tests", () => { mockPing = vi.mocked(Docker.prototype.ping); }); - test("should pull the Ollama model", async () => { - mockGetContainer.mockReturnValueOnce({exec: mockExec} as unknown as Docker.Container); + test("should handle errors during the execution of pullOllamaModel gracefully", async () => { + const mockExec = vi.fn(); + const mockStart = vi.fn(); + + mockExec.mockResolvedValue({ + start: mockStart, + }); + + const mockStream = { + on: vi.fn((event, callback) => { + if (event === "data") callback("Mock data chunk"); + if (event === "error") callback(new Error("Mock error during stream")); + }), + }; + + mockStart.mockResolvedValue(mockStream); + + mockGetContainer.mockReturnValueOnce({ + exec: mockExec, + } as unknown as Docker.Container); + + const result = await simulatorService.pullOllamaModel(); + + expect(result).toBe(false); + expect(mockGetContainer).toHaveBeenCalledWith("ollama"); + expect(mockExec).toHaveBeenCalledWith({ + Cmd: ["ollama", "pull", "llama3"], + AttachStdout: true, + AttachStderr: true, + }); + expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); + expect(mockStream.on).toHaveBeenCalledWith("error", expect.any(Function)); + }); + + test("should successfully execute pullOllamaModel and return true", async () => { + const mockExec = vi.fn(); + const mockStart = vi.fn(); + + mockExec.mockResolvedValue({ + start: mockStart, + }); + + const mockStream = { + on: vi.fn((event, callback) => { + if (event === "data") callback("Mock data chunk"); + if (event === "end") callback(); + }), + }; + + mockStart.mockResolvedValue(mockStream); + + mockGetContainer.mockReturnValueOnce({ + exec: mockExec, + } as unknown as Docker.Container); const result = await simulatorService.pullOllamaModel(); @@ -323,9 +363,15 @@ describe("SimulatorService - Docker Tests", () => { expect(mockGetContainer).toHaveBeenCalledWith("ollama"); expect(mockExec).toHaveBeenCalledWith({ Cmd: ["ollama", "pull", "llama3"], + AttachStdout: true, + AttachStderr: true, }); + expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); + expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); + expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); }); + test("should stop and remove Docker containers with the specified prefix", async () => { const mockContainers = [ { @@ -411,12 +457,12 @@ describe("SimulatorService - Docker Tests", () => { expect(executeCommand).toHaveBeenCalledTimes(1); }); - test("should throw an unexpected error when checking docker installation requirement", async () => { + test("should call execute command again to start docker service", async () => { vi.mocked(checkCommand) .mockResolvedValueOnce(undefined) .mockRejectedValue(undefined); - mockPing.mockRejectedValueOnce("Unexpected docker error"); - await expect(simulatorService.checkInstallRequirements()).rejects.toThrow("Unexpected docker error"); + mockPing.mockRejectedValueOnce(""); + await expect(simulatorService.checkInstallRequirements()).resolves.toStrictEqual({ docker: true }); }); test("should warn the user when an update is available", async () => { diff --git a/vitest.config.ts b/vitest.config.ts index 6f818b5c..72da1a8c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ globals: true, environment: 'jsdom', coverage: { - exclude: [...configDefaults.exclude, '*.js', 'tests/**/*.ts', 'src/types'], + exclude: [...configDefaults.exclude, '*.js', 'tests/**/*.ts', 'src/types', 'scripts'], } } }); \ No newline at end of file From 6168782af5c028d80c2376559d3f6e5aecef2c3b Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:07:41 -0300 Subject: [PATCH 35/67] feat: keygen create command (#147) * feat: keygen create command * feat: adding option overwrite --- package-lock.json | 100 ++++++++++++++++++- package.json | 1 + src/commands/general/index.ts | 7 +- src/commands/keygen/create.ts | 44 +++++++++ src/commands/keygen/index.ts | 21 ++++ src/index.ts | 4 +- src/lib/config/ConfigFileManager.ts | 51 ++++++++++ tests/actions/create.test.ts | 140 +++++++++++++++++++++++++++ tests/commands/keygen.test.ts | 77 +++++++++++++++ tests/index.test.ts | 4 + tests/libs/configFileManager.test.ts | 113 +++++++++++++++++++++ 11 files changed, 555 insertions(+), 7 deletions(-) create mode 100644 src/commands/keygen/create.ts create mode 100644 src/commands/keygen/index.ts create mode 100644 src/lib/config/ConfigFileManager.ts create mode 100644 tests/actions/create.test.ts create mode 100644 tests/commands/keygen.test.ts create mode 100644 tests/libs/configFileManager.test.ts diff --git a/package-lock.json b/package-lock.json index ac38081c..29b1e460 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "commander": "^12.0.0", "dockerode": "^4.0.2", "dotenv": "^16.4.5", + "ethers": "^6.13.4", "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", @@ -54,6 +55,12 @@ "node": ">=0.10.0" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "dev": true, @@ -544,6 +551,30 @@ "node": ">= 0.4" } }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -1496,6 +1527,12 @@ "dev": true, "license": "MIT" }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, "node_modules/agent-base": { "version": "7.1.1", "devOptional": true, @@ -3586,6 +3623,64 @@ "node": ">=0.10.0" } }, + "node_modules/ethers": { + "version": "6.13.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", + "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/execa": { "version": "5.1.1", "dev": true, @@ -7900,7 +7995,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, "node_modules/tweetnacl": { @@ -8053,7 +8150,6 @@ }, "node_modules/undici-types": { "version": "6.19.8", - "devOptional": true, "license": "MIT" }, "node_modules/unicorn-magic": { diff --git a/package.json b/package.json index 834a97d5..ccc03623 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "commander": "^12.0.0", "dockerode": "^4.0.2", "dotenv": "^16.4.5", + "ethers": "^6.13.4", "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 3b9f8333..72404a09 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -1,9 +1,8 @@ -import {Command} from "commander"; +import { Command } from "commander"; import simulatorService from "../../lib/services/simulator"; - -import {initAction, InitActionOptions} from "./init"; -import {startAction, StartActionOptions} from "./start"; +import { initAction, InitActionOptions } from "./init"; +import { startAction, StartActionOptions } from "./start"; export function initializeGeneralCommands(program: Command) { program diff --git a/src/commands/keygen/create.ts b/src/commands/keygen/create.ts new file mode 100644 index 00000000..b5150f23 --- /dev/null +++ b/src/commands/keygen/create.ts @@ -0,0 +1,44 @@ +import { writeFileSync, existsSync } from "fs"; +import { ethers } from "ethers"; +import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; + +export interface CreateKeypairOptions { + output: string; + overwrite: boolean; +} + +export class KeypairCreator { + private filePathManager: ConfigFileManager; + + constructor() { + this.filePathManager = new ConfigFileManager(); + } + + createKeypairAction(options: CreateKeypairOptions) { + try { + + const outputPath = this.filePathManager.getFilePath(options.output); + + if(existsSync(outputPath) && !options.overwrite) { + console.warn( + `The file at ${outputPath} already exists. Use the '--overwrite' option to replace it.` + ); + return; + } + + const wallet = ethers.Wallet.createRandom(); + const keypairData = { + address: wallet.address, + privateKey: wallet.privateKey, + }; + + writeFileSync(outputPath, JSON.stringify(keypairData, null, 2)); + + this.filePathManager.writeConfig('keyPairPath', outputPath); + console.log(`Keypair successfully created and saved to: ${outputPath}`); + } catch (error) { + console.error("Failed to generate keypair:", error); + process.exit(1); + } + } +} \ No newline at end of file diff --git a/src/commands/keygen/index.ts b/src/commands/keygen/index.ts new file mode 100644 index 00000000..95f21bfd --- /dev/null +++ b/src/commands/keygen/index.ts @@ -0,0 +1,21 @@ +import { Command } from "commander"; +import { CreateKeypairOptions, KeypairCreator } from "./create"; + +export function initializeKeygenCommands(program: Command) { + + const keygenCommand = program + .command("keygen") + .description("Manage keypair generation"); + + keygenCommand + .command("create") + .description("Generates a new keypair and saves it to a file") + .option("--output ", "Path to save the keypair", "./keypair.json") + .option("--overwrite", "Overwrite the existing file if it already exists", false) + .action((options: CreateKeypairOptions) => { + const keypairCreator = new KeypairCreator(); + keypairCreator.createKeypairAction(options); + }); + + return program; +} diff --git a/src/index.ts b/src/index.ts index bcc7dd1d..95e1110b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,11 +2,13 @@ import {program} from "commander"; import {version} from "../package.json"; import {CLI_DESCRIPTION} from "../src/lib/config/text"; -import {initializeGeneralCommands} from "../src/commands/general"; +import { initializeGeneralCommands } from "../src/commands/general"; +import { initializeKeygenCommands } from "../src/commands/keygen"; export function initializeCLI() { program.version(version).description(CLI_DESCRIPTION); initializeGeneralCommands(program); + initializeKeygenCommands(program); program.parse(process.argv); } diff --git a/src/lib/config/ConfigFileManager.ts b/src/lib/config/ConfigFileManager.ts new file mode 100644 index 00000000..7227275d --- /dev/null +++ b/src/lib/config/ConfigFileManager.ts @@ -0,0 +1,51 @@ +import path from "path"; +import os from "os"; +import fs from "fs"; + +export class ConfigFileManager { + private folderPath: string; + private configFilePath: string; + + constructor(baseFolder: string = ".genlayer/", configFileName: string = "genlayer-config.json") { + this.folderPath = path.resolve(os.homedir(), baseFolder); + this.configFilePath = path.resolve(this.folderPath, configFileName); + this.ensureFolderExists(); + this.ensureConfigFileExists(); + } + + private ensureFolderExists(): void { + if (!fs.existsSync(this.folderPath)) { + fs.mkdirSync(this.folderPath, { recursive: true }); + } + } + + private ensureConfigFileExists(): void { + if (!fs.existsSync(this.configFilePath)) { + fs.writeFileSync(this.configFilePath, JSON.stringify({}, null, 2)); + } + } + + getFolderPath(): string { + return this.folderPath; + } + + getFilePath(fileName: string): string { + return path.resolve(this.folderPath, fileName); + } + + getConfig(): Record { + const configContent = fs.readFileSync(this.configFilePath, "utf-8"); + return JSON.parse(configContent); + } + + getConfigByKey(key: string): any { + const config = this.getConfig(); + return config[key] !== undefined ? config[key] : null; + } + + writeConfig(key: string, value: any): void { + const config = this.getConfig(); + config[key] = value; + fs.writeFileSync(this.configFilePath, JSON.stringify(config, null, 2)); + } +} diff --git a/tests/actions/create.test.ts b/tests/actions/create.test.ts new file mode 100644 index 00000000..743129f8 --- /dev/null +++ b/tests/actions/create.test.ts @@ -0,0 +1,140 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import { KeypairCreator } from "../../src/commands/keygen/create"; +import { writeFileSync, existsSync } from "fs"; +import { ethers } from "ethers"; + +vi.mock("fs"); + +vi.mock("ethers", () => ({ + ethers: { + Wallet: { + createRandom: vi.fn(), + }, + }, +})); + +vi.mock("../../src/lib/config/ConfigFileManager", () => ({ + ConfigFileManager: vi.fn().mockImplementation(() => ({ + getFilePath: vi.fn((fileName) => `/mocked/path/${fileName}`), + writeConfig: vi.fn(), + })), +})); + +describe("KeypairCreator", () => { + let keypairCreator: KeypairCreator; + + const mockWallet: any = { + address: "0xMockedAddress", + privateKey: "0xMockedPrivateKey", + }; + keypairCreator = new KeypairCreator(); + + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(ethers.Wallet.createRandom).mockReturnValue(mockWallet); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("successfully creates and saves a keypair", () => { + const consoleLogSpy = vi.spyOn(console, "log"); + vi.mocked(existsSync).mockReturnValue(false); + const options = { output: "keypair.json", overwrite: false }; + + keypairCreator.createKeypairAction(options); + + expect(ethers.Wallet.createRandom).toHaveBeenCalledTimes(1); + + expect(keypairCreator["filePathManager"].getFilePath).toHaveBeenCalledWith("keypair.json"); + + expect(writeFileSync).toHaveBeenCalledWith( + "/mocked/path/keypair.json", + JSON.stringify( + { + address: mockWallet.address, + privateKey: mockWallet.privateKey, + }, + null, + 2 + ) + ); + + expect(keypairCreator["filePathManager"].writeConfig).toHaveBeenCalledWith( + "keyPairPath", + "/mocked/path/keypair.json" + ); + + expect(consoleLogSpy).toHaveBeenCalledWith( + "Keypair successfully created and saved to: /mocked/path/keypair.json" + ); + }); + + test("skips creation if file exists and overwrite is false", () => { + + + const consoleWarnSpy = vi.spyOn(console, "warn"); + vi.mocked(existsSync).mockReturnValue(true); + const options = { output: "keypair.json", overwrite: false }; + + keypairCreator.createKeypairAction(options); + + expect(ethers.Wallet.createRandom).not.toHaveBeenCalled(); + expect(writeFileSync).not.toHaveBeenCalled(); + expect(consoleWarnSpy).toHaveBeenCalledWith( + "The file at /mocked/path/keypair.json already exists. Use the '--overwrite' option to replace it." + ); + }); + + test("overwrites the file if overwrite is true", () => { + const consoleLogSpy = vi.spyOn(console, "log"); + vi.mocked(existsSync).mockReturnValue(true); // Simulate file exists + const options = { output: "keypair.json", overwrite: true }; + + keypairCreator.createKeypairAction(options); + + expect(ethers.Wallet.createRandom).toHaveBeenCalledTimes(1); + + expect(keypairCreator["filePathManager"].getFilePath).toHaveBeenCalledWith("keypair.json"); + + expect(writeFileSync).toHaveBeenCalledWith( + "/mocked/path/keypair.json", + JSON.stringify( + { + address: mockWallet.address, + privateKey: mockWallet.privateKey, + }, + null, + 2 + ) + ); + + expect(keypairCreator["filePathManager"].writeConfig).toHaveBeenCalledWith( + "keyPairPath", + "/mocked/path/keypair.json" + ); + + expect(consoleLogSpy).toHaveBeenCalledWith( + "Keypair successfully created and saved to: /mocked/path/keypair.json" + ); + }); + + test("handles errors during keypair creation", () => { + const consoleErrorSpy = vi.spyOn(console, "error"); + const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { + throw new Error("process.exit"); + }); + + vi.mocked(writeFileSync).mockImplementation(() => { + throw new Error("Mocked write error"); + }); + + expect(() => { + keypairCreator.createKeypairAction({ output: "keypair.json", overwrite: true }); + }).toThrowError("process.exit"); + + expect(consoleErrorSpy).toHaveBeenCalledWith("Failed to generate keypair:", expect.any(Error)); + expect(processExitSpy).toHaveBeenCalledWith(1); + }); +}); diff --git a/tests/commands/keygen.test.ts b/tests/commands/keygen.test.ts new file mode 100644 index 00000000..bde597bd --- /dev/null +++ b/tests/commands/keygen.test.ts @@ -0,0 +1,77 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeKeygenCommands } from "../../src/commands/keygen"; +import { KeypairCreator } from "../../src/commands/keygen/create"; + +vi.mock("../../src/commands/keygen/create"); + +describe("keygen create command", () => { + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeKeygenCommands(program); + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("keypairCreator.createKeypairAction is called with default options", async () => { + program.parse(["node", "test", "keygen", "create"]); + expect(KeypairCreator).toHaveBeenCalledTimes(1); + expect(KeypairCreator.prototype.createKeypairAction).toHaveBeenCalledWith({ + output: "./keypair.json", + overwrite: false, + }); + }); + + test("keypairCreator.createKeypairAction is called with custom output option", async () => { + program.parse(["node", "test", "keygen", "create", "--output", "./custom.json"]); + expect(KeypairCreator).toHaveBeenCalledTimes(1); + expect(KeypairCreator.prototype.createKeypairAction).toHaveBeenCalledWith({ + output: "./custom.json", + overwrite: false, + }); + }); + + test("keypairCreator.createKeypairAction is called with overwrite enabled", async () => { + program.parse(["node", "test", "keygen", "create", "--overwrite"]); + expect(KeypairCreator).toHaveBeenCalledTimes(1); + expect(KeypairCreator.prototype.createKeypairAction).toHaveBeenCalledWith({ + output: "./keypair.json", + overwrite: true, + }); + }); + + test("keypairCreator.createKeypairAction is called with custom output and overwrite enabled", async () => { + program.parse(["node", "test", "keygen", "create", "--output", "./custom.json", "--overwrite"]); + expect(KeypairCreator).toHaveBeenCalledTimes(1); + expect(KeypairCreator.prototype.createKeypairAction).toHaveBeenCalledWith({ + output: "./custom.json", + overwrite: true, + }); + }); + + test("KeypairCreator is instantiated when the command is executed", async () => { + program.parse(["node", "test", "keygen", "create"]); + expect(KeypairCreator).toHaveBeenCalledTimes(1); + }); + + test("throws error for unrecognized options", async () => { + const keygenCommand = program.commands.find((cmd) => cmd.name() === "keygen"); + const createCommand = keygenCommand?.commands.find((cmd) => cmd.name() === "create"); + + createCommand?.exitOverride(); + expect(() => program.parse(["node", "test", "keygen", "create", "--unknown"])).toThrowError( + "error: unknown option '--unknown'" + ); + }); + + test("keypairCreator.createKeypairAction is called without throwing errors for default options", async () => { + program.parse(["node", "test", "keygen", "create"]); + vi.mocked(KeypairCreator.prototype.createKeypairAction).mockReturnValue(); + expect(() => program.parse(["node", "test", "keygen", "create"])).not.toThrow(); + }); +}); diff --git a/tests/index.test.ts b/tests/index.test.ts index 9451c88e..b0ffc993 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -13,6 +13,10 @@ vi.mock("../src/commands/general", () => ({ initializeGeneralCommands: vi.fn(), })); +vi.mock("../src/commands/keygen", () => ({ + initializeKeygenCommands: vi.fn(), +})); + describe("CLI", () => { it("should initialize CLI", () => { diff --git a/tests/libs/configFileManager.test.ts b/tests/libs/configFileManager.test.ts new file mode 100644 index 00000000..d49f39b2 --- /dev/null +++ b/tests/libs/configFileManager.test.ts @@ -0,0 +1,113 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import { ConfigFileManager } from "../../src/lib/config/ConfigFileManager"; +import fs from "fs"; +import os from "os"; +import path from "path"; + +vi.mock("fs"); + +vi.mock("os") + +describe("ConfigFileManager", () => { + const mockFolderPath = "/mocked/home/.genlayer"; + const mockConfigFilePath = `${mockFolderPath}/genlayer-config.json`; + + let configFileManager: ConfigFileManager; + + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(os.homedir).mockReturnValue("/mocked/home"); + configFileManager = new ConfigFileManager(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("ensures folder and config file are created if they don't exist", () => { + vi.mocked(fs.existsSync).mockReturnValue(false); + + new ConfigFileManager(); + + expect(fs.existsSync).toHaveBeenCalledWith(mockFolderPath); + expect(fs.mkdirSync).toHaveBeenCalledWith(mockFolderPath, { recursive: true }); + + expect(fs.existsSync).toHaveBeenCalledWith(mockConfigFilePath); + expect(fs.writeFileSync).toHaveBeenCalledWith(mockConfigFilePath, JSON.stringify({}, null, 2)); + }); + + test("does not recreate folder or config file if they exist", () => { + vi.clearAllMocks(); + vi.mocked(fs.existsSync).mockReturnValue(true); + + new ConfigFileManager(); + + expect(fs.mkdirSync).not.toHaveBeenCalled(); + expect(fs.writeFileSync).not.toHaveBeenCalled(); + }); + + test("getFolderPath returns the correct folder path", () => { + expect(configFileManager.getFolderPath()).toBe(mockFolderPath); + }); + + test("getFilePath returns the correct file path for a given file name", () => { + const fileName = "example.json"; + const expectedFilePath = path.resolve(mockFolderPath, fileName); + + expect(configFileManager.getFilePath(fileName)).toBe(expectedFilePath); + }); + + test("getConfig returns the parsed content of the config file", () => { + const mockConfig = { key: "value" }; + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig)); + + const config = configFileManager.getConfig(); + + expect(fs.readFileSync).toHaveBeenCalledWith(mockConfigFilePath, "utf-8"); + expect(config).toEqual(mockConfig); + }); + + test("getConfigByKey returns the value for a given key", () => { + const mockConfig = { key: "value" }; + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig)); + + const value = configFileManager.getConfigByKey("key"); + + expect(value).toBe("value"); + }); + + test("getConfigByKey returns null for a non-existing key", () => { + const mockConfig = { key: "value" }; + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig)); + + const value = configFileManager.getConfigByKey("nonExistingKey"); + + expect(value).toBeNull(); + }); + + test("writeConfig updates the config file with a new key-value pair", () => { + const mockConfig = { existingKey: "existingValue" }; + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig)); + + configFileManager.writeConfig("newKey", "newValue"); + + const expectedConfig = { existingKey: "existingValue", newKey: "newValue" }; + expect(fs.writeFileSync).toHaveBeenCalledWith( + mockConfigFilePath, + JSON.stringify(expectedConfig, null, 2) + ); + }); + + test("writeConfig overwrites an existing key in the config file", () => { + const mockConfig = { existingKey: "existingValue" }; + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockConfig)); + + configFileManager.writeConfig("existingKey", "updatedValue"); + + const expectedConfig = { existingKey: "updatedValue" }; + expect(fs.writeFileSync).toHaveBeenCalledWith( + mockConfigFilePath, + JSON.stringify(expectedConfig, null, 2) + ); + }); +}); From 0ba2c91dd3cf21842c7fcc7071d53a98e4753447 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Dec 2024 15:08:29 +0000 Subject: [PATCH 36/67] Release v0.6.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c24d78b9..2dbeee14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.6.0 (2024-12-03) + + +### Features + +* keygen create command ([#147](https://github.com/yeagerai/genlayer-cli/issues/147)) ([6168782](https://github.com/yeagerai/genlayer-cli/commit/6168782af5c028d80c2376559d3f6e5aecef2c3b)) + ## 0.5.1-beta.0 (2024-12-03) diff --git a/package-lock.json b/package-lock.json index 29b1e460..d48b0844 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.5.1-beta.0", + "version": "0.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.5.1-beta.0", + "version": "0.6.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index ccc03623..8907cfc4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.5.1-beta.0", + "version": "0.6.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From a7bf41986e89e8db95003df290d381e77dad127f Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:37:53 -0300 Subject: [PATCH 37/67] feat: adding localnet version option on init (#151) --- .env.example | 1 + docker-compose.yml | 8 +++--- src/commands/general/index.ts | 1 + src/commands/general/init.ts | 7 +++++ src/lib/interfaces/ISimulatorService.ts | 1 + src/lib/services/simulator.ts | 17 +++++++++++++ tests/actions/init.test.ts | 5 ++-- tests/commands/init.test.ts | 10 +++++++- tests/services/simulator.test.ts | 34 +++++++++++++++++++++++++ 9 files changed, 77 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 045d3de7..78823ad4 100644 --- a/.env.example +++ b/.env.example @@ -69,3 +69,4 @@ VALIDATORS_CONFIG_JSON='' VSCODEDEBUG="false" +LOCALNETVERSION="latest" diff --git a/docker-compose.yml b/docker-compose.yml index c542fbe2..7eb0616f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.8" services: frontend: - image: yeagerai/simulator-frontend:latest + image: yeagerai/simulator-frontend:${LOCALNETVERSION:-latest} ports: - "${FRONTEND_PORT:-8080}:8080" environment: @@ -25,7 +25,7 @@ services: jsonrpc: - image: yeagerai/simulator-jsonrpc:latest + image: yeagerai/simulator-jsonrpc:${LOCALNETVERSION:-latest} environment: - FLASK_SERVER_PORT=${RPCPORT:-5000} - PYTHONUNBUFFERED=1 @@ -63,7 +63,7 @@ services: replicas: ${JSONRPC_REPLICAS:-1} webrequest: - image: yeagerai/simulator-webrequest:latest + image: yeagerai/simulator-webrequest:${LOCALNETVERSION:-latest} shm_size: 2gb environment: - FLASK_SERVER_PORT=${WEBREQUESTPORT:-5002} @@ -131,7 +131,7 @@ services: # - "./data/postgres:/var/lib/postgresql/data" database-migration: - image: yeagerai/simulator-database-migration:latest + image: yeagerai/simulator-database-migration:${LOCALNETVERSION:-latest} environment: - DB_URL=postgresql://${DBUSER:-postgres}:${DBPASSWORD:-postgres}@postgres/${DBNAME:-simulator_db} - WEBREQUESTPORT=${WEBREQUESTPORT:-5002} diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 72404a09..3509bd10 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -11,6 +11,7 @@ export function initializeGeneralCommands(program: Command) { .option("--numValidators ", "Number of validators", "5") .option("--headless", "Headless mode", false) .option("--reset-db", "Reset Database", false) + .option("--localnet-version ", "Select a specific localnet version", 'latest') .action((options: InitActionOptions) => initAction(options, simulatorService)); program diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 1cbff484..438904b4 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -6,6 +6,7 @@ export interface InitActionOptions { numValidators: number; headless: boolean; resetDb: boolean; + localnetVersion: string; } function getRequirementsErrorMessage({docker}: Record): string { @@ -34,6 +35,11 @@ function getVersionErrorMessage({docker, node}: Record): string export async function initAction(options: InitActionOptions, simulatorService: ISimulatorService) { simulatorService.setComposeOptions(options.headless); + let localnetVersion = options.localnetVersion; + + if(localnetVersion !== 'latest'){ + localnetVersion = simulatorService.normalizeLocalnetVersion(localnetVersion); + } await simulatorService.checkCliVersion(); // Check if requirements are installed @@ -139,6 +145,7 @@ export async function initAction(options: InitActionOptions, simulatorService: I console.log("Configuring GenLayer Simulator environment..."); simulatorService.addConfigToEnvFile(aiProvidersEnvVars); + simulatorService.addConfigToEnvFile({LOCALNETVERSION: localnetVersion}); // Run the GenLayer Simulator diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index 1aa83ea1..64509915 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -18,6 +18,7 @@ export interface ISimulatorService { checkCliVersion(): Promise; cleanDatabase(): Promise; addConfigToEnvFile(newConfig: Record): void; + normalizeLocalnetVersion(version: string): string; } diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 85aaf5cd..7cbb88d0 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -295,6 +295,23 @@ export class SimulatorService implements ISimulatorService { return true; } + public normalizeLocalnetVersion(version: string) { + + if (!version.startsWith('v')) { + version = 'v' + version; + } + + const versionRegex = /^v(\d+)\.(\d+)\.(\d+)(-.+)?$/; + const match = version.match(versionRegex); + + if (!match) { + console.error('Invalid version format. Expected format: v0.0.0 or v0.0.0-suffix'); + process.exit(1); + } + + return version + } + } export default new SimulatorService(); diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 43d0671c..156298fb 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -14,7 +14,7 @@ vi.mock("dotenv"); const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); -const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false }; +const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false, localnetVersion: 'latest' }; describe("init action", () => { let error: ReturnType; @@ -201,7 +201,7 @@ describe("init action", () => { simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - await initAction({...defaultActionOptions, headless: true, resetDb: true}, simulatorService); + await initAction({...defaultActionOptions, headless: true, resetDb: true, localnetVersion: "v1.0.0"}, simulatorService); expect(log).toHaveBeenCalledWith( `GenLayer simulator initialized successfully! ` @@ -441,4 +441,5 @@ describe("init action", () => { expect(error).toHaveBeenCalledWith(errorMsg); }); + }); \ No newline at end of file diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index 70a2e1bd..6f92d155 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -8,7 +8,8 @@ const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); const defaultOptions = { numValidators: "5", headless: false, - resetDb: false + resetDb: false, + localnetVersion: 'latest' } vi.mock("inquirer", () => ({ @@ -73,4 +74,11 @@ describe("init command", () => { expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true}); expect(openFrontendSpy).not.toHaveBeenCalled(); }); + + test("option --localnet-version is accepted", async () => { + program.parse(["node", "test", "init", "--localnet-version", "v1.0.0"]); + expect(action).toHaveBeenCalledTimes(1); + expect(action).toHaveBeenCalledWith({...defaultOptions, localnetVersion: "v1.0.0"}); + expect(openFrontendSpy).not.toHaveBeenCalled(); + }); }); diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index d47b6c15..4455383d 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -505,3 +505,37 @@ describe("SimulatorService - Docker Tests", () => { consoleWarnSpy.mockRestore(); }); }); + +describe('normalizeLocalnetVersion', () => { + test('should add "v" if not present', () => { + expect(simulatorService.normalizeLocalnetVersion("0.26.0")).toBe("v0.26.0"); + }); + + test('should preserve "v" if already present', () => { + expect(simulatorService.normalizeLocalnetVersion("v0.26.0")).toBe("v0.26.0"); + }); + + test('should retain suffixes like "-test000"', () => { + expect(simulatorService.normalizeLocalnetVersion("0.25.0-test000")).toBe("v0.25.0-test000"); + expect(simulatorService.normalizeLocalnetVersion("v1.0.0-alpha")).toBe("v1.0.0-alpha"); + }); + + test('should handle versions with numbers only', () => { + expect(simulatorService.normalizeLocalnetVersion("1.0.0")).toBe("v1.0.0"); + }); + + test('should throw an error and exit for invalid versions', () => { + const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => { return undefined as never}); + const mockConsoleError = vi.spyOn(console, 'error').mockImplementation(() => {}); + + simulatorService.normalizeLocalnetVersion("invalid-version"); + + expect(mockConsoleError).toHaveBeenCalledWith( + 'Invalid version format. Expected format: v0.0.0 or v0.0.0-suffix' + ); + expect(mockExit).toHaveBeenCalledWith(1); + + mockExit.mockRestore(); + mockConsoleError.mockRestore(); + }); +}); From eeaef38c77c0ec87a4c316cd6cbbe29a2a6b3075 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 9 Dec 2024 13:38:30 +0000 Subject: [PATCH 38/67] Release v0.7.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dbeee14..0d3206c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.7.0 (2024-12-09) + + +### Features + +* adding localnet version option on init ([#151](https://github.com/yeagerai/genlayer-cli/issues/151)) ([a7bf419](https://github.com/yeagerai/genlayer-cli/commit/a7bf41986e89e8db95003df290d381e77dad127f)) + ## 0.6.0 (2024-12-03) diff --git a/package-lock.json b/package-lock.json index d48b0844..dfd213d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.6.0", + "version": "0.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.6.0", + "version": "0.7.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 8907cfc4..3733efa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.6.0", + "version": "0.7.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From cc0f2caee2c55f00efc7da0671663827a69be557 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Wed, 11 Dec 2024 11:51:45 -0300 Subject: [PATCH 39/67] feat: implement config command (#149) * feat: keygen create command * feat: adding option overwrite * feat: new config command --- src/commands/config/getSetReset.ts | 44 +++++++++++++ src/commands/config/index.ts | 30 +++++++++ src/index.ts | 2 + tests/actions/create.test.ts | 2 +- tests/actions/getSetReset.test.ts | 101 +++++++++++++++++++++++++++++ tests/commands/config.test.ts | 54 +++++++++++++++ tests/index.test.ts | 4 ++ 7 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 src/commands/config/getSetReset.ts create mode 100644 src/commands/config/index.ts create mode 100644 tests/actions/getSetReset.test.ts create mode 100644 tests/commands/config.test.ts diff --git a/src/commands/config/getSetReset.ts b/src/commands/config/getSetReset.ts new file mode 100644 index 00000000..2aae7c00 --- /dev/null +++ b/src/commands/config/getSetReset.ts @@ -0,0 +1,44 @@ +import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; + +export class ConfigActions { + private configManager: ConfigFileManager; + + constructor() { + this.configManager = new ConfigFileManager(); + } + + set(keyValue: string): void { + const [key, value] = keyValue.split("="); + if (!key || value === undefined) { + console.error("Invalid format. Use key=value."); + process.exit(1); + } + this.configManager.writeConfig(key, value); + console.log(`Configuration updated: ${key}=${value}`); + } + + get(key?: string): void { + if (key) { + const value = this.configManager.getConfigByKey(key); + if (value === null) { + console.log(`No value set for key: ${key}`); + } else { + console.log(`${key}=${value}`); + } + } else { + const config = this.configManager.getConfig(); + console.log("Current configuration:", JSON.stringify(config, null, 2)); + } + } + + reset(key: string): void { + const config = this.configManager.getConfig(); + if (config[key] === undefined) { + console.log(`Key does not exist in the configuration: ${key}`); + return; + } + delete config[key]; + this.configManager.writeConfig(key, undefined); + console.log(`Configuration key reset: ${key}`); + } +} diff --git a/src/commands/config/index.ts b/src/commands/config/index.ts new file mode 100644 index 00000000..905cd53f --- /dev/null +++ b/src/commands/config/index.ts @@ -0,0 +1,30 @@ +import { Command } from "commander"; +import { ConfigActions } from "./getSetReset"; + +export function initializeConfigCommands(program: Command) { + const configActions = new ConfigActions(); + + const configCommand = program + .command("config") + .description("Manage CLI configuration, including the default network"); + + configCommand + .command("set") + .description("Set a configuration value") + .argument("", "Configuration key-value pair to set") + .action((keyValue: string) => configActions.set(keyValue)); + + configCommand + .command("get") + .description("Get the current configuration") + .argument("[key]", "Configuration key to retrieve") + .action((key?: string) => configActions.get(key)); + + configCommand + .command("reset") + .description("Reset a configuration value to its default") + .argument("", "Configuration key to reset") + .action((key: string) => configActions.reset(key)); + + return program; +} diff --git a/src/index.ts b/src/index.ts index 95e1110b..bd00623b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,11 +4,13 @@ import {version} from "../package.json"; import {CLI_DESCRIPTION} from "../src/lib/config/text"; import { initializeGeneralCommands } from "../src/commands/general"; import { initializeKeygenCommands } from "../src/commands/keygen"; +import { initializeConfigCommands } from "../src/commands/config"; export function initializeCLI() { program.version(version).description(CLI_DESCRIPTION); initializeGeneralCommands(program); initializeKeygenCommands(program); + initializeConfigCommands(program); program.parse(process.argv); } diff --git a/tests/actions/create.test.ts b/tests/actions/create.test.ts index 743129f8..7c61fef6 100644 --- a/tests/actions/create.test.ts +++ b/tests/actions/create.test.ts @@ -89,7 +89,7 @@ describe("KeypairCreator", () => { test("overwrites the file if overwrite is true", () => { const consoleLogSpy = vi.spyOn(console, "log"); - vi.mocked(existsSync).mockReturnValue(true); // Simulate file exists + vi.mocked(existsSync).mockReturnValue(true); const options = { output: "keypair.json", overwrite: true }; keypairCreator.createKeypairAction(options); diff --git a/tests/actions/getSetReset.test.ts b/tests/actions/getSetReset.test.ts new file mode 100644 index 00000000..a4bb9549 --- /dev/null +++ b/tests/actions/getSetReset.test.ts @@ -0,0 +1,101 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import { ConfigActions } from "../../src/commands/config/getSetReset"; +import { ConfigFileManager } from "../../src/lib/config/ConfigFileManager"; + +vi.mock("../../src/lib/config/ConfigFileManager"); + +describe("ConfigActions", () => { + let configActions: ConfigActions; + + beforeEach(() => { + configActions = new ConfigActions(); + vi.clearAllMocks(); + }); + + new ConfigFileManager(); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("set method writes key-value pair to the configuration", () => { + const consoleLogSpy = vi.spyOn(console, "log"); + + configActions.set("defaultNetwork=testnet"); + + expect(configActions["configManager"].writeConfig).toHaveBeenCalledWith("defaultNetwork", "testnet"); + expect(consoleLogSpy).toHaveBeenCalledWith("Configuration updated: defaultNetwork=testnet"); + }); + + test("set method throws error for invalid format", () => { + const consoleErrorSpy = vi.spyOn(console, "error"); + const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { + throw new Error("process.exit"); + }); + + expect(() => configActions.set("invalidFormat")).toThrowError("process.exit"); + + expect(consoleErrorSpy).toHaveBeenCalledWith("Invalid format. Use key=value."); + expect(processExitSpy).toHaveBeenCalledWith(1); + }); + + test("get method retrieves value for a specific key", () => { + vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue("testnet"); + + const consoleLogSpy = vi.spyOn(console, "log"); + + configActions.get("defaultNetwork"); + + expect(configActions["configManager"].getConfigByKey).toHaveBeenCalledWith("defaultNetwork"); + expect(consoleLogSpy).toHaveBeenCalledWith("defaultNetwork=testnet"); + }); + + test("get method prints message when key has no value", () => { + vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue(null); + + const consoleLogSpy = vi.spyOn(console, "log"); + + configActions.get("nonexistentKey"); + + expect(configActions["configManager"].getConfigByKey).toHaveBeenCalledWith("nonexistentKey"); + expect(consoleLogSpy).toHaveBeenCalledWith("No value set for key: nonexistentKey"); + }); + + test("get method retrieves the entire configuration when no key is provided", () => { + const mockConfig = { defaultNetwork: "testnet" }; + vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); + + const consoleLogSpy = vi.spyOn(console, "log"); + + configActions.get(); + + expect(configActions["configManager"].getConfig).toHaveBeenCalledTimes(1); + expect(consoleLogSpy).toHaveBeenCalledWith("Current configuration:", JSON.stringify(mockConfig, null, 2)); + }); + + test("reset method removes key from configuration", () => { + const mockConfig = { defaultNetwork: "testnet" }; + vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); + + const consoleLogSpy = vi.spyOn(console, "log"); + + configActions.reset("defaultNetwork"); + + expect(configActions["configManager"].getConfig).toHaveBeenCalledTimes(1); + expect(configActions["configManager"].writeConfig).toHaveBeenCalledWith("defaultNetwork", undefined); + expect(consoleLogSpy).toHaveBeenCalledWith("Configuration key reset: defaultNetwork"); + }); + + test("reset method prints message when key does not exist", () => { + const mockConfig = {}; + vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); + + const consoleLogSpy = vi.spyOn(console, "log"); + + configActions.reset("nonexistentKey"); + + expect(configActions["configManager"].getConfig).toHaveBeenCalledTimes(1); + expect(configActions["configManager"].writeConfig).not.toHaveBeenCalled(); + expect(consoleLogSpy).toHaveBeenCalledWith("Key does not exist in the configuration: nonexistentKey"); + }); +}); diff --git a/tests/commands/config.test.ts b/tests/commands/config.test.ts new file mode 100644 index 00000000..4052f967 --- /dev/null +++ b/tests/commands/config.test.ts @@ -0,0 +1,54 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeConfigCommands } from "../../src/commands/config"; +import { ConfigActions } from "../../src/commands/config/getSetReset"; + +vi.mock("../../src/commands/config/getSetReset"); + +describe("config commands", () => { + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeConfigCommands(program); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("ConfigActions.set is called with the correct key-value pair", async () => { + program.parse(["node", "test", "config", "set", "defaultNetwork=testnet"]); + expect(ConfigActions).toHaveBeenCalledTimes(1); + expect(ConfigActions.prototype.set).toHaveBeenCalledWith("defaultNetwork=testnet"); + }); + + test("ConfigActions.get is called with a specific key", async () => { + program.parse(["node", "test", "config", "get", "defaultNetwork"]); + expect(ConfigActions).toHaveBeenCalledTimes(1); + expect(ConfigActions.prototype.get).toHaveBeenCalledWith("defaultNetwork"); + }); + + test("ConfigActions.get is called without a key", async () => { + program.parse(["node", "test", "config", "get"]); + expect(ConfigActions).toHaveBeenCalledTimes(1); + expect(ConfigActions.prototype.get).toHaveBeenCalledWith(undefined); + }); + + test("ConfigActions.reset is called with the correct key", async () => { + program.parse(["node", "test", "config", "reset", "defaultNetwork"]); + expect(ConfigActions).toHaveBeenCalledTimes(1); + expect(ConfigActions.prototype.reset).toHaveBeenCalledWith("defaultNetwork"); + }); + + test("ConfigActions is instantiated when the command is executed", async () => { + program.parse(["node", "test", "config", "set", "defaultNetwork=testnet"]); + expect(ConfigActions).toHaveBeenCalledTimes(1); + }); + + test("ConfigActions.set is called without throwing errors for valid input", async () => { + program.parse(["node", "test", "config", "set", "defaultNetwork=testnet"]); + vi.mocked(ConfigActions.prototype.set).mockReturnValue(); + expect(() => program.parse(["node", "test", "config", "set", "defaultNetwork=testnet"])).not.toThrow(); + }); +}); diff --git a/tests/index.test.ts b/tests/index.test.ts index b0ffc993..12e03ec1 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -17,6 +17,10 @@ vi.mock("../src/commands/keygen", () => ({ initializeKeygenCommands: vi.fn(), })); +vi.mock("../src/commands/config", () => ({ + initializeConfigCommands: vi.fn(), +})); + describe("CLI", () => { it("should initialize CLI", () => { From 6bc8cf634e1d632e2353ef901f00f291733ae2b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 11 Dec 2024 14:52:41 +0000 Subject: [PATCH 40/67] Release v0.8.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d3206c3..627d4c20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.8.0 (2024-12-11) + + +### Features + +* implement config command ([#149](https://github.com/yeagerai/genlayer-cli/issues/149)) ([cc0f2ca](https://github.com/yeagerai/genlayer-cli/commit/cc0f2caee2c55f00efc7da0671663827a69be557)) + ## 0.7.0 (2024-12-09) diff --git a/package-lock.json b/package-lock.json index dfd213d6..8a815d1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.7.0", + "version": "0.8.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.7.0", + "version": "0.8.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3733efa3..3dbc15ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.7.0", + "version": "0.8.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 8744b2d3ef2b4d7fd4d3ac71ac6e8eef69ed1555 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 13 Dec 2024 10:47:10 -0300 Subject: [PATCH 41/67] feat: Add Deploy Command and Update Configurations for Compatibility (#153) * feat: new deploy command * fix: Genvm returning error when theres no args * fix: moving getPrivateKey * fix: moving getPrivateKey * fix: new folder to contracts commands * removing kwargs --- .env.example | 9 + docker-compose.yml | 7 + esbuild.config.dev | 2 +- esbuild.config.prod | 2 +- package-lock.json | 516 ++++++++++++++++++++---------- package.json | 2 + src/commands/contracts/deploy.ts | 69 ++++ src/commands/contracts/index.ts | 18 ++ src/commands/general/index.ts | 3 +- src/index.ts | 2 + src/lib/accounts/getPrivateKey.ts | 21 ++ tests/actions/deploy.test.ts | 137 ++++++++ tests/commands/deploy.test.ts | 69 ++++ tests/index.test.ts | 4 + tests/libs/getPrivateKey.test.ts | 96 ++++++ tsconfig.json | 2 +- 16 files changed, 780 insertions(+), 179 deletions(-) create mode 100644 src/commands/contracts/deploy.ts create mode 100644 src/commands/contracts/index.ts create mode 100644 src/lib/accounts/getPrivateKey.ts create mode 100644 tests/actions/deploy.test.ts create mode 100644 tests/commands/deploy.test.ts create mode 100644 tests/libs/getPrivateKey.test.ts diff --git a/.env.example b/.env.example index 78823ad4..37098a75 100644 --- a/.env.example +++ b/.env.example @@ -70,3 +70,12 @@ VALIDATORS_CONFIG_JSON='' VSCODEDEBUG="false" LOCALNETVERSION="latest" + +FRONTEND_BUILD_TARGET = 'final' # change to 'dev' to run in dev mode + +# Hardhat port +HARDHAT_URL = 'http://hardhat' +HARDHAT_PORT = '8545' +HARDHAT_PRIVATE_KEY = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' + +BACKEND_BUILD_TARGET = 'debug' diff --git a/docker-compose.yml b/docker-compose.yml index 7eb0616f..38f0a3a4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -142,3 +142,10 @@ services: condition: service_healthy webrequest: condition: service_healthy + + hardhat: + image: yeagerai/simulator-hardhat + ports: + - "${HARDHAT_PORT:-8545}:8545" + environment: + - HARDHAT_NETWORK=hardhat \ No newline at end of file diff --git a/esbuild.config.dev b/esbuild.config.dev index 68b63ad0..e1a76486 100644 --- a/esbuild.config.dev +++ b/esbuild.config.dev @@ -5,7 +5,7 @@ module.exports = { bundle: true, // Bundle all dependencies outfile: "dist/index.js", // Output file platform: "node", - target: "es6", + target: "es2020", define: { 'import.meta.url': '_importMetaUrl' }, banner: { js: "const _importMetaUrl=require('url').pathToFileURL(__filename)", diff --git a/esbuild.config.prod b/esbuild.config.prod index 876ceada..41a349d4 100644 --- a/esbuild.config.prod +++ b/esbuild.config.prod @@ -5,7 +5,7 @@ module.exports = { bundle: true, // Bundle all dependencies outfile: "dist/index.js", // Output file platform: "node", - target: "es6", + target: "es2020", define: { 'import.meta.url': '_importMetaUrl' }, banner: { js: "const _importMetaUrl=require('url').pathToFileURL(__filename)", diff --git a/package-lock.json b/package-lock.json index 8a815d1a..1cce28cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,11 +14,13 @@ "dockerode": "^4.0.2", "dotenv": "^16.4.5", "ethers": "^6.13.4", + "genlayer-js": "^0.4.7", "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", "update-check": "^1.5.4", "uuid": "^9.0.1", + "viem": "^2.21.54", "vitest": "^2.1.4" }, "bin": { @@ -49,7 +51,6 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -253,7 +254,6 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -267,7 +267,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", - "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -275,7 +274,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -297,7 +295,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -306,7 +303,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -317,7 +313,6 @@ }, "node_modules/@eslint/js": { "version": "8.57.1", - "dev": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -325,7 +320,6 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", - "dev": true, "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", @@ -338,7 +332,6 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -347,7 +340,6 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -358,7 +350,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -370,7 +361,6 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "dev": true, "license": "BSD-3-Clause" }, "node_modules/@hutson/parse-repository-url": { @@ -577,7 +567,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -589,7 +578,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -597,7 +585,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -948,9 +935,95 @@ }, "node_modules/@rtsao/scc": { "version": "1.1.0", - "dev": true, "license": "MIT" }, + "node_modules/@scure/base": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", + "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.0.tgz", + "integrity": "sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.7.0", + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.0.tgz", + "integrity": "sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.6.0", + "@scure/base": "~1.2.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sindresorhus/is": { "version": "5.6.0", "dev": true, @@ -1057,7 +1130,6 @@ }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, "license": "MIT" }, "node_modules/@types/node": { @@ -1315,7 +1387,6 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "dev": true, "license": "ISC" }, "node_modules/@vitest/coverage-v8": { @@ -1495,9 +1566,29 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/abitype": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.7.tgz", + "integrity": "sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/acorn": { "version": "8.11.3", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1508,7 +1599,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -1546,7 +1636,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1617,12 +1706,10 @@ }, "node_modules/argparse": { "version": "2.0.1", - "dev": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", @@ -1642,7 +1729,6 @@ }, "node_modules/array-includes": { "version": "3.1.8", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -1669,7 +1755,6 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.5", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -1688,7 +1773,6 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -1705,7 +1789,6 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -1741,7 +1824,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", - "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -1802,7 +1884,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -1816,7 +1897,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -2114,7 +2194,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -2267,7 +2346,6 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -2597,7 +2675,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2708,7 +2785,6 @@ }, "node_modules/data-view-buffer": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", @@ -2724,7 +2800,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -2740,7 +2815,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", @@ -2815,7 +2889,6 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, "license": "MIT" }, "node_modules/default-browser": { @@ -2887,7 +2960,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -2969,7 +3041,6 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -3058,7 +3129,6 @@ }, "node_modules/es-abstract": { "version": "1.23.3", - "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -3158,7 +3228,6 @@ }, "node_modules/es-object-atoms": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3169,7 +3238,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.3", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", @@ -3182,7 +3250,6 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -3190,7 +3257,6 @@ }, "node_modules/es-to-primitive": { "version": "1.2.1", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.1.4", @@ -3255,7 +3321,6 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -3286,7 +3351,6 @@ }, "node_modules/eslint": { "version": "8.57.1", - "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -3351,7 +3415,6 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", - "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", @@ -3361,7 +3424,6 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -3403,7 +3465,6 @@ }, "node_modules/eslint-module-utils": { "version": "2.12.0", - "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7" @@ -3419,7 +3480,6 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -3427,7 +3487,6 @@ }, "node_modules/eslint-plugin-import": { "version": "2.31.0", - "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", @@ -3459,7 +3518,6 @@ }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3468,7 +3526,6 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -3476,7 +3533,6 @@ }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -3487,7 +3543,6 @@ }, "node_modules/eslint-plugin-import/node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3498,7 +3553,6 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3506,7 +3560,6 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -3521,7 +3574,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3532,7 +3584,6 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3541,7 +3592,6 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3552,7 +3602,6 @@ }, "node_modules/espree": { "version": "9.6.1", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", @@ -3580,7 +3629,6 @@ }, "node_modules/esquery": { "version": "1.5.0", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -3591,7 +3639,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -3602,7 +3649,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3617,7 +3663,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -3681,6 +3726,12 @@ } } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/execa": { "version": "5.1.1", "dev": true, @@ -3724,7 +3775,6 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -3755,17 +3805,14 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -3817,7 +3864,6 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" @@ -3839,7 +3885,6 @@ }, "node_modules/find-up": { "version": "5.0.0", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -3854,7 +3899,6 @@ }, "node_modules/flat-cache": { "version": "3.2.0", - "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -3867,12 +3911,10 @@ }, "node_modules/flatted": { "version": "3.3.1", - "dev": true, "license": "ISC" }, "node_modules/for-each": { "version": "0.3.3", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.1.3" @@ -3957,7 +3999,6 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -3980,7 +4021,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.6", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -3997,12 +4037,22 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/genlayer-js": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/genlayer-js/-/genlayer-js-0.4.7.tgz", + "integrity": "sha512-vp+7spuVaX7vflZd2q7qmaYgi5Cf7S/h4lAoVhAkFdyAsDStvhtwCdJGcZDt+U77AWxo3I1mUMXz0sk9ER3JXQ==", + "license": "MIT", + "dependencies": { + "eslint-plugin-import": "^2.30.0", + "typescript-parsec": "^0.3.4", + "viem": "^2.21.7" + } + }, "node_modules/get-east-asian-width": { "version": "1.2.0", "dev": true, @@ -4044,7 +4094,6 @@ }, "node_modules/get-symbol-description": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", @@ -4141,7 +4190,6 @@ }, "node_modules/glob": { "version": "7.2.3", - "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -4160,7 +4208,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -4171,7 +4218,6 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -4180,7 +4226,6 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -4205,7 +4250,6 @@ }, "node_modules/globals": { "version": "13.24.0", - "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.20.2" @@ -4219,7 +4263,6 @@ }, "node_modules/globalthis": { "version": "1.0.3", - "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.1.3" @@ -4291,7 +4334,6 @@ }, "node_modules/graphemer": { "version": "1.4.0", - "dev": true, "license": "MIT" }, "node_modules/handlebars": { @@ -4316,7 +4358,6 @@ }, "node_modules/has-bigints": { "version": "1.0.2", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4361,7 +4402,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -4497,7 +4537,6 @@ }, "node_modules/ignore": { "version": "5.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -4505,7 +4544,6 @@ }, "node_modules/import-fresh": { "version": "3.3.0", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4528,7 +4566,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -4536,7 +4573,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -4591,7 +4627,6 @@ }, "node_modules/internal-slot": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4644,7 +4679,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.4", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -4664,7 +4698,6 @@ }, "node_modules/is-bigint": { "version": "1.0.4", - "dev": true, "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" @@ -4675,7 +4708,6 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -4709,7 +4741,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4731,7 +4762,6 @@ }, "node_modules/is-core-module": { "version": "2.15.1", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -4745,7 +4775,6 @@ }, "node_modules/is-data-view": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" @@ -4759,7 +4788,6 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -4786,7 +4814,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4801,7 +4828,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -4875,7 +4901,6 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4905,7 +4930,6 @@ }, "node_modules/is-number-object": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -4927,7 +4951,6 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4940,7 +4963,6 @@ }, "node_modules/is-regex": { "version": "1.1.4", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -4966,7 +4988,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7" @@ -4999,7 +5020,6 @@ }, "node_modules/is-string": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -5013,7 +5033,6 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" @@ -5038,7 +5057,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" @@ -5067,7 +5085,6 @@ }, "node_modules/is-weakref": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2" @@ -5091,14 +5108,27 @@ }, "node_modules/isarray": { "version": "2.0.5", - "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, "license": "ISC" }, + "node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/issue-parser": { "version": "7.0.0", "dev": true, @@ -5188,7 +5218,6 @@ }, "node_modules/js-yaml": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5274,7 +5303,6 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -5284,12 +5312,10 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { @@ -5299,7 +5325,6 @@ }, "node_modules/json5": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.0" @@ -5344,7 +5369,6 @@ }, "node_modules/keyv": { "version": "4.5.4", - "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -5366,7 +5390,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -5383,7 +5406,6 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -5421,7 +5443,6 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "dev": true, "license": "MIT" }, "node_modules/lodash.uniqby": { @@ -5660,7 +5681,6 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "dev": true, "license": "MIT" }, "node_modules/neo-async": { @@ -5780,7 +5800,6 @@ }, "node_modules/object-inspect": { "version": "1.13.1", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5788,7 +5807,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5796,7 +5814,6 @@ }, "node_modules/object.assign": { "version": "4.1.5", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", @@ -5813,7 +5830,6 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -5830,7 +5846,6 @@ }, "node_modules/object.groupby": { "version": "1.0.3", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -5843,7 +5858,6 @@ }, "node_modules/object.values": { "version": "1.2.0", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -5895,7 +5909,6 @@ }, "node_modules/optionator": { "version": "0.9.3", - "dev": true, "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", @@ -5952,6 +5965,74 @@ "node": ">=0.10.0" } }, + "node_modules/ox": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz", + "integrity": "sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/p-cancelable": { "version": "3.0.0", "dev": true, @@ -5962,7 +6043,6 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -5976,7 +6056,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -6066,7 +6145,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -6121,7 +6199,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6129,7 +6206,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6137,7 +6213,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6145,7 +6220,6 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -6204,7 +6278,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6238,7 +6311,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -6330,7 +6402,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -6352,7 +6423,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "dev": true, "funding": [ { "type": "github", @@ -6604,7 +6674,6 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", @@ -7123,7 +7192,6 @@ }, "node_modules/resolve": { "version": "1.22.8", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -7144,7 +7212,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -7193,7 +7260,6 @@ }, "node_modules/reusify": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -7202,7 +7268,6 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -7273,7 +7338,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "dev": true, "funding": [ { "type": "github", @@ -7302,7 +7366,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -7337,7 +7400,6 @@ }, "node_modules/safe-regex-test": { "version": "1.0.3", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", @@ -7411,7 +7473,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -7425,7 +7486,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -7436,7 +7496,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7460,7 +7519,6 @@ }, "node_modules/side-channel": { "version": "1.0.6", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -7665,7 +7723,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.9", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -7682,7 +7739,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.8", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -7695,7 +7751,6 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -7733,7 +7788,6 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -7749,7 +7803,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7770,7 +7823,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7833,7 +7885,6 @@ }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, "license": "MIT" }, "node_modules/through": { @@ -7985,7 +8036,6 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", - "dev": true, "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", @@ -8008,7 +8058,6 @@ }, "node_modules/type-check": { "version": "0.4.0", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -8019,7 +8068,6 @@ }, "node_modules/type-fest": { "version": "0.20.2", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -8030,7 +8078,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -8043,7 +8090,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -8061,7 +8107,6 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -8080,7 +8125,6 @@ }, "node_modules/typed-array-length": { "version": "1.0.6", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -8112,7 +8156,7 @@ }, "node_modules/typescript": { "version": "5.4.5", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -8122,6 +8166,12 @@ "node": ">=14.17" } }, + "node_modules/typescript-parsec": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/typescript-parsec/-/typescript-parsec-0.3.4.tgz", + "integrity": "sha512-6RD4xOxp26BTZLopNbqT2iErqNhQZZWb5m5F07/UwGhldGvOAKOl41pZ3fxsFp04bNL+PbgMjNfb6IvJAC/uYQ==", + "license": "MIT" + }, "node_modules/uglify-js": { "version": "3.17.4", "dev": true, @@ -8136,7 +8186,6 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -8260,7 +8309,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -8303,6 +8351,76 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/viem": { + "version": "2.21.54", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.54.tgz", + "integrity": "sha512-G9mmtbua3UtnVY9BqAtWdNp+3AO+oWhD0B9KaEsZb6gcrOWgmA4rz02yqEMg+qW9m6KgKGie7q3zcHqJIw6AqA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.7.0", + "@noble/hashes": "1.6.1", + "@scure/bip32": "1.6.0", + "@scure/bip39": "1.5.0", + "abitype": "1.0.7", + "isows": "1.0.6", + "ox": "0.1.2", + "webauthn-p256": "0.0.10", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/vite": { "version": "5.4.10", "license": "MIT", @@ -8518,6 +8636,61 @@ "node": ">= 8" } }, + "node_modules/webauthn-p256": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", + "integrity": "sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/webauthn-p256/node_modules/@noble/curves": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/webauthn-p256/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/webauthn-p256/node_modules/@noble/hashes": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "license": "BSD-2-Clause" @@ -8562,7 +8735,6 @@ }, "node_modules/which": { "version": "2.0.2", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -8576,7 +8748,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", @@ -8591,7 +8762,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.15", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -8740,7 +8910,6 @@ }, "node_modules/ws": { "version": "8.18.0", - "devOptional": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -8805,7 +8974,6 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index 3dbc15ee..740d42b6 100644 --- a/package.json +++ b/package.json @@ -60,11 +60,13 @@ "dockerode": "^4.0.2", "dotenv": "^16.4.5", "ethers": "^6.13.4", + "genlayer-js": "^0.4.7", "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", "update-check": "^1.5.4", "uuid": "^9.0.1", + "viem": "^2.21.54", "vitest": "^2.1.4" } } diff --git a/src/commands/contracts/deploy.ts b/src/commands/contracts/deploy.ts new file mode 100644 index 00000000..bb2f7eee --- /dev/null +++ b/src/commands/contracts/deploy.ts @@ -0,0 +1,69 @@ +import fs from "fs"; +import { createClient, createAccount } from "genlayer-js"; +import { simulator } from "genlayer-js/chains"; +import type { GenLayerClient } from "genlayer-js/types"; +import { getPrivateKey } from "../../lib/accounts/getPrivateKey"; + +export interface DeployOptions { + contract?: string; + // network: string; + args?: any[]; + kwargs?: string; +} + +export class DeployAction { + private genlayerClient: GenLayerClient; + + constructor() { + this.genlayerClient = createClient({ + chain: simulator, + endpoint: process.env.VITE_JSON_RPC_SERVER_URL, + account: createAccount(getPrivateKey() as any), + }); + } + + private readContractCode(contractPath: string): string { + if (!fs.existsSync(contractPath)) { + throw new Error(`Contract file not found: ${contractPath}`); + } + return fs.readFileSync(contractPath, "utf-8"); + } + + async deploy(options: DeployOptions): Promise { + + const argsUsed = options.args && options.args.length > 0; + const kwargsUsed = options.kwargs && options.kwargs.trim() !== ""; + + if (argsUsed && kwargsUsed) { + throw new Error("Invalid usage: Please specify either `args` or `kwargs`, but not both."); + } + + if (!options.contract) { + console.error("No contract specified for deployment."); + return; + } + + const contractCode = this.readContractCode(options.contract); + + if (!contractCode) { + console.error("Contract code is empty."); + return; + } + + const leaderOnly = false; + let deployParams: any = { code: contractCode, args: options.args, leaderOnly }; + + console.log("Starting contract deployment..."); + console.log("Deployment Parameters:", deployParams); + + try { + const result = await this.genlayerClient.deployContract(deployParams); + + console.log("Contract deployed successfully."); + console.log("Transaction Hash:", result); + } catch (error) { + console.error("Error deploying contract:", error); + throw new Error("Contract deployment failed."); + } + } +} diff --git a/src/commands/contracts/index.ts b/src/commands/contracts/index.ts new file mode 100644 index 00000000..1d1001f5 --- /dev/null +++ b/src/commands/contracts/index.ts @@ -0,0 +1,18 @@ +import { Command } from "commander"; +import { DeployAction, DeployOptions } from "../contracts/deploy"; + +export function initializeContractsCommands(program: Command) { + + program + .command("deploy") + .description("Deploy intelligent contracts") + .option("--contract ", "Path to the smart contract to deploy") + // .option("--network ", "Specify the network (e.g., testnet)", "localnet") + .option("--args ", "Positional arguments for the contract (space-separated, use quotes for multi-word arguments)", []) + .action(async (options: DeployOptions) => { + const deployer = new DeployAction(); + await deployer.deploy(options); + }); + + return program; +} diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 3509bd10..d97318a4 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -1,5 +1,4 @@ import { Command } from "commander"; - import simulatorService from "../../lib/services/simulator"; import { initAction, InitActionOptions } from "./init"; import { startAction, StartActionOptions } from "./start"; @@ -11,7 +10,7 @@ export function initializeGeneralCommands(program: Command) { .option("--numValidators ", "Number of validators", "5") .option("--headless", "Headless mode", false) .option("--reset-db", "Reset Database", false) - .option("--localnet-version ", "Select a specific localnet version", 'latest') + .option("--localnet-version ", "Select a specific localnet version", "latest") .action((options: InitActionOptions) => initAction(options, simulatorService)); program diff --git a/src/index.ts b/src/index.ts index bd00623b..5ae3ceaf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,12 +4,14 @@ import {version} from "../package.json"; import {CLI_DESCRIPTION} from "../src/lib/config/text"; import { initializeGeneralCommands } from "../src/commands/general"; import { initializeKeygenCommands } from "../src/commands/keygen"; +import { initializeContractsCommands } from "../src/commands/contracts"; import { initializeConfigCommands } from "../src/commands/config"; export function initializeCLI() { program.version(version).description(CLI_DESCRIPTION); initializeGeneralCommands(program); initializeKeygenCommands(program); + initializeContractsCommands(program); initializeConfigCommands(program); program.parse(process.argv); } diff --git a/src/lib/accounts/getPrivateKey.ts b/src/lib/accounts/getPrivateKey.ts new file mode 100644 index 00000000..42001249 --- /dev/null +++ b/src/lib/accounts/getPrivateKey.ts @@ -0,0 +1,21 @@ +import fs from "fs"; +import { ConfigFileManager } from "../config/ConfigFileManager"; + +export function getPrivateKey(): string { + const configFileManager: ConfigFileManager = new ConfigFileManager(); + const keypairPath = configFileManager.getConfigByKey("keyPairPath"); + + if (!keypairPath || !fs.existsSync(keypairPath)) { + console.error("Keypair file not found. Please generate or specify a valid keypair path."); + process.exit(1); + } + + const keypairData = JSON.parse(fs.readFileSync(keypairPath, "utf-8")); + + if (!keypairData.privateKey) { + console.error("Invalid keypair file. Private key is missing."); + process.exit(1); + } + + return keypairData.privateKey; +} \ No newline at end of file diff --git a/tests/actions/deploy.test.ts b/tests/actions/deploy.test.ts new file mode 100644 index 00000000..5741e3b4 --- /dev/null +++ b/tests/actions/deploy.test.ts @@ -0,0 +1,137 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import fs from "fs"; +import { createClient, createAccount } from "genlayer-js"; +import { DeployAction, DeployOptions } from "../../src/commands/contracts/deploy"; +import { getPrivateKey } from "../../src/lib/accounts/getPrivateKey"; + +vi.mock("fs"); +vi.mock("genlayer-js"); +vi.mock("../../src/lib/accounts/getPrivateKey"); + +describe("Deploy Action", () => { + let deployer: DeployAction; + const mockClient = { + deployContract: vi.fn(), + }; + + const mockPrivateKey = "mocked_private_key"; + + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(createClient).mockReturnValue(mockClient as any); + vi.mocked(createAccount).mockReturnValue({ privateKey: mockPrivateKey } as any); + vi.mocked(getPrivateKey).mockReturnValue(mockPrivateKey); + deployer = new DeployAction(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("reads contract code successfully", () => { + const contractPath = "/mocked/contract/path"; + const contractContent = "contract code"; + vi.mocked(fs.existsSync).mockReturnValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(contractContent); + + const result = deployer["readContractCode"](contractPath); + + expect(fs.existsSync).toHaveBeenCalledWith(contractPath); + expect(fs.readFileSync).toHaveBeenCalledWith(contractPath, "utf-8"); + expect(result).toBe(contractContent); + }); + + test("throws error if contract file is missing", () => { + const contractPath = "/mocked/contract/path"; + vi.mocked(fs.existsSync).mockReturnValue(false); + + expect(() => deployer["readContractCode"](contractPath)).toThrowError( + `Contract file not found: ${contractPath}` + ); + expect(fs.existsSync).toHaveBeenCalledWith(contractPath); + }); + + + test("deploys contract with args", async () => { + const options: DeployOptions = { + contract: "/mocked/contract/path", + args: [1, 2, 3], + }; + const contractContent = "contract code"; + + vi.mocked(fs.existsSync).mockReturnValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(contractContent); + vi.mocked(mockClient.deployContract).mockResolvedValue("mocked_tx_hash"); + + await deployer.deploy(options); + + expect(fs.readFileSync).toHaveBeenCalledWith(options.contract, "utf-8"); + expect(mockClient.deployContract).toHaveBeenCalledWith({ + code: contractContent, + args: [1, 2, 3], + leaderOnly: false, + }); + expect(mockClient.deployContract).toHaveResolvedWith("mocked_tx_hash"); + }); + + test("throws error for both args and kwargs", async () => { + const options: DeployOptions = { + contract: "/mocked/contract/path", + args: [1, 2, 3], + kwargs: "key1=value1,key2=42", + }; + + await expect(deployer.deploy(options)).rejects.toThrowError( + "Invalid usage: Please specify either `args` or `kwargs`, but not both." + ); + + expect(fs.readFileSync).not.toHaveBeenCalled(); + expect(mockClient.deployContract).not.toHaveBeenCalled(); + }); + + test("throws error for missing contract", async () => { + const options: DeployOptions = { + }; + + await deployer.deploy(options); + + expect(fs.readFileSync).not.toHaveBeenCalled(); + expect(mockClient.deployContract).not.toHaveBeenCalled(); + }); + + test("handles deployment errors", async () => { + const options: DeployOptions = { + contract: "/mocked/contract/path", + args: [1, 2, 3], + }; + const contractContent = "contract code"; + + vi.mocked(fs.existsSync).mockReturnValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(contractContent); + vi.mocked(mockClient.deployContract).mockRejectedValue( + new Error("Mocked deployment error") + ); + + await expect(deployer.deploy(options)).rejects.toThrowError( + "Contract deployment failed." + ); + + expect(fs.readFileSync).toHaveBeenCalledWith(options.contract, "utf-8"); + expect(mockClient.deployContract).toHaveBeenCalled(); + }); + + test("throws error if contract code is empty", async () => { + const options: DeployOptions = { + contract: "/mocked/contract/path", + }; + + vi.mocked(fs.existsSync).mockReturnValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(""); + + await deployer.deploy(options); + + expect(fs.existsSync).toHaveBeenCalledWith(options.contract); + expect(fs.readFileSync).toHaveBeenCalledWith(options.contract, "utf-8"); + expect(mockClient.deployContract).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/commands/deploy.test.ts b/tests/commands/deploy.test.ts new file mode 100644 index 00000000..80bf286b --- /dev/null +++ b/tests/commands/deploy.test.ts @@ -0,0 +1,69 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeContractsCommands } from "../../src/commands/contracts"; +import { DeployAction } from "../../src/commands/contracts/deploy"; + +vi.mock("../../src/commands/contracts/deploy"); + +describe("deploy command", () => { + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeContractsCommands(program); + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("DeployAction.deploy is called with default options", async () => { + program.parse(["node", "test", "deploy", "--contract", "./path/to/contract"]); + expect(DeployAction).toHaveBeenCalledTimes(1); + expect(DeployAction.prototype.deploy).toHaveBeenCalledWith({ + contract: "./path/to/contract", + args: [], + }); + }); + + test("DeployAction.deploy is called with positional arguments", async () => { + program.parse([ + "node", + "test", + "deploy", + "--contract", + "./path/to/contract", + "--args", + "1", + "2", + "3", + ]); + expect(DeployAction).toHaveBeenCalledTimes(1); + expect(DeployAction.prototype.deploy).toHaveBeenCalledWith({ + contract: "./path/to/contract", + args: ["1", "2", "3"] + }); + }); + + test("DeployAction is instantiated when the deploy command is executed", async () => { + program.parse(["node", "test", "deploy", "--contract", "./path/to/contract"]); + expect(DeployAction).toHaveBeenCalledTimes(1); + }); + + test("throws error for unrecognized options", async () => { + const deployCommand = program.commands.find((cmd) => cmd.name() === "deploy"); + deployCommand?.exitOverride(); + expect(() => program.parse(["node", "test", "deploy", "--unknown"])).toThrowError( + "error: unknown option '--unknown'" + ); + }); + + test("DeployAction.deploy is called without throwing errors for valid options", async () => { + program.parse(["node", "test", "deploy", "--contract", "./path/to/contract"]); + vi.mocked(DeployAction.prototype.deploy).mockResolvedValueOnce(undefined); + expect(() => + program.parse(["node", "test", "deploy", "--contract", "./path/to/contract"]) + ).not.toThrow(); + }); +}); diff --git a/tests/index.test.ts b/tests/index.test.ts index 12e03ec1..8fd80236 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -17,6 +17,10 @@ vi.mock("../src/commands/keygen", () => ({ initializeKeygenCommands: vi.fn(), })); +vi.mock("../src/commands/contracts", () => ({ + initializeContractsCommands: vi.fn(), +})); + vi.mock("../src/commands/config", () => ({ initializeConfigCommands: vi.fn(), })); diff --git a/tests/libs/getPrivateKey.test.ts b/tests/libs/getPrivateKey.test.ts new file mode 100644 index 00000000..780ac798 --- /dev/null +++ b/tests/libs/getPrivateKey.test.ts @@ -0,0 +1,96 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import fs from "fs"; +import { getPrivateKey } from "../../src/lib/accounts/getPrivateKey"; +import { ConfigFileManager } from "../../src/lib/config/ConfigFileManager"; + +vi.mock("fs"); +vi.mock("../../src/lib/config/ConfigFileManager"); + +describe("getPrivateKey", () => { + new ConfigFileManager(); + + beforeEach(() => { + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("returns the private key if the file exists and is valid", () => { + const mockPath = "/mocked/path/keypair.json"; + const mockPrivateKey = "0xMockedPrivateKey"; + const mockKeypairData = { privateKey: mockPrivateKey }; + + vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue(mockPath); + vi.mocked(fs.existsSync).mockReturnValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockKeypairData)); + + const privateKey = getPrivateKey(); + + expect(ConfigFileManager.prototype.getConfigByKey).toHaveBeenCalledWith("keyPairPath"); + expect(fs.existsSync).toHaveBeenCalledWith(mockPath); + expect(fs.readFileSync).toHaveBeenCalledWith(mockPath, "utf-8"); + expect(privateKey).toBe(mockPrivateKey); + }); + + test("exits if the keypair path is missing in the config", () => { + const consoleErrorSpy = vi.spyOn(console, "error"); + const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { + throw new Error("process.exit"); + }); + + vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue(null); + + expect(() => getPrivateKey()).toThrowError("process.exit"); + + expect(ConfigFileManager.prototype.getConfigByKey).toHaveBeenCalledWith("keyPairPath"); + expect(consoleErrorSpy).toHaveBeenCalledWith( + "Keypair file not found. Please generate or specify a valid keypair path." + ); + expect(processExitSpy).toHaveBeenCalledWith(1); + }); + + test("exits if the keypair file does not exist", () => { + const consoleErrorSpy = vi.spyOn(console, "error"); + const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { + throw new Error("process.exit"); + }); + + const mockPath = "/mocked/path/keypair.json"; + + vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue(mockPath); + vi.mocked(fs.existsSync).mockReturnValue(false); + + expect(() => getPrivateKey()).toThrowError("process.exit"); + + expect(ConfigFileManager.prototype.getConfigByKey).toHaveBeenCalledWith("keyPairPath"); + expect(fs.existsSync).toHaveBeenCalledWith(mockPath); + expect(consoleErrorSpy).toHaveBeenCalledWith( + "Keypair file not found. Please generate or specify a valid keypair path." + ); + expect(processExitSpy).toHaveBeenCalledWith(1); + }); + + test("exits if the private key is missing in the keypair file", () => { + const consoleErrorSpy = vi.spyOn(console, "error"); + const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { + throw new Error("process.exit"); + }); + + const mockPath = "/mocked/path/keypair.json"; + const mockKeypairData = { notPrivateKey: "SomeOtherData" }; // Invalid keypair data + + vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue(mockPath); + vi.mocked(fs.existsSync).mockReturnValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockKeypairData)); + + expect(() => getPrivateKey()).toThrowError("process.exit"); + + expect(ConfigFileManager.prototype.getConfigByKey).toHaveBeenCalledWith("keyPairPath"); + expect(fs.existsSync).toHaveBeenCalledWith(mockPath); + expect(fs.readFileSync).toHaveBeenCalledWith(mockPath, "utf-8"); + expect(consoleErrorSpy).toHaveBeenCalledWith("Invalid keypair file. Private key is missing."); + expect(processExitSpy).toHaveBeenCalledWith(1); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index ef290c69..cb0e5b8b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -27,7 +27,7 @@ /* Modules */ "module": "ES2022" /* Specify what module code is generated. */, // "rootDir": /* Specify the root folder within your source files. */, - "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + "moduleResolution": "bundler" /* Specify how TypeScript looks up a file from a given module specifier. */, // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ "paths": { "@/*": ["./src/*"], From a3c485c99f1abc9448128b3c85e19fe9307d14f7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 13 Dec 2024 13:47:49 +0000 Subject: [PATCH 42/67] Release v0.9.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 627d4c20..82305ff7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.9.0 (2024-12-13) + + +### Features + +* Add Deploy Command and Update Configurations for Compatibility ([#153](https://github.com/yeagerai/genlayer-cli/issues/153)) ([8744b2d](https://github.com/yeagerai/genlayer-cli/commit/8744b2d3ef2b4d7fd4d3ac71ac6e8eef69ed1555)) + ## 0.8.0 (2024-12-11) diff --git a/package-lock.json b/package-lock.json index 1cce28cb..e0c8935f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.8.0", + "version": "0.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.8.0", + "version": "0.9.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 740d42b6..f83e2887 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.8.0", + "version": "0.9.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 189c7592fedb6373e3603f1bdb4366c79f289160 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:30:49 -0300 Subject: [PATCH 43/67] fix: removing volumes to stop error when running node without nvm (#156) * fix: removing volumes to stop error when running node without nvm and removing backup .env file to allow users to run genlayer globally without root user * fix: removing service to not conflict with other PR --- docker-compose.yml | 12 ++++++------ src/lib/services/simulator.ts | 3 --- tests/services/simulator.test.ts | 1 - 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 38f0a3a4..857b609f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,8 +7,8 @@ services: - "${FRONTEND_PORT:-8080}:8080" environment: - VITE_* - volumes: - - ./.env:/app/.env + env_file: + - ./.env depends_on: jsonrpc: condition: service_healthy @@ -36,8 +36,8 @@ services: ports: - "${RPCPORT:-5000}:${RPCPORT:-5000}" - "${RPCDEBUGPORT:-5001}:${RPCDEBUGPORT:-5001}" - volumes: - - ./.env:/app/.env + env_file: + - ./.env healthcheck: test: [ "CMD", "python", "backend/healthcheck.py", "--port", "${RPCPORT}" ] interval: 30s @@ -75,8 +75,8 @@ services: expose: - "${WEBREQUESTPORT:-5002}:${WEBREQUESTPORT:-5002}" - "${WEBREQUESTSELENIUMPORT:-4444}:${WEBREQUESTSELENIUMPORT:-4444}" - volumes: - - ./.env:/app/webrequest/.env + env_file: + - ./.env depends_on: ollama: condition: service_started diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 7cbb88d0..f7ea8171 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -50,9 +50,6 @@ export class SimulatorService implements ISimulatorService { public addConfigToEnvFile(newConfig: Record): void { const envFilePath = path.join(this.location, ".env"); - // Create a backup of the original .env file - fs.writeFileSync(`${envFilePath}.bak`, fs.readFileSync(envFilePath)); - // Transform the config string to object const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); Object.keys(newConfig).forEach(key => { diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 4455383d..056e122e 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -173,7 +173,6 @@ describe("SimulatorService - Basic Tests", () => { simulatorService.addConfigToEnvFile(newConfig); - expect(writeFileSyncMock).toHaveBeenCalledWith(`${envFilePath}.bak`, ""); const expectedUpdatedContent = `NEW_KEY=newValue`; expect(writeFileSyncMock).toHaveBeenCalledWith(envFilePath, expectedUpdatedContent); }); From fb1343848c1d5622d2c9c26c02671380c086a80d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 13 Dec 2024 14:31:30 +0000 Subject: [PATCH 44/67] Release v0.9.1 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82305ff7..1458ccee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.9.1 (2024-12-13) + + +### Bug Fixes + +* removing volumes to stop error when running node without nvm ([#156](https://github.com/yeagerai/genlayer-cli/issues/156)) ([189c759](https://github.com/yeagerai/genlayer-cli/commit/189c7592fedb6373e3603f1bdb4366c79f289160)) + ## 0.9.0 (2024-12-13) diff --git a/package-lock.json b/package-lock.json index e0c8935f..af12d6d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.9.0", + "version": "0.9.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.9.0", + "version": "0.9.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index f83e2887..298f137a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.9.0", + "version": "0.9.1", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 89cb74f849d49a02ea78134648b88d3d32e3e76e Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:04:51 -0300 Subject: [PATCH 45/67] 157 cli is always breaking when a new studio version is released (#159) --- .env.example | 2 +- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- src/commands/general/index.ts | 4 +++- src/commands/general/init.ts | 1 - src/lib/config/simulator.ts | 10 ++++++---- src/lib/services/simulator.ts | 7 ++++--- tests/actions/init.test.ts | 3 ++- tests/commands/init.test.ts | 3 ++- tests/services/simulator.test.ts | 12 ++++++------ 11 files changed, 34 insertions(+), 21 deletions(-) diff --git a/.env.example b/.env.example index 37098a75..642b771b 100644 --- a/.env.example +++ b/.env.example @@ -69,7 +69,7 @@ VALIDATORS_CONFIG_JSON='' VSCODEDEBUG="false" -LOCALNETVERSION="latest" +LOCALNETVERSION="" FRONTEND_BUILD_TARGET = 'final' # change to 'dev' to run in dev mode diff --git a/CHANGELOG.md b/CHANGELOG.md index 1458ccee..0da3ffd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.10.0-beta.0 (2024-12-13) + + +### Features + +* new global var to deal with compatible version ([33a4c02](https://github.com/yeagerai/genlayer-cli/commit/33a4c02f091e87faf1b884177ee854fe1b66f52b)) + ## 0.9.1 (2024-12-13) diff --git a/package-lock.json b/package-lock.json index af12d6d9..4cc4110e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.9.1", + "version": "0.10.0-beta.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.9.1", + "version": "0.10.0-beta.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 298f137a..b81d9bc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.9.1", + "version": "0.10.0-beta.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index d97318a4..1ecd336f 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -1,7 +1,9 @@ import { Command } from "commander"; + import simulatorService from "../../lib/services/simulator"; import { initAction, InitActionOptions } from "./init"; import { startAction, StartActionOptions } from "./start"; +import {localnetCompatibleVersion} from "../../lib/config/simulator"; export function initializeGeneralCommands(program: Command) { program @@ -10,7 +12,7 @@ export function initializeGeneralCommands(program: Command) { .option("--numValidators ", "Number of validators", "5") .option("--headless", "Headless mode", false) .option("--reset-db", "Reset Database", false) - .option("--localnet-version ", "Select a specific localnet version", "latest") + .option("--localnet-version ", "Select a specific localnet version", localnetCompatibleVersion) .action((options: InitActionOptions) => initAction(options, simulatorService)); program diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 438904b4..ee6e2266 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -147,7 +147,6 @@ export async function initAction(options: InitActionOptions, simulatorService: I simulatorService.addConfigToEnvFile(aiProvidersEnvVars); simulatorService.addConfigToEnvFile({LOCALNETVERSION: localnetVersion}); - // Run the GenLayer Simulator console.log("Running the GenLayer Simulator..."); try { diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index d9b56ac8..62447322 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -1,9 +1,11 @@ +export const localnetCompatibleVersion = "v0.29.0"; export const DEFAULT_JSON_RPC_URL = "http://localhost:4000/api"; -export const DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX = "/genlayer-cli-"; +export const CONTAINERS_NAME_PREFIX = "/genlayer-"; +export const IMAGES_NAME_PREFIX = "yeagerai"; export const DEFAULT_RUN_SIMULATOR_COMMAND = (location: string, options: string) => ({ - darwin: `osascript -e 'tell application "Terminal" to do script "cd ${location} && docker compose build && docker compose up ${options}"'`, - win32: `start cmd.exe /c "cd /d ${location} && docker compose build && docker compose up && pause ${options}"`, - linux: `nohup bash -c 'cd ${location} && docker compose build && docker compose up -d ${options}'`, + darwin: `osascript -e 'tell application "Terminal" to do script "cd ${location} && docker compose build && docker compose -p genlayer up ${options}"'`, + win32: `start cmd.exe /c "cd /d ${location} && docker compose build && docker compose -p genlayer up ${options} && pause"`, + linux: `nohup bash -c 'cd ${location} && docker compose build && docker compose -p genlayer up ${options} -d '`, }); export const DEFAULT_RUN_DOCKER_COMMAND = { darwin: "open -a Docker", diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index f7ea8171..96ac2d85 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -8,7 +8,6 @@ import pkg from '../../../package.json' import {rpcClient} from "../clients/jsonRpcClient"; import { - DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, DEFAULT_RUN_SIMULATOR_COMMAND, DEFAULT_RUN_DOCKER_COMMAND, STARTING_TIMEOUT_WAIT_CYLCE, @@ -16,6 +15,8 @@ import { AI_PROVIDERS_CONFIG, AiProviders, VERSION_REQUIREMENTS, + CONTAINERS_NAME_PREFIX, + IMAGES_NAME_PREFIX } from "../config/simulator"; import { checkCommand, @@ -254,7 +255,7 @@ export class SimulatorService implements ISimulatorService { const containers = await this.docker.listContainers({ all: true }); const genlayerContainers = containers.filter(container => container.Names.some(name => - name.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX) + name.startsWith(CONTAINERS_NAME_PREFIX) ) ); @@ -271,7 +272,7 @@ export class SimulatorService implements ISimulatorService { public async resetDockerImages(): Promise { const images = await this.docker.listImages(); const genlayerImages = images.filter(image => - image.RepoTags?.some(tag => tag.startsWith(DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX)) + image.RepoTags?.some(tag => tag.startsWith(IMAGES_NAME_PREFIX)) ); for (const imageInfo of genlayerImages) { diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 156298fb..c3945212 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -7,6 +7,7 @@ import {mkdtempSync} from "fs"; import {join} from "path"; import fs from "fs"; import * as dotenv from "dotenv"; +import {localnetCompatibleVersion} from "../../src/lib/config/simulator"; vi.mock("fs"); @@ -14,7 +15,7 @@ vi.mock("dotenv"); const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); -const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false, localnetVersion: 'latest' }; +const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false, localnetVersion: localnetCompatibleVersion }; describe("init action", () => { let error: ReturnType; diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index 6f92d155..bf0182ac 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -3,13 +3,14 @@ import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import { initializeGeneralCommands } from "../../src/commands/general"; import { getCommand, getCommandOption } from "../utils"; import simulatorService from '../../src/lib/services/simulator' +import {localnetCompatibleVersion} from "../../src/lib/config/simulator"; const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); const defaultOptions = { numValidators: "5", headless: false, resetDb: false, - localnetVersion: 'latest' + localnetVersion: localnetCompatibleVersion } vi.mock("inquirer", () => ({ diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 056e122e..7205c740 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -10,10 +10,10 @@ import { checkCommand, } from "../../src/lib/clients/system"; import { - DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX, + CONTAINERS_NAME_PREFIX, VERSION_REQUIREMENTS, STARTING_TIMEOUT_ATTEMPTS, - DEFAULT_RUN_SIMULATOR_COMMAND, + DEFAULT_RUN_SIMULATOR_COMMAND, localnetCompatibleVersion, IMAGES_NAME_PREFIX, } from "../../src/lib/config/simulator"; import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; import * as semver from "semver"; @@ -375,12 +375,12 @@ describe("SimulatorService - Docker Tests", () => { const mockContainers = [ { Id: "container1", - Names: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}container1`], + Names: [`${CONTAINERS_NAME_PREFIX}container1`], State: "running", }, { Id: "container2", - Names: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}container2`], + Names: [`${CONTAINERS_NAME_PREFIX}container2`], State: "exited", }, { @@ -417,11 +417,11 @@ describe("SimulatorService - Docker Tests", () => { const mockImages = [ { Id: "image1", - RepoTags: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}image1:latest`], + RepoTags: [`${IMAGES_NAME_PREFIX}image1:${localnetCompatibleVersion}`], }, { Id: "image2", - RepoTags: [`${DOCKER_IMAGES_AND_CONTAINERS_NAME_PREFIX}image2:latest`], + RepoTags: [`${IMAGES_NAME_PREFIX}image2:${localnetCompatibleVersion}`], }, { Id: "image3", From 13cfe51a3a24555dc53b301ea3cd05417e485edb Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:22:47 -0300 Subject: [PATCH 46/67] feat: Add `call` Command for Contract Interactions (#154) * feat: new deploy command * fix: Genvm returning error when theres no args * fix: moving getPrivateKey * fix: moving getPrivateKey * fix: new folder to contracts commands * removing kwargs * feat: call command (contract) * fix: adding new env var * feat: method type is chosen dynamically --- .env.example | 1 + src/commands/contracts/call.ts | 87 ++++++++++++++++++ src/commands/contracts/deploy.ts | 7 +- src/commands/contracts/index.ts | 12 ++- tests/actions/call.test.ts | 146 +++++++++++++++++++++++++++++++ tests/actions/deploy.test.ts | 2 + tests/commands/call.test.ts | 70 +++++++++++++++ 7 files changed, 322 insertions(+), 3 deletions(-) create mode 100644 src/commands/contracts/call.ts create mode 100644 tests/actions/call.test.ts create mode 100644 tests/commands/call.test.ts diff --git a/.env.example b/.env.example index 642b771b..4fb79844 100644 --- a/.env.example +++ b/.env.example @@ -79,3 +79,4 @@ HARDHAT_PORT = '8545' HARDHAT_PRIVATE_KEY = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' BACKEND_BUILD_TARGET = 'debug' +VITE_FINALITY_WINDOW=1 diff --git a/src/commands/contracts/call.ts b/src/commands/contracts/call.ts new file mode 100644 index 00000000..a9a58b6e --- /dev/null +++ b/src/commands/contracts/call.ts @@ -0,0 +1,87 @@ +import { createClient, createAccount } from "genlayer-js"; +import { simulator } from "genlayer-js/chains"; +import type { GenLayerClient } from "genlayer-js/types"; +import { getPrivateKey } from "../../lib/accounts/getPrivateKey"; + +export interface CallOptions { + args: any[]; +} + +export class CallAction { + private genlayerClient: GenLayerClient; + + constructor() { + this.genlayerClient = createClient({ + chain: simulator, + endpoint: process.env.VITE_JSON_RPC_SERVER_URL, + account: createAccount(getPrivateKey() as any), + }); + } + + async call({ + contractAddress, + method, + args, + }: { + contractAddress: string; + method: string; + args: any[]; + }): Promise { + console.log(`Calling method ${method} on contract at ${contractAddress}...`); + + const contractSchema = await this.genlayerClient.getContractSchema(contractAddress); + + if(!contractSchema.methods.hasOwnProperty(method)){ + console.error(`method ${method} not found.`); + process.exit(1); + } + + const readonly = contractSchema.methods[method as any].readonly; + + try { + if (readonly) { + await this.executeRead(contractAddress, method, args); + } else { + await this.executeWrite(contractAddress, method, args); + } + } catch (error) { + console.error("Error calling contract method:", error); + throw error; + } + } + + private async executeRead(contractAddress: string, method: string, args: any[]): Promise { + try { + const result = await this.genlayerClient.readContract({ + address: contractAddress as any, + functionName: method, + args, + }); + console.log("Read result:", result); + } catch (error) { + console.error("Error during read operation:", error); + throw error; + } + } + + private async executeWrite(contractAddress: string, method: string, args: any[]): Promise { + try { + const hash = await this.genlayerClient.writeContract({ + address: contractAddress as any, + functionName: method, + args, + value: 0n, + }); + const result = await this.genlayerClient.waitForTransactionReceipt({ + hash, + retries: 15, + interval: 2000, + }); + console.log("Write transaction hash:", hash); + console.log("Result:", result); + } catch (error) { + console.error("Error during write operation:", error); + throw error; + } + } +} diff --git a/src/commands/contracts/deploy.ts b/src/commands/contracts/deploy.ts index bb2f7eee..57cc093d 100644 --- a/src/commands/contracts/deploy.ts +++ b/src/commands/contracts/deploy.ts @@ -57,10 +57,13 @@ export class DeployAction { console.log("Deployment Parameters:", deployParams); try { - const result = await this.genlayerClient.deployContract(deployParams); + const hash = await this.genlayerClient.deployContract(deployParams) as any; + + const result = await this.genlayerClient.waitForTransactionReceipt({hash, retries: 15, interval: 2000}) console.log("Contract deployed successfully."); - console.log("Transaction Hash:", result); + console.log("Transaction Hash:", hash); + console.log("Contract Address:", result.data?.contract_address); } catch (error) { console.error("Error deploying contract:", error); throw new Error("Contract deployment failed."); diff --git a/src/commands/contracts/index.ts b/src/commands/contracts/index.ts index 1d1001f5..8a2dcd4a 100644 --- a/src/commands/contracts/index.ts +++ b/src/commands/contracts/index.ts @@ -1,5 +1,6 @@ import { Command } from "commander"; -import { DeployAction, DeployOptions } from "../contracts/deploy"; +import { DeployAction, DeployOptions } from "./deploy"; +import { CallAction, CallOptions } from "./call"; export function initializeContractsCommands(program: Command) { @@ -14,5 +15,14 @@ export function initializeContractsCommands(program: Command) { await deployer.deploy(options); }); + program + .command("call ") + .description("Call a contract method") + .option("--args ", "Positional arguments for the method (space-separated, use quotes for multi-word arguments)", []) + .action(async (contractAddress: string, method: string, options: CallOptions) => { + const caller = new CallAction(); + await caller.call({ contractAddress, method, ...options }); + }); + return program; } diff --git a/tests/actions/call.test.ts b/tests/actions/call.test.ts new file mode 100644 index 00000000..34880b4b --- /dev/null +++ b/tests/actions/call.test.ts @@ -0,0 +1,146 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import { createClient, createAccount } from "genlayer-js"; +import { CallAction, CallOptions } from "../../src/commands/contracts/call"; +import { getPrivateKey } from "../../src/lib/accounts/getPrivateKey"; + +vi.mock("genlayer-js"); +vi.mock("../../src/lib/accounts/getPrivateKey"); + +describe("Call Action", () => { + let caller: CallAction; + const mockClient = { + readContract: vi.fn(), + writeContract: vi.fn(), + waitForTransactionReceipt: vi.fn(), + getContractSchema: vi.fn() + }; + + const mockPrivateKey = "mocked_private_key"; + + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(createClient).mockReturnValue(mockClient as any); + vi.mocked(createAccount).mockReturnValue({ privateKey: mockPrivateKey } as any); + vi.mocked(getPrivateKey).mockReturnValue(mockPrivateKey); + caller = new CallAction(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("calls readContract successfully", async () => { + const options: CallOptions = { + args: [1, 2, "Hello"] + }; + const mockResult = "mocked_result"; + + vi.mocked(mockClient.readContract).mockResolvedValue(mockResult); + vi.mocked(mockClient.getContractSchema).mockResolvedValue({methods: {getData: {readonly: true}}}); + + await caller.call({ + contractAddress: "0xMockedContract", + method: "getData", + ...options, + }); + + expect(mockClient.readContract).toHaveBeenCalledWith({ + address: "0xMockedContract", + functionName: "getData", + args: [1, 2, "Hello"], + }); + expect(mockClient.readContract).toHaveResolvedWith(mockResult); + }); + + test("calls writeContract successfully", async () => { + const options: CallOptions = { + args: [42, "Update"] + }; + const mockHash = "0xMockedTransactionHash"; + const mockReceipt = { status: "success" }; + + vi.mocked(mockClient.writeContract).mockResolvedValue(mockHash); + vi.mocked(mockClient.waitForTransactionReceipt).mockResolvedValue(mockReceipt); + vi.mocked(mockClient.getContractSchema).mockResolvedValue({methods: {updateData: {readonly: false}}}); + + await caller.call({ + contractAddress: "0xMockedContract", + method: "updateData", + ...options, + }); + + expect(mockClient.writeContract).toHaveBeenCalledWith({ + address: "0xMockedContract", + functionName: "updateData", + args: [42, "Update"], + value: 0n, + }); + expect(mockClient.waitForTransactionReceipt).toHaveBeenCalledWith({ + hash: mockHash, + retries: 15, + interval: 2000, + }); + expect(mockClient.writeContract).toHaveResolvedWith(mockHash); + }); + + test("throws error when method is not found", async () => { + const options: CallOptions = { + args: [] + }; + + vi.mocked(mockClient.getContractSchema).mockResolvedValue({methods: {updateData: {readonly: false}}}); + + await expect( + caller.call({ + contractAddress: "0xMockedContract", + method: "getData", + ...options, + }) + ).rejects.toThrowError('process.exit unexpectedly called with "1"'); + + expect(mockClient.readContract).not.toHaveBeenCalled(); + expect(mockClient.writeContract).not.toHaveBeenCalled(); + }); + + test("handles errors during readContract", async () => { + const options: CallOptions = { + args: [1] + }; + + vi.mocked(mockClient.getContractSchema).mockResolvedValue({methods: {getData: {readonly: true}}}); + vi.mocked(mockClient.readContract).mockRejectedValue( + new Error("Mocked read error") + ); + + await expect( + caller.call({ + contractAddress: "0xMockedContract", + method: "getData", + ...options, + }) + ).rejects.toThrowError("Mocked read error"); + + expect(mockClient.readContract).toHaveBeenCalled(); + }); + + test("handles errors during writeContract", async () => { + const options: CallOptions = { + args: [1] + }; + + vi.mocked(mockClient.getContractSchema).mockResolvedValue({methods: {updateData: {readonly: false}}}); + vi.mocked(mockClient.writeContract).mockRejectedValue( + new Error("Mocked write error") + ); + + await expect( + caller.call({ + contractAddress: "0xMockedContract", + method: "updateData", + ...options, + }) + ).rejects.toThrowError("Mocked write error"); + + expect(mockClient.writeContract).toHaveBeenCalled(); + }); +}); diff --git a/tests/actions/deploy.test.ts b/tests/actions/deploy.test.ts index 5741e3b4..f548da8a 100644 --- a/tests/actions/deploy.test.ts +++ b/tests/actions/deploy.test.ts @@ -12,6 +12,7 @@ describe("Deploy Action", () => { let deployer: DeployAction; const mockClient = { deployContract: vi.fn(), + waitForTransactionReceipt: vi.fn() }; const mockPrivateKey = "mocked_private_key"; @@ -62,6 +63,7 @@ describe("Deploy Action", () => { vi.mocked(fs.existsSync).mockReturnValue(true); vi.mocked(fs.readFileSync).mockReturnValue(contractContent); vi.mocked(mockClient.deployContract).mockResolvedValue("mocked_tx_hash"); + vi.mocked(mockClient.waitForTransactionReceipt).mockResolvedValue({data: {contractAddress: '0xdasdsadasdasdada'}}); await deployer.deploy(options); diff --git a/tests/commands/call.test.ts b/tests/commands/call.test.ts new file mode 100644 index 00000000..038f239c --- /dev/null +++ b/tests/commands/call.test.ts @@ -0,0 +1,70 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeContractsCommands } from "../../src/commands/contracts"; +import { CallAction } from "../../src/commands/contracts/call"; + +vi.mock("../../src/commands/contracts/call"); + +describe("call command", () => { + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeContractsCommands(program); + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("CallAction.call is called with default options", async () => { + program.parse(["node", "test", "call", "0xMockedContract", "getData"]); + expect(CallAction).toHaveBeenCalledTimes(1); + expect(CallAction.prototype.call).toHaveBeenCalledWith({ + contractAddress: "0xMockedContract", + method: "getData", + args: [] + }); + }); + + test("CallAction.call is called with positional arguments", async () => { + program.parse([ + "node", + "test", + "call", + "0xMockedContract", + "updateData", + "--args", + "1", + "2", + "Hello", + ]); + expect(CallAction).toHaveBeenCalledTimes(1); + expect(CallAction.prototype.call).toHaveBeenCalledWith({ + contractAddress: "0xMockedContract", + method: "updateData", + args: ["1", "2", "Hello"] + }); + }); + + test("CallAction is instantiated when the call command is executed", async () => { + program.parse(["node", "test", "call", "0xMockedContract", "getData"]); + expect(CallAction).toHaveBeenCalledTimes(1); + }); + + test("throws error for unrecognized options", async () => { + const callCommand = program.commands.find((cmd) => cmd.name() === "call"); + callCommand?.exitOverride(); + expect(() => program.parse(["node", "test", "call", "0xMockedContract", "getData", "--unknown"])) + .toThrowError("error: unknown option '--unknown'"); + }); + + test("CallAction.call is called without throwing errors for valid options", async () => { + program.parse(["node", "test", "call", "0xMockedContract", "getData"]); + vi.mocked(CallAction.prototype.call).mockResolvedValueOnce(undefined); + expect(() => + program.parse(["node", "test", "call", "0xMockedContract", "getData"]) + ).not.toThrow(); + }); +}); From e48e31eeb8d962c84a2537acf4205d36990f36ed Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:12:48 -0300 Subject: [PATCH 47/67] feat: Add Ollama Model Management Features (#163) * fix: CLI hardcoded version and solving issues with containers and images * feat: new global var to deal with compatible version * Release v0.10.0-beta.0 [skip ci] * fix: removing default value from .env.example * feat: new update ollama command --------- Co-authored-by: github-actions[bot] --- src/commands/general/init.ts | 6 +- src/commands/update/index.ts | 26 +++++ src/commands/update/ollama.ts | 42 ++++++++ src/index.ts | 2 + src/lib/interfaces/ISimulatorService.ts | 1 - src/lib/services/simulator.ts | 33 ------ tests/actions/init.test.ts | 21 ++-- tests/actions/ollama.test.ts | 129 ++++++++++++++++++++++++ tests/commands/update.test.ts | 43 ++++++++ tests/index.test.ts | 4 + tests/services/simulator.test.ts | 72 ------------- 11 files changed, 264 insertions(+), 115 deletions(-) create mode 100644 src/commands/update/index.ts create mode 100644 src/commands/update/ollama.ts create mode 100644 tests/actions/ollama.test.ts create mode 100644 tests/commands/update.test.ts diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index ee6e2266..e7372c23 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -1,7 +1,8 @@ import inquirer from "inquirer"; - import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; import {AI_PROVIDERS_CONFIG, AiProviders} from "../../lib/config/simulator"; +import { OllamaAction } from "../update/ollama"; + export interface InitActionOptions { numValidators: number; headless: boolean; @@ -179,7 +180,8 @@ export async function initAction(options: InitActionOptions, simulatorService: I // Ollama doesn't need changes in configuration, we just run it if (selectedLlmProviders.includes("ollama")) { console.log("Pulling llama3 from Ollama..."); - await simulatorService.pullOllamaModel(); + const ollamaAction = new OllamaAction(); + await ollamaAction.updateModel("llama3"); } // Initializing validators diff --git a/src/commands/update/index.ts b/src/commands/update/index.ts new file mode 100644 index 00000000..161995bb --- /dev/null +++ b/src/commands/update/index.ts @@ -0,0 +1,26 @@ +import { Command } from "commander"; +import { OllamaAction } from "./ollama"; + +export function initializeUpdateCommands(program: Command) { + const updateCommand = program + .command("update") + .description("Update resources like models or configurations"); + + updateCommand + .command("ollama") + .description("Manage Ollama models (update or remove)") + .option("--model [model-name]", "Specify the model to update or remove") + .option("--remove", "Remove the specified model instead of updating") + .action(async (options) => { + const modelName = options.model || "default-model"; + const ollamaAction = new OllamaAction(); + + if (options.remove) { + await ollamaAction.removeModel(modelName); + } else { + await ollamaAction.updateModel(modelName); + } + }); + + return program; +} diff --git a/src/commands/update/ollama.ts b/src/commands/update/ollama.ts new file mode 100644 index 00000000..1821a2de --- /dev/null +++ b/src/commands/update/ollama.ts @@ -0,0 +1,42 @@ +import Docker from "dockerode" + +export class OllamaAction { + private docker: Docker; + + constructor() { + this.docker = new Docker(); + } + + async updateModel(modelName: string) { + await this.executeModelCommand("pull", modelName, `Model "${modelName}" updated successfully`); + } + + async removeModel(modelName: string) { + await this.executeModelCommand("rm", modelName, `Model "${modelName}" removed successfully`); + } + + private async executeModelCommand(command: string, modelName: string, successMessage: string) { + try { + const ollamaContainer = this.docker.getContainer("ollama"); + const exec = await ollamaContainer.exec({ + Cmd: ["ollama", command, modelName], + AttachStdout: true, + AttachStderr: true, + }); + const stream = await exec.start({ Detach: false, Tty: false }); + + stream.on("data", (chunk: any) => { + console.log(chunk.toString()); + }); + + await new Promise((resolve, reject) => { + stream.on("end", resolve); + stream.on("error", reject); + }); + + console.log(successMessage); + } catch (error) { + console.error(`Error executing command "${command}" on model "${modelName}":`, error); + } + } +} diff --git a/src/index.ts b/src/index.ts index 5ae3ceaf..7563c308 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { initializeGeneralCommands } from "../src/commands/general"; import { initializeKeygenCommands } from "../src/commands/keygen"; import { initializeContractsCommands } from "../src/commands/contracts"; import { initializeConfigCommands } from "../src/commands/config"; +import { initializeUpdateCommands } from "../src/commands/update"; export function initializeCLI() { program.version(version).description(CLI_DESCRIPTION); @@ -13,6 +14,7 @@ export function initializeCLI() { initializeKeygenCommands(program); initializeContractsCommands(program); initializeConfigCommands(program); + initializeUpdateCommands(program) program.parse(process.argv); } diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index 64509915..27189fdb 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -5,7 +5,6 @@ export interface ISimulatorService { getComposeOptions(): string; checkInstallRequirements(): Promise>; checkVersionRequirements(): Promise>; - pullOllamaModel(): Promise; runSimulator(): Promise<{stdout: string; stderr: string}>; waitForSimulatorToBeReady(retries?: number): Promise; createRandomValidators(numValidators: number, llmProviders: AiProviders[]): Promise; diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 96ac2d85..18109a8d 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -150,39 +150,6 @@ export class SimulatorService implements ISimulatorService { } } - public async pullOllamaModel(): Promise { - try { - const ollamaContainer = this.docker.getContainer("ollama"); - - // Create the exec instance - const exec = await ollamaContainer.exec({ - Cmd: ["ollama", "pull", "llama3"], - AttachStdout: true, - AttachStderr: true, - }); - - // Start the exec instance and attach to the stream - const stream = await exec.start({ Detach: false, Tty: false }); - - // Collect and log the output - stream.on("data", (chunk) => { - console.log(chunk.toString()); - }); - - await new Promise((resolve, reject) => { - stream.on("end", resolve); - stream.on("error", reject); - }); - - console.log("Command executed successfully"); - return true; - } catch (error) { - console.error("Error executing ollama pull llama3:", error); - return false; - } - } - - public runSimulator(): Promise<{stdout: string; stderr: string}> { const commandsByPlatform = DEFAULT_RUN_SIMULATOR_COMMAND(this.location, this.getComposeOptions()); return executeCommand(commandsByPlatform); diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index c3945212..c2c8c0a8 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -8,10 +8,12 @@ import {join} from "path"; import fs from "fs"; import * as dotenv from "dotenv"; import {localnetCompatibleVersion} from "../../src/lib/config/simulator"; +import { OllamaAction } from "../../src/commands/update/ollama"; vi.mock("fs"); vi.mock("dotenv"); +vi.mock("../../src/commands/update/ollama") const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); @@ -29,7 +31,6 @@ describe("init action", () => { let simServgetAiProvidersOptions: ReturnType; let simServRunSimulator: ReturnType; let simServWaitForSimulator: ReturnType; - let simServPullOllamaModel: ReturnType; let simServDeleteAllValidators: ReturnType; let simServCreateRandomValidators: ReturnType; let simServOpenFrontend: ReturnType; @@ -50,7 +51,6 @@ describe("init action", () => { simServgetAiProvidersOptions = vi.spyOn(simulatorService, "getAiProvidersOptions"); simServRunSimulator = vi.spyOn(simulatorService, "runSimulator"); simServWaitForSimulator = vi.spyOn(simulatorService, "waitForSimulatorToBeReady"); - simServPullOllamaModel = vi.spyOn(simulatorService, "pullOllamaModel"); simServDeleteAllValidators = vi.spyOn(simulatorService, "deleteAllValidators"); simServCreateRandomValidators = vi.spyOn(simulatorService, "createRandomValidators"); simServOpenFrontend = vi.spyOn(simulatorService, "openFrontend"); @@ -162,9 +162,11 @@ describe("init action", () => { { name: "OpenAI", value: "openai" }, { name: "Heurist", value: "heuristai" }, ]); + + vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); + simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServPullOllamaModel.mockResolvedValue(true); simServDeleteAllValidators.mockResolvedValue(true); simServCreateRandomValidators.mockResolvedValue(true); simServOpenFrontend.mockResolvedValue(true); @@ -192,9 +194,11 @@ describe("init action", () => { { name: "OpenAI", value: "openai" }, { name: "Heurist", value: "heuristai" }, ]); + + vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); + simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServPullOllamaModel.mockResolvedValue(true); simServDeleteAllValidators.mockResolvedValue(true); simServCreateRandomValidators.mockResolvedValue(true); simServOpenFrontend.mockResolvedValue(true); @@ -221,9 +225,11 @@ describe("init action", () => { { name: "OpenAI", value: "openai" }, { name: "Heurist", value: "heuristai" }, ]); + + vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); + simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServPullOllamaModel.mockResolvedValue(true); simServDeleteAllValidators.mockResolvedValue(true); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); @@ -264,16 +270,17 @@ describe("init action", () => { { name: "Ollama", value: "ollama" }, ]); + vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); + simServRunSimulator.mockResolvedValue(true); simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServPullOllamaModel.mockResolvedValue(true); simServDeleteAllValidators.mockResolvedValue(true); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); await initAction(defaultActionOptions, simulatorService); - expect(simServPullOllamaModel).toHaveBeenCalled(); + expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); }); test("logs error if checkVersionRequirements throws", async () => { diff --git a/tests/actions/ollama.test.ts b/tests/actions/ollama.test.ts new file mode 100644 index 00000000..c3b0eeb3 --- /dev/null +++ b/tests/actions/ollama.test.ts @@ -0,0 +1,129 @@ +import {describe, test, vi, beforeEach, afterEach, expect, Mock} from "vitest"; +import { OllamaAction } from "../../src/commands/update/ollama"; +import Docker from "dockerode"; + +vi.mock("dockerode"); + +describe("OllamaAction", () => { + let ollamaAction: OllamaAction; + let mockGetContainer: Mock; + let mockExec: Mock; + let mockStart: Mock; + let mockStream: any; + + beforeEach(() => { + vi.clearAllMocks(); + ollamaAction = new OllamaAction(); + + mockGetContainer = vi.mocked(Docker.prototype.getContainer); + mockExec = vi.fn(); + mockStart = vi.fn(); + + mockStream = { + on: vi.fn(), + }; + + mockExec.mockResolvedValue({ + start: mockStart, + }); + + mockStart.mockResolvedValue(mockStream); + + mockGetContainer.mockReturnValue({ + exec: mockExec, + } as unknown as Docker.Container); + + Docker.prototype.getContainer = mockGetContainer; + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("should update the model using 'pull'", async () => { + mockStream.on.mockImplementation((event: any, callback:any) => { + if (event === "data") callback(Buffer.from("Mocked output")); + if (event === "end") callback(); + }); + + console.log = vi.fn(); + + await ollamaAction.updateModel("mocked_model"); + + expect(mockGetContainer).toHaveBeenCalledWith("ollama"); + expect(mockExec).toHaveBeenCalledWith({ + Cmd: ["ollama", "pull", "mocked_model"], + AttachStdout: true, + AttachStderr: true, + }); + expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); + expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); + expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); + expect(console.log).toHaveBeenCalledWith("Mocked output"); + expect(console.log).toHaveBeenCalledWith('Model "mocked_model" updated successfully'); + }); + + test("should remove the model using 'rm'", async () => { + mockStream.on.mockImplementation((event:any, callback:any) => { + if (event === "data") callback(Buffer.from("Mocked output")); + if (event === "end") callback(); + }); + + console.log = vi.fn(); + + await ollamaAction.removeModel("mocked_model"); + + expect(mockGetContainer).toHaveBeenCalledWith("ollama"); + expect(mockExec).toHaveBeenCalledWith({ + Cmd: ["ollama", "rm", "mocked_model"], + AttachStdout: true, + AttachStderr: true, + }); + expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); + expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); + expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); + expect(console.log).toHaveBeenCalledWith("Mocked output"); + expect(console.log).toHaveBeenCalledWith('Model "mocked_model" removed successfully'); + }); + + test("should log an error if an exception occurs during 'pull'", async () => { + const error = new Error("Mocked error"); + mockGetContainer.mockReturnValueOnce( + { + exec: () => { + throw new Error("Mocked error"); + } + } + ); + console.error = vi.fn(); + + await ollamaAction.updateModel("mocked_model"); + + expect(mockGetContainer).toHaveBeenCalledWith("ollama"); + expect(console.error).toHaveBeenCalledWith( + 'Error executing command "pull" on model "mocked_model":', + error + ); + }); + + test("should log an error if an exception occurs during 'rm'", async () => { + const error = new Error("Mocked error"); + mockGetContainer.mockReturnValueOnce( + { + exec: () => { + throw new Error("Mocked error"); + } + } + ); + + console.error = vi.fn(); + + await ollamaAction.removeModel("mocked_model"); + + expect(mockGetContainer).toHaveBeenCalledWith("ollama"); + expect(console.error).toHaveBeenCalledWith( + 'Error executing command "rm" on model "mocked_model":', + error + ); + }); +}); diff --git a/tests/commands/update.test.ts b/tests/commands/update.test.ts new file mode 100644 index 00000000..00dcb947 --- /dev/null +++ b/tests/commands/update.test.ts @@ -0,0 +1,43 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeUpdateCommands } from "../../src/commands/update"; +import { OllamaAction } from "../../src/commands/update/ollama"; + +vi.mock("../../src/commands/update/ollama"); + +describe("ollama command", () => { + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeUpdateCommands(program); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("OllamaAction.updateModel is called with model option", async () => { + program.parse(["node", "test", "update", "ollama", "--model", "mocked_model"]); + expect(OllamaAction).toHaveBeenCalledTimes(1); + expect(OllamaAction.prototype.updateModel).toHaveBeenCalledWith("mocked_model"); + }); + + test("OllamaAction.updateModel is called with default model", async () => { + program.parse(["node", "test", "update", "ollama"]); + expect(OllamaAction).toHaveBeenCalledTimes(1); + expect(OllamaAction.prototype.updateModel).toHaveBeenCalledWith("default-model"); + }); + + test("OllamaAction.removeModel is called with model option", async () => { + program.parse(["node", "test", "update", "ollama", "--model", "mocked_model", "--remove"]); + expect(OllamaAction).toHaveBeenCalledTimes(1); + expect(OllamaAction.prototype.removeModel).toHaveBeenCalledWith("mocked_model"); + }); + + test("OllamaAction.removeModel is called with default model", async () => { + program.parse(["node", "test", "update", "ollama", "--remove"]); + expect(OllamaAction).toHaveBeenCalledTimes(1); + expect(OllamaAction.prototype.removeModel).toHaveBeenCalledWith("default-model"); + }); +}); diff --git a/tests/index.test.ts b/tests/index.test.ts index 8fd80236..e72ba16c 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -25,6 +25,10 @@ vi.mock("../src/commands/config", () => ({ initializeConfigCommands: vi.fn(), })); +vi.mock("../src/commands/update", () => ({ + initializeUpdateCommands: vi.fn(), +})); + describe("CLI", () => { it("should initialize CLI", () => { diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 7205c740..65cac3b1 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -284,7 +284,6 @@ describe("SimulatorService - Basic Tests", () => { }); describe("SimulatorService - Docker Tests", () => { - let mockExec: Mock; let mockGetContainer: Mock; let mockListContainers: Mock; let mockListImages: Mock; @@ -293,7 +292,6 @@ describe("SimulatorService - Docker Tests", () => { beforeEach(() => { vi.clearAllMocks(); - mockExec = vi.fn().mockResolvedValueOnce({}); mockGetContainer = vi.mocked(Docker.prototype.getContainer); mockListContainers = vi.mocked(Docker.prototype.listContainers); mockListImages = vi.mocked(Docker.prototype.listImages); @@ -301,76 +299,6 @@ describe("SimulatorService - Docker Tests", () => { mockPing = vi.mocked(Docker.prototype.ping); }); - test("should handle errors during the execution of pullOllamaModel gracefully", async () => { - const mockExec = vi.fn(); - const mockStart = vi.fn(); - - mockExec.mockResolvedValue({ - start: mockStart, - }); - - const mockStream = { - on: vi.fn((event, callback) => { - if (event === "data") callback("Mock data chunk"); - if (event === "error") callback(new Error("Mock error during stream")); - }), - }; - - mockStart.mockResolvedValue(mockStream); - - mockGetContainer.mockReturnValueOnce({ - exec: mockExec, - } as unknown as Docker.Container); - - const result = await simulatorService.pullOllamaModel(); - - expect(result).toBe(false); - expect(mockGetContainer).toHaveBeenCalledWith("ollama"); - expect(mockExec).toHaveBeenCalledWith({ - Cmd: ["ollama", "pull", "llama3"], - AttachStdout: true, - AttachStderr: true, - }); - expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); - expect(mockStream.on).toHaveBeenCalledWith("error", expect.any(Function)); - }); - - test("should successfully execute pullOllamaModel and return true", async () => { - const mockExec = vi.fn(); - const mockStart = vi.fn(); - - mockExec.mockResolvedValue({ - start: mockStart, - }); - - const mockStream = { - on: vi.fn((event, callback) => { - if (event === "data") callback("Mock data chunk"); - if (event === "end") callback(); - }), - }; - - mockStart.mockResolvedValue(mockStream); - - mockGetContainer.mockReturnValueOnce({ - exec: mockExec, - } as unknown as Docker.Container); - - const result = await simulatorService.pullOllamaModel(); - - expect(result).toBe(true); - expect(mockGetContainer).toHaveBeenCalledWith("ollama"); - expect(mockExec).toHaveBeenCalledWith({ - Cmd: ["ollama", "pull", "llama3"], - AttachStdout: true, - AttachStderr: true, - }); - expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); - expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); - expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); - }); - - test("should stop and remove Docker containers with the specified prefix", async () => { const mockContainers = [ { From 140565c4cc8c31a4a1f9d7b585cd3e5f4e288d0d Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Thu, 9 Jan 2025 03:52:12 -0300 Subject: [PATCH 48/67] feat: Add New GitHub Action (#130) --- .github/workflows/validate-code.yml | 44 + package-lock.json | 5409 ++++++++++++++++++--------- package.json | 5 + 3 files changed, 3592 insertions(+), 1866 deletions(-) create mode 100644 .github/workflows/validate-code.yml diff --git a/.github/workflows/validate-code.yml b/.github/workflows/validate-code.yml new file mode 100644 index 00000000..aa84ee12 --- /dev/null +++ b/.github/workflows/validate-code.yml @@ -0,0 +1,44 @@ +name: CI Workflow + +on: + pull_request: + types: + - opened + - synchronize + - reopened + push: + branches: + - main + +jobs: + build-and-test: + name: Build and Test + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Build the project + run: npm run build + + - name: Run tests + run: npm run test:coverage + + - name: Upload coverage report + if: success() + uses: codecov/codecov-action@v5.1.1 + with: + verbose: true + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true + directory: coverage \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4cc4110e..b9d6b8ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,13 +49,6 @@ "typescript": "^5.4.5" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", @@ -64,6 +57,8 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -74,21 +69,15 @@ "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@babel/code-frame": { - "version": "7.24.2", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -97,6 +86,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { @@ -105,140 +96,238 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "license": "Apache-2.0" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@babel/parser": { - "version": "7.26.2", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@babel/types": { - "version": "7.26.0", + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@balena/dockerignore": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", - "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", - "license": "Apache-2.0" + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -246,27 +335,289 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" ], "engines": { "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "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.10.0", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -274,6 +625,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -295,6 +648,8 @@ }, "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==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -303,6 +658,8 @@ }, "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==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -313,6 +670,8 @@ }, "node_modules/@eslint/js": { "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -320,6 +679,9 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", @@ -332,6 +694,8 @@ }, "node_modules/@humanwhocodes/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==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -340,6 +704,8 @@ }, "node_modules/@humanwhocodes/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==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -350,6 +716,8 @@ }, "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==", "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -361,10 +729,15 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "license": "BSD-3-Clause" }, "node_modules/@hutson/parse-repository-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", + "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -373,11 +746,15 @@ }, "node_modules/@iarna/toml": { "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", "dev": true, "license": "ISC" }, "node_modules/@inquirer/figures": { - "version": "1.0.1", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", "license": "MIT", "engines": { "node": ">=18" @@ -385,6 +762,8 @@ }, "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": { @@ -401,6 +780,8 @@ }, "node_modules/@isaacs/cliui/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": { @@ -412,6 +793,8 @@ }, "node_modules/@isaacs/cliui/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": { @@ -423,11 +806,15 @@ }, "node_modules/@isaacs/cliui/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/@isaacs/cliui/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": { @@ -444,6 +831,8 @@ }, "node_modules/@isaacs/cliui/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": { @@ -458,6 +847,8 @@ }, "node_modules/@isaacs/cliui/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": { @@ -474,6 +865,8 @@ }, "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": { @@ -481,7 +874,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -493,17 +888,10 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "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": { @@ -512,6 +900,8 @@ }, "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": { @@ -520,25 +910,19 @@ }, "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==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "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.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@noble/curves": { @@ -567,6 +951,8 @@ }, "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==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -578,6 +964,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==", "license": "MIT", "engines": { "node": ">= 8" @@ -585,6 +973,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==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -596,6 +986,8 @@ }, "node_modules/@nolyfill/is-core-module": { "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", "dev": true, "license": "MIT", "engines": { @@ -604,6 +996,8 @@ }, "node_modules/@octokit/auth-token": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, "license": "MIT", "engines": { @@ -612,6 +1006,8 @@ }, "node_modules/@octokit/core": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", + "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", "dev": true, "license": "MIT", "dependencies": { @@ -629,6 +1025,8 @@ }, "node_modules/@octokit/endpoint": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dev": true, "license": "MIT", "dependencies": { @@ -641,6 +1039,8 @@ }, "node_modules/@octokit/graphql": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", + "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -653,16 +1053,20 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.1.0", + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", "dev": true, "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.1", + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", + "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^12.6.0" + "@octokit/types": "^13.5.0" }, "engines": { "node": ">= 18" @@ -671,21 +1075,10 @@ "@octokit/core": "5" } }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "12.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } - }, "node_modules/@octokit/plugin-request-log": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", + "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", "dev": true, "license": "MIT", "engines": { @@ -696,34 +1089,25 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "10.4.1", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", + "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^12.6.0" + "@octokit/types": "^13.5.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "12.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" + "@octokit/core": "^5" } }, "node_modules/@octokit/request": { "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dev": true, "license": "MIT", "dependencies": { @@ -738,6 +1122,8 @@ }, "node_modules/@octokit/request-error": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -750,29 +1136,35 @@ } }, "node_modules/@octokit/rest": { - "version": "20.1.0", + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", + "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", "dev": true, "license": "MIT", "dependencies": { "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "^9.1.5", + "@octokit/plugin-paginate-rest": "11.3.1", "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "^10.2.0" + "@octokit/plugin-rest-endpoint-methods": "13.2.2" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/types": { - "version": "13.4.1", + "version": "13.6.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.2.tgz", + "integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^22.1.0" + "@octokit/openapi-types": "^22.2.0" } }, "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, @@ -782,6 +1174,8 @@ }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, "license": "MIT", "engines": { @@ -790,151 +1184,63 @@ }, "node_modules/@pnpm/network.ca-file": { "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@release-it/conventional-changelog": { - "version": "8.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog": "^5.1.0", - "conventional-recommended-bump": "^9.0.0", - "git-semver-tags": "^8.0.0", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || ^22.0.0" - }, - "peerDependencies": { - "release-it": "^17.0.0" - } - }, - "node_modules/@release-it/conventional-changelog/node_modules/@conventional-changelog/git-client": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/semver": "^7.5.5", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0" - }, - "peerDependenciesMeta": { - "conventional-commits-filter": { - "optional": true - }, - "conventional-commits-parser": { - "optional": true - } - } - }, - "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-filter": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@release-it/conventional-changelog/node_modules/conventional-commits-parser": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "meow": "^13.0.0" - }, - "bin": { - "conventional-commits-parser": "dist/cli/index.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@release-it/conventional-changelog/node_modules/git-semver-tags": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@conventional-changelog/git-client": "^1.0.0", - "meow": "^13.0.0" - }, - "bin": { - "git-semver-tags": "src/cli.js" + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" }, "engines": { - "node": ">=18" + "node": ">=12.22.0" } }, - "node_modules/@release-it/conventional-changelog/node_modules/meow": { - "version": "13.2.0", + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=12" } }, - "node_modules/@release-it/conventional-changelog/node_modules/semver": { - "version": "7.6.3", + "node_modules/@release-it/conventional-changelog": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-8.0.2.tgz", + "integrity": "sha512-WpnWWRr7O0JeLoiejLrPEWnnwFhCscBn1wBTAXeitiz2/Ifaol0s+t8otf/HYq/OiQOri2iH8d0CnVb72tBdIQ==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog": "^5.1.0", + "conventional-recommended-bump": "^9.0.0", + "git-semver-tags": "^8.0.0", + "semver": "^7.6.3" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || ^22.0.0" + }, + "peerDependencies": { + "release-it": "^17.0.0" } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.4", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, "node_modules/@rtsao/scc": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "license": "MIT" }, "node_modules/@scure/base": { @@ -1024,19 +1330,10 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, "license": "MIT", "engines": { @@ -1046,39 +1343,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node10": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, @@ -1094,9 +1390,9 @@ } }, "node_modules/@types/dockerode": { - "version": "3.3.31", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.31.tgz", - "integrity": "sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==", + "version": "3.3.32", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.32.tgz", + "integrity": "sha512-xxcG0g5AWKtNyh7I7wswLdFvym4Mlqks5ZlKzxEUrGHS0r0PUOfxm2T0mspwu10mHQqu3Ck3MI3V2HqvLWE1fg==", "dev": true, "license": "MIT", "dependencies": { @@ -1107,15 +1403,14 @@ }, "node_modules/@types/estree": { "version": "1.0.6", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "dev": true, + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, "node_modules/@types/inquirer": { "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", + "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", "dev": true, "license": "MIT", "dependencies": { @@ -1123,17 +1418,16 @@ "rxjs": "^7.2.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, "node_modules/@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.0", + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1142,16 +1436,22 @@ }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true, "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, "license": "MIT" }, "node_modules/@types/sinon": { "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", + "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", "dev": true, "license": "MIT", "dependencies": { @@ -1160,6 +1460,8 @@ }, "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", "dev": true, "license": "MIT" }, @@ -1174,9 +1476,9 @@ } }, "node_modules/@types/ssh2/node_modules/@types/node": { - "version": "18.19.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", - "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "version": "18.19.68", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz", + "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==", "dev": true, "license": "MIT", "dependencies": { @@ -1192,6 +1494,8 @@ }, "node_modules/@types/through": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1200,24 +1504,26 @@ }, "node_modules/@types/uuid": { "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/type-utils": "7.7.0", - "@typescript-eslint/utils": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -1238,14 +1544,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { @@ -1265,12 +1573,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1281,12 +1591,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -1307,7 +1619,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, "license": "MIT", "engines": { @@ -1319,12 +1633,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1346,17 +1662,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1370,11 +1685,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.0", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -1386,11 +1703,15 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", "license": "ISC" }, "node_modules/@vitest/coverage-v8": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.8.tgz", + "integrity": "sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==", "dev": true, "license": "MIT", "dependencies": { @@ -1403,7 +1724,7 @@ "istanbul-reports": "^3.1.7", "magic-string": "^0.30.12", "magicast": "^0.3.5", - "std-env": "^3.7.0", + "std-env": "^3.8.0", "test-exclude": "^7.0.1", "tinyrainbow": "^1.2.0" }, @@ -1411,8 +1732,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "2.1.4", - "vitest": "2.1.4" + "@vitest/browser": "2.1.8", + "vitest": "2.1.8" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -1420,66 +1741,14 @@ } } }, - "node_modules/@vitest/coverage-v8/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/glob": { - "version": "10.4.5", - "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/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { - "version": "7.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@vitest/expect": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, @@ -1488,10 +1757,12 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.4", + "@vitest/spy": "2.1.8", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, @@ -1512,7 +1783,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", "license": "MIT", "dependencies": { "tinyrainbow": "^1.2.0" @@ -1522,10 +1795,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.4", + "@vitest/utils": "2.1.8", "pathe": "^1.1.2" }, "funding": { @@ -1533,10 +1808,12 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.1.8", "magic-string": "^0.30.12", "pathe": "^1.1.2" }, @@ -1545,7 +1822,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", "license": "MIT", "dependencies": { "tinyspy": "^3.0.2" @@ -1555,10 +1834,12 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.1.8", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, @@ -1588,7 +1869,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1599,21 +1882,30 @@ }, "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==", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.3.2", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, "node_modules/add-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", "dev": true, "license": "MIT" }, @@ -1624,18 +1916,19 @@ "license": "MIT" }, "node_modules/agent-base": { - "version": "7.1.1", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "devOptional": 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==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1650,6 +1943,8 @@ }, "node_modules/ansi-align": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "license": "ISC", "dependencies": { @@ -1658,6 +1953,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -1671,6 +1968,8 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -1681,6 +1980,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -1688,6 +1989,8 @@ }, "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==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -1701,19 +2004,25 @@ }, "node_modules/arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "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==", "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -1724,11 +2033,15 @@ }, "node_modules/array-ify": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true, "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -1747,6 +2060,8 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { @@ -1755,6 +2070,8 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -1772,13 +2089,15 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1788,32 +2107,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.7", - "dev": true, + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1823,17 +2125,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -1853,6 +2156,8 @@ }, "node_modules/assertion-error": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "license": "MIT", "engines": { "node": ">=12" @@ -1860,6 +2165,8 @@ }, "node_modules/ast-types": { "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "license": "MIT", "dependencies": { @@ -1871,6 +2178,8 @@ }, "node_modules/async-retry": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -1879,11 +2188,25 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "devOptional": true, "license": "MIT" }, + "node_modules/atomically": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", + "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", + "dev": true, + "dependencies": { + "stubborn-fs": "^1.2.5", + "when-exit": "^2.1.1" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -1897,10 +2220,14 @@ }, "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==", "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==", "funding": [ { "type": "github", @@ -1919,6 +2246,8 @@ }, "node_modules/basic-ftp": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, "license": "MIT", "engines": { @@ -1936,11 +2265,15 @@ }, "node_modules/before-after-hook": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -1949,28 +2282,32 @@ } }, "node_modules/boxen": { - "version": "7.1.1", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", "dev": true, "license": "MIT", "dependencies": { "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", + "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": { @@ -1982,6 +2319,8 @@ }, "node_modules/boxen/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": { @@ -1991,19 +2330,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz", + "integrity": "sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==", "dev": true, "license": "MIT", "engines": { @@ -2014,21 +2344,25 @@ } }, "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", + "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/boxen/node_modules/string-width": { - "version": "5.1.2", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2036,6 +2370,8 @@ }, "node_modules/boxen/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": { @@ -2049,27 +2385,31 @@ } }, "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", + "version": "4.30.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.2.tgz", + "integrity": "sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12.20" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -2077,6 +2417,8 @@ }, "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": { @@ -2084,11 +2426,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", + "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.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2096,6 +2440,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -2118,6 +2464,8 @@ }, "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" }, @@ -2132,6 +2480,8 @@ }, "node_modules/bundle-name": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" @@ -2145,45 +2495,52 @@ }, "node_modules/cac": { "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "dev": true, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "dev": true, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" } }, - "node_modules/call-bind": { - "version": "1.0.7", + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -2192,15 +2549,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/chai": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", @@ -2215,6 +2589,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -2229,10 +2605,14 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, "node_modules/check-error": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "license": "MIT", "engines": { "node": ">= 16" @@ -2245,7 +2625,9 @@ "license": "ISC" }, "node_modules/ci-info": { - "version": "3.9.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", "dev": true, "funding": [ { @@ -2260,6 +2642,8 @@ }, "node_modules/cli-boxes": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, "license": "MIT", "engines": { @@ -2271,6 +2655,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" @@ -2281,6 +2667,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=6" @@ -2291,6 +2679,8 @@ }, "node_modules/cli-width": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "license": "ISC", "engines": { "node": ">= 12" @@ -2298,6 +2688,8 @@ }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" @@ -2305,6 +2697,8 @@ }, "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==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2315,10 +2709,14 @@ }, "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==", "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2329,7 +2727,9 @@ } }, "node_modules/commander": { - "version": "12.0.0", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "engines": { "node": ">=18" @@ -2337,6 +2737,8 @@ }, "node_modules/compare-func": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "license": "MIT", "dependencies": { @@ -2346,10 +2748,14 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "engines": [ "node >= 6.0" @@ -2364,6 +2770,8 @@ }, "node_modules/config-chain": { "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2371,56 +2779,58 @@ "proto-list": "~1.2.1" } }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" - }, "node_modules/configstore": { - "version": "6.0.0", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.0.0.tgz", + "integrity": "sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" + "atomically": "^2.0.3", + "dot-prop": "^9.0.0", + "graceful-fs": "^4.2.11", + "xdg-basedir": "^5.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/yeoman/configstore?sponsor=1" } }, "node_modules/configstore/node_modules/dot-prop": { - "version": "6.0.1", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", "dev": true, "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" + "type-fest": "^4.18.2" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", + "node_modules/configstore/node_modules/type-fest": { + "version": "4.30.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.2.tgz", + "integrity": "sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==", "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/conventional-changelog": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-5.1.0.tgz", + "integrity": "sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==", "dev": true, "license": "MIT", "dependencies": { @@ -2442,6 +2852,8 @@ }, "node_modules/conventional-changelog-angular": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, "license": "ISC", "dependencies": { @@ -2453,6 +2865,8 @@ }, "node_modules/conventional-changelog-atom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz", + "integrity": "sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==", "dev": true, "license": "ISC", "engines": { @@ -2461,6 +2875,8 @@ }, "node_modules/conventional-changelog-codemirror": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz", + "integrity": "sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==", "dev": true, "license": "ISC", "engines": { @@ -2469,6 +2885,8 @@ }, "node_modules/conventional-changelog-conventionalcommits": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", "dev": true, "license": "ISC", "dependencies": { @@ -2480,6 +2898,8 @@ }, "node_modules/conventional-changelog-core": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz", + "integrity": "sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==", "dev": true, "license": "MIT", "dependencies": { @@ -2498,8 +2918,27 @@ "node": ">=16" } }, + "node_modules/conventional-changelog-core/node_modules/git-semver-tags": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz", + "integrity": "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^12.0.1", + "semver": "^7.5.2" + }, + "bin": { + "git-semver-tags": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/conventional-changelog-ember": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz", + "integrity": "sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==", "dev": true, "license": "ISC", "engines": { @@ -2508,6 +2947,8 @@ }, "node_modules/conventional-changelog-eslint": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz", + "integrity": "sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==", "dev": true, "license": "ISC", "engines": { @@ -2516,6 +2957,8 @@ }, "node_modules/conventional-changelog-express": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz", + "integrity": "sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==", "dev": true, "license": "ISC", "engines": { @@ -2524,6 +2967,8 @@ }, "node_modules/conventional-changelog-jquery": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz", + "integrity": "sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==", "dev": true, "license": "ISC", "engines": { @@ -2532,6 +2977,8 @@ }, "node_modules/conventional-changelog-jshint": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz", + "integrity": "sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==", "dev": true, "license": "ISC", "dependencies": { @@ -2543,6 +2990,8 @@ }, "node_modules/conventional-changelog-preset-loader": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", + "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==", "dev": true, "license": "MIT", "engines": { @@ -2551,6 +3000,8 @@ }, "node_modules/conventional-changelog-writer": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", + "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", "dev": true, "license": "MIT", "dependencies": { @@ -2570,6 +3021,8 @@ }, "node_modules/conventional-commits-filter": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", + "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", "dev": true, "license": "MIT", "engines": { @@ -2578,6 +3031,8 @@ }, "node_modules/conventional-commits-parser": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dev": true, "license": "MIT", "dependencies": { @@ -2595,6 +3050,8 @@ }, "node_modules/conventional-recommended-bump": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-9.0.0.tgz", + "integrity": "sha512-HR1yD0G5HgYAu6K0wJjLd7QGRK8MQDqqj6Tn1n/ja1dFwBCE6QmV+iSgQ5F7hkx7OUR/8bHpxJqYtXj2f/opPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2612,8 +3069,27 @@ "node": ">=16" } }, + "node_modules/conventional-recommended-bump/node_modules/git-semver-tags": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-7.0.1.tgz", + "integrity": "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^12.0.1", + "semver": "^7.5.2" + }, + "bin": { + "git-semver-tags": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { @@ -2637,6 +3113,39 @@ } } }, + "node_modules/cosmiconfig/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/cosmiconfig/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cpu-features": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", @@ -2653,11 +3162,15 @@ }, "node_modules/create-require": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/cross-env": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2674,7 +3187,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2685,33 +3200,10 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cssstyle": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2723,6 +3215,8 @@ }, "node_modules/dargs": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", "dev": true, "license": "MIT", "engines": { @@ -2733,15 +3227,19 @@ } }, "node_modules/data-uri-to-buffer": { - "version": "4.0.1", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 12" + "node": ">= 14" } }, "node_modules/data-urls": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2752,44 +3250,15 @@ "node": ">=18" } }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.0.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.0.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/data-view-buffer": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2799,25 +3268,29 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -2829,7 +3302,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2845,36 +3320,15 @@ }, "node_modules/decimal.js": { "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "devOptional": true, "license": "MIT" }, - "node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-eql": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "license": "MIT", "engines": { "node": ">=6" @@ -2882,6 +3336,8 @@ }, "node_modules/deep-extend": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -2889,10 +3345,14 @@ }, "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==", "license": "MIT" }, "node_modules/default-browser": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -2907,6 +3367,8 @@ }, "node_modules/default-browser-id": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "license": "MIT", "engines": { "node": ">=18" @@ -2917,6 +3379,8 @@ }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -2925,16 +3389,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -2950,6 +3408,8 @@ }, "node_modules/define-lazy-prop": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", "engines": { "node": ">=12" @@ -2960,6 +3420,8 @@ }, "node_modules/define-properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -2975,6 +3437,8 @@ }, "node_modules/degenerator": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2988,6 +3452,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "devOptional": true, "license": "MIT", "engines": { @@ -2996,11 +3462,25 @@ }, "node_modules/deprecation": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true, "license": "ISC" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -3041,6 +3521,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -3051,6 +3533,8 @@ }, "node_modules/dot-prop": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3061,7 +3545,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -3070,13 +3556,31 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "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/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==", "license": "MIT" }, "node_modules/end-of-stream": { @@ -3089,7 +3593,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3102,6 +3608,8 @@ }, "node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "devOptional": true, "license": "BSD-2-Clause", "engines": { @@ -3113,6 +3621,8 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { @@ -3121,6 +3631,8 @@ }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "license": "MIT", "dependencies": { @@ -3128,55 +3640,59 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", + "version": "1.23.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.6.tgz", + "integrity": "sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "data-view-buffer": "^1.0.1", "data-view-byte-length": "^1.0.1", "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.7", + "get-intrinsic": "^1.2.6", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", + "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", + "is-string": "^1.1.1", "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.0.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-regex-test": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", + "typed-array-byte-offset": "^1.0.3", + "typed-array-length": "^1.0.7", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -3185,49 +3701,34 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/es-define-property": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "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==", + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3238,6 +3739,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", @@ -3250,18 +3753,22 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -3271,7 +3778,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3282,34 +3791,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escape-goat": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", "dev": true, "license": "MIT", "engines": { @@ -3321,6 +3833,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=10" @@ -3331,6 +3845,8 @@ }, "node_modules/escodegen": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3351,6 +3867,9 @@ }, "node_modules/eslint": { "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -3404,6 +3923,8 @@ }, "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": { @@ -3415,6 +3936,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "license": "MIT", "dependencies": { "debug": "^3.2.7", @@ -3424,24 +3947,28 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.3", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", + "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", "dev": true, "license": "ISC", "dependencies": { "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", + "debug": "^4.3.7", "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", "fast-glob": "^3.3.2", "get-tsconfig": "^4.7.5", "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3" + "is-glob": "^4.0.3", + "stable-hash": "^0.0.4" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -3465,6 +3992,8 @@ }, "node_modules/eslint-module-utils": { "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "license": "MIT", "dependencies": { "debug": "^3.2.7" @@ -3480,6 +4009,8 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -3487,6 +4018,8 @@ }, "node_modules/eslint-plugin-import": { "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", @@ -3518,6 +4051,8 @@ }, "node_modules/eslint-plugin-import/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==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3526,6 +4061,8 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -3533,6 +4070,8 @@ }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -3543,6 +4082,8 @@ }, "node_modules/eslint-plugin-import/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3553,6 +4094,8 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3560,6 +4103,8 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -3574,6 +4119,8 @@ }, "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==", "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3584,6 +4131,8 @@ }, "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==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3592,6 +4141,8 @@ }, "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==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3602,6 +4153,8 @@ }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", @@ -3617,6 +4170,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -3628,7 +4183,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -3639,6 +4196,8 @@ }, "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==", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -3649,6 +4208,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3656,6 +4217,8 @@ }, "node_modules/estree-walker": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -3663,6 +4226,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -3692,38 +4257,17 @@ "tslib": "2.7.0", "ws": "8.17.1" }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ethers/node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/ethers/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" } }, "node_modules/eventemitter3": { @@ -3733,22 +4277,24 @@ "license": "MIT" }, "node_modules/execa": { - "version": "5.1.1", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.0.tgz", + "integrity": "sha512-CTNS0BcKBcoOsawKBlpcKNmK4Kjuyz5jVLhf+PUsHGMqiKMVTa4cN3U7r7bRY8KTpfOGpXMo27fdy0dYVg2pqA==", "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -3756,6 +4302,8 @@ }, "node_modules/expect-type": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", "license": "Apache-2.0", "engines": { "node": ">=12.0.0" @@ -3763,6 +4311,8 @@ }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -3775,10 +4325,14 @@ }, "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==", "license": "MIT" }, "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": { @@ -3794,6 +4348,8 @@ }, "node_modules/fast-glob/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": { @@ -3805,65 +4361,29 @@ }, "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==", "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==", "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" @@ -3873,7 +4393,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", + "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": { @@ -3885,6 +4407,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==", "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -3899,6 +4423,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -3910,11 +4436,15 @@ } }, "node_modules/flatted": { - "version": "3.3.1", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "license": "ISC" }, "node_modules/for-each": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "license": "MIT", "dependencies": { "is-callable": "^1.1.3" @@ -3922,6 +4452,8 @@ }, "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": { @@ -3935,19 +4467,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3959,50 +4482,23 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, - "node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "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==", "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==", + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -4014,19 +4510,25 @@ }, "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==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.6", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -4037,15 +4539,17 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/genlayer-js": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/genlayer-js/-/genlayer-js-0.4.7.tgz", - "integrity": "sha512-vp+7spuVaX7vflZd2q7qmaYgi5Cf7S/h4lAoVhAkFdyAsDStvhtwCdJGcZDt+U77AWxo3I1mUMXz0sk9ER3JXQ==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/genlayer-js/-/genlayer-js-0.4.8.tgz", + "integrity": "sha512-ypH4bSMqOEqINxBIF+Z7Aqv+m5EB9ONg2GWZFKxPVvBi4tYakfLA+Lic389pb0pFGMvtNGL6F6boO1QYd8/GTA==", "license": "MIT", "dependencies": { "eslint-plugin-import": "^2.30.0", @@ -4054,7 +4558,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.2.0", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, "license": "MIT", "engines": { @@ -4065,14 +4571,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4082,23 +4595,27 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4109,6 +4626,8 @@ }, "node_modules/get-tsconfig": { "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dev": true, "license": "MIT", "dependencies": { @@ -4119,29 +4638,24 @@ } }, "node_modules/get-uri": { - "version": "6.0.3", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", "dev": true, "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" + "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/git-raw-commits": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4157,22 +4671,95 @@ } }, "node_modules/git-semver-tags": { - "version": "7.0.1", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz", + "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==", "dev": true, "license": "MIT", "dependencies": { - "meow": "^12.0.1", + "@conventional-changelog/git-client": "^1.0.0", + "meow": "^13.0.0" + }, + "bin": { + "git-semver-tags": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/git-semver-tags/node_modules/@conventional-changelog/git-client": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz", + "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/semver": "^7.5.5", "semver": "^7.5.2" }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/git-semver-tags/node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/git-semver-tags/node_modules/conventional-commits-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.0.0.tgz", + "integrity": "sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "meow": "^13.0.0" + }, "bin": { - "git-semver-tags": "cli.mjs" + "conventional-commits-parser": "dist/cli/index.js" }, "engines": { - "node": ">=16" + "node": ">=18" + } + }, + "node_modules/git-semver-tags/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/git-up": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4182,6 +4769,8 @@ }, "node_modules/git-url-parse": { "version": "14.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", + "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4190,6 +4779,9 @@ }, "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", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -4208,6 +4800,8 @@ }, "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==", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -4218,6 +4812,8 @@ }, "node_modules/glob/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==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -4226,6 +4822,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -4234,22 +4832,36 @@ "node": "*" } }, - "node_modules/global-dirs": { - "version": "3.0.1", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "license": "MIT", "dependencies": { - "ini": "2.0.0" + "ini": "4.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "license": "MIT", "dependencies": { "type-fest": "^0.20.2" @@ -4262,10 +4874,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -4276,6 +4891,8 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { @@ -4294,50 +4911,34 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "13.0.0", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, "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==", "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4357,14 +4958,21 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -4372,6 +4980,8 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -4381,8 +4991,13 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4391,7 +5006,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4402,6 +5019,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -4415,6 +5034,8 @@ }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4424,7 +5045,9 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", "dependencies": { @@ -4434,16 +5057,10 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4455,44 +5072,33 @@ }, "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-cache-semantics": { - "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" - }, "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==", "devOptional": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=10.19.0" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "devOptional": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4500,15 +5106,19 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" + "node": ">=16.17.0" } }, "node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -4519,6 +5129,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -4536,7 +5148,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.1", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -4544,6 +5158,8 @@ }, "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==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -4556,16 +5172,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -4573,6 +5183,9 @@ }, "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.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -4581,57 +5194,48 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/inquirer": { - "version": "9.2.19", + "version": "9.3.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", + "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.1", - "@ljharb/through": "^2.3.13", + "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", - "lodash": "^4.17.21", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", "rxjs": "^7.8.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/internal-slot": { - "version": "1.0.7", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4639,6 +5243,8 @@ }, "node_modules/interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "license": "MIT", "engines": { @@ -4647,6 +5253,8 @@ }, "node_modules/ip-address": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, "license": "MIT", "dependencies": { @@ -4657,18 +5265,15 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "dev": true, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4677,12 +5282,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4691,27 +5304,29 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "node_modules/is-bigint": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4721,26 +5336,19 @@ } }, "node_modules/is-bun-module": { - "version": "1.2.1", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.6.3" } }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.6.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4749,19 +5357,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { - "version": "2.15.1", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -4774,9 +5373,13 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -4787,10 +5390,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4801,6 +5407,8 @@ }, "node_modules/is-docker": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -4814,20 +5422,56 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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==", "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -4837,7 +5481,9 @@ } }, "node_modules/is-in-ci": { - "version": "0.1.0", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", + "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", "dev": true, "license": "MIT", "bin": { @@ -4852,6 +5498,8 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "license": "MIT", "dependencies": { "is-docker": "^3.0.0" @@ -4867,15 +5515,30 @@ } }, "node_modules/is-installed-globally": { - "version": "0.4.0", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", "dev": true, "license": "MIT", "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4883,6 +5546,8 @@ }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", "engines": { "node": ">=8" @@ -4890,7 +5555,8 @@ }, "node_modules/is-map": { "version": "2.0.3", - "dev": true, + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4901,6 +5567,8 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4911,6 +5579,8 @@ }, "node_modules/is-npm": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", "dev": true, "license": "MIT", "engines": { @@ -4922,6 +5592,8 @@ }, "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": { @@ -4929,10 +5601,13 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4943,6 +5618,8 @@ }, "node_modules/is-obj": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, "license": "MIT", "engines": { @@ -4951,6 +5628,8 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -4958,15 +5637,21 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "devOptional": true, "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.4", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4977,7 +5662,8 @@ }, "node_modules/is-set": { "version": "2.0.3", - "dev": true, + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4987,10 +5673,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5001,6 +5689,8 @@ }, "node_modules/is-ssh": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5008,21 +5698,26 @@ } }, "node_modules/is-stream": { - "version": "2.0.1", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { - "version": "1.0.7", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5032,10 +5727,14 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5046,6 +5745,8 @@ }, "node_modules/is-text-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", "dev": true, "license": "MIT", "dependencies": { @@ -5056,10 +5757,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -5068,13 +5771,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "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==", "license": "MIT", "engines": { "node": ">=10" @@ -5083,11 +5783,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5095,6 +5828,8 @@ }, "node_modules/is-wsl": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -5108,10 +5843,14 @@ }, "node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isows": { @@ -5130,7 +5869,9 @@ } }, "node_modules/issue-parser": { - "version": "7.0.0", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", "dev": true, "license": "MIT", "dependencies": { @@ -5146,6 +5887,8 @@ }, "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": { @@ -5154,6 +5897,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": { @@ -5165,40 +5910,39 @@ "node": ">=10" } }, - "node_modules/istanbul-reports": { - "version": "3.1.7", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/iterate-value": { - "version": "1.0.2", + "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": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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": { @@ -5213,11 +5957,15 @@ }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "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==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5228,11 +5976,15 @@ }, "node_modules/jsbn": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, "license": "MIT" }, "node_modules/jsdom": { "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5270,61 +6022,67 @@ } } }, - "node_modules/jsdom/node_modules/tr46": { - "version": "5.0.0", + "node_modules/jsdom/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "devOptional": true, "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "devOptional": true, - "license": "BSD-2-Clause", "engines": { - "node": ">=12" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.0.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" + "node": ">=10.0.0" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "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==", "license": "MIT" }, "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "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==", "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==", "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, "license": "ISC" }, "node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "license": "MIT", "dependencies": { "minimist": "^1.2.0" @@ -5333,19 +6091,10 @@ "json5": "lib/cli.js" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -5354,6 +6103,8 @@ }, "node_modules/JSONStream": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "license": "(MIT OR Apache-2.0)", "dependencies": { @@ -5369,20 +6120,37 @@ }, "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==", "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, + "node_modules/ky": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.7.4.tgz", + "integrity": "sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/latest-version": { - "version": "7.0.0", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", + "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", "dev": true, "license": "MIT", "dependencies": { - "package-json": "^8.1.0" + "package-json": "^10.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5390,6 +6158,8 @@ }, "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==", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -5400,12 +6170,19 @@ } }, "node_modules/lines-and-columns": { - "version": "1.2.4", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, "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==", "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -5419,39 +6196,56 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, "license": "MIT" }, "node_modules/lodash.capitalize": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", "dev": true, "license": "MIT" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true, "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true, "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "dev": true, "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==", "license": "MIT" }, "node_modules/lodash.uniqby": { "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "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==", "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -5466,32 +6260,21 @@ }, "node_modules/loupe": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", "license": "MIT" }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lru-cache": { - "version": "6.0.0", + "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", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "ISC" }, "node_modules/macos-release": { - "version": "3.2.0", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz", + "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==", "dev": true, "license": "MIT", "engines": { @@ -5502,7 +6285,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -5510,6 +6295,8 @@ }, "node_modules/magicast": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5520,6 +6307,8 @@ }, "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": { @@ -5534,11 +6323,24 @@ }, "node_modules/make-error": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/meow": { "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true, "license": "MIT", "engines": { @@ -5550,11 +6352,15 @@ }, "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": { @@ -5562,11 +6368,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", + "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.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -5575,6 +6383,8 @@ }, "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==", "devOptional": true, "license": "MIT", "engines": { @@ -5583,6 +6393,8 @@ }, "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==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5593,25 +6405,35 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "4.0.0", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { - "version": "9.0.4", + "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": { @@ -5626,6 +6448,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5633,6 +6457,8 @@ }, "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": { @@ -5647,10 +6473,14 @@ }, "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==", "license": "MIT" }, "node_modules/mute-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -5664,7 +6494,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.7", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -5681,15 +6513,21 @@ }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "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/netmask": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, "license": "MIT", "engines": { @@ -5698,6 +6536,8 @@ }, "node_modules/new-github-release-url": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5712,6 +6552,8 @@ }, "node_modules/new-github-release-url/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -5721,26 +6563,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -5757,13 +6583,36 @@ } } }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/normalize-package-data": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -5771,54 +6620,74 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/normalize-url": { - "version": "8.0.1", + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { - "node": ">=14.16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/nwsapi": { - "version": "2.2.13", + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "devOptional": true, "license": "MIT" }, "node_modules/object-inspect": { - "version": "1.13.1", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.5", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -5830,6 +6699,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -5846,6 +6717,8 @@ }, "node_modules/object.groupby": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -5857,10 +6730,13 @@ } }, "node_modules/object.values": { - "version": "1.2.0", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -5873,19 +6749,24 @@ }, "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==", "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { - "version": "5.1.2", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5893,6 +6774,8 @@ }, "node_modules/open": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "license": "MIT", "dependencies": { "default-browser": "^5.2.1", @@ -5908,15 +6791,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -5924,6 +6809,8 @@ }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", "dependencies": { "bl": "^4.1.0", @@ -5945,6 +6832,8 @@ }, "node_modules/os-name": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5960,6 +6849,8 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6033,16 +6924,10 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, "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==", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -6056,6 +6941,8 @@ }, "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==", "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -6068,18 +6955,20 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" @@ -6087,6 +6976,8 @@ }, "node_modules/pac-resolver": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, "license": "MIT", "dependencies": { @@ -6098,17 +6989,19 @@ } }, "node_modules/package-json": { - "version": "8.1.1", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", + "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", "dev": true, "license": "MIT", "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" + "ky": "^1.2.0", + "registry-auth-token": "^5.0.2", + "registry-url": "^6.0.1", + "semver": "^7.6.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6116,35 +7009,44 @@ }, "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/package-json/node_modules/got": { - "version": "12.6.1", + "node_modules/package-json/node_modules/registry-auth-token": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.3.tgz", + "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "@pnpm/npm-conf": "^2.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=14" + } + }, + "node_modules/package-json/node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "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==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -6154,17 +7056,33 @@ } }, "node_modules/parse-json": { - "version": "5.2.0", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6172,6 +7090,8 @@ }, "node_modules/parse-path": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "license": "MIT", "dependencies": { @@ -6180,6 +7100,8 @@ }, "node_modules/parse-url": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "license": "MIT", "dependencies": { @@ -6188,6 +7110,8 @@ }, "node_modules/parse5": { "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6199,6 +7123,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -6206,6 +7132,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==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6213,6 +7141,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -6220,10 +7150,14 @@ }, "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==", "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": { @@ -6237,13 +7171,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { @@ -6252,10 +7183,14 @@ }, "node_modules/pathe": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "license": "MIT", "engines": { "node": ">= 14.16" @@ -6263,10 +7198,14 @@ }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "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": { @@ -6278,13 +7217,17 @@ }, "node_modules/possible-typed-array-names": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.47", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -6302,7 +7245,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -6311,13 +7254,17 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "3.3.3", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "license": "MIT", "bin": { @@ -6330,37 +7277,24 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/promise.allsettled": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "iterate-value": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/proto-list": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true, "license": "ISC" }, "node_modules/protocols": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true, "license": "MIT" }, "node_modules/proxy-agent": { "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6379,6 +7313,8 @@ }, "node_modules/proxy-agent/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", "engines": { @@ -6387,6 +7323,8 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true, "license": "MIT" }, @@ -6402,6 +7340,8 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -6409,6 +7349,8 @@ }, "node_modules/pupa": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", "dev": true, "license": "MIT", "dependencies": { @@ -6423,6 +7365,8 @@ }, "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==", "funding": [ { "type": "github", @@ -6439,19 +7383,10 @@ ], "license": "MIT" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/rc": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -6463,12 +7398,10 @@ "rc": "cli.js" } }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "license": "ISC" - }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6476,6 +7409,8 @@ }, "node_modules/read-pkg": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6493,6 +7428,8 @@ }, "node_modules/read-pkg-up": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", + "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", "dev": true, "license": "MIT", "dependencies": { @@ -6509,6 +7446,8 @@ }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "license": "MIT", "dependencies": { @@ -6524,6 +7463,8 @@ }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { @@ -6538,6 +7479,8 @@ }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6550,77 +7493,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.16.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.4", + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.1.1", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.30.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.2.tgz", + "integrity": "sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -6628,19 +7532,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", + "node_modules/read-pkg-up/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.16.0", + "version": "4.30.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.2.tgz", + "integrity": "sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -6652,6 +7560,8 @@ }, "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==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -6664,6 +7574,8 @@ }, "node_modules/rechoir": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { "resolve": "^1.1.6" @@ -6672,14 +7584,20 @@ "node": ">= 0.10" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", + "node_modules/reflect.getprototypeof": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6688,33 +7606,50 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "dev": true, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "license": "MIT", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "node_modules/registry-url": { - "version": "6.0.1", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", "license": "MIT", "dependencies": { - "rc": "1.2.8" + "rc": "^1.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/release-it": { - "version": "17.2.0", + "version": "17.10.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-17.10.0.tgz", + "integrity": "sha512-00cXYEl7RFD5NnjXpwaH9JFjpwe8w3NcfUd4XPxrKQkszp1xppPo42zK9eSbxStKyPA5CVk2KmKPDPDiAKVJTA==", "dev": true, "funding": [ { @@ -6729,29 +7664,26 @@ "license": "MIT", "dependencies": { "@iarna/toml": "2.2.5", - "@octokit/rest": "20.1.0", + "@octokit/rest": "20.1.1", "async-retry": "1.3.3", "chalk": "5.3.0", + "ci-info": "^4.0.0", "cosmiconfig": "9.0.0", - "execa": "8.0.1", + "execa": "8.0.0", "git-url-parse": "14.0.0", - "globby": "14.0.1", - "got": "13.0.0", - "inquirer": "9.2.17", - "is-ci": "3.0.1", - "issue-parser": "7.0.0", + "globby": "14.0.2", + "inquirer": "9.3.2", + "issue-parser": "7.0.1", "lodash": "4.17.21", "mime-types": "2.1.35", "new-github-release-url": "2.0.0", - "node-fetch": "3.3.2", "open": "10.1.0", - "ora": "8.0.1", + "ora": "8.1.0", "os-name": "5.1.0", - "promise.allsettled": "1.0.7", "proxy-agent": "6.4.0", - "semver": "7.6.0", + "semver": "7.6.3", "shelljs": "0.8.5", - "update-notifier": "7.0.0", + "update-notifier": "7.3.1", "url-join": "5.0.0", "wildcard-match": "5.1.3", "yargs-parser": "21.1.1" @@ -6760,11 +7692,13 @@ "release-it": "bin/release-it.js" }, "engines": { - "node": "^18.18.0 || ^20.8.0 || ^21.0.0" + "node": "^18.18.0 || ^20.9.0 || ^22.0.0" } }, "node_modules/release-it/node_modules/ansi-regex": { - "version": "6.0.1", + "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": { @@ -6776,6 +7710,8 @@ }, "node_modules/release-it/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": { @@ -6786,45 +7722,16 @@ } }, "node_modules/release-it/node_modules/emoji-regex": { - "version": "10.3.0", + "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/release-it/node_modules/execa": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/release-it/node_modules/get-stream": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/release-it/node_modules/globby": { - "version": "14.0.1", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "license": "MIT", "dependencies": { @@ -6842,63 +7749,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/human-signals": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, "node_modules/release-it/node_modules/inquirer": { - "version": "9.2.17", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.2.tgz", + "integrity": "sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw==", "dev": true, "license": "MIT", "dependencies": { - "@ljharb/through": "^2.3.13", + "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", - "figures": "^3.2.0", - "lodash": "^4.17.21", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", "rxjs": "^7.8.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.1" }, "engines": { "node": ">=18" } }, - "node_modules/release-it/node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/inquirer/node_modules/ora/node_modules/chalk": { + "node_modules/release-it/node_modules/inquirer/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": { @@ -6912,86 +7790,61 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/release-it/node_modules/is-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/node-fetch": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/release-it/node_modules/npm-run-path": { - "version": "5.3.0", + "node_modules/release-it/node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/release-it/node_modules/onetime": { - "version": "6.0.0", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/release-it/node_modules/ora": { - "version": "8.0.1", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", + "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", + "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", "strip-ansi": "^7.1.0" }, "engines": { @@ -7002,14 +7855,16 @@ } }, "node_modules/release-it/node_modules/ora/node_modules/cli-cursor": { - "version": "4.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7017,6 +7872,8 @@ }, "node_modules/release-it/node_modules/ora/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": { @@ -7027,7 +7884,9 @@ } }, "node_modules/release-it/node_modules/ora/node_modules/is-unicode-supported": { - "version": "2.0.0", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", "engines": { @@ -7039,6 +7898,8 @@ }, "node_modules/release-it/node_modules/ora/node_modules/log-symbols": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, "license": "MIT", "dependencies": { @@ -7054,6 +7915,8 @@ }, "node_modules/release-it/node_modules/ora/node_modules/log-symbols/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": { @@ -7064,7 +7927,9 @@ } }, "node_modules/release-it/node_modules/ora/node_modules/string-width": { - "version": "7.1.0", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7081,6 +7946,8 @@ }, "node_modules/release-it/node_modules/ora/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": { @@ -7093,19 +7960,10 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/release-it/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/release-it/node_modules/path-type": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "license": "MIT", "engines": { @@ -7115,103 +7973,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/restore-cursor": { - "version": "4.0.0", - "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/release-it/node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it/node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/release-it/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/release-it/node_modules/slash": { + "node_modules/release-it/node_modules/restore-cursor": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/strip-final-newline": { - "version": "3.0.0", + "node_modules/release-it/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/resolve": { - "version": "1.22.8", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, "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==", "license": "MIT", "engines": { "node": ">=4" @@ -7219,39 +8034,61 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/responselike": { - "version": "3.0.0", - "dev": true, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", + "node_modules/restore-cursor/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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "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==", + "license": "ISC" + }, "node_modules/retry": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "license": "MIT", "engines": { @@ -7260,6 +8097,8 @@ }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -7268,6 +8107,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -7280,7 +8122,10 @@ } }, "node_modules/rollup": { - "version": "4.24.4", + "name": "@rollup/wasm-node", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.29.0.tgz", + "integrity": "sha512-mYQImWcTvfemUz6c/+c3NLdzmWF0lyqt3Oj3I3dRUvfKSY43Oylzt0mVcPfhm3RKFKFlRQDMNy09WwEg1DyEuQ==", "license": "MIT", "dependencies": { "@types/estree": "1.0.6" @@ -7293,34 +8138,20 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.4", - "@rollup/rollup-android-arm64": "4.24.4", - "@rollup/rollup-darwin-arm64": "4.24.4", - "@rollup/rollup-darwin-x64": "4.24.4", - "@rollup/rollup-freebsd-arm64": "4.24.4", - "@rollup/rollup-freebsd-x64": "4.24.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.4", - "@rollup/rollup-linux-arm-musleabihf": "4.24.4", - "@rollup/rollup-linux-arm64-gnu": "4.24.4", - "@rollup/rollup-linux-arm64-musl": "4.24.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4", - "@rollup/rollup-linux-riscv64-gnu": "4.24.4", - "@rollup/rollup-linux-s390x-gnu": "4.24.4", - "@rollup/rollup-linux-x64-gnu": "4.24.4", - "@rollup/rollup-linux-x64-musl": "4.24.4", - "@rollup/rollup-win32-arm64-msvc": "4.24.4", - "@rollup/rollup-win32-ia32-msvc": "4.24.4", - "@rollup/rollup-win32-x64-msvc": "4.24.4", "fsevents": "~2.3.2" } }, "node_modules/rrweb-cssom": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "devOptional": true, "license": "MIT" }, "node_modules/run-applescript": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "license": "MIT", "engines": { "node": ">=18" @@ -7331,6 +8162,8 @@ }, "node_modules/run-async": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -7338,6 +8171,8 @@ }, "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==", "funding": [ { "type": "github", @@ -7359,18 +8194,23 @@ }, "node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-array-concat": { - "version": "1.1.2", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -7382,6 +8222,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -7399,12 +8241,14 @@ "license": "MIT" }, "node_modules/safe-regex-test": { - "version": "1.0.3", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -7415,10 +8259,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/saxes": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "devOptional": true, "license": "ISC", "dependencies": { @@ -7429,12 +8277,11 @@ } }, "node_modules/semver": { - "version": "7.6.0", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -7442,22 +8289,10 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -7473,6 +8308,8 @@ }, "node_modules/set-function-name": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -7486,6 +8323,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==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -7496,6 +8335,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==", "license": "MIT", "engines": { "node": ">=8" @@ -7503,6 +8344,8 @@ }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7518,13 +8361,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7535,14 +8434,27 @@ }, "node_modules/siginfo": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "license": "ISC" }, "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" + "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/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -7551,6 +8463,8 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", "engines": { @@ -7560,6 +8474,8 @@ }, "node_modules/socks": { "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -7572,13 +8488,15 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -7586,6 +8504,8 @@ }, "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": { @@ -7594,6 +8514,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -7601,6 +8523,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7610,11 +8534,15 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7623,7 +8551,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.17", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true, "license": "CC0-1.0" }, @@ -7635,12 +8565,21 @@ }, "node_modules/split2": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, "license": "ISC", "engines": { "node": ">= 10.x" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/ssh2": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", @@ -7658,16 +8597,29 @@ "nan": "^2.20.0" } }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" + }, "node_modules/stackback": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "license": "MIT" }, "node_modules/std-env": { - "version": "3.7.0", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "license": "MIT" }, "node_modules/stdin-discarder": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "dev": true, "license": "MIT", "engines": { @@ -7677,19 +8629,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -7697,6 +8640,8 @@ }, "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==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -7710,6 +8655,8 @@ "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": { @@ -7722,13 +8669,18 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7738,19 +8690,27 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -7766,6 +8726,8 @@ }, "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==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -7777,6 +8739,8 @@ "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": { @@ -7788,21 +8752,30 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/strip-final-newline": { - "version": "2.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -7811,8 +8784,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stubborn-fs": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", + "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==", + "dev": true + }, "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==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -7823,6 +8804,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -7833,11 +8816,15 @@ }, "node_modules/symbol-tree": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "devOptional": true, "license": "MIT" }, "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": { @@ -7872,8 +8859,46 @@ "node": ">=6" } }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/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/text-extensions": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "dev": true, "license": "MIT", "engines": { @@ -7885,23 +8910,33 @@ }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "license": "MIT" }, "node_modules/tinyexec": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", "license": "MIT" }, "node_modules/tinypool": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" @@ -7909,6 +8944,8 @@ }, "node_modules/tinyrainbow": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -7916,29 +8953,37 @@ }, "node_modules/tinyspy": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/tldts": { - "version": "6.1.58", + "version": "6.1.69", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.69.tgz", + "integrity": "sha512-Oh/CqRQ1NXNY7cy9NkTPUauOWiTro0jEYZTioGbOmcQh6EC45oribyIMJp0OJO3677r13tO6SKdWoGZUx2BDFw==", "devOptional": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.58" + "tldts-core": "^6.1.69" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.58", + "version": "6.1.69", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.69.tgz", + "integrity": "sha512-nygxy9n2PBUFQUtAXAc122gGo+04/j5qr5TGQFZTHafTKYvmARVXt2cA5rgero2/dnXUfkdPtiJoKmrd3T+wdA==", "devOptional": true, "license": "MIT" }, "node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -7949,6 +8994,8 @@ }, "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": { @@ -7960,6 +9007,8 @@ }, "node_modules/tough-cookie": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", "devOptional": true, "license": "BSD-3-Clause", "dependencies": { @@ -7970,11 +9019,22 @@ } }, "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } }, "node_modules/ts-api-utils": { - "version": "1.3.0", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", "engines": { @@ -7986,6 +9046,8 @@ }, "node_modules/ts-node": { "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8026,16 +9088,10 @@ } } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", @@ -8058,6 +9114,8 @@ }, "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==", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -8068,6 +9126,8 @@ }, "node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -8077,26 +9137,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8106,15 +9170,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -8124,15 +9191,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -8143,19 +9212,15 @@ }, "node_modules/typedarray": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { - "version": "5.4.5", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -8173,7 +9238,9 @@ "license": "MIT" }, "node_modules/uglify-js": { - "version": "3.17.4", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -8185,13 +9252,18 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8199,10 +9271,14 @@ }, "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==", "license": "MIT" }, "node_modules/unicorn-magic": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, "license": "MIT", "engines": { @@ -8212,32 +9288,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/universal-user-agent": { - "version": "6.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" }, "node_modules/update-check": { "version": "1.5.4", @@ -8249,44 +9305,22 @@ "registry-url": "3.1.0" } }, - "node_modules/update-check/node_modules/registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "license": "MIT", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/update-check/node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "license": "MIT", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/update-notifier": { - "version": "7.0.0", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-7.3.1.tgz", + "integrity": "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "boxen": "^7.1.1", + "boxen": "^8.0.1", "chalk": "^5.3.0", - "configstore": "^6.0.0", - "import-lazy": "^4.0.0", - "is-in-ci": "^0.1.0", - "is-installed-globally": "^0.4.0", + "configstore": "^7.0.0", + "is-in-ci": "^1.0.0", + "is-installed-globally": "^1.0.0", "is-npm": "^6.0.0", - "latest-version": "^7.0.0", + "latest-version": "^9.0.0", "pupa": "^3.1.0", - "semver": "^7.5.4", - "semver-diff": "^4.0.0", + "semver": "^7.6.3", "xdg-basedir": "^5.1.0" }, "engines": { @@ -8297,7 +9331,9 @@ } }, "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz", + "integrity": "sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==", "dev": true, "license": "MIT", "engines": { @@ -8309,6 +9345,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -8316,6 +9354,8 @@ }, "node_modules/url-join": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, "license": "MIT", "engines": { @@ -8324,10 +9364,14 @@ }, "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==", "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -8339,11 +9383,15 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8352,9 +9400,9 @@ } }, "node_modules/viem": { - "version": "2.21.54", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.54.tgz", - "integrity": "sha512-G9mmtbua3UtnVY9BqAtWdNp+3AO+oWhD0B9KaEsZb6gcrOWgmA4rz02yqEMg+qW9m6KgKGie7q3zcHqJIw6AqA==", + "version": "2.21.56", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.56.tgz", + "integrity": "sha512-lHcVd1sFDlVWu482Sb4j22a5+hXJWE8HwqLgXDH49L7mfdA5QHfkQgeyl7K2kKg6pBbPbxIwd9so/u3LcynKTg==", "funding": [ { "type": "github", @@ -8421,8 +9469,31 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/viem/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/vite": { - "version": "5.4.10", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "license": "MIT", "dependencies": { "esbuild": "^0.21.3", @@ -8478,34 +9549,391 @@ } } }, - "node_modules/vite-node": { - "version": "2.1.4", + "node_modules/vite-node": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" ], "engines": { "node": ">=12" @@ -8513,6 +9941,8 @@ }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -8548,28 +9978,30 @@ } }, "node_modules/vitest": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.4", - "@vitest/mocker": "2.1.4", - "@vitest/pretty-format": "^2.1.4", - "@vitest/runner": "2.1.4", - "@vitest/snapshot": "2.1.4", - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", "magic-string": "^0.30.12", "pathe": "^1.1.2", - "std-env": "^3.7.0", + "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.4", + "vite-node": "2.1.8", "why-is-node-running": "^2.3.0" }, "bin": { @@ -8584,8 +10016,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.4", - "@vitest/ui": "2.1.4", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, @@ -8612,6 +10044,8 @@ }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8623,19 +10057,13 @@ }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/webauthn-p256": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", @@ -8692,11 +10120,19 @@ } }, "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } }, "node_modules/whatwg-encoding": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8708,6 +10144,8 @@ }, "node_modules/whatwg-encoding/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8719,6 +10157,8 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "devOptional": true, "license": "MIT", "engines": { @@ -8726,15 +10166,29 @@ } }, "node_modules/whatwg-url": { - "version": "5.0.0", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "devOptional": true, "license": "MIT", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" } }, + "node_modules/when-exit": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.3.tgz", + "integrity": "sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -8747,27 +10201,80 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.15", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -8779,6 +10286,8 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "license": "MIT", "dependencies": { "siginfo": "^2.0.0", @@ -8792,21 +10301,25 @@ } }, "node_modules/widest-line": { - "version": "4.0.1", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", "dev": true, "license": "MIT", "dependencies": { - "string-width": "^5.0.1" + "string-width": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", + "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": { @@ -8817,21 +10330,25 @@ } }, "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", + "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/widest-line/node_modules/string-width": { - "version": "5.1.2", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8839,6 +10356,8 @@ }, "node_modules/widest-line/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": { @@ -8853,11 +10372,15 @@ }, "node_modules/wildcard-match": { "version": "5.1.3", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.3.tgz", + "integrity": "sha512-a95hPUk+BNzSGLntNXYxsjz2Hooi5oL7xOfJR6CKwSsSALh7vUNuTlzsrZowtYy38JNduYFRVhFv19ocqNOZlg==", "dev": true, "license": "ISC" }, "node_modules/windows-release": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", + "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", "dev": true, "license": "MIT", "dependencies": { @@ -8870,13 +10393,142 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/windows-release/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/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/windows-release/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/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/windows-release/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/windows-release/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -8890,6 +10542,8 @@ "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": { @@ -8906,10 +10560,14 @@ }, "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==", "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -8929,6 +10587,8 @@ }, "node_modules/xdg-basedir": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, "license": "MIT", "engines": { @@ -8940,6 +10600,8 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -8948,16 +10610,15 @@ }, "node_modules/xmlchars": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "devOptional": true, "license": "MIT" }, - "node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "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": { @@ -8966,6 +10627,8 @@ }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -8974,6 +10637,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==", "license": "MIT", "engines": { "node": ">=10" @@ -8981,6 +10646,18 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index b81d9bc5..622d2167 100644 --- a/package.json +++ b/package.json @@ -68,5 +68,10 @@ "uuid": "^9.0.1", "viem": "^2.21.54", "vitest": "^2.1.4" + }, + "overrides": { + "vite": { + "rollup": "npm:@rollup/wasm-node" + } } } From d9e440d0cd37368e0d8b154c7b5cbcdad463256f Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Thu, 9 Jan 2025 06:05:10 -0300 Subject: [PATCH 49/67] feat: getting default ollama model from config file (#167) --- src/commands/general/init.ts | 12 ++++++++++-- tests/actions/init.test.ts | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index e7372c23..f0ce5b16 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -2,6 +2,7 @@ import inquirer from "inquirer"; import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; import {AI_PROVIDERS_CONFIG, AiProviders} from "../../lib/config/simulator"; import { OllamaAction } from "../update/ollama"; +import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; export interface InitActionOptions { numValidators: number; @@ -179,9 +180,16 @@ export async function initAction(options: InitActionOptions, simulatorService: I // Ollama doesn't need changes in configuration, we just run it if (selectedLlmProviders.includes("ollama")) { - console.log("Pulling llama3 from Ollama..."); + const ollamaAction = new OllamaAction(); - await ollamaAction.updateModel("llama3"); + const configManager = new ConfigFileManager(); + const config = configManager.getConfig() + + let ollamaModel = config.defaultOllamaModel || 'llama3'; + + console.log(`Pulling ${ollamaModel} from Ollama...`); + + await ollamaAction.updateModel(ollamaModel); } // Initializing validators diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index c2c8c0a8..522c2369 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -256,6 +256,39 @@ describe("init action", () => { }); test("should pull Ollama model if 'ollama' is in providers", async () => { + + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai", "ollama"], + openai: "API_KEY1", + heuristai: "API_KEY2", + ollama: "API_KEY3", + }); + simServgetAiProvidersOptions.mockReturnValue([ + { name: "OpenAI", value: "openai" }, + { name: "Heurist", value: "heuristai" }, + { name: "Ollama", value: "ollama" }, + ]); + + vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); + + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ initialized: true }); + simServDeleteAllValidators.mockResolvedValue(true); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({})); + + await initAction(defaultActionOptions, simulatorService); + + expect(log).toHaveBeenCalledWith(`Pulling llama3 from Ollama...`); + expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); + }); + + test("should pull Ollama model if 'ollama' is in providers using defaultOllamaModel", async () => { + const ollamaModel = "gemma"; + inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, @@ -277,9 +310,11 @@ describe("init action", () => { simServDeleteAllValidators.mockResolvedValue(true); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({defaultOllamaModel: ollamaModel})); await initAction(defaultActionOptions, simulatorService); + expect(log).toHaveBeenCalledWith(`Pulling ${ollamaModel} from Ollama...`); expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); }); From 1665b509e4970565fd785684c4be212afb475c5a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 28 Jan 2025 14:51:46 +0000 Subject: [PATCH 50/67] Release v0.10.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0da3ffd2..168c9f94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.10.0 (2025-01-28) + + +### Features + +* getting default ollama model from config file ([#167](https://github.com/yeagerai/genlayer-cli/issues/167)) ([d9e440d](https://github.com/yeagerai/genlayer-cli/commit/d9e440d0cd37368e0d8b154c7b5cbcdad463256f)) + ## 0.10.0-beta.0 (2024-12-13) diff --git a/package-lock.json b/package-lock.json index b9d6b8ea..e10f7174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.10.0-beta.0", + "version": "0.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.10.0-beta.0", + "version": "0.10.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 622d2167..b3c541d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.10.0-beta.0", + "version": "0.10.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From fb563e6db4a01355baf95b2b07335374966a9cdb Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Wed, 29 Jan 2025 03:05:18 -0300 Subject: [PATCH 51/67] fix: updating studio version and docker compose breaking change (#173) --- docker-compose.yml | 2 +- src/lib/config/simulator.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 857b609f..adc8c0ae 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,7 +39,7 @@ services: env_file: - ./.env healthcheck: - test: [ "CMD", "python", "backend/healthcheck.py", "--port", "${RPCPORT}" ] + test: [ "CMD", "python3", "backend/healthcheck.py", "--port", "${RPCPORT}" ] interval: 30s timeout: 10s retries: 3 diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index 62447322..da9e8ba8 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -1,4 +1,4 @@ -export const localnetCompatibleVersion = "v0.29.0"; +export const localnetCompatibleVersion = "v0.34.3"; export const DEFAULT_JSON_RPC_URL = "http://localhost:4000/api"; export const CONTAINERS_NAME_PREFIX = "/genlayer-"; export const IMAGES_NAME_PREFIX = "yeagerai"; From 148cbda3726158f876add3f940cedbd0042b6b19 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 29 Jan 2025 06:05:52 +0000 Subject: [PATCH 52/67] Release v0.10.1 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 168c9f94..eeba55e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.10.1 (2025-01-29) + + +### Bug Fixes + +* updating studio version and docker compose breaking change ([#173](https://github.com/yeagerai/genlayer-cli/issues/173)) ([fb563e6](https://github.com/yeagerai/genlayer-cli/commit/fb563e6db4a01355baf95b2b07335374966a9cdb)) + ## 0.10.0 (2025-01-28) diff --git a/package-lock.json b/package-lock.json index e10f7174..3296bef8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.10.0", + "version": "0.10.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.10.0", + "version": "0.10.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index b3c541d4..a1a82e2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.10.0", + "version": "0.10.1", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 81c6087cf1a902be7b547dc121294df173249245 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:38:58 -0300 Subject: [PATCH 53/67] feat: implement validators commands (#162) * fix: CLI hardcoded version and solving issues with containers and images * feat: new global var to deal with compatible version * Release v0.10.0-beta.0 [skip ci] * fix: removing default value from .env.example * feat: all validators commands * fix: json rpc bug and tests * feat: non interactive validator creation * feat: adding models to create random * test: improving create random validators tests --------- Co-authored-by: github-actions[bot] --- src/commands/validators/index.ts | 94 ++++ src/commands/validators/validators.ts | 274 ++++++++++++ src/index.ts | 2 + src/lib/actions/BaseAction.ts | 19 + src/lib/clients/jsonRpcClient.ts | 39 +- src/lib/services/simulator.ts | 4 +- tests/actions/validators.test.ts | 619 ++++++++++++++++++++++++++ tests/commands/validator.test.ts | 127 ++++++ tests/index.test.ts | 4 + tests/libs/jsonRpcClient.test.ts | 5 +- tests/services/simulator.test.ts | 16 +- 11 files changed, 1177 insertions(+), 26 deletions(-) create mode 100644 src/commands/validators/index.ts create mode 100644 src/commands/validators/validators.ts create mode 100644 src/lib/actions/BaseAction.ts create mode 100644 tests/actions/validators.test.ts create mode 100644 tests/commands/validator.test.ts diff --git a/src/commands/validators/index.ts b/src/commands/validators/index.ts new file mode 100644 index 00000000..b7737421 --- /dev/null +++ b/src/commands/validators/index.ts @@ -0,0 +1,94 @@ +import { Command } from "commander"; +import { ValidatorsAction } from "./validators"; + +export function initializeValidatorCommands(program: Command) { + const validatorsAction = new ValidatorsAction(); + + const validatorsCommand = program + .command("validators") + .description("Manage validator operations"); + + validatorsCommand + .command("get") + + .description("Retrieve details of a specific validator or all validators") + .option("--address ", "The address of the validator to retrieve (omit to retrieve all validators)") + .action(async (options) => { + await validatorsAction.getValidator({ address: options.address }); + }); + + validatorsCommand + .command("delete") + .description("Delete a specific validator or all validators") + .option("--address ", "The address of the validator to delete (omit to delete all validators)") + .action(async (options) => { + await validatorsAction.deleteValidator({ address: options.address }); + }); + + validatorsCommand + .command("count") + .description("Count all validators") + .action(async () => { + await validatorsAction.countValidators(); + }); + + validatorsCommand + .command("update ") + .description("Update a validator's details") + .option("--stake ", "New stake for the validator") + .option("--provider ", "New provider for the validator") + .option("--model ", "New model for the validator") + .option("--config ", "New JSON config for the validator") + .action(async (validatorAddress, options) => { + await validatorsAction.updateValidator({ + address: validatorAddress, + stake: options.stake, + provider: options.provider, + model: options.model, + config: options.config, + }); + }); + + validatorsCommand + .command("create-random") + .description("Create random validators") + .option("--count ", "Number of validators to create", "1") // Default to "1" + .option( + "--providers ", + "Space-separated list of provider names (e.g., openai ollama)", + [] + ) + .option( + "--models ", + "Space-separated list of model names (e.g., gpt-4 gpt-4o)", + [] + ) + .action(async (options) => { + await validatorsAction.createRandomValidators({ + count: options.count, + providers: options.providers, + models: options.models, + }); + }); + + validatorsCommand + .command("create") + .description("Create a new validator") + .option("--stake ", "Stake amount for the validator (default: 1)", "1") + .option( + "--config ", + 'Optional JSON configuration for the validator (e.g., \'{"max_tokens": 500, "temperature": 0.75}\')' + ) + .option("--provider ", "Specify the provider for the validator") + .option("--model ", "Specify the model for the validator") + .action(async (options) => { + await validatorsAction.createValidator({ + stake: options.stake, + config: options.config, + provider: options.provider, + model: options.model, + }); + }); + + return program; +} diff --git a/src/commands/validators/validators.ts b/src/commands/validators/validators.ts new file mode 100644 index 00000000..99a4024e --- /dev/null +++ b/src/commands/validators/validators.ts @@ -0,0 +1,274 @@ +import inquirer from "inquirer"; +import { rpcClient } from "../../lib/clients/jsonRpcClient"; +import { BaseAction } from "../../lib/actions/BaseAction"; + +export interface ValidatorOptions { + address?: string; +} + +export interface UpdateValidatorOptions { + address: string; + stake?: string; + provider?: string; + model?: string; + config?: string; +} + +export interface CreateRandomValidatorsOptions { + count: string; + providers: string[]; + models: string[]; +} + +export interface CreateValidatorOptions { + stake: string; + config?: string; + model?: string; + provider?: string; +} + +export class ValidatorsAction extends BaseAction { + public async getValidator(options: ValidatorOptions): Promise { + try { + if (options.address) { + console.log(`Fetching validator with address: ${options.address}`); + + const result = await rpcClient.request({ + method: "sim_getValidator", + params: [options.address], + }); + + console.log("Validator Details:", result.result); + } else { + console.log("Fetching all validators..."); + + const result = await rpcClient.request({ + method: "sim_getAllValidators", + params: [], + }); + + console.log("All Validators:", result.result); + } + } catch (error) { + console.error("Error fetching validators:", error); + } + } + + public async deleteValidator(options: ValidatorOptions): Promise { + try { + if (options.address) { + await this.confirmPrompt(`This command will delete the validator with the address: ${options.address}. Do you want to continue?`); + console.log(`Deleting validator with address: ${options.address}`); + + const result = await rpcClient.request({ + method: "sim_deleteValidator", + params: [options.address], + }); + + console.log("Deleted Address:", result.result); + } else { + await this.confirmPrompt(`This command will delete all validators. Do you want to continue?`); + console.log("Deleting all validators..."); + + await rpcClient.request({ + method: "sim_deleteAllValidators", + params: [], + }); + + console.log("Successfully deleted all validators"); + } + } catch (error) { + console.error("Error deleting validators:", error); + } + } + + public async countValidators(): Promise { + try { + console.log("Counting all validators..."); + + const result = await rpcClient.request({ + method: "sim_countValidators", + params: [], + }); + + console.log("Total Validators:", result.result); + } catch (error) { + console.error("Error counting validators:", error); + } + } + + public async updateValidator(options: UpdateValidatorOptions): Promise { + try { + console.log(`Fetching validator with address: ${options.address}...`); + const currentValidator = await rpcClient.request({ + method: "sim_getValidator", + params: [options.address], + }); + + if (!currentValidator.result) { + throw new Error(`Validator with address ${options.address} not found.`); + } + + console.log("Current Validator Details:", currentValidator.result); + + const parsedStake = options.stake + ? parseInt(options.stake, 10) + : currentValidator.result.stake; + + if (isNaN(parsedStake) || parsedStake < 0) { + return console.error("Invalid stake value. Stake must be a positive integer."); + } + + const updatedValidator = { + address: options.address, + stake: options.stake || currentValidator.result.stake, + provider: options.provider || currentValidator.result.provider, + model: options.model || currentValidator.result.model, + config: options.config ? JSON.parse(options.config) : currentValidator.result.config, + }; + + console.log("Updated Validator Details:", updatedValidator); + + const result = await rpcClient.request({ + method: "sim_updateValidator", + params: [ + updatedValidator.address, + updatedValidator.stake, + updatedValidator.provider, + updatedValidator.model, + updatedValidator.config, + ], + }); + + console.log("Validator successfully updated:", result.result); + } catch (error) { + console.error("Error updating validator:", error); + } + } + + public async createRandomValidators(options: CreateRandomValidatorsOptions): Promise { + try { + const count = parseInt(options.count, 10); + if (isNaN(count) || count < 1) { + return console.error("Invalid count. Please provide a positive integer."); + } + + console.log(`Creating ${count} random validator(s)...`); + console.log(`Providers: ${options.providers.length > 0 ? options.providers.join(", ") : "None"}`); + console.log(`Models: ${options.models.length > 0 ? options.models.join(", ") : "None"}`); + + const result = await rpcClient.request({ + method: "sim_createRandomValidators", + params: [count, 1, 10, options.providers, options.models], + }); + + console.log("Random validators successfully created:", result.result); + } catch (error) { + console.error("Error creating random validators:", error); + } + } + + public async createValidator(options: CreateValidatorOptions): Promise { + try { + const stake = parseInt(options.stake, 10); + if (isNaN(stake) || stake < 1) { + return console.error("Invalid stake. Please provide a positive integer."); + } + + if (options.model && !options.provider) { + return console.error("You must specify a provider if using a model."); + } + + console.log("Fetching available providers and models..."); + + const providersAndModels = await rpcClient.request({ + method: "sim_getProvidersAndModels", + params: [], + }); + + if (!providersAndModels.result || providersAndModels.result.length === 0) { + return console.error("No providers or models available."); + } + + const availableProviders = [ + ...new Map( + providersAndModels.result + .filter((entry: any) => entry.is_available) + .map((entry: any) => [entry.provider, entry]) + ).values(), + ]; + + let provider = options.provider + + if(!provider){ + const { selectedProvider } = await inquirer.prompt([ + { + type: "list", + name: "selectedProvider", + message: "Select a provider:", + choices: availableProviders.map((entry: any) => entry.provider), + }, + ]); + + provider = selectedProvider; + } + + const availableModels = providersAndModels.result.filter( + (entry: any) => entry.provider === provider && entry.is_model_available + ); + + if (availableModels.length === 0) { + return console.error("No models available for the selected provider."); + } + + let model = options.model; + + if(!model){ + const { selectedModel } = await inquirer.prompt([ + { + type: "list", + name: "selectedModel", + message: "Select a model:", + choices: availableModels.map((entry: any) => entry.model), + }, + ]); + + model = selectedModel; + } + + const modelDetails = availableModels.find( + (entry: any) => entry.model === model + ); + + if (!modelDetails) { + return console.error("Selected model details not found."); + } + + const config = options.config ? JSON.parse(options.config) : modelDetails.config; + + console.log("Creating validator with the following details:"); + console.log(`Stake: ${stake}`); + console.log(`Provider: ${modelDetails.provider}`); + console.log(`Model: ${modelDetails.model}`); + console.log(`Config:`, config); + console.log(`Plugin:`, modelDetails.plugin); + console.log(`Plugin Config:`, modelDetails.plugin_config); + + const result = await rpcClient.request({ + method: "sim_createValidator", + params: [ + stake, + modelDetails.provider, + modelDetails.model, + config, + modelDetails.plugin, + modelDetails.plugin_config, + ], + }); + + console.log("Validator successfully created:", result.result); + } catch (error) { + console.error("Error creating validator:", error); + } + } +} diff --git a/src/index.ts b/src/index.ts index 7563c308..8f98875c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { initializeGeneralCommands } from "../src/commands/general"; import { initializeKeygenCommands } from "../src/commands/keygen"; import { initializeContractsCommands } from "../src/commands/contracts"; import { initializeConfigCommands } from "../src/commands/config"; +import {initializeValidatorCommands} from "../src/commands/validators"; import { initializeUpdateCommands } from "../src/commands/update"; export function initializeCLI() { @@ -15,6 +16,7 @@ export function initializeCLI() { initializeContractsCommands(program); initializeConfigCommands(program); initializeUpdateCommands(program) + initializeValidatorCommands(program); program.parse(process.argv); } diff --git a/src/lib/actions/BaseAction.ts b/src/lib/actions/BaseAction.ts new file mode 100644 index 00000000..93dab902 --- /dev/null +++ b/src/lib/actions/BaseAction.ts @@ -0,0 +1,19 @@ +import inquirer from "inquirer"; + +export class BaseAction { + protected async confirmPrompt(message: string): Promise { + const answer = await inquirer.prompt([ + { + type: "confirm", + name: "confirmAction", + message: message, + default: true, + }, + ]); + + if (!answer.confirmAction) { + console.log("Operation aborted!"); + process.exit(0); + } + } +} diff --git a/src/lib/clients/jsonRpcClient.ts b/src/lib/clients/jsonRpcClient.ts index 412921a4..25274a72 100644 --- a/src/lib/clients/jsonRpcClient.ts +++ b/src/lib/clients/jsonRpcClient.ts @@ -16,27 +16,26 @@ export class JsonRpcClient { } async request({method, params}: JsonRPCParams): Promise { - try { - const response = await fetch(this.serverUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: uuidv4(), - method, - params, - }), - }); - - if (response.ok) { - return response.json(); - } - } catch (error: any) { - throw new Error(`Fetch Error: ${error.message}`); + const response = await fetch(this.serverUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: uuidv4(), + method, + params, + }), + }); + + if (response.ok) { + return response.json(); } - return null; + const result = await response.json(); + + throw new Error(result?.error?.message || response.statusText); + } } export const rpcClient = new JsonRpcClient(DEFAULT_JSON_RPC_URL); diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 18109a8d..f757892b 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -190,13 +190,13 @@ export class SimulatorService implements ISimulatorService { public createRandomValidators(numValidators: number, llmProviders: AiProviders[]): Promise { return rpcClient.request({ - method: "create_random_validators", + method: "sim_createRandomValidators", params: [numValidators, 1, 10, llmProviders], }); } public deleteAllValidators(): Promise { - return rpcClient.request({method: "delete_all_validators", params: []}); + return rpcClient.request({method: "sim_deleteAllValidators", params: []}); } public getAiProvidersOptions(withHint: boolean = true): Array<{name: string; value: string}> { diff --git a/tests/actions/validators.test.ts b/tests/actions/validators.test.ts new file mode 100644 index 00000000..3e9b9979 --- /dev/null +++ b/tests/actions/validators.test.ts @@ -0,0 +1,619 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import { ValidatorsAction } from "../../src/commands/validators/validators"; +import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; +import inquirer from "inquirer"; + +vi.mock("../../src/lib/clients/jsonRpcClient", () => ({ + rpcClient: { + request: vi.fn(), + }, +})); + +vi.mock("inquirer"); + +describe("ValidatorsAction", () => { + let validatorsAction: ValidatorsAction; + + beforeEach(() => { + vi.clearAllMocks(); + validatorsAction = new ValidatorsAction(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + describe("getValidator", () => { + test("should fetch a specific validator by address", async () => { + const mockAddress = "mocked_address"; + const mockResponse = { result: { id: 1, name: "Validator1" } }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.getValidator({ address: mockAddress }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(console.log).toHaveBeenCalledWith("Validator Details:", mockResponse.result); + }); + + test("should fetch all validators when no address is provided", async () => { + const mockResponse = { result: [{ id: 1 }, { id: 2 }] }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.getValidator({}); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getAllValidators", + params: [], + }); + expect(console.log).toHaveBeenCalledWith("All Validators:", mockResponse.result); + }); + + test("should log an error if an exception occurs while fetching a specific validator", async () => { + const mockAddress = "mocked_address"; + const mockError = new Error("Unexpected error"); + + vi.mocked(rpcClient.request).mockRejectedValue(mockError); + + console.error = vi.fn(); + + await validatorsAction.getValidator({ address: mockAddress }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(console.error).toHaveBeenCalledWith("Error fetching validators:", mockError); + }); + + test("should log an error if an exception occurs while fetching all validators", async () => { + const mockError = new Error("Unexpected error"); + + vi.mocked(rpcClient.request).mockRejectedValue(mockError); + + console.error = vi.fn(); + + await validatorsAction.getValidator({}); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getAllValidators", + params: [], + }); + expect(console.error).toHaveBeenCalledWith("Error fetching validators:", mockError); + }); + }); + + describe("deleteValidator", () => { + test("should delete a specific validator", async () => { + const mockAddress = "mocked_address"; + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: true }); + vi.mocked(rpcClient.request).mockResolvedValue({ result: { id: 1 } }); + + console.log = vi.fn(); + + await validatorsAction.deleteValidator({ address: mockAddress }); + + expect(inquirer.prompt).toHaveBeenCalled(); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_deleteValidator", + params: [mockAddress], + }); + expect(console.log).toHaveBeenCalledWith("Deleted Address:", { id: 1 }); + }); + + test("should delete all validators when no address is provided", async () => { + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: true }); + vi.mocked(rpcClient.request).mockResolvedValue({}); + + console.log = vi.fn(); + + await validatorsAction.deleteValidator({}); + + expect(inquirer.prompt).toHaveBeenCalled(); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_deleteAllValidators", + params: [], + }); + expect(console.log).toHaveBeenCalledWith("Successfully deleted all validators"); + }); + + test("should abort deletion if user declines confirmation", async () => { + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: false }); + + console.log = vi.fn(); + + await validatorsAction.deleteValidator({ address: "mocked_address" }) + + expect(inquirer.prompt).toHaveBeenCalled(); + expect(console.log).toHaveBeenCalledWith("Operation aborted!"); + expect(rpcClient.request).not.toHaveBeenCalled(); + }); + }); + + describe("countValidators", () => { + test("should count all validators", async () => { + const mockResponse = { result: 42 }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.countValidators(); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_countValidators", + params: [], + }); + expect(console.log).toHaveBeenCalledWith("Total Validators:", 42); + }); + + test("should log an error if an exception occurs while counting validators", async () => { + const mockError = new Error("Unexpected error"); + + vi.mocked(rpcClient.request).mockRejectedValue(mockError); + + console.error = vi.fn(); + + await validatorsAction.countValidators(); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_countValidators", + params: [], + }); + expect(console.error).toHaveBeenCalledWith("Error counting validators:", mockError); + }); + }); + + describe("createValidator", () => { + test("should create a validator with selected provider and model", async () => { + const mockProvidersAndModels = [ + { + provider: "Provider1", + is_available: true, + is_model_available: true, + model: "Model1", + config: { max_tokens: 500 }, + plugin: "Plugin1", + plugin_config: { api_key_env_var: "KEY1" }, + }, + ]; + const mockResponse = { result: { id: 123 } }; + + vi.mocked(rpcClient.request) + .mockResolvedValueOnce({ result: mockProvidersAndModels }) + .mockResolvedValueOnce(mockResponse); + + vi.mocked(inquirer.prompt) + .mockResolvedValueOnce({ selectedProvider: "Provider1" }) + .mockResolvedValueOnce({ selectedModel: "Model1" }); + + console.log = vi.fn(); + + await validatorsAction.createValidator({ stake: "10" }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getProvidersAndModels", + params: [], + }); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_createValidator", + params: [ + 10, + "Provider1", + "Model1", + { max_tokens: 500 }, + "Plugin1", + { api_key_env_var: "KEY1" }, + ], + }); + expect(console.log).toHaveBeenCalledWith("Validator successfully created:", { id: 123 }); + }); + + test("should log an error for invalid stake", async () => { + console.error = vi.fn(); + + await validatorsAction.createValidator({ stake: "invalid" }); + + expect(console.error).toHaveBeenCalledWith("Invalid stake. Please provide a positive integer."); + expect(rpcClient.request).not.toHaveBeenCalled(); + }); + + test("should log an error if no providers or models are available", async () => { + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: [] }); + + console.error = vi.fn(); + + await validatorsAction.createValidator({ stake: "10" }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getProvidersAndModels", + params: [], + }); + expect(console.error).toHaveBeenCalledWith("No providers or models available."); + }); + + test("should log an error if no models are available for the selected provider", async () => { + const mockProvidersAndModels = [ + { provider: "Provider1", is_available: true, is_model_available: false }, + ]; + + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: mockProvidersAndModels }); + vi.mocked(inquirer.prompt).mockResolvedValueOnce({ selectedProvider: "Provider1" }); + + console.error = vi.fn(); + + await validatorsAction.createValidator({ stake: "10" }); + + expect(console.error).toHaveBeenCalledWith("No models available for the selected provider."); + }); + + test("should log an error if selected model details are not found", async () => { + const mockProvidersAndModels = [ + { + provider: "Provider1", + is_available: true, + is_model_available: true, + model: "Model1", + }, + ]; + + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: mockProvidersAndModels }); + vi.mocked(inquirer.prompt) + .mockResolvedValueOnce({ selectedProvider: "Provider1" }) + .mockResolvedValueOnce({ selectedModel: "NonExistentModel" }); + + console.error = vi.fn(); + + await validatorsAction.createValidator({ stake: "10" }); + + expect(console.error).toHaveBeenCalledWith("Selected model details not found."); + }); + + test("should log an error if an exception occurs during the process", async () => { + const mockError = new Error("Unexpected error"); + vi.mocked(rpcClient.request).mockRejectedValue(mockError); + + console.error = vi.fn(); + + await validatorsAction.createValidator({ stake: "10" }); + + expect(console.error).toHaveBeenCalledWith("Error creating validator:", mockError); + }); + + test("should use user-provided config if specified", async () => { + const mockProvidersAndModels = [ + { + provider: "Provider1", + is_available: true, + is_model_available: true, + model: "Model1", + config: { max_tokens: 500 }, + plugin: "Plugin1", + plugin_config: { api_key_env_var: "KEY1" }, + }, + ]; + const mockResponse = { result: { id: 123 } }; + + vi.mocked(rpcClient.request) + .mockResolvedValueOnce({ result: mockProvidersAndModels }) + .mockResolvedValueOnce(mockResponse); + + vi.mocked(inquirer.prompt) + .mockResolvedValueOnce({ selectedProvider: "Provider1" }) + .mockResolvedValueOnce({ selectedModel: "Model1" }); + + console.log = vi.fn(); + + const customConfig = '{"custom_key":"custom_value"}'; + await validatorsAction.createValidator({ stake: "10", config: customConfig }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_createValidator", + params: [ + 10, + "Provider1", + "Model1", + { custom_key: "custom_value" }, + "Plugin1", + { api_key_env_var: "KEY1" }, + ], + }); + expect(console.log).toHaveBeenCalledWith("Validator successfully created:", { id: 123 }); + }); + }); + describe("createRandomValidators", () => { + test("should create random validators with valid count and providers", async () => { + const mockResponse = { result: { success: true } }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.createRandomValidators({ count: "5", providers: ["Provider1", "Provider2"], models: [] }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_createRandomValidators", + params: [5, 1, 10, ["Provider1", "Provider2"], []], + }); + expect(console.log).toHaveBeenCalledWith("Creating 5 random validator(s)..."); + expect(console.log).toHaveBeenCalledWith("Providers: Provider1, Provider2"); + expect(console.log).toHaveBeenCalledWith("Random validators successfully created:", mockResponse.result); + }); + + test("should create random validators with valid count, providers and models", async () => { + const mockResponse = { result: { success: true } }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.createRandomValidators({ count: "10", providers: ["Provider3"], models: ["Model1", "Model2"] }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_createRandomValidators", + params: [10, 1, 10, ["Provider3"], ["Model1", "Model2"]], + }); + expect(console.log).toHaveBeenCalledWith("Creating 10 random validator(s)..."); + expect(console.log).toHaveBeenCalledWith("Providers: Provider3"); + expect(console.log).toHaveBeenCalledWith("Models: Model1, Model2"); + expect(console.log).toHaveBeenCalledWith("Random validators successfully created:", mockResponse.result); + }); + + test("should create random validators with default provider message when providers list is empty", async () => { + const mockResponse = { result: { success: true } }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.createRandomValidators({ count: "3", providers: [], models: [] }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_createRandomValidators", + params: [3, 1, 10, [], []], + }); + expect(console.log).toHaveBeenCalledWith("Creating 3 random validator(s)..."); + expect(console.log).toHaveBeenCalledWith("Providers: None"); + expect(console.log).toHaveBeenCalledWith("Random validators successfully created:", mockResponse.result); + }); + + test("should throw an error for invalid count", async () => { + console.error = vi.fn(); + + await validatorsAction.createRandomValidators({ count: "invalid", providers: ["Provider1"], models: [] }); + + expect(console.error).toHaveBeenCalledWith("Invalid count. Please provide a positive integer."); + expect(rpcClient.request).not.toHaveBeenCalled(); + }); + + test("should log an error if rpc request fails", async () => { + const mockError = new Error("RPC failure"); + vi.mocked(rpcClient.request).mockRejectedValue(mockError); + + console.error = vi.fn(); + + await validatorsAction.createRandomValidators({ count: "5", providers: ["Provider1"], models: [] }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_createRandomValidators", + params: [5, 1, 10, ["Provider1"], []], + }); + expect(console.error).toHaveBeenCalledWith("Error creating random validators:", mockError); + }); + }); + + describe("updateValidator", () => { + test("should fetch and update a validator with new stake", async () => { + const mockAddress = "mocked_address"; + const mockCurrentValidator = { + result: { + address: "mocked_address", + stake: 100, + provider: "Provider1", + model: "Model1", + config: { max_tokens: 500 }, + }, + }; + const mockResponse = { result: { success: true } }; + + vi.mocked(rpcClient.request) + .mockResolvedValueOnce(mockCurrentValidator) + .mockResolvedValueOnce(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.updateValidator({ address: mockAddress, stake: "200" }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_updateValidator", + params: [ + "mocked_address", + "200", + "Provider1", + "Model1", + { max_tokens: 500 }, + ], + }); + expect(console.log).toHaveBeenCalledWith("Validator successfully updated:", mockResponse.result); + }); + + test("should fetch and update a validator with new provider and model", async () => { + const mockAddress = "mocked_address"; + const mockCurrentValidator = { + result: { + address: "mocked_address", + stake: "100", + provider: "Provider1", + model: "Model1", + config: { max_tokens: 500 }, + }, + }; + const mockResponse = { result: { success: true } }; + + vi.mocked(rpcClient.request) + .mockResolvedValueOnce(mockCurrentValidator) + .mockResolvedValueOnce(mockResponse); + + console.log = vi.fn(); + + await validatorsAction.updateValidator({ + address: mockAddress, + provider: "Provider2", + model: "Model2", + }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_updateValidator", + params: [ + "mocked_address", + "100", + "Provider2", + "Model2", + { max_tokens: 500 }, + ], + }); + expect(console.log).toHaveBeenCalledWith("Validator successfully updated:", mockResponse.result); + }); + + test("should fetch and update a validator with new config", async () => { + const mockAddress = "mocked_address"; + const mockCurrentValidator = { + result: { + address: "mocked_address", + stake: "100", + provider: "Provider1", + model: "Model1", + config: { max_tokens: 500 }, + }, + }; + const mockResponse = { result: { success: true } }; + + vi.mocked(rpcClient.request) + .mockResolvedValueOnce(mockCurrentValidator) + .mockResolvedValueOnce(mockResponse); + + console.log = vi.fn(); + + const newConfig = '{"max_tokens":1000}'; + await validatorsAction.updateValidator({ address: mockAddress, config: newConfig }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_updateValidator", + params: [ + "mocked_address", + "100", + "Provider1", + "Model1", + { max_tokens: 1000 }, + ], + }); + expect(console.log).toHaveBeenCalledWith("Validator successfully updated:", mockResponse.result); + }); + + test("should throw an error if validator is not found", async () => { + const mockAddress = "mocked_address"; + const mockResponse = { result: null }; + + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + console.error = vi.fn(); + + await validatorsAction.updateValidator({ address: mockAddress }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(console.error).toHaveBeenCalledWith( + "Error updating validator:", + new Error(`Validator with address ${mockAddress} not found.`) + ); + expect(rpcClient.request).toHaveBeenCalledTimes(1); + }); + + test("should log an error if updateValidator RPC call fails", async () => { + const mockAddress = "mocked_address"; + const mockCurrentValidator = { + result: { + address: "mocked_address", + stake: "100", + provider: "Provider1", + model: "Model1", + config: { max_tokens: 500 }, + }, + }; + const mockError = new Error("RPC failure"); + + vi.mocked(rpcClient.request) + .mockResolvedValueOnce(mockCurrentValidator) + .mockRejectedValueOnce(mockError); + + console.error = vi.fn(); + + await validatorsAction.updateValidator({ address: mockAddress, stake: "200" }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_updateValidator", + params: [ + "mocked_address", + "200", + "Provider1", + "Model1", + { max_tokens: 500 }, + ], + }); + expect(console.error).toHaveBeenCalledWith("Error updating validator:", mockError); + }); + }); + test("should log an error for invalid stake value", async () => { + const mockAddress = "mocked_address"; + const mockCurrentValidator = { + result: { + address: "mocked_address", + stake: 100, + provider: "Provider1", + model: "Model1", + config: { max_tokens: 500 }, + }, + }; + + vi.mocked(rpcClient.request).mockResolvedValue(mockCurrentValidator); + + console.error = vi.fn(); + + await validatorsAction.updateValidator({ address: mockAddress, stake: "-10" }); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + expect(console.error).toHaveBeenCalledWith("Invalid stake value. Stake must be a positive integer."); + expect(rpcClient.request).toHaveBeenCalledTimes(1); + }); + test("should log an error if model is provided without provider", async () => { + console.error = vi.fn(); + + await validatorsAction.createValidator({ stake: "10", model: "Model1" }); + + expect(console.error).toHaveBeenCalledWith("You must specify a provider if using a model."); + expect(rpcClient.request).not.toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/tests/commands/validator.test.ts b/tests/commands/validator.test.ts new file mode 100644 index 00000000..1ffd6b9d --- /dev/null +++ b/tests/commands/validator.test.ts @@ -0,0 +1,127 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeValidatorCommands } from "../../src/commands/validators"; +import { ValidatorsAction } from "../../src/commands/validators/validators"; + +vi.mock("../../src/commands/validators/validators"); + +describe("validators command", () => { + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeValidatorCommands(program); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("ValidatorsAction.getValidator is called with address option", async () => { + program.parse(["node", "test", "validators", "get", "--address", "mocked_address"]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.getValidator).toHaveBeenCalledWith({ + address: "mocked_address", + }); + }); + + test("ValidatorsAction.getValidator is called without address option", async () => { + program.parse(["node", "test", "validators", "get"]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.getValidator).toHaveBeenCalledWith({}); + }); + + test("ValidatorsAction.deleteValidator is called with address option", async () => { + program.parse(["node", "test", "validators", "delete", "--address", "mocked_address"]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.deleteValidator).toHaveBeenCalledWith({ + address: "mocked_address", + }); + }); + + test("ValidatorsAction.deleteValidator is called without address option", async () => { + program.parse(["node", "test", "validators", "delete"]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.deleteValidator).toHaveBeenCalledWith({}); + }); + + test("ValidatorsAction.countValidators is called", async () => { + program.parse(["node", "test", "validators", "count"]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.countValidators).toHaveBeenCalled(); + }); + + test("ValidatorsAction.updateValidator is called with all options", async () => { + program.parse([ + "node", + "test", + "validators", + "update", + "mocked_address", + "--stake", + "10", + "--provider", + "mocked_provider", + "--model", + "mocked_model", + '--config', + '{"max_tokens":500}', + ]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.updateValidator).toHaveBeenCalledWith({ + address: "mocked_address", + stake: "10", + provider: "mocked_provider", + model: "mocked_model", + config: '{"max_tokens":500}', + }); + }); + + test("ValidatorsAction.createRandomValidators is called with count and providers", async () => { + program.parse([ + "node", + "test", + "validators", + "create-random", + "--count", + "3", + "--providers", + "provider1", + "provider2", + ]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.createRandomValidators).toHaveBeenCalledWith({ + count: "3", + providers: ["provider1", "provider2"], + models: [] + }); + }); + + test("ValidatorsAction.createValidator is called with default stake", async () => { + program.parse(["node", "test", "validators", "create"]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.createValidator).toHaveBeenCalledWith({ + stake: "1", + config: undefined, + }); + }); + + test("ValidatorsAction.createValidator is called with stake and config", async () => { + program.parse([ + "node", + "test", + "validators", + "create", + "--stake", + "5", + '--config', + '{"temperature":0.8}', + ]); + expect(ValidatorsAction).toHaveBeenCalledTimes(1); + expect(ValidatorsAction.prototype.createValidator).toHaveBeenCalledWith({ + stake: "5", + config: '{"temperature":0.8}', + }); + }); + +}); diff --git a/tests/index.test.ts b/tests/index.test.ts index e72ba16c..723315f5 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -25,6 +25,10 @@ vi.mock("../src/commands/config", () => ({ initializeConfigCommands: vi.fn(), })); +vi.mock("../src/commands/validators", () => ({ + initializeValidatorCommands: vi.fn(), +})); + vi.mock("../src/commands/update", () => ({ initializeUpdateCommands: vi.fn(), })); diff --git a/tests/libs/jsonRpcClient.test.ts b/tests/libs/jsonRpcClient.test.ts index 95de7452..33a0b537 100644 --- a/tests/libs/jsonRpcClient.test.ts +++ b/tests/libs/jsonRpcClient.test.ts @@ -40,6 +40,7 @@ describe("JsonRpcClient - Successful and Unsuccessful Requests", () => { test("should return null when the fetch response is not ok", async () => { (fetch as Mock).mockResolvedValueOnce({ ok: false, + statusText: "Something went wrong", json: async () => ({ error: "Something went wrong" }), }); @@ -48,9 +49,7 @@ describe("JsonRpcClient - Successful and Unsuccessful Requests", () => { params: ["param1", "param2"], }; - const response = await rpcClient.request(params); - - expect(response).toBeNull(); + await expect(rpcClient.request(params)).rejects.toThrowError("Something went wrong"); expect(fetch).toHaveBeenCalledWith(mockServerUrl, { method: "POST", headers: { "Content-Type": "application/json" }, diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 65cac3b1..c82628b8 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -200,7 +200,7 @@ describe("SimulatorService - Basic Tests", () => { const mockResponse = { success: true }; vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); const result = await simulatorService.deleteAllValidators(); - expect(rpcClient.request).toHaveBeenCalledWith({ method: "delete_all_validators", params: [] }); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_deleteAllValidators", params: [] }); expect(result).toBe(mockResponse); }); @@ -465,4 +465,18 @@ describe('normalizeLocalnetVersion', () => { mockExit.mockRestore(); mockConsoleError.mockRestore(); }); + test("should log an error if an exception occurs while cleaning the database", async () => { + const mockError = new Error("Database cleanup error"); + vi.mocked(rpcClient.request).mockRejectedValue(mockError); + + console.error = vi.fn(); + + await simulatorService.cleanDatabase(); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_clearDbTables", + params: [['current_state', 'transactions']], + }); + expect(console.error).toHaveBeenCalledWith(mockError); + }); }); From e70e7f2e549abc9c9633ae066820fb272c9334ee Mon Sep 17 00:00:00 2001 From: Cristiam Da Silva Date: Thu, 30 Jan 2025 16:34:38 +0100 Subject: [PATCH 54/67] fix: updated studio version (#174) * fix: updated studio version * fix: hardhat volumes sharing * chore: increased localnet default compatible version * chore: removed unused docker volumes * fix: hardhat version now uses localnetversion var --------- Co-authored-by: Edinaldo Junior --- docker-compose.yml | 14 ++++++++++++-- src/lib/config/simulator.ts | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index adc8c0ae..d31edefb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,6 +61,9 @@ services: max-file: "3" deploy: replicas: ${JSONRPC_REPLICAS:-1} + volumes: + - hardhat_artifacts:/app/hardhat/artifacts + - hardhat_deployments:/app/hardhat/deployments webrequest: image: yeagerai/simulator-webrequest:${LOCALNETVERSION:-latest} @@ -144,8 +147,15 @@ services: condition: service_healthy hardhat: - image: yeagerai/simulator-hardhat + image: yeagerai/simulator-hardhat:${LOCALNETVERSION:-latest} ports: - "${HARDHAT_PORT:-8545}:8545" environment: - - HARDHAT_NETWORK=hardhat \ No newline at end of file + - HARDHAT_NETWORK=hardhat + volumes: + - hardhat_artifacts:/app/artifacts + - hardhat_deployments:/app/deployments + +volumes: + hardhat_artifacts: + hardhat_deployments: \ No newline at end of file diff --git a/src/lib/config/simulator.ts b/src/lib/config/simulator.ts index da9e8ba8..bb06abad 100644 --- a/src/lib/config/simulator.ts +++ b/src/lib/config/simulator.ts @@ -1,4 +1,4 @@ -export const localnetCompatibleVersion = "v0.34.3"; +export const localnetCompatibleVersion = "v0.35.2"; export const DEFAULT_JSON_RPC_URL = "http://localhost:4000/api"; export const CONTAINERS_NAME_PREFIX = "/genlayer-"; export const IMAGES_NAME_PREFIX = "yeagerai"; From 6f72fd7ff01fecd39dc84dac9e49e9e2f01cb8cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 30 Jan 2025 15:35:12 +0000 Subject: [PATCH 55/67] Release v0.10.2 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eeba55e0..1a4fe649 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.10.2 (2025-01-30) + + +### Bug Fixes + +* updated studio version ([#174](https://github.com/yeagerai/genlayer-cli/issues/174)) ([e70e7f2](https://github.com/yeagerai/genlayer-cli/commit/e70e7f2e549abc9c9633ae066820fb272c9334ee)) + ## 0.10.1 (2025-01-29) diff --git a/package-lock.json b/package-lock.json index 3296bef8..f22d2908 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.10.1", + "version": "0.10.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.10.1", + "version": "0.10.2", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a1a82e2c..a31f568f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.10.1", + "version": "0.10.2", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 3dc7a9673ada8116b1fb99e089439a75e06237ec Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Thu, 30 Jan 2025 21:21:16 -0300 Subject: [PATCH 56/67] feat: Enhance Ollama Command Workflow and Default Model Handling (#171) * feat: add a new ollama provider when it does not exist * test: removing comments --- src/commands/general/init.ts | 6 ++- src/commands/update/index.ts | 6 ++- src/commands/update/ollama.ts | 77 ++++++++++++++++++++++++--- tests/actions/init.test.ts | 39 +++++++++++++- tests/actions/ollama.test.ts | 97 +++++++++++++++++++++++++++++++---- tests/commands/update.test.ts | 5 ++ 6 files changed, 209 insertions(+), 21 deletions(-) diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index f0ce5b16..7657fe2d 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -184,8 +184,12 @@ export async function initAction(options: InitActionOptions, simulatorService: I const ollamaAction = new OllamaAction(); const configManager = new ConfigFileManager(); const config = configManager.getConfig() + let ollamaModel = config.defaultOllamaModel; - let ollamaModel = config.defaultOllamaModel || 'llama3'; + if(!config.defaultOllamaModel){ + configManager.writeConfig('defaultOllamaModel', 'llama3'); + ollamaModel = 'llama3' + } console.log(`Pulling ${ollamaModel} from Ollama...`); diff --git a/src/commands/update/index.ts b/src/commands/update/index.ts index 161995bb..e0a19f74 100644 --- a/src/commands/update/index.ts +++ b/src/commands/update/index.ts @@ -1,5 +1,6 @@ import { Command } from "commander"; import { OllamaAction } from "./ollama"; +import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; export function initializeUpdateCommands(program: Command) { const updateCommand = program @@ -12,7 +13,10 @@ export function initializeUpdateCommands(program: Command) { .option("--model [model-name]", "Specify the model to update or remove") .option("--remove", "Remove the specified model instead of updating") .action(async (options) => { - const modelName = options.model || "default-model"; + const configManager = new ConfigFileManager(); + const config = configManager.getConfig() + + const modelName = options.model || config.defaultOllamaModel; const ollamaAction = new OllamaAction(); if (options.remove) { diff --git a/src/commands/update/ollama.ts b/src/commands/update/ollama.ts index 1821a2de..6f96f54e 100644 --- a/src/commands/update/ollama.ts +++ b/src/commands/update/ollama.ts @@ -1,4 +1,5 @@ -import Docker from "dockerode" +import Docker from "dockerode"; +import { rpcClient } from "../../lib/clients/jsonRpcClient"; export class OllamaAction { private docker: Docker; @@ -8,34 +9,94 @@ export class OllamaAction { } async updateModel(modelName: string) { - await this.executeModelCommand("pull", modelName, `Model "${modelName}" updated successfully`); + const providersAndModels = await rpcClient.request({ + method: "sim_getProvidersAndModels", + params: [], + }); + + const existingOllamaProvider = providersAndModels.result.find( + (entry: any) => entry.plugin === "ollama" + ); + + if (!existingOllamaProvider) { + throw new Error("No existing 'ollama' provider found. Unable to add/update a model."); + } + + await this.executeModelCommand( + "pull", + modelName, + `Model "${modelName}" updated successfully` + ); + + const existingModel = providersAndModels.result.some( + (entry: any) => + entry.plugin === "ollama" && entry.model === modelName + ); + + if (!existingModel) { + console.log(`Model "${modelName}" not found in Provider Presets. Adding...`); + + const newModelConfig = { + config: existingOllamaProvider.config, + model: modelName, + plugin: "ollama", + plugin_config: existingOllamaProvider.plugin_config, + provider: "ollama", + }; + + await rpcClient.request({ + method: "sim_addProvider", + params: [newModelConfig], + }); + + console.log(`Model "${modelName}" added successfully.`); + } } async removeModel(modelName: string) { - await this.executeModelCommand("rm", modelName, `Model "${modelName}" removed successfully`); + await this.executeModelCommand( + "rm", + modelName, + `Model "${modelName}" removed successfully` + ); } - private async executeModelCommand(command: string, modelName: string, successMessage: string) { + private async executeModelCommand( + command: string, + modelName: string, + successMessage: string + ) { try { + let success = false; const ollamaContainer = this.docker.getContainer("ollama"); const exec = await ollamaContainer.exec({ Cmd: ["ollama", command, modelName], AttachStdout: true, AttachStderr: true, }); - const stream = await exec.start({ Detach: false, Tty: false }); + const stream = await exec.start({Detach: false, Tty: false}); stream.on("data", (chunk: any) => { - console.log(chunk.toString()); + const chunkStr = chunk.toString(); + console.log(chunkStr); + if (chunkStr.includes("success") || chunkStr.includes("deleted")) { + success = true; + } }); await new Promise((resolve, reject) => { - stream.on("end", resolve); + stream.on("end", () => { + if (success) { + resolve(); + } else { + reject('internal error'); + } + }); stream.on("error", reject); }); console.log(successMessage); - } catch (error) { + }catch (error) { console.error(`Error executing command "${command}" on model "${modelName}":`, error); } } diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 522c2369..0a173eb0 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -9,11 +9,13 @@ import fs from "fs"; import * as dotenv from "dotenv"; import {localnetCompatibleVersion} from "../../src/lib/config/simulator"; import { OllamaAction } from "../../src/commands/update/ollama"; +import { ConfigFileManager } from "../../src/lib/config/ConfigFileManager"; vi.mock("fs"); vi.mock("dotenv"); vi.mock("../../src/commands/update/ollama") +vi.mock("../../src/lib/config/ConfigFileManager"); const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); @@ -278,7 +280,7 @@ describe("init action", () => { simServDeleteAllValidators.mockResolvedValue(true); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({})); + vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue({}); await initAction(defaultActionOptions, simulatorService); @@ -310,7 +312,7 @@ describe("init action", () => { simServDeleteAllValidators.mockResolvedValue(true); simServResetDockerContainers.mockResolvedValue(true); simServResetDockerImages.mockResolvedValue(true); - vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({defaultOllamaModel: ollamaModel})); + vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue({defaultOllamaModel: ollamaModel}); await initAction(defaultActionOptions, simulatorService); @@ -318,6 +320,39 @@ describe("init action", () => { expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); }); + test("should set defaultOllamaModel to llama 3 if no defaultOllamaModel is provided", async () => { + + inquirerPrompt.mockResolvedValue({ + confirmReset: true, + confirmDownload: true, + selectedLlmProviders: ["openai", "heuristai", "ollama"], + openai: "API_KEY1", + heuristai: "API_KEY2", + ollama: "API_KEY3", + }); + simServgetAiProvidersOptions.mockReturnValue([ + { name: "OpenAI", value: "openai" }, + { name: "Heurist", value: "heuristai" }, + { name: "Ollama", value: "ollama" }, + ]); + + vi.mocked(ConfigFileManager.prototype.getConfig).mockResolvedValueOnce({}) + vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); + + simServRunSimulator.mockResolvedValue(true); + simServWaitForSimulator.mockResolvedValue({ initialized: true }); + simServDeleteAllValidators.mockResolvedValue(true); + simServResetDockerContainers.mockResolvedValue(true); + simServResetDockerImages.mockResolvedValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({})); + + await initAction(defaultActionOptions, simulatorService); + + expect(ConfigFileManager.prototype.writeConfig).toHaveBeenCalledWith('defaultOllamaModel', 'llama3') + expect(log).toHaveBeenCalledWith(`Pulling llama3 from Ollama...`); + expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); + }); + test("logs error if checkVersionRequirements throws", async () => { simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); const errorMsg = new Error("checkVersionRequirements error"); diff --git a/tests/actions/ollama.test.ts b/tests/actions/ollama.test.ts index c3b0eeb3..6827c089 100644 --- a/tests/actions/ollama.test.ts +++ b/tests/actions/ollama.test.ts @@ -1,8 +1,11 @@ -import {describe, test, vi, beforeEach, afterEach, expect, Mock} from "vitest"; +import { describe, test, vi, beforeEach, afterEach, expect, Mock } from "vitest"; import { OllamaAction } from "../../src/commands/update/ollama"; +import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; + import Docker from "dockerode"; vi.mock("dockerode"); +vi.mock("../../src/lib/clients/jsonRpcClient"); describe("OllamaAction", () => { let ollamaAction: OllamaAction; @@ -41,9 +44,22 @@ describe("OllamaAction", () => { }); test("should update the model using 'pull'", async () => { - mockStream.on.mockImplementation((event: any, callback:any) => { - if (event === "data") callback(Buffer.from("Mocked output")); - if (event === "end") callback(); + const mockProvider = { + plugin: "ollama", + config: { key: "value" }, + plugin_config: { pluginKey: "pluginValue" }, + }; + vi.mocked(rpcClient.request).mockResolvedValueOnce({ + result: [mockProvider], + }); + + mockStream.on.mockImplementation((event: any, callback: any) => { + if (event === "data") { + callback(Buffer.from("Mocked output success")); + } + if (event === "end") { + callback(); + } }); console.log = vi.fn(); @@ -59,14 +75,18 @@ describe("OllamaAction", () => { expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); - expect(console.log).toHaveBeenCalledWith("Mocked output"); + expect(console.log).toHaveBeenCalledWith("Mocked output success"); expect(console.log).toHaveBeenCalledWith('Model "mocked_model" updated successfully'); }); test("should remove the model using 'rm'", async () => { - mockStream.on.mockImplementation((event:any, callback:any) => { - if (event === "data") callback(Buffer.from("Mocked output")); - if (event === "end") callback(); + mockStream.on.mockImplementation((event: any, callback: any) => { + if (event === "data") { + callback(Buffer.from("Mocked output success")); + } + if (event === "end") { + callback(); + } }); console.log = vi.fn(); @@ -82,11 +102,20 @@ describe("OllamaAction", () => { expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); - expect(console.log).toHaveBeenCalledWith("Mocked output"); + expect(console.log).toHaveBeenCalledWith("Mocked output success"); expect(console.log).toHaveBeenCalledWith('Model "mocked_model" removed successfully'); }); test("should log an error if an exception occurs during 'pull'", async () => { + const mockProvider = { + plugin: "ollama", + config: { key: "value" }, + plugin_config: { pluginKey: "pluginValue" }, + }; + vi.mocked(rpcClient.request).mockResolvedValueOnce({ + result: [mockProvider], + }); + const error = new Error("Mocked error"); mockGetContainer.mockReturnValueOnce( { @@ -126,4 +155,54 @@ describe("OllamaAction", () => { error ); }); + + test("should throw an error if no 'ollama' provider exists during updateModel", async () => { + vi.mocked(rpcClient.request).mockResolvedValueOnce({ + result: [], + }); + + const modelName = "mocked_model"; + + await expect(ollamaAction.updateModel(modelName)).rejects.toThrowError( + "No existing 'ollama' provider found. Unable to add/update a model." + ); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getProvidersAndModels", + params: [], + }); + }); + + test("should reject with an error if success is not set to true", async () => { + console.error = vi.fn(); + + const mockProvider = { + plugin: "ollama", + config: { key: "value" }, + plugin_config: { pluginKey: "pluginValue" }, + }; + + vi.mocked(rpcClient.request).mockResolvedValueOnce({ + result: [mockProvider], + }); + + mockStream.on.mockImplementation((event: any, callback: any) => { + if (event === "data") { + callback(Buffer.from("Mocked output failure")); + } + if (event === "end") { + callback(); + } + }); + + console.log = vi.fn(); + console.error = vi.fn(); + + await ollamaAction.updateModel("mocked_model"); + + expect(console.error).toHaveBeenCalledWith( + 'Error executing command "pull" on model "mocked_model":', 'internal error' + ); + }); + }); diff --git a/tests/commands/update.test.ts b/tests/commands/update.test.ts index 00dcb947..dc30bb50 100644 --- a/tests/commands/update.test.ts +++ b/tests/commands/update.test.ts @@ -2,8 +2,10 @@ import { Command } from "commander"; import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import { initializeUpdateCommands } from "../../src/commands/update"; import { OllamaAction } from "../../src/commands/update/ollama"; +import { ConfigFileManager } from "../../src/lib/config/ConfigFileManager"; vi.mock("../../src/commands/update/ollama"); +vi.mock("../../src/lib/config/ConfigFileManager"); describe("ollama command", () => { let program: Command; @@ -11,6 +13,9 @@ describe("ollama command", () => { beforeEach(() => { program = new Command(); initializeUpdateCommands(program); + + const mockConfig = { defaultOllamaModel: "default-model" }; + vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); }); afterEach(() => { From 91504b79c954032617bb4b314e3afb7d65a15965 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 31 Jan 2025 00:21:50 +0000 Subject: [PATCH 57/67] Release v0.11.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a4fe649..ad091d94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.11.0 (2025-01-31) + + +### Features + +* Enhance Ollama Command Workflow and Default Model Handling ([#171](https://github.com/yeagerai/genlayer-cli/issues/171)) ([3dc7a96](https://github.com/yeagerai/genlayer-cli/commit/3dc7a9673ada8116b1fb99e089439a75e06237ec)) + ## 0.10.2 (2025-01-30) diff --git a/package-lock.json b/package-lock.json index f22d2908..bfe59c32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.10.2", + "version": "0.11.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.10.2", + "version": "0.11.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a31f568f..c5460faa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.10.2", + "version": "0.11.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From a957ffa51d1a76595434097178595f8b5cd6bcc0 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:06:08 -0300 Subject: [PATCH 58/67] chore: new reset message (#177) --- src/commands/general/init.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 7657fe2d..9c1a7934 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -77,7 +77,7 @@ export async function initAction(options: InitActionOptions, simulatorService: I { type: "confirm", name: "confirmReset", - message: `This command is going to reset GenLayer docker images and containers, providers API Keys, and GenLayer database (accounts, transactions, and validators). Do you want to continue?`, + message: `This command is going to reset GenLayer docker images and containers, providers API Keys, and GenLayer database (accounts, transactions, validators and logs). Contract code (gpy files) will be kept. Do you want to continue?`, default: true, }, ]); From 7b221c142d5ae0942edd8e6455c4b3dd8f8dc434 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Feb 2025 14:06:44 +0000 Subject: [PATCH 59/67] Release v0.11.1 [skip ci] --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad091d94..78f431ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ +## 0.11.1 (2025-02-05) + ## 0.11.0 (2025-01-31) diff --git a/package-lock.json b/package-lock.json index bfe59c32..c8b0199b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.11.0", + "version": "0.11.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.11.0", + "version": "0.11.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index c5460faa..b0c6db09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.11.0", + "version": "0.11.1", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From dbae62cd6ea0c90ee7fb6953112006f9dff729c3 Mon Sep 17 00:00:00 2001 From: Edinaldo Pereira da Silva Junior <69252337+epsjunior@users.noreply.github.com> Date: Wed, 5 Feb 2025 15:14:41 -0300 Subject: [PATCH 60/67] feat: Add `stop` Command and Improve Docker Container Management (#178) * feat: new command stop * chore: improving logs --- src/commands/general/index.ts | 9 ++++ src/commands/general/stop.ts | 25 ++++++++++ src/lib/interfaces/ISimulatorService.ts | 5 +- src/lib/services/simulator.ts | 66 +++++++++++++++---------- tests/actions/stop.test.ts | 58 ++++++++++++++++++++++ tests/commands/stop.test.ts | 27 ++++++++++ tests/services/simulator.test.ts | 34 ++++++++++++- vitest.config.ts | 1 + 8 files changed, 195 insertions(+), 30 deletions(-) create mode 100644 src/commands/general/stop.ts create mode 100644 tests/actions/stop.test.ts create mode 100644 tests/commands/stop.test.ts diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 1ecd336f..67fd14e0 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -4,6 +4,7 @@ import simulatorService from "../../lib/services/simulator"; import { initAction, InitActionOptions } from "./init"; import { startAction, StartActionOptions } from "./start"; import {localnetCompatibleVersion} from "../../lib/config/simulator"; +import {StopAction} from "./stop"; export function initializeGeneralCommands(program: Command) { program @@ -24,5 +25,13 @@ export function initializeGeneralCommands(program: Command) { .option("--reset-db", "Reset Database", false) .action((options: StartActionOptions) => startAction(options, simulatorService)); + program + .command("stop") + .description("Stop all running localnet services.") + .action(async () => { + const stopAction = new StopAction(); + await stopAction.stop(); + }); + return program; } diff --git a/src/commands/general/stop.ts b/src/commands/general/stop.ts new file mode 100644 index 00000000..4583f647 --- /dev/null +++ b/src/commands/general/stop.ts @@ -0,0 +1,25 @@ +import { BaseAction } from "../../lib/actions/BaseAction"; +import { SimulatorService } from "../../lib/services/simulator"; +import { ISimulatorService } from "../../lib/interfaces/ISimulatorService"; + +export class StopAction extends BaseAction { + private simulatorService: ISimulatorService; + + constructor() { + super(); + this.simulatorService = new SimulatorService(); + } + + public async stop(): Promise { + try{ + await this.confirmPrompt( + "Are you sure you want to stop all running GenLayer containers? This will halt all active processes." + ); + console.log(`Stopping Docker containers...`); + await this.simulatorService.stopDockerContainers(); + console.log(`All running GenLayer containers have been successfully stopped.`); + }catch (error) { + console.error("An error occurred while stopping the containers:", error) + } + } +} diff --git a/src/lib/interfaces/ISimulatorService.ts b/src/lib/interfaces/ISimulatorService.ts index 27189fdb..1e9a0e05 100644 --- a/src/lib/interfaces/ISimulatorService.ts +++ b/src/lib/interfaces/ISimulatorService.ts @@ -12,8 +12,9 @@ export interface ISimulatorService { getAiProvidersOptions(withHint: boolean): Array<{name: string; value: string}>; getFrontendUrl(): string; openFrontend(): Promise; - resetDockerContainers(): Promise; - resetDockerImages(): Promise; + stopDockerContainers(): Promise; + resetDockerContainers(): Promise; + resetDockerImages(): Promise; checkCliVersion(): Promise; cleanDatabase(): Promise; addConfigToEnvFile(newConfig: Record): void; diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index f757892b..5cf69300 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -1,4 +1,4 @@ -import Docker from "dockerode" +import Docker, {ContainerInfo} from "dockerode"; import * as fs from "fs"; import * as dotenv from "dotenv"; import * as path from "path"; @@ -48,6 +48,39 @@ export class SimulatorService implements ISimulatorService { this.docker = new Docker(); } + private readEnvConfigValue(key: string): string { + const envFilePath = path.join(this.location, ".env"); + // Transform the config string to object + const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); + return envConfig[key]; + } + + private async getGenlayerContainers(): Promise { + const containers = await this.docker.listContainers({ all: true }); + return containers.filter(container => + container.Names.some(name => + name.startsWith(CONTAINERS_NAME_PREFIX) || name.includes("ollama") + ) + ); + } + + private async stopAndRemoveContainers(remove: boolean = false): Promise { + const genlayerContainers = await this.getGenlayerContainers(); + + for (const containerInfo of genlayerContainers) { + const container = this.docker.getContainer(containerInfo.Id); + if (containerInfo.State === "running") { + await container.stop(); + } + + const isOllamaContainer = containerInfo.Names.some(name => name.includes("ollama")); + + if (remove && !isOllamaContainer) { + await container.remove(); + } + } + } + public addConfigToEnvFile(newConfig: Record): void { const envFilePath = path.join(this.location, ".env"); @@ -76,13 +109,6 @@ export class SimulatorService implements ISimulatorService { return this.composeOptions; } - private readEnvConfigValue(key: string): string { - const envFilePath = path.join(this.location, ".env"); - // Transform the config string to object - const envConfig = dotenv.parse(fs.readFileSync(envFilePath, "utf8")); - return envConfig[key]; - } - public async checkCliVersion(): Promise { const update = await updateCheck(pkg); if (update && update.latest !== pkg.version) { @@ -218,25 +244,15 @@ export class SimulatorService implements ISimulatorService { return true; } - public async resetDockerContainers(): Promise { - const containers = await this.docker.listContainers({ all: true }); - const genlayerContainers = containers.filter(container => - container.Names.some(name => - name.startsWith(CONTAINERS_NAME_PREFIX) - ) - ); + public async stopDockerContainers(): Promise { + await this.stopAndRemoveContainers(false); + } - for (const containerInfo of genlayerContainers) { - const container = this.docker.getContainer(containerInfo.Id); - if (containerInfo.State === "running") { - await container.stop(); - } - await container.remove(); - } - return true; + public async resetDockerContainers(): Promise { + await this.stopAndRemoveContainers(true); } - public async resetDockerImages(): Promise { + public async resetDockerImages(): Promise { const images = await this.docker.listImages(); const genlayerImages = images.filter(image => image.RepoTags?.some(tag => tag.startsWith(IMAGES_NAME_PREFIX)) @@ -246,8 +262,6 @@ export class SimulatorService implements ISimulatorService { const image = this.docker.getImage(imageInfo.Id); await image.remove({force: true}); } - - return true; } public async cleanDatabase(): Promise { diff --git a/tests/actions/stop.test.ts b/tests/actions/stop.test.ts new file mode 100644 index 00000000..9a308894 --- /dev/null +++ b/tests/actions/stop.test.ts @@ -0,0 +1,58 @@ +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; +import { StopAction } from "../../src/commands/general/stop"; +import { SimulatorService } from "../../src/lib/services/simulator"; +import { ISimulatorService } from "../../src/lib/interfaces/ISimulatorService"; +import inquirer from "inquirer"; + +vi.mock("../../src/lib/services/simulator"); +vi.mock("inquirer"); + +describe("StopAction", () => { + let stopAction: StopAction; + let mockSimulatorService: ISimulatorService; + + beforeEach(() => { + vi.clearAllMocks(); + + mockSimulatorService = { + stopDockerContainers: vi.fn(), + } as unknown as ISimulatorService; + + SimulatorService.prototype.stopDockerContainers = mockSimulatorService.stopDockerContainers; + + stopAction = new StopAction(); + (stopAction as any).simulatorService = mockSimulatorService; + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("should stop containers if user confirms", async () => { + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: true }); + + await stopAction.stop(); + + expect(inquirer.prompt).toHaveBeenCalledWith([ + { + type: "confirm", + name: "confirmAction", + message: "Are you sure you want to stop all running GenLayer containers? This will halt all active processes.", + default: true, + }, + ]); + expect(mockSimulatorService.stopDockerContainers).toHaveBeenCalled(); + }); + + test("should abort if user cancels", async () => { + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: false }); + + console.log = vi.fn(); + + await stopAction.stop(); + + expect(inquirer.prompt).toHaveBeenCalled(); + expect(console.log).toHaveBeenCalledWith("Operation aborted!"); + expect(mockSimulatorService.stopDockerContainers).not.toHaveBeenCalled(); + }); +}); diff --git a/tests/commands/stop.test.ts b/tests/commands/stop.test.ts new file mode 100644 index 00000000..5999bb4a --- /dev/null +++ b/tests/commands/stop.test.ts @@ -0,0 +1,27 @@ +import { Command } from "commander"; +import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; +import { initializeGeneralCommands } from "../../src/commands/general"; +import { StopAction } from "../../src/commands/general/stop"; + +vi.mock("../../src/commands/general/stop"); + +describe("stop command", () => { + let program: Command; + + beforeEach(() => { + program = new Command(); + initializeGeneralCommands(program); + + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("doesn't require arguments or options", async () => { + expect(() => program.parse(["node", "test", "stop"])).not.toThrow(); + expect(StopAction).toHaveBeenCalledTimes(1); + expect(StopAction.prototype.stop).toHaveBeenCalledWith(); + }); +}); diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index c82628b8..92782f3b 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -329,7 +329,7 @@ describe("SimulatorService - Docker Tests", () => { const result = await simulatorService.resetDockerContainers(); - expect(result).toBe(true); + expect(result).toBe(undefined); expect(mockListContainers).toHaveBeenCalledWith({ all: true }); // Ensure only the relevant containers were stopped and removed @@ -341,6 +341,36 @@ describe("SimulatorService - Docker Tests", () => { expect(mockRemove).toHaveBeenCalledTimes(2); }); + test("should stop all running GenLayer containers", async () => { + const mockContainers = [ + { + Id: "container1", + Names: [`${CONTAINERS_NAME_PREFIX}container1`], + State: "running", + }, + { + Id: "container2", + Names: [`${CONTAINERS_NAME_PREFIX}container2`], + State: "exited", + }, + ]; + + vi.mocked(Docker.prototype.listContainers).mockResolvedValue(mockContainers as any); + + const mockStop = vi.fn().mockResolvedValue(undefined); + const mockGetContainer = vi.mocked(Docker.prototype.getContainer); + mockGetContainer.mockImplementation(() => ({ + stop: mockStop, + } as unknown as Docker.Container)); + + await simulatorService.stopDockerContainers(); + + expect(mockGetContainer).toHaveBeenCalledWith("container1"); + expect(mockGetContainer).toHaveBeenCalledWith("container2"); + expect(mockStop).toHaveBeenCalledTimes(1); + }); + + test("should remove Docker images with the specified prefix", async () => { const mockImages = [ { @@ -366,7 +396,7 @@ describe("SimulatorService - Docker Tests", () => { const result = await simulatorService.resetDockerImages(); - expect(result).toBe(true); + expect(result).toBe(undefined); expect(mockListImages).toHaveBeenCalled(); expect(mockGetImage).toHaveBeenCalledWith("image1"); expect(mockGetImage).toHaveBeenCalledWith("image2"); diff --git a/vitest.config.ts b/vitest.config.ts index 72da1a8c..625a376d 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,6 +4,7 @@ export default defineConfig({ test: { globals: true, environment: 'jsdom', + testTimeout: 10000, coverage: { exclude: [...configDefaults.exclude, '*.js', 'tests/**/*.ts', 'src/types', 'scripts'], } From 1e9d916ac1573f02a74dd3d527edd1050f6bc1b3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 5 Feb 2025 18:15:16 +0000 Subject: [PATCH 61/67] Release v0.12.0 [skip ci] --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78f431ca..97d54aab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ +## 0.12.0 (2025-02-05) + + +### Features + +* Add `stop` Command and Improve Docker Container Management ([#178](https://github.com/yeagerai/genlayer-cli/issues/178)) ([dbae62c](https://github.com/yeagerai/genlayer-cli/commit/dbae62cd6ea0c90ee7fb6953112006f9dff729c3)) + ## 0.11.1 (2025-02-05) ## 0.11.0 (2025-01-31) diff --git a/package-lock.json b/package-lock.json index c8b0199b..9bcc27d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "genlayer", - "version": "0.11.1", + "version": "0.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "genlayer", - "version": "0.11.1", + "version": "0.12.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index b0c6db09..eccdfc12 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "genlayer", - "version": "0.11.1", + "version": "0.12.0", "description": "GenLayer Command Line Tool", "main": "src/index.ts", "bin": { From 39ec17bc20a8759bc0d9e74cf78006be554dab8d Mon Sep 17 00:00:00 2001 From: Edinaldo Junior Date: Fri, 14 Feb 2025 04:45:16 -0300 Subject: [PATCH 62/67] feat: new log and spinner class --- package-lock.json | 289 ++++++++++++++---- package.json | 2 + src/commands/general/stop.ts | 11 +- src/commands/update/ollama.ts | 110 ++++--- src/commands/validators/validators.ts | 103 +++---- src/lib/actions/BaseAction.ts | 74 ++++- tests/actions/ollama.test.ts | 87 ++---- tests/actions/stop.test.ts | 27 +- tests/actions/validators.test.ts | 415 +++++++++++++++++--------- tests/libs/baseAction.test.ts | 175 +++++++++++ 10 files changed, 921 insertions(+), 372 deletions(-) create mode 100644 tests/libs/baseAction.test.ts diff --git a/package-lock.json b/package-lock.json index 9bcc27d7..c19b4918 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { + "chalk": "^5.4.1", "commander": "^12.0.0", "dockerode": "^4.0.2", "dotenv": "^16.4.5", @@ -18,6 +19,7 @@ "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", + "ora": "^8.2.0", "update-check": "^1.5.4", "uuid": "^9.0.1", "viem": "^2.21.54", @@ -2330,19 +2332,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz", - "integrity": "sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==", - "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/boxen/node_modules/emoji-regex": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", @@ -2588,16 +2577,12 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -4139,6 +4124,22 @@ "concat-map": "0.0.1" } }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4561,7 +4562,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -5227,6 +5227,45 @@ "node": ">=18" } }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -6258,6 +6297,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/loupe": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", @@ -6421,7 +6476,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -6808,28 +6862,176 @@ } }, "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/ora/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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols/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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/os-name": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", @@ -8442,7 +8644,6 @@ "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" @@ -8620,7 +8821,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -9330,19 +9530,6 @@ "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz", - "integrity": "sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==", - "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/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index eccdfc12..9d5af5a6 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "typescript": "^5.4.5" }, "dependencies": { + "chalk": "^5.4.1", "commander": "^12.0.0", "dockerode": "^4.0.2", "dotenv": "^16.4.5", @@ -64,6 +65,7 @@ "inquirer": "^9.2.19", "node-fetch": "^2.7.0", "open": "^10.1.0", + "ora": "^8.2.0", "update-check": "^1.5.4", "uuid": "^9.0.1", "viem": "^2.21.54", diff --git a/src/commands/general/stop.ts b/src/commands/general/stop.ts index 4583f647..39da59bd 100644 --- a/src/commands/general/stop.ts +++ b/src/commands/general/stop.ts @@ -11,15 +11,16 @@ export class StopAction extends BaseAction { } public async stop(): Promise { - try{ + try { await this.confirmPrompt( "Are you sure you want to stop all running GenLayer containers? This will halt all active processes." ); - console.log(`Stopping Docker containers...`); + + this.startSpinner("Stopping Docker containers..."); await this.simulatorService.stopDockerContainers(); - console.log(`All running GenLayer containers have been successfully stopped.`); - }catch (error) { - console.error("An error occurred while stopping the containers:", error) + this.succeedSpinner("All running GenLayer containers have been successfully stopped."); + } catch (error) { + this.failSpinner("An error occurred while stopping the containers.", error); } } } diff --git a/src/commands/update/ollama.ts b/src/commands/update/ollama.ts index 6f96f54e..6fb88441 100644 --- a/src/commands/update/ollama.ts +++ b/src/commands/update/ollama.ts @@ -1,72 +1,67 @@ import Docker from "dockerode"; import { rpcClient } from "../../lib/clients/jsonRpcClient"; +import { BaseAction } from "../../lib/actions/BaseAction"; -export class OllamaAction { +export class OllamaAction extends BaseAction { private docker: Docker; constructor() { + super(); this.docker = new Docker(); } async updateModel(modelName: string) { - const providersAndModels = await rpcClient.request({ - method: "sim_getProvidersAndModels", - params: [], - }); - - const existingOllamaProvider = providersAndModels.result.find( - (entry: any) => entry.plugin === "ollama" - ); - - if (!existingOllamaProvider) { - throw new Error("No existing 'ollama' provider found. Unable to add/update a model."); - } + try { + this.startSpinner(`Updating model "${modelName}"...`); - await this.executeModelCommand( - "pull", - modelName, - `Model "${modelName}" updated successfully` - ); - - const existingModel = providersAndModels.result.some( - (entry: any) => - entry.plugin === "ollama" && entry.model === modelName - ); - - if (!existingModel) { - console.log(`Model "${modelName}" not found in Provider Presets. Adding...`); - - const newModelConfig = { - config: existingOllamaProvider.config, - model: modelName, - plugin: "ollama", - plugin_config: existingOllamaProvider.plugin_config, - provider: "ollama", - }; - - await rpcClient.request({ - method: "sim_addProvider", - params: [newModelConfig], + const providersAndModels = await rpcClient.request({ + method: "sim_getProvidersAndModels", + params: [], }); - console.log(`Model "${modelName}" added successfully.`); + const existingOllamaProvider = providersAndModels.result.find( + (entry: any) => entry.plugin === "ollama" + ); + + if (!existingOllamaProvider) { + return this.failSpinner("No existing 'ollama' provider found. Unable to add/update a model."); + } + + await this.executeModelCommand("pull", modelName, `Model "${modelName}" updated successfully`); + + const existingModel = providersAndModels.result.some( + (entry: any) => entry.plugin === "ollama" && entry.model === modelName + ); + if (!existingModel) { + this.startSpinner(`Adding model "${modelName}" to Provider Presets...`); + + const newModelConfig = { + config: existingOllamaProvider.config, + model: modelName, + plugin: "ollama", + plugin_config: existingOllamaProvider.plugin_config, + provider: "ollama", + }; + + await rpcClient.request({ + method: "sim_addProvider", + params: [newModelConfig], + }); + this.succeedSpinner(`Model "${modelName}" added successfully.`); + } + } catch (error) { + this.failSpinner(`Error updating model "${modelName}"`, error); } } async removeModel(modelName: string) { - await this.executeModelCommand( - "rm", - modelName, - `Model "${modelName}" removed successfully` - ); + await this.executeModelCommand("rm", modelName, `Model "${modelName}" removed successfully`); } - private async executeModelCommand( - command: string, - modelName: string, - successMessage: string - ) { + private async executeModelCommand(command: string, modelName: string, successMessage: string) { try { + this.startSpinner(`Executing '${command}' command on model "${modelName}"...`); + let success = false; const ollamaContainer = this.docker.getContainer("ollama"); const exec = await ollamaContainer.exec({ @@ -74,12 +69,13 @@ export class OllamaAction { AttachStdout: true, AttachStderr: true, }); - const stream = await exec.start({Detach: false, Tty: false}); + const stream = await exec.start({ Detach: false, Tty: false }); stream.on("data", (chunk: any) => { - const chunkStr = chunk.toString(); - console.log(chunkStr); - if (chunkStr.includes("success") || chunkStr.includes("deleted")) { + const output = chunk.toString(); + this.setSpinnerText(output.trim()); + + if (output.includes("success") || output.includes("deleted")) { success = true; } }); @@ -87,17 +83,17 @@ export class OllamaAction { await new Promise((resolve, reject) => { stream.on("end", () => { if (success) { + this.succeedSpinner(successMessage); resolve(); } else { + this.failSpinner(`Failed to execute '${command}' on model "${modelName}".`); reject('internal error'); } }); stream.on("error", reject); }); - - console.log(successMessage); - }catch (error) { - console.error(`Error executing command "${command}" on model "${modelName}":`, error); + } catch (error) { + this.failSpinner(`Error executing command "${command}" on model "${modelName}"`, error); } } } diff --git a/src/commands/validators/validators.ts b/src/commands/validators/validators.ts index 99a4024e..1c8a4fe4 100644 --- a/src/commands/validators/validators.ts +++ b/src/commands/validators/validators.ts @@ -31,26 +31,25 @@ export class ValidatorsAction extends BaseAction { public async getValidator(options: ValidatorOptions): Promise { try { if (options.address) { - console.log(`Fetching validator with address: ${options.address}`); + this.startSpinner(`Fetching validator with address: ${options.address}`); const result = await rpcClient.request({ method: "sim_getValidator", params: [options.address], }); - console.log("Validator Details:", result.result); + this.succeedSpinner(`Successfully fetched validator with address: ${options.address}`, result.result); } else { - console.log("Fetching all validators..."); + this.startSpinner(`Fetching all validators...`); const result = await rpcClient.request({ method: "sim_getAllValidators", params: [], }); - - console.log("All Validators:", result.result); + this.succeedSpinner('Successfully fetched all validators.', result.result) } } catch (error) { - console.error("Error fetching validators:", error); + this.failSpinner("Error fetching validators", error); } } @@ -58,65 +57,60 @@ export class ValidatorsAction extends BaseAction { try { if (options.address) { await this.confirmPrompt(`This command will delete the validator with the address: ${options.address}. Do you want to continue?`); - console.log(`Deleting validator with address: ${options.address}`); + this.startSpinner(`Deleting validator with address: ${options.address}`); const result = await rpcClient.request({ method: "sim_deleteValidator", params: [options.address], }); - console.log("Deleted Address:", result.result); + this.succeedSpinner(`Deleted Address: ${result.result}`); } else { await this.confirmPrompt(`This command will delete all validators. Do you want to continue?`); - console.log("Deleting all validators..."); + this.startSpinner("Deleting all validators..."); await rpcClient.request({ method: "sim_deleteAllValidators", params: [], }); - console.log("Successfully deleted all validators"); + this.succeedSpinner("Successfully deleted all validators"); } } catch (error) { - console.error("Error deleting validators:", error); + this.failSpinner("Error deleting validators", error); } } public async countValidators(): Promise { try { - console.log("Counting all validators..."); + this.startSpinner("Counting all validators..."); const result = await rpcClient.request({ method: "sim_countValidators", params: [], }); - - console.log("Total Validators:", result.result); + this.succeedSpinner(`Total Validators: ${result.result}`); } catch (error) { - console.error("Error counting validators:", error); + this.failSpinner("Error counting validators", error); } } public async updateValidator(options: UpdateValidatorOptions): Promise { try { - console.log(`Fetching validator with address: ${options.address}...`); + this.startSpinner(`Fetching validator with address: ${options.address}...`); const currentValidator = await rpcClient.request({ method: "sim_getValidator", params: [options.address], }); - if (!currentValidator.result) { - throw new Error(`Validator with address ${options.address} not found.`); - } - - console.log("Current Validator Details:", currentValidator.result); + this.log("Current Validator Details:", currentValidator.result); const parsedStake = options.stake ? parseInt(options.stake, 10) : currentValidator.result.stake; if (isNaN(parsedStake) || parsedStake < 0) { - return console.error("Invalid stake value. Stake must be a positive integer."); + return this.failSpinner("Invalid stake value. Stake must be a positive integer."); } const updatedValidator = { @@ -127,7 +121,9 @@ export class ValidatorsAction extends BaseAction { config: options.config ? JSON.parse(options.config) : currentValidator.result.config, }; - console.log("Updated Validator Details:", updatedValidator); + this.log("Updated Validator Details:", updatedValidator); + + this.setSpinnerText('Updating Validator...'); const result = await rpcClient.request({ method: "sim_updateValidator", @@ -140,9 +136,9 @@ export class ValidatorsAction extends BaseAction { ], }); - console.log("Validator successfully updated:", result.result); + this.succeedSpinner("Validator successfully updated", result.result); } catch (error) { - console.error("Error updating validator:", error); + this.failSpinner("Error updating validator", error); } } @@ -150,21 +146,21 @@ export class ValidatorsAction extends BaseAction { try { const count = parseInt(options.count, 10); if (isNaN(count) || count < 1) { - return console.error("Invalid count. Please provide a positive integer."); + return this.logError("Invalid count. Please provide a positive integer."); } - console.log(`Creating ${count} random validator(s)...`); - console.log(`Providers: ${options.providers.length > 0 ? options.providers.join(", ") : "None"}`); - console.log(`Models: ${options.models.length > 0 ? options.models.join(", ") : "None"}`); + this.startSpinner(`Creating ${count} random validator(s)...`); + this.log(`Providers: ${options.providers.length > 0 ? options.providers.join(", ") : "All"}`); + this.log(`Models: ${options.models.length > 0 ? options.models.join(", ") : "All"}`); const result = await rpcClient.request({ method: "sim_createRandomValidators", params: [count, 1, 10, options.providers, options.models], }); - console.log("Random validators successfully created:", result.result); + this.succeedSpinner("Random validators successfully created", result.result); } catch (error) { - console.error("Error creating random validators:", error); + this.failSpinner("Error creating random validators", error); } } @@ -172,22 +168,23 @@ export class ValidatorsAction extends BaseAction { try { const stake = parseInt(options.stake, 10); if (isNaN(stake) || stake < 1) { - return console.error("Invalid stake. Please provide a positive integer."); + return this.logError("Invalid stake. Please provide a positive integer."); } if (options.model && !options.provider) { - return console.error("You must specify a provider if using a model."); + return this.logError("You must specify a provider if using a model."); } - console.log("Fetching available providers and models..."); + this.startSpinner("Fetching available providers and models..."); const providersAndModels = await rpcClient.request({ method: "sim_getProvidersAndModels", params: [], }); + this.stopSpinner(); if (!providersAndModels.result || providersAndModels.result.length === 0) { - return console.error("No providers or models available."); + return this.logError("No providers or models available."); } const availableProviders = [ @@ -218,7 +215,7 @@ export class ValidatorsAction extends BaseAction { ); if (availableModels.length === 0) { - return console.error("No models available for the selected provider."); + return this.logError("No models available for the selected provider."); } let model = options.model; @@ -241,34 +238,30 @@ export class ValidatorsAction extends BaseAction { ); if (!modelDetails) { - return console.error("Selected model details not found."); + return this.logError("Selected model details not found."); } const config = options.config ? JSON.parse(options.config) : modelDetails.config; - - console.log("Creating validator with the following details:"); - console.log(`Stake: ${stake}`); - console.log(`Provider: ${modelDetails.provider}`); - console.log(`Model: ${modelDetails.model}`); - console.log(`Config:`, config); - console.log(`Plugin:`, modelDetails.plugin); - console.log(`Plugin Config:`, modelDetails.plugin_config); + const params = [ + stake, + modelDetails.provider, + modelDetails.model, + config, + modelDetails.plugin, + modelDetails.plugin_config, + ] + + this.log("Validator details:", params); + this.startSpinner('Creating validator...'); const result = await rpcClient.request({ method: "sim_createValidator", - params: [ - stake, - modelDetails.provider, - modelDetails.model, - config, - modelDetails.plugin, - modelDetails.plugin_config, - ], + params, }); - console.log("Validator successfully created:", result.result); + this.succeedSpinner("Validator successfully created:", result.result); } catch (error) { - console.error("Error creating validator:", error); + this.failSpinner("Error creating validator", error); } } } diff --git a/src/lib/actions/BaseAction.ts b/src/lib/actions/BaseAction.ts index 93dab902..5ffba7b6 100644 --- a/src/lib/actions/BaseAction.ts +++ b/src/lib/actions/BaseAction.ts @@ -1,19 +1,87 @@ import inquirer from "inquirer"; +import chalk from "chalk"; +import ora, { Ora } from "ora"; export class BaseAction { + private spinner: Ora; + + constructor() { + this.spinner = ora({ text: "", spinner: "dots" }); + } + protected async confirmPrompt(message: string): Promise { const answer = await inquirer.prompt([ { type: "confirm", name: "confirmAction", - message: message, + message: chalk.yellow(message), default: true, }, ]); if (!answer.confirmAction) { - console.log("Operation aborted!"); + this.logError("Operation aborted!"); process.exit(0); } } -} + + private formatOutput(data: any): string { + if (data instanceof Error) { + const errorDetails = { + name: data.name, + message: data.message, + ...(Object.keys(data).length ? data : {}), + }; + return JSON.stringify(errorDetails, null, 2); + } + return typeof data === "object" ? JSON.stringify(data, null, 2) : String(data); + } + + protected log(message: string, data?: any): void { + console.log(chalk.white(`\n${message}`)); + if (data) console.log(this.formatOutput(data)); + } + + protected logSuccess(message: string, data?: any): void { + console.log(chalk.green(`\n✔ ${message}`)); + if (data) console.log(chalk.green(this.formatOutput(data))); + } + + protected logInfo(message: string, data?: any): void { + console.log(chalk.blue(`\nℹ ${message}`)); + if (data) console.log(chalk.blue(this.formatOutput(data))); + } + + protected logWarning(message: string, data?: any): void { + console.log(chalk.yellow(`\n⚠ ${message}`)); + if (data) console.log(chalk.yellow(this.formatOutput(data))); + } + + protected logError(message: string, error?: any): void { + console.error(chalk.red(`\n✖ ${message}`)); + if (error) console.error(chalk.red(this.formatOutput(error))); + } + + protected startSpinner(message: string) { + this.spinner.text = chalk.blue(`${message}`); + this.spinner.start(); + } + + protected succeedSpinner(message: string, data?: any): void { + if (data) this.log('Result:', data); + this.spinner.succeed(chalk.green(message)); + } + + protected failSpinner(message: string, error?:any): void { + if (error) this.log('Error:', error); + this.spinner.fail(chalk.red(message)); + } + + protected stopSpinner(): void { + this.spinner.stop(); + } + + protected setSpinnerText(message: string): void { + this.spinner.text = chalk.blue(message); + } +} \ No newline at end of file diff --git a/tests/actions/ollama.test.ts b/tests/actions/ollama.test.ts index 6827c089..76aa080d 100644 --- a/tests/actions/ollama.test.ts +++ b/tests/actions/ollama.test.ts @@ -1,7 +1,6 @@ import { describe, test, vi, beforeEach, afterEach, expect, Mock } from "vitest"; import { OllamaAction } from "../../src/commands/update/ollama"; import { rpcClient } from "../../src/lib/clients/jsonRpcClient"; - import Docker from "dockerode"; vi.mock("dockerode"); @@ -37,6 +36,11 @@ describe("OllamaAction", () => { } as unknown as Docker.Container); Docker.prototype.getContainer = mockGetContainer; + + vi.spyOn(ollamaAction as any, "startSpinner").mockImplementation(() => {}); + vi.spyOn(ollamaAction as any, "setSpinnerText").mockImplementation(() => {}); + vi.spyOn(ollamaAction as any, "succeedSpinner").mockImplementation(() => {}); + vi.spyOn(ollamaAction as any, "failSpinner").mockImplementation(() => {}); }); afterEach(() => { @@ -49,6 +53,7 @@ describe("OllamaAction", () => { config: { key: "value" }, plugin_config: { pluginKey: "pluginValue" }, }; + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: [mockProvider], }); @@ -62,10 +67,9 @@ describe("OllamaAction", () => { } }); - console.log = vi.fn(); - await ollamaAction.updateModel("mocked_model"); + expect(ollamaAction["startSpinner"]).toHaveBeenCalledWith(`Updating model "mocked_model"...`); expect(mockGetContainer).toHaveBeenCalledWith("ollama"); expect(mockExec).toHaveBeenCalledWith({ Cmd: ["ollama", "pull", "mocked_model"], @@ -73,10 +77,8 @@ describe("OllamaAction", () => { AttachStderr: true, }); expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); - expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); - expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); - expect(console.log).toHaveBeenCalledWith("Mocked output success"); - expect(console.log).toHaveBeenCalledWith('Model "mocked_model" updated successfully'); + expect(ollamaAction["setSpinnerText"]).toHaveBeenCalledWith("Mocked output success"); + expect(ollamaAction["succeedSpinner"]).toHaveBeenCalledWith(`Model "mocked_model" updated successfully`); }); test("should remove the model using 'rm'", async () => { @@ -89,10 +91,9 @@ describe("OllamaAction", () => { } }); - console.log = vi.fn(); - await ollamaAction.removeModel("mocked_model"); + expect(ollamaAction["startSpinner"]).toHaveBeenCalledWith(`Executing 'rm' command on model "mocked_model"...`); expect(mockGetContainer).toHaveBeenCalledWith("ollama"); expect(mockExec).toHaveBeenCalledWith({ Cmd: ["ollama", "rm", "mocked_model"], @@ -100,10 +101,8 @@ describe("OllamaAction", () => { AttachStderr: true, }); expect(mockStart).toHaveBeenCalledWith({ Detach: false, Tty: false }); - expect(mockStream.on).toHaveBeenCalledWith("data", expect.any(Function)); - expect(mockStream.on).toHaveBeenCalledWith("end", expect.any(Function)); - expect(console.log).toHaveBeenCalledWith("Mocked output success"); - expect(console.log).toHaveBeenCalledWith('Model "mocked_model" removed successfully'); + expect(ollamaAction["setSpinnerText"]).toHaveBeenCalledWith("Mocked output success"); + expect(ollamaAction["succeedSpinner"]).toHaveBeenCalledWith(`Model "mocked_model" removed successfully`); }); test("should log an error if an exception occurs during 'pull'", async () => { @@ -112,48 +111,26 @@ describe("OllamaAction", () => { config: { key: "value" }, plugin_config: { pluginKey: "pluginValue" }, }; + vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: [mockProvider], }); const error = new Error("Mocked error"); - mockGetContainer.mockReturnValueOnce( - { - exec: () => { - throw new Error("Mocked error"); - } - } - ); - console.error = vi.fn(); + mockExec.mockRejectedValue(error); await ollamaAction.updateModel("mocked_model"); - expect(mockGetContainer).toHaveBeenCalledWith("ollama"); - expect(console.error).toHaveBeenCalledWith( - 'Error executing command "pull" on model "mocked_model":', - error - ); + expect(ollamaAction["failSpinner"]).toHaveBeenCalledWith(`Error executing command "pull" on model "mocked_model"`, error); }); test("should log an error if an exception occurs during 'rm'", async () => { const error = new Error("Mocked error"); - mockGetContainer.mockReturnValueOnce( - { - exec: () => { - throw new Error("Mocked error"); - } - } - ); - - console.error = vi.fn(); + mockExec.mockRejectedValue(error); await ollamaAction.removeModel("mocked_model"); - expect(mockGetContainer).toHaveBeenCalledWith("ollama"); - expect(console.error).toHaveBeenCalledWith( - 'Error executing command "rm" on model "mocked_model":', - error - ); + expect(ollamaAction["failSpinner"]).toHaveBeenCalledWith(`Error executing command "rm" on model "mocked_model"`, error); }); test("should throw an error if no 'ollama' provider exists during updateModel", async () => { @@ -161,21 +138,14 @@ describe("OllamaAction", () => { result: [], }); - const modelName = "mocked_model"; + await ollamaAction.updateModel("mocked_model"); - await expect(ollamaAction.updateModel(modelName)).rejects.toThrowError( + expect(ollamaAction["failSpinner"]).toHaveBeenCalledWith( "No existing 'ollama' provider found. Unable to add/update a model." ); - - expect(rpcClient.request).toHaveBeenCalledWith({ - method: "sim_getProvidersAndModels", - params: [], - }); }); test("should reject with an error if success is not set to true", async () => { - console.error = vi.fn(); - const mockProvider = { plugin: "ollama", config: { key: "value" }, @@ -195,14 +165,21 @@ describe("OllamaAction", () => { } }); - console.log = vi.fn(); - console.error = vi.fn(); - await ollamaAction.updateModel("mocked_model"); - expect(console.error).toHaveBeenCalledWith( - 'Error executing command "pull" on model "mocked_model":', 'internal error' + expect(ollamaAction["failSpinner"]).toHaveBeenCalledWith( + `Failed to execute 'pull' on model "mocked_model".` ); }); -}); + test("should log an error if an exception occurs inside updateModel", async () => { + const mockError = new Error("Mocked error"); + + vi.mocked(rpcClient.request).mockRejectedValue(mockError); + + await ollamaAction.updateModel("mocked_model"); + + expect(ollamaAction["failSpinner"]).toHaveBeenCalledWith(`Error updating model "mocked_model"`, mockError); + }); + +}); \ No newline at end of file diff --git a/tests/actions/stop.test.ts b/tests/actions/stop.test.ts index 9a308894..fdd1d354 100644 --- a/tests/actions/stop.test.ts +++ b/tests/actions/stop.test.ts @@ -2,6 +2,8 @@ import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; import { StopAction } from "../../src/commands/general/stop"; import { SimulatorService } from "../../src/lib/services/simulator"; import { ISimulatorService } from "../../src/lib/interfaces/ISimulatorService"; +import chalk from "chalk"; + import inquirer from "inquirer"; vi.mock("../../src/lib/services/simulator"); @@ -22,6 +24,10 @@ describe("StopAction", () => { stopAction = new StopAction(); (stopAction as any).simulatorService = mockSimulatorService; + + vi.spyOn(stopAction as any, "startSpinner").mockImplementation(() => {}); + vi.spyOn(stopAction as any, "succeedSpinner").mockImplementation(() => {}); + vi.spyOn(stopAction as any, "failSpinner").mockImplementation(() => {}); }); afterEach(() => { @@ -37,22 +43,35 @@ describe("StopAction", () => { { type: "confirm", name: "confirmAction", - message: "Are you sure you want to stop all running GenLayer containers? This will halt all active processes.", + message: chalk.yellow("Are you sure you want to stop all running GenLayer containers? This will halt all active processes."), default: true, }, ]); expect(mockSimulatorService.stopDockerContainers).toHaveBeenCalled(); + expect(stopAction["succeedSpinner"]).toHaveBeenCalledWith( + "All running GenLayer containers have been successfully stopped." + ); }); test("should abort if user cancels", async () => { vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: false }); - console.log = vi.fn(); - await stopAction.stop(); expect(inquirer.prompt).toHaveBeenCalled(); - expect(console.log).toHaveBeenCalledWith("Operation aborted!"); expect(mockSimulatorService.stopDockerContainers).not.toHaveBeenCalled(); }); + + test("should handle errors and call failSpinner", async () => { + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: true }); + const error = new Error("Test Error"); + mockSimulatorService.stopDockerContainers = vi.fn().mockRejectedValue(error); + + await stopAction.stop(); + + expect(stopAction["failSpinner"]).toHaveBeenCalledWith( + "An error occurred while stopping the containers.", + error + ); + }); }); diff --git a/tests/actions/validators.test.ts b/tests/actions/validators.test.ts index 3e9b9979..40cc6c9a 100644 --- a/tests/actions/validators.test.ts +++ b/tests/actions/validators.test.ts @@ -17,6 +17,15 @@ describe("ValidatorsAction", () => { beforeEach(() => { vi.clearAllMocks(); validatorsAction = new ValidatorsAction(); + + vi.spyOn(validatorsAction as any, "logSuccess").mockImplementation(() => {}); + vi.spyOn(validatorsAction as any, "logError").mockImplementation(() => {}); + vi.spyOn(validatorsAction as any, "startSpinner").mockImplementation(() => {}); + vi.spyOn(validatorsAction as any, "succeedSpinner").mockImplementation(() => {}); + vi.spyOn(validatorsAction as any, "failSpinner").mockImplementation(() => {}); + vi.spyOn(validatorsAction as any, "log").mockImplementation(() => {}); + vi.spyOn(validatorsAction as any, "stopSpinner").mockImplementation(() => {}); + vi.spyOn(validatorsAction as any, "setSpinnerText").mockImplementation(() => {}); }); afterEach(() => { @@ -29,30 +38,44 @@ describe("ValidatorsAction", () => { const mockResponse = { result: { id: 1, name: "Validator1" } }; vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); - console.log = vi.fn(); - await validatorsAction.getValidator({ address: mockAddress }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith( + `Fetching validator with address: ${mockAddress}` + ); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getValidator", params: [mockAddress], }); - expect(console.log).toHaveBeenCalledWith("Validator Details:", mockResponse.result); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith( + `Successfully fetched validator with address: ${mockAddress}`, + mockResponse.result + ); + + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should fetch all validators when no address is provided", async () => { const mockResponse = { result: [{ id: 1 }, { id: 2 }] }; vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); - console.log = vi.fn(); - await validatorsAction.getValidator({}); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching all validators..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getAllValidators", params: [], }); - expect(console.log).toHaveBeenCalledWith("All Validators:", mockResponse.result); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith( + "Successfully fetched all validators.", + mockResponse.result + ); + + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should log an error if an exception occurs while fetching a specific validator", async () => { @@ -61,15 +84,19 @@ describe("ValidatorsAction", () => { vi.mocked(rpcClient.request).mockRejectedValue(mockError); - console.error = vi.fn(); - await validatorsAction.getValidator({ address: mockAddress }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith( + `Fetching validator with address: ${mockAddress}` + ); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getValidator", params: [mockAddress], }); - expect(console.error).toHaveBeenCalledWith("Error fetching validators:", mockError); + + expect(validatorsAction["failSpinner"]).toHaveBeenCalledWith("Error fetching validators", mockError); + expect(validatorsAction["succeedSpinner"]).not.toHaveBeenCalled(); }); test("should log an error if an exception occurs while fetching all validators", async () => { @@ -77,63 +104,78 @@ describe("ValidatorsAction", () => { vi.mocked(rpcClient.request).mockRejectedValue(mockError); - console.error = vi.fn(); - await validatorsAction.getValidator({}); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching all validators..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getAllValidators", params: [], }); - expect(console.error).toHaveBeenCalledWith("Error fetching validators:", mockError); + + expect(validatorsAction["failSpinner"]).toHaveBeenCalledWith("Error fetching validators", mockError); + expect(validatorsAction["succeedSpinner"]).not.toHaveBeenCalled(); }); }); describe("deleteValidator", () => { - test("should delete a specific validator", async () => { - const mockAddress = "mocked_address"; + test("should delete a specific validator", async () => { + const mockAddress = "0x725a9D2D572E8833059a3e9a844791aF185C5Ff4"; vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: true }); - vi.mocked(rpcClient.request).mockResolvedValue({ result: { id: 1 } }); - - console.log = vi.fn(); + vi.mocked(rpcClient.request).mockResolvedValue({ result: mockAddress }); await validatorsAction.deleteValidator({ address: mockAddress }); - expect(inquirer.prompt).toHaveBeenCalled(); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith( + `Deleting validator with address: ${mockAddress}` + ); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_deleteValidator", params: [mockAddress], }); - expect(console.log).toHaveBeenCalledWith("Deleted Address:", { id: 1 }); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith( + `Deleted Address: ${mockAddress}` + ); + + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should delete all validators when no address is provided", async () => { vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: true }); vi.mocked(rpcClient.request).mockResolvedValue({}); - console.log = vi.fn(); - await validatorsAction.deleteValidator({}); - expect(inquirer.prompt).toHaveBeenCalled(); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith( + "Deleting all validators..." + ); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_deleteAllValidators", params: [], }); - expect(console.log).toHaveBeenCalledWith("Successfully deleted all validators"); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith( + "Successfully deleted all validators" + ); + + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should abort deletion if user declines confirmation", async () => { vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: false }); - console.log = vi.fn(); - - await validatorsAction.deleteValidator({ address: "mocked_address" }) + await validatorsAction.deleteValidator({ address: "mocked_address" }); expect(inquirer.prompt).toHaveBeenCalled(); - expect(console.log).toHaveBeenCalledWith("Operation aborted!"); + expect(validatorsAction["logError"]).toHaveBeenCalledWith("Operation aborted!"); expect(rpcClient.request).not.toHaveBeenCalled(); + expect(validatorsAction["startSpinner"]).not.toHaveBeenCalled(); + expect(validatorsAction["succeedSpinner"]).not.toHaveBeenCalled(); }); + }); describe("countValidators", () => { @@ -141,15 +183,17 @@ describe("ValidatorsAction", () => { const mockResponse = { result: 42 }; vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); - console.log = vi.fn(); - await validatorsAction.countValidators(); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Counting all validators..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_countValidators", params: [], }); - expect(console.log).toHaveBeenCalledWith("Total Validators:", 42); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Total Validators: 42"); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should log an error if an exception occurs while counting validators", async () => { @@ -157,16 +201,19 @@ describe("ValidatorsAction", () => { vi.mocked(rpcClient.request).mockRejectedValue(mockError); - console.error = vi.fn(); - await validatorsAction.countValidators(); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Counting all validators..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_countValidators", params: [], }); - expect(console.error).toHaveBeenCalledWith("Error counting validators:", mockError); + + expect(validatorsAction["failSpinner"]).toHaveBeenCalledWith("Error counting validators", mockError); + expect(validatorsAction["succeedSpinner"]).not.toHaveBeenCalled(); }); + }); describe("createValidator", () => { @@ -192,14 +239,37 @@ describe("ValidatorsAction", () => { .mockResolvedValueOnce({ selectedProvider: "Provider1" }) .mockResolvedValueOnce({ selectedModel: "Model1" }); - console.log = vi.fn(); - await validatorsAction.createValidator({ stake: "10" }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching available providers and models..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getProvidersAndModels", params: [], }); + + expect(validatorsAction["stopSpinner"]).toHaveBeenCalled(); + + expect(inquirer.prompt).toHaveBeenCalledWith([ + { + type: "list", + name: "selectedProvider", + message: "Select a provider:", + choices: ["Provider1"], + }, + ]); + + expect(inquirer.prompt).toHaveBeenCalledWith([ + { + type: "list", + name: "selectedModel", + message: "Select a model:", + choices: ["Model1"], + }, + ]); + + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Creating validator..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_createValidator", params: [ @@ -211,30 +281,46 @@ describe("ValidatorsAction", () => { { api_key_env_var: "KEY1" }, ], }); - expect(console.log).toHaveBeenCalledWith("Validator successfully created:", { id: 123 }); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith( + "Validator successfully created:", + mockResponse.result + ); + + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should log an error for invalid stake", async () => { - console.error = vi.fn(); await validatorsAction.createValidator({ stake: "invalid" }); - expect(console.error).toHaveBeenCalledWith("Invalid stake. Please provide a positive integer."); + expect(validatorsAction["logError"]).toHaveBeenCalledWith( + "Invalid stake. Please provide a positive integer." + ); + expect(rpcClient.request).not.toHaveBeenCalled(); + expect(validatorsAction["startSpinner"]).not.toHaveBeenCalled(); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should log an error if no providers or models are available", async () => { vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: [] }); - console.error = vi.fn(); - await validatorsAction.createValidator({ stake: "10" }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching available providers and models..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getProvidersAndModels", params: [], }); - expect(console.error).toHaveBeenCalledWith("No providers or models available."); + + expect(validatorsAction["stopSpinner"]).toHaveBeenCalled(); + + expect(validatorsAction["logError"]).toHaveBeenCalledWith("No providers or models available."); + + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); + expect(validatorsAction["succeedSpinner"]).not.toHaveBeenCalled(); }); test("should log an error if no models are available for the selected provider", async () => { @@ -245,11 +331,22 @@ describe("ValidatorsAction", () => { vi.mocked(rpcClient.request).mockResolvedValueOnce({ result: mockProvidersAndModels }); vi.mocked(inquirer.prompt).mockResolvedValueOnce({ selectedProvider: "Provider1" }); - console.error = vi.fn(); - await validatorsAction.createValidator({ stake: "10" }); - expect(console.error).toHaveBeenCalledWith("No models available for the selected provider."); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching available providers and models..."); + + expect(validatorsAction["stopSpinner"]).toHaveBeenCalled(); + + expect(inquirer.prompt).toHaveBeenCalledWith([ + { + type: "list", + name: "selectedProvider", + message: "Select a provider:", + choices: ["Provider1"], + }, + ]); + + expect(validatorsAction["logError"]).toHaveBeenCalledWith("No models available for the selected provider."); }); test("should log an error if selected model details are not found", async () => { @@ -267,22 +364,42 @@ describe("ValidatorsAction", () => { .mockResolvedValueOnce({ selectedProvider: "Provider1" }) .mockResolvedValueOnce({ selectedModel: "NonExistentModel" }); - console.error = vi.fn(); - await validatorsAction.createValidator({ stake: "10" }); - expect(console.error).toHaveBeenCalledWith("Selected model details not found."); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching available providers and models..."); + + expect(validatorsAction["stopSpinner"]).toHaveBeenCalled(); + + expect(inquirer.prompt).toHaveBeenCalledWith([ + { + type: "list", + name: "selectedProvider", + message: "Select a provider:", + choices: ["Provider1"], + }, + ]); + + expect(inquirer.prompt).toHaveBeenCalledWith([ + { + type: "list", + name: "selectedModel", + message: "Select a model:", + choices: ["Model1"], + }, + ]); + + expect(validatorsAction["logError"]).toHaveBeenCalledWith("Selected model details not found."); }); test("should log an error if an exception occurs during the process", async () => { const mockError = new Error("Unexpected error"); vi.mocked(rpcClient.request).mockRejectedValue(mockError); - console.error = vi.fn(); - await validatorsAction.createValidator({ stake: "10" }); - expect(console.error).toHaveBeenCalledWith("Error creating validator:", mockError); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching available providers and models..."); + + expect(validatorsAction["failSpinner"]).toHaveBeenCalledWith("Error creating validator", mockError); }); test("should use user-provided config if specified", async () => { @@ -307,11 +424,22 @@ describe("ValidatorsAction", () => { .mockResolvedValueOnce({ selectedProvider: "Provider1" }) .mockResolvedValueOnce({ selectedModel: "Model1" }); - console.log = vi.fn(); - const customConfig = '{"custom_key":"custom_value"}'; await validatorsAction.createValidator({ stake: "10", config: customConfig }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Fetching available providers and models..."); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getProvidersAndModels", + params: [], + }); + expect(validatorsAction["stopSpinner"]).toHaveBeenCalled(); + expect(inquirer.prompt).toHaveBeenCalledWith([ + { type: "list", name: "selectedProvider", message: "Select a provider:", choices: ["Provider1"] }, + ]); + expect(inquirer.prompt).toHaveBeenCalledWith([ + { type: "list", name: "selectedModel", message: "Select a model:", choices: ["Model1"] }, + ]); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Creating validator..."); expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_createValidator", params: [ @@ -323,84 +451,100 @@ describe("ValidatorsAction", () => { { api_key_env_var: "KEY1" }, ], }); - expect(console.log).toHaveBeenCalledWith("Validator successfully created:", { id: 123 }); + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Validator successfully created:", mockResponse.result); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); + }); + + test("should log an error if model is provided without provider", async () => { + vi.spyOn(validatorsAction as any, "logError").mockImplementation(() => {}); + + await validatorsAction.createValidator({ stake: "10", model: "Model1" }); + + expect(validatorsAction["logError"]).toHaveBeenCalledWith("You must specify a provider if using a model."); + expect(rpcClient.request).not.toHaveBeenCalled(); }); }); + describe("createRandomValidators", () => { test("should create random validators with valid count and providers", async () => { const mockResponse = { result: { success: true } }; vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); - console.log = vi.fn(); - await validatorsAction.createRandomValidators({ count: "5", providers: ["Provider1", "Provider2"], models: [] }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Creating 5 random validator(s)..."); + expect(validatorsAction["log"]).toHaveBeenCalledWith("Providers: Provider1, Provider2"); + expect(validatorsAction["log"]).toHaveBeenCalledWith("Models: All"); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_createRandomValidators", params: [5, 1, 10, ["Provider1", "Provider2"], []], }); - expect(console.log).toHaveBeenCalledWith("Creating 5 random validator(s)..."); - expect(console.log).toHaveBeenCalledWith("Providers: Provider1, Provider2"); - expect(console.log).toHaveBeenCalledWith("Random validators successfully created:", mockResponse.result); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Random validators successfully created", mockResponse.result); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should create random validators with valid count, providers and models", async () => { const mockResponse = { result: { success: true } }; vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); - console.log = vi.fn(); - await validatorsAction.createRandomValidators({ count: "10", providers: ["Provider3"], models: ["Model1", "Model2"] }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Creating 10 random validator(s)..."); + expect(validatorsAction["log"]).toHaveBeenCalledWith("Providers: Provider3"); + expect(validatorsAction["log"]).toHaveBeenCalledWith("Models: Model1, Model2"); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_createRandomValidators", params: [10, 1, 10, ["Provider3"], ["Model1", "Model2"]], }); - expect(console.log).toHaveBeenCalledWith("Creating 10 random validator(s)..."); - expect(console.log).toHaveBeenCalledWith("Providers: Provider3"); - expect(console.log).toHaveBeenCalledWith("Models: Model1, Model2"); - expect(console.log).toHaveBeenCalledWith("Random validators successfully created:", mockResponse.result); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Random validators successfully created", mockResponse.result); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should create random validators with default provider message when providers list is empty", async () => { const mockResponse = { result: { success: true } }; vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); - console.log = vi.fn(); - await validatorsAction.createRandomValidators({ count: "3", providers: [], models: [] }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Creating 3 random validator(s)..."); + expect(validatorsAction["log"]).toHaveBeenCalledWith("Providers: All"); + expect(validatorsAction["log"]).toHaveBeenCalledWith("Models: All"); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_createRandomValidators", params: [3, 1, 10, [], []], }); - expect(console.log).toHaveBeenCalledWith("Creating 3 random validator(s)..."); - expect(console.log).toHaveBeenCalledWith("Providers: None"); - expect(console.log).toHaveBeenCalledWith("Random validators successfully created:", mockResponse.result); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Random validators successfully created", mockResponse.result); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should throw an error for invalid count", async () => { - console.error = vi.fn(); - await validatorsAction.createRandomValidators({ count: "invalid", providers: ["Provider1"], models: [] }); - expect(console.error).toHaveBeenCalledWith("Invalid count. Please provide a positive integer."); + expect(validatorsAction["logError"]).toHaveBeenCalledWith("Invalid count. Please provide a positive integer."); expect(rpcClient.request).not.toHaveBeenCalled(); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should log an error if rpc request fails", async () => { const mockError = new Error("RPC failure"); vi.mocked(rpcClient.request).mockRejectedValue(mockError); - console.error = vi.fn(); - await validatorsAction.createRandomValidators({ count: "5", providers: ["Provider1"], models: [] }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith("Creating 5 random validator(s)..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_createRandomValidators", params: [5, 1, 10, ["Provider1"], []], }); - expect(console.error).toHaveBeenCalledWith("Error creating random validators:", mockError); + + expect(validatorsAction["failSpinner"]).toHaveBeenCalledWith("Error creating random validators", mockError); }); }); @@ -422,14 +566,17 @@ describe("ValidatorsAction", () => { .mockResolvedValueOnce(mockCurrentValidator) .mockResolvedValueOnce(mockResponse); - console.log = vi.fn(); - await validatorsAction.updateValidator({ address: mockAddress, stake: "200" }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith(`Fetching validator with address: ${mockAddress}...`); expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getValidator", params: [mockAddress], }); + + expect(validatorsAction["log"]).toHaveBeenCalledWith("Current Validator Details:", mockCurrentValidator.result); + expect(validatorsAction["setSpinnerText"]).toHaveBeenCalledWith("Updating Validator..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_updateValidator", params: [ @@ -440,7 +587,9 @@ describe("ValidatorsAction", () => { { max_tokens: 500 }, ], }); - expect(console.log).toHaveBeenCalledWith("Validator successfully updated:", mockResponse.result); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Validator successfully updated", mockResponse.result); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should fetch and update a validator with new provider and model", async () => { @@ -460,18 +609,17 @@ describe("ValidatorsAction", () => { .mockResolvedValueOnce(mockCurrentValidator) .mockResolvedValueOnce(mockResponse); - console.log = vi.fn(); - - await validatorsAction.updateValidator({ - address: mockAddress, - provider: "Provider2", - model: "Model2", - }); + await validatorsAction.updateValidator({ address: mockAddress, provider: "Provider2", model: "Model2" }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith(`Fetching validator with address: ${mockAddress}...`); expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getValidator", params: [mockAddress], }); + + expect(validatorsAction["log"]).toHaveBeenCalledWith("Current Validator Details:", mockCurrentValidator.result); + expect(validatorsAction["setSpinnerText"]).toHaveBeenCalledWith("Updating Validator..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_updateValidator", params: [ @@ -482,7 +630,9 @@ describe("ValidatorsAction", () => { { max_tokens: 500 }, ], }); - expect(console.log).toHaveBeenCalledWith("Validator successfully updated:", mockResponse.result); + + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Validator successfully updated", mockResponse.result); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should fetch and update a validator with new config", async () => { @@ -502,15 +652,18 @@ describe("ValidatorsAction", () => { .mockResolvedValueOnce(mockCurrentValidator) .mockResolvedValueOnce(mockResponse); - console.log = vi.fn(); - const newConfig = '{"max_tokens":1000}'; await validatorsAction.updateValidator({ address: mockAddress, config: newConfig }); + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith(`Fetching validator with address: ${mockAddress}...`); expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_getValidator", params: [mockAddress], }); + + expect(validatorsAction["log"]).toHaveBeenCalledWith("Current Validator Details:", mockCurrentValidator.result); + expect(validatorsAction["setSpinnerText"]).toHaveBeenCalledWith("Updating Validator..."); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_updateValidator", params: [ @@ -521,28 +674,9 @@ describe("ValidatorsAction", () => { { max_tokens: 1000 }, ], }); - expect(console.log).toHaveBeenCalledWith("Validator successfully updated:", mockResponse.result); - }); - - test("should throw an error if validator is not found", async () => { - const mockAddress = "mocked_address"; - const mockResponse = { result: null }; - - vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); - console.error = vi.fn(); - - await validatorsAction.updateValidator({ address: mockAddress }); - - expect(rpcClient.request).toHaveBeenCalledWith({ - method: "sim_getValidator", - params: [mockAddress], - }); - expect(console.error).toHaveBeenCalledWith( - "Error updating validator:", - new Error(`Validator with address ${mockAddress} not found.`) - ); - expect(rpcClient.request).toHaveBeenCalledTimes(1); + expect(validatorsAction["succeedSpinner"]).toHaveBeenCalledWith("Validator successfully updated", mockResponse.result); + expect(validatorsAction["failSpinner"]).not.toHaveBeenCalled(); }); test("should log an error if updateValidator RPC call fails", async () => { @@ -562,7 +696,7 @@ describe("ValidatorsAction", () => { .mockResolvedValueOnce(mockCurrentValidator) .mockRejectedValueOnce(mockError); - console.error = vi.fn(); + vi.spyOn(validatorsAction as any, "failSpinner").mockImplementation(() => {}); await validatorsAction.updateValidator({ address: mockAddress, stake: "200" }); @@ -570,6 +704,7 @@ describe("ValidatorsAction", () => { method: "sim_getValidator", params: [mockAddress], }); + expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_updateValidator", params: [ @@ -580,40 +715,36 @@ describe("ValidatorsAction", () => { { max_tokens: 500 }, ], }); - expect(console.error).toHaveBeenCalledWith("Error updating validator:", mockError); - }); - }); - test("should log an error for invalid stake value", async () => { - const mockAddress = "mocked_address"; - const mockCurrentValidator = { - result: { - address: "mocked_address", - stake: 100, - provider: "Provider1", - model: "Model1", - config: { max_tokens: 500 }, - }, - }; - - vi.mocked(rpcClient.request).mockResolvedValue(mockCurrentValidator); - - console.error = vi.fn(); - - await validatorsAction.updateValidator({ address: mockAddress, stake: "-10" }); - - expect(rpcClient.request).toHaveBeenCalledWith({ - method: "sim_getValidator", - params: [mockAddress], + + expect(validatorsAction["failSpinner"]).toHaveBeenCalledWith("Error updating validator", mockError); }); - expect(console.error).toHaveBeenCalledWith("Invalid stake value. Stake must be a positive integer."); - expect(rpcClient.request).toHaveBeenCalledTimes(1); - }); - test("should log an error if model is provided without provider", async () => { - console.error = vi.fn(); - await validatorsAction.createValidator({ stake: "10", model: "Model1" }); + test("should log an error for invalid stake value", async () => { + const mockAddress = "mocked_address"; + const mockCurrentValidator = { + result: { + address: "mocked_address", + stake: 100, + provider: "Provider1", + model: "Model1", + config: { max_tokens: 500 }, + }, + }; + + vi.mocked(rpcClient.request).mockResolvedValue(mockCurrentValidator); - expect(console.error).toHaveBeenCalledWith("You must specify a provider if using a model."); - expect(rpcClient.request).not.toHaveBeenCalled(); + vi.spyOn(validatorsAction as any, "failSpinner").mockImplementation(() => {}); + + await validatorsAction.updateValidator({ address: mockAddress, stake: "-10" }); + + expect(validatorsAction["startSpinner"]).toHaveBeenCalledWith(`Fetching validator with address: ${mockAddress}...`); + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_getValidator", + params: [mockAddress], + }); + + expect(validatorsAction["failSpinner"]).toHaveBeenCalledWith("Invalid stake value. Stake must be a positive integer."); + expect(rpcClient.request).toHaveBeenCalledTimes(1); + }); }); }); \ No newline at end of file diff --git a/tests/libs/baseAction.test.ts b/tests/libs/baseAction.test.ts new file mode 100644 index 00000000..1ac3bad7 --- /dev/null +++ b/tests/libs/baseAction.test.ts @@ -0,0 +1,175 @@ +import {describe, test, vi, beforeEach, afterEach, expect, Mock} from "vitest"; +import { BaseAction } from "../../src/lib/actions/BaseAction"; +import inquirer from "inquirer"; +import ora, { Ora } from "ora"; +import chalk from "chalk"; + +vi.mock("inquirer"); +vi.mock("ora"); + +describe("BaseAction", () => { + let baseAction: BaseAction; + let mockSpinner: Ora; + let consoleSpy: any; + let consoleErrorSpy: any; + + beforeEach(() => { + vi.clearAllMocks(); + consoleSpy = vi.spyOn(console, "log").mockImplementation(() => {}); + consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); + mockSpinner = { + start: vi.fn(), + stop: vi.fn(), + succeed: vi.fn(), + fail: vi.fn(), + text: "", + } as unknown as Ora; + + (ora as unknown as Mock).mockReturnValue(mockSpinner); + + baseAction = new BaseAction(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("should start the spinner with a message", () => { + baseAction["startSpinner"]("Loading..."); + expect(mockSpinner.start).toHaveBeenCalled(); + expect(mockSpinner.text).toBe(chalk.blue("Loading...")); + }); + + test("should succeed the spinner with a message", () => { + baseAction["succeedSpinner"]("Success"); + expect(mockSpinner.succeed).toHaveBeenCalledWith(expect.stringContaining("Success")); + }); + + test("should fail the spinner with an error message", () => { + baseAction["failSpinner"]("Failure", new Error("Something went wrong")); + expect(mockSpinner.fail).toHaveBeenCalledWith(expect.stringContaining("Failure")); + }); + + test("should stop the spinner", () => { + baseAction["stopSpinner"](); + expect(mockSpinner.stop).toHaveBeenCalled(); + }); + + test("should set spinner text", () => { + baseAction["setSpinnerText"]("Updated text"); + expect(mockSpinner.text).toBe(chalk.blue("Updated text")); + }); + + test("should confirm prompt and proceed when confirmed", async () => { + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: true }); + + await expect(baseAction["confirmPrompt"]("Are you sure?")).resolves.not.toThrow(); + expect(inquirer.prompt).toHaveBeenCalled(); + }); + + test("should confirm prompt and exit when declined", async () => { + vi.mocked(inquirer.prompt).mockResolvedValue({ confirmAction: false }); + const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { + throw new Error("process exited"); + }); + + await expect(baseAction["confirmPrompt"]("Are you sure?")).rejects.toThrow("process exited"); + expect(inquirer.prompt).toHaveBeenCalled(); + expect(processExitSpy).toHaveBeenCalledWith(0); + }); + + test("should log a success message", () => { + baseAction["logSuccess"]("Success message"); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("✔ Success message")); + }); + + test("should log an error message", () => { + baseAction["logError"]("Error message"); + + expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("✖ Error message")); + }); + + test("should log a info message", () => { + baseAction["logInfo"]("Info message"); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("ℹ Info message")); + }); + + test("should log a warning message", () => { + baseAction["logWarning"]("Warning message"); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("⚠ Warning message")); + }); + + test("should log a success message with data", () => { + const data = { key: "value" }; + + baseAction["logSuccess"]("Success message", data); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("✔ Success message")); + expect(consoleSpy).toHaveBeenCalledWith(chalk.green(JSON.stringify(data, null, 2))); + }); + + test("should log an error message with error details", () => { + const error = new Error("Something went wrong"); + + baseAction["logError"]("Error message", error); + + expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining("✖ Error message")); + expect(consoleErrorSpy).toHaveBeenCalledWith(chalk.red(JSON.stringify({ + name: error.name, + message: error.message, + }, null, 2))); + }); + + test("should log an info message with data", () => { + const data = { info: "This is some info" }; + + baseAction["logInfo"]("Info message", data); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("ℹ Info message")); + expect(consoleSpy).toHaveBeenCalledWith(chalk.blue(JSON.stringify(data, null, 2))); + }); + + test("should log a warning message with data", () => { + const data = { warning: "This is a warning" }; + + baseAction["logWarning"]("Warning message", data); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("⚠ Warning message")); + expect(consoleSpy).toHaveBeenCalledWith(chalk.yellow(JSON.stringify(data, null, 2))); + }); + + test("should succeed the spinner with a message and log result if data is provided", () => { + const mockData = { key: "value" }; + + baseAction["succeedSpinner"]("Success", mockData); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Result:")); + expect(consoleSpy).toHaveBeenCalledWith(JSON.stringify(mockData, null, 2)); + expect(mockSpinner.succeed).toHaveBeenCalledWith(expect.stringContaining("Success")); + }); + + test("should format an Error instance with name, message, and additional properties", () => { + const error = new Error("Something went wrong"); + (error as any).code = 500; + + const result = (baseAction as any).formatOutput(error); + expect(result).toBe(JSON.stringify({ name: "Error", message: "Something went wrong", code: 500 }, null, 2)); + }); + + test("should format an object as JSON string", () => { + const data = { key: "value", num: 42 }; + const result = (baseAction as any).formatOutput(data); + + expect(result).toBe(JSON.stringify(data, null, 2)); + }); + + test("should return a string representation of a primitive", () => { + expect((baseAction as any).formatOutput("Hello")).toBe("Hello"); + expect((baseAction as any).formatOutput(42)).toBe("42"); + expect((baseAction as any).formatOutput(true)).toBe("true"); + }); + +}); From 134df7f99099bbb226d0197ba36c48f015fecf99 Mon Sep 17 00:00:00 2001 From: Edinaldo Junior Date: Fri, 14 Feb 2025 12:34:39 -0300 Subject: [PATCH 63/67] feat: adding spinner to keygen command --- src/commands/keygen/create.ts | 13 +++++++------ tests/actions/create.test.ts | 33 +++++++++++++-------------------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/commands/keygen/create.ts b/src/commands/keygen/create.ts index b5150f23..918bfc8e 100644 --- a/src/commands/keygen/create.ts +++ b/src/commands/keygen/create.ts @@ -1,26 +1,28 @@ import { writeFileSync, existsSync } from "fs"; import { ethers } from "ethers"; import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; +import { BaseAction } from "../../lib/actions/BaseAction"; export interface CreateKeypairOptions { output: string; overwrite: boolean; } -export class KeypairCreator { +export class KeypairCreator extends BaseAction{ private filePathManager: ConfigFileManager; constructor() { + super() this.filePathManager = new ConfigFileManager(); } createKeypairAction(options: CreateKeypairOptions) { try { - + this.startSpinner(`Creating keypair...`); const outputPath = this.filePathManager.getFilePath(options.output); if(existsSync(outputPath) && !options.overwrite) { - console.warn( + this.failSpinner( `The file at ${outputPath} already exists. Use the '--overwrite' option to replace it.` ); return; @@ -35,10 +37,9 @@ export class KeypairCreator { writeFileSync(outputPath, JSON.stringify(keypairData, null, 2)); this.filePathManager.writeConfig('keyPairPath', outputPath); - console.log(`Keypair successfully created and saved to: ${outputPath}`); + this.succeedSpinner(`Keypair successfully created and saved to: ${outputPath}`); } catch (error) { - console.error("Failed to generate keypair:", error); - process.exit(1); + this.failSpinner("Failed to generate keypair:", error); } } } \ No newline at end of file diff --git a/tests/actions/create.test.ts b/tests/actions/create.test.ts index 7c61fef6..101aa734 100644 --- a/tests/actions/create.test.ts +++ b/tests/actions/create.test.ts @@ -31,6 +31,9 @@ describe("KeypairCreator", () => { beforeEach(() => { vi.clearAllMocks(); + vi.spyOn(keypairCreator as any, "startSpinner").mockImplementation(() => {}); + vi.spyOn(keypairCreator as any, "succeedSpinner").mockImplementation(() => {}); + vi.spyOn(keypairCreator as any, "failSpinner").mockImplementation(() => {}); vi.mocked(ethers.Wallet.createRandom).mockReturnValue(mockWallet); }); @@ -39,16 +42,16 @@ describe("KeypairCreator", () => { }); test("successfully creates and saves a keypair", () => { - const consoleLogSpy = vi.spyOn(console, "log"); vi.mocked(existsSync).mockReturnValue(false); const options = { output: "keypair.json", overwrite: false }; keypairCreator.createKeypairAction(options); + expect(keypairCreator["startSpinner"]).toHaveBeenCalledWith("Creating keypair..."); expect(ethers.Wallet.createRandom).toHaveBeenCalledTimes(1); - expect(keypairCreator["filePathManager"].getFilePath).toHaveBeenCalledWith("keypair.json"); + expect(writeFileSync).toHaveBeenCalledWith( "/mocked/path/keypair.json", JSON.stringify( @@ -66,15 +69,12 @@ describe("KeypairCreator", () => { "/mocked/path/keypair.json" ); - expect(consoleLogSpy).toHaveBeenCalledWith( + expect(keypairCreator["succeedSpinner"]).toHaveBeenCalledWith( "Keypair successfully created and saved to: /mocked/path/keypair.json" ); }); test("skips creation if file exists and overwrite is false", () => { - - - const consoleWarnSpy = vi.spyOn(console, "warn"); vi.mocked(existsSync).mockReturnValue(true); const options = { output: "keypair.json", overwrite: false }; @@ -82,20 +82,19 @@ describe("KeypairCreator", () => { expect(ethers.Wallet.createRandom).not.toHaveBeenCalled(); expect(writeFileSync).not.toHaveBeenCalled(); - expect(consoleWarnSpy).toHaveBeenCalledWith( + expect(keypairCreator["failSpinner"]).toHaveBeenCalledWith( "The file at /mocked/path/keypair.json already exists. Use the '--overwrite' option to replace it." ); }); test("overwrites the file if overwrite is true", () => { - const consoleLogSpy = vi.spyOn(console, "log"); vi.mocked(existsSync).mockReturnValue(true); const options = { output: "keypair.json", overwrite: true }; keypairCreator.createKeypairAction(options); + expect(keypairCreator["startSpinner"]).toHaveBeenCalledWith("Creating keypair..."); expect(ethers.Wallet.createRandom).toHaveBeenCalledTimes(1); - expect(keypairCreator["filePathManager"].getFilePath).toHaveBeenCalledWith("keypair.json"); expect(writeFileSync).toHaveBeenCalledWith( @@ -115,26 +114,20 @@ describe("KeypairCreator", () => { "/mocked/path/keypair.json" ); - expect(consoleLogSpy).toHaveBeenCalledWith( + expect(keypairCreator["succeedSpinner"]).toHaveBeenCalledWith( "Keypair successfully created and saved to: /mocked/path/keypair.json" ); }); test("handles errors during keypair creation", () => { - const consoleErrorSpy = vi.spyOn(console, "error"); - const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { - throw new Error("process.exit"); - }); + const mockError = new Error("Mocked write error"); vi.mocked(writeFileSync).mockImplementation(() => { - throw new Error("Mocked write error"); + throw mockError; }); - expect(() => { - keypairCreator.createKeypairAction({ output: "keypair.json", overwrite: true }); - }).toThrowError("process.exit"); + keypairCreator.createKeypairAction({ output: "keypair.json", overwrite: true }); - expect(consoleErrorSpy).toHaveBeenCalledWith("Failed to generate keypair:", expect.any(Error)); - expect(processExitSpy).toHaveBeenCalledWith(1); + expect(keypairCreator["failSpinner"]).toHaveBeenCalledWith("Failed to generate keypair:", mockError); }); }); From 25967f9d743d9a26c4cd49bc93d9b43a990504b5 Mon Sep 17 00:00:00 2001 From: Edinaldo Junior Date: Fri, 14 Feb 2025 14:49:08 -0300 Subject: [PATCH 64/67] feat: adding spinner and logs to command config --- src/commands/config/getSetReset.ts | 30 +++++++++----- tests/actions/getSetReset.test.ts | 63 ++++++++++++------------------ 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/src/commands/config/getSetReset.ts b/src/commands/config/getSetReset.ts index 2aae7c00..4774edea 100644 --- a/src/commands/config/getSetReset.ts +++ b/src/commands/config/getSetReset.ts @@ -1,44 +1,54 @@ import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; +import { BaseAction } from "../../lib/actions/BaseAction"; -export class ConfigActions { +export class ConfigActions extends BaseAction { private configManager: ConfigFileManager; constructor() { + super(); this.configManager = new ConfigFileManager(); } set(keyValue: string): void { const [key, value] = keyValue.split("="); + this.startSpinner(`Updating configuration: ${key}`); + if (!key || value === undefined) { - console.error("Invalid format. Use key=value."); - process.exit(1); + this.failSpinner("Invalid format. Use 'key=value'."); + return; } + this.configManager.writeConfig(key, value); - console.log(`Configuration updated: ${key}=${value}`); + this.succeedSpinner(`Configuration successfully updated`); } get(key?: string): void { + this.startSpinner(key ? `Retrieving value for: ${key}` : "Retrieving all configurations"); + if (key) { const value = this.configManager.getConfigByKey(key); if (value === null) { - console.log(`No value set for key: ${key}`); + this.failSpinner(`No configuration found for '${key}'.`); } else { - console.log(`${key}=${value}`); + this.succeedSpinner(`Configuration successfully retrieved`, `${key}=${value}`); } } else { const config = this.configManager.getConfig(); - console.log("Current configuration:", JSON.stringify(config, null, 2)); + this.succeedSpinner("All configurations successfully retrieved", JSON.stringify(config, null, 2)); } } reset(key: string): void { + this.startSpinner(`Resetting configuration: ${key}`); + const config = this.configManager.getConfig(); - if (config[key] === undefined) { - console.log(`Key does not exist in the configuration: ${key}`); + if (!(key in config)) { + this.failSpinner(`Configuration key '${key}' does not exist.`); return; } + delete config[key]; this.configManager.writeConfig(key, undefined); - console.log(`Configuration key reset: ${key}`); + this.succeedSpinner(`Configuration successfully reset`); } } diff --git a/tests/actions/getSetReset.test.ts b/tests/actions/getSetReset.test.ts index a4bb9549..8a8ac17c 100644 --- a/tests/actions/getSetReset.test.ts +++ b/tests/actions/getSetReset.test.ts @@ -10,92 +10,79 @@ describe("ConfigActions", () => { beforeEach(() => { configActions = new ConfigActions(); vi.clearAllMocks(); - }); - new ConfigFileManager(); + vi.spyOn(configActions as any, "startSpinner").mockImplementation(() => {}); + vi.spyOn(configActions as any, "succeedSpinner").mockImplementation(() => {}); + vi.spyOn(configActions as any, "failSpinner").mockImplementation(() => {}); + }); afterEach(() => { vi.restoreAllMocks(); }); test("set method writes key-value pair to the configuration", () => { - const consoleLogSpy = vi.spyOn(console, "log"); - configActions.set("defaultNetwork=testnet"); expect(configActions["configManager"].writeConfig).toHaveBeenCalledWith("defaultNetwork", "testnet"); - expect(consoleLogSpy).toHaveBeenCalledWith("Configuration updated: defaultNetwork=testnet"); + expect(configActions["startSpinner"]).toHaveBeenCalledWith("Updating configuration: defaultNetwork"); + expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("Configuration successfully updated"); }); - test("set method throws error for invalid format", () => { - const consoleErrorSpy = vi.spyOn(console, "error"); - const processExitSpy = vi.spyOn(process, "exit").mockImplementation(() => { - throw new Error("process.exit"); - }); + test("set method fails for invalid format", () => { + configActions.set("invalidFormat"); - expect(() => configActions.set("invalidFormat")).toThrowError("process.exit"); - - expect(consoleErrorSpy).toHaveBeenCalledWith("Invalid format. Use key=value."); - expect(processExitSpy).toHaveBeenCalledWith(1); + expect(configActions["failSpinner"]).toHaveBeenCalledWith("Invalid format. Use 'key=value'."); + expect(configActions["configManager"].writeConfig).not.toHaveBeenCalled(); }); test("get method retrieves value for a specific key", () => { vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue("testnet"); - const consoleLogSpy = vi.spyOn(console, "log"); - configActions.get("defaultNetwork"); expect(configActions["configManager"].getConfigByKey).toHaveBeenCalledWith("defaultNetwork"); - expect(consoleLogSpy).toHaveBeenCalledWith("defaultNetwork=testnet"); + expect(configActions["startSpinner"]).toHaveBeenCalledWith("Retrieving value for: defaultNetwork"); + expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("Configuration successfully retrieved", "defaultNetwork=testnet"); }); - test("get method prints message when key has no value", () => { + test("get method prints failure message when key does not exist", () => { vi.mocked(ConfigFileManager.prototype.getConfigByKey).mockReturnValue(null); - const consoleLogSpy = vi.spyOn(console, "log"); - configActions.get("nonexistentKey"); expect(configActions["configManager"].getConfigByKey).toHaveBeenCalledWith("nonexistentKey"); - expect(consoleLogSpy).toHaveBeenCalledWith("No value set for key: nonexistentKey"); + expect(configActions["failSpinner"]).toHaveBeenCalledWith("No configuration found for 'nonexistentKey'."); }); test("get method retrieves the entire configuration when no key is provided", () => { const mockConfig = { defaultNetwork: "testnet" }; vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); - const consoleLogSpy = vi.spyOn(console, "log"); - configActions.get(); - expect(configActions["configManager"].getConfig).toHaveBeenCalledTimes(1); - expect(consoleLogSpy).toHaveBeenCalledWith("Current configuration:", JSON.stringify(mockConfig, null, 2)); + expect(configActions["configManager"].getConfig).toHaveBeenCalled(); + expect(configActions["startSpinner"]).toHaveBeenCalledWith("Retrieving all configurations"); + expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("All configurations successfully retrieved", JSON.stringify(mockConfig, null, 2)); }); test("reset method removes key from configuration", () => { const mockConfig = { defaultNetwork: "testnet" }; vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); - const consoleLogSpy = vi.spyOn(console, "log"); - configActions.reset("defaultNetwork"); - expect(configActions["configManager"].getConfig).toHaveBeenCalledTimes(1); + expect(configActions["configManager"].getConfig).toHaveBeenCalled(); + expect(configActions["startSpinner"]).toHaveBeenCalledWith("Resetting configuration: defaultNetwork"); expect(configActions["configManager"].writeConfig).toHaveBeenCalledWith("defaultNetwork", undefined); - expect(consoleLogSpy).toHaveBeenCalledWith("Configuration key reset: defaultNetwork"); + expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("Configuration successfully reset"); }); - test("reset method prints message when key does not exist", () => { - const mockConfig = {}; - vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); - - const consoleLogSpy = vi.spyOn(console, "log"); + test("reset method prints failure message when key does not exist", () => { + vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue({}); configActions.reset("nonexistentKey"); - expect(configActions["configManager"].getConfig).toHaveBeenCalledTimes(1); - expect(configActions["configManager"].writeConfig).not.toHaveBeenCalled(); - expect(consoleLogSpy).toHaveBeenCalledWith("Key does not exist in the configuration: nonexistentKey"); + expect(configActions["configManager"].getConfig).toHaveBeenCalled(); + expect(configActions["failSpinner"]).toHaveBeenCalledWith("Configuration key 'nonexistentKey' does not exist."); }); -}); +}); \ No newline at end of file From 0c9f777f73fa088e24b47c752a0ff5ebc4f1dc48 Mon Sep 17 00:00:00 2001 From: Edinaldo Junior Date: Mon, 17 Feb 2025 10:15:33 -0300 Subject: [PATCH 65/67] feat: new up command(class) --- src/commands/general/index.ts | 7 +- src/commands/general/start.ts | 152 ++++++++++++------------ src/lib/services/simulator.ts | 1 - tests/actions/start.test.ts | 215 +++++++++++++++++----------------- tests/commands/up.test.ts | 52 ++++---- 5 files changed, 217 insertions(+), 210 deletions(-) diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index 67fd14e0..f318c835 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -2,7 +2,7 @@ import { Command } from "commander"; import simulatorService from "../../lib/services/simulator"; import { initAction, InitActionOptions } from "./init"; -import { startAction, StartActionOptions } from "./start"; +import { StartAction, StartActionOptions } from "./start"; import {localnetCompatibleVersion} from "../../lib/config/simulator"; import {StopAction} from "./stop"; @@ -23,7 +23,10 @@ export function initializeGeneralCommands(program: Command) { .option("--numValidators ", "Number of validators", "5") .option("--headless", "Headless mode", false) .option("--reset-db", "Reset Database", false) - .action((options: StartActionOptions) => startAction(options, simulatorService)); + .action(async (options: StartActionOptions) => { + const startAction = new StartAction(); + await startAction.execute(options); + }); program .command("stop") diff --git a/src/commands/general/start.ts b/src/commands/general/start.ts index e7c7cbfc..c543846e 100644 --- a/src/commands/general/start.ts +++ b/src/commands/general/start.ts @@ -1,104 +1,102 @@ import inquirer from "inquirer"; - -import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; +import { ISimulatorService } from "../../lib/interfaces/ISimulatorService"; +import { BaseAction } from "../../lib/actions/BaseAction"; +import { SimulatorService } from "../../lib/services/simulator"; export interface StartActionOptions { resetValidators: boolean; numValidators: number; headless: boolean; - resetDb: boolean + resetDb: boolean; } -export async function startAction(options: StartActionOptions, simulatorService: ISimulatorService) { - const {resetValidators, numValidators, headless, resetDb} = options; +export class StartAction extends BaseAction { + private simulatorService: ISimulatorService; - simulatorService.setComposeOptions(headless); + constructor() { + super(); + this.simulatorService = new SimulatorService(); + } - await simulatorService.checkCliVersion(); + async execute(options: StartActionOptions) { + const { resetValidators, numValidators, headless, resetDb } = options; - const restartValidatorsHintText = resetValidators - ? `creating new ${numValidators} random validators` - : "keeping the existing validators"; + this.simulatorService.setComposeOptions(headless); + this.startSpinner("Checking CLI version..."); + await this.simulatorService.checkCliVersion(); - console.log(`Starting GenLayer simulator ${restartValidatorsHintText}`); + const restartValidatorsHintText = resetValidators + ? `creating new ${numValidators} random validators` + : "keeping the existing validators"; + this.setSpinnerText(`Starting GenLayer Localnet (${restartValidatorsHintText})...`); - try { - await simulatorService.runSimulator(); - } catch (error) { - console.error(error); - return; - } - - try { - const {initialized, errorCode, errorMessage} = await simulatorService.waitForSimulatorToBeReady(); - if (!initialized && errorCode === "ERROR") { - console.log(errorMessage); - console.error("Unable to initialize the GenLayer simulator. Please try again."); - return; - } - if (!initialized && errorCode === "TIMEOUT") { - console.error( - "The simulator is taking too long to initialize. Please try again after the simulator is ready.", - ); + try { + await this.simulatorService.runSimulator(); + } catch (error) { + this.failSpinner("Error starting the simulator", error); return; } - console.log("Simulator is running!"); - } catch (error) { - console.error(error); - return; - } - - if(resetDb){ - await simulatorService.cleanDatabase() - } - if (resetValidators) { - // Initializing validators - console.log("Initializing validators..."); try { - //remove all validators - await simulatorService.deleteAllValidators(); - const questions = [ - { - type: "checkbox", - name: "selectedLlmProviders", - message: "Select which LLM providers do you want to use:", - choices: simulatorService.getAiProvidersOptions(false), - validate: function (answer: string[]) { - if (answer.length < 1) { - return "You must choose at least one option."; - } - return true; - }, - }, - ]; + this.setSpinnerText("Waiting for the simulator to be ready..."); + const { initialized, errorCode, errorMessage } = await this.simulatorService.waitForSimulatorToBeReady(); - // Since ollama runs locally we can run it here and then look for the other providers - const llmProvidersAnswer = await inquirer.prompt(questions); + if (!initialized) { + if (errorCode === "ERROR") { + this.failSpinner("Unable to initialize the GenLayer simulator.", errorMessage); + return; + } + if (errorCode === "TIMEOUT") { + this.failSpinner("The simulator is taking too long to initialize. Please try again later."); + return; + } + } - // create random validators - await simulatorService.createRandomValidators( - Number(options.numValidators), - llmProvidersAnswer.selectedLlmProviders, - ); } catch (error) { - console.error("Unable to initialize the validators."); - console.error(error); + this.failSpinner("Error waiting for the simulator to be ready", error); return; } - console.log("New random validators successfully created..."); - } - // Simulator ready - let successMessage = "GenLayer simulator initialized successfully! " - successMessage += headless ? '' : `Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`; - console.log(successMessage); - try { - if(!headless) { - await simulatorService.openFrontend(); + if (resetDb) { + this.setSpinnerText("Resetting database..."); + await this.simulatorService.cleanDatabase(); + } + + if (resetValidators) { + this.setSpinnerText("Initializing validators..."); + try { + await this.simulatorService.deleteAllValidators(); + + const questions = [ + { + type: "checkbox", + name: "selectedLlmProviders", + message: "Select which LLM providers do you want to use:", + choices: this.simulatorService.getAiProvidersOptions(false), + validate: (answer: string[]) => (answer.length < 1 ? "You must choose at least one option." : true), + }, + ]; + + const llmProvidersAnswer = await inquirer.prompt(questions); + await this.simulatorService.createRandomValidators(numValidators, llmProvidersAnswer.selectedLlmProviders); + } catch (error) { + this.failSpinner("Unable to initialize the validators", error); + return; + } } - } catch (error) { - console.error(error); + let successMessage = "GenLayer simulator initialized successfully! "; + successMessage += headless ? "" : `Go to ${this.simulatorService.getFrontendUrl()} in your browser to access it.`; + this.succeedSpinner(successMessage); + + if (!headless) { + try { + this.startSpinner("Opening frontend..."); + await this.simulatorService.openFrontend(); + this.succeedSpinner("Frontend opened successfully"); + } catch (error) { + this.failSpinner("Error opening the frontend", error); + } + } } } diff --git a/src/lib/services/simulator.ts b/src/lib/services/simulator.ts index 5cf69300..7750277e 100644 --- a/src/lib/services/simulator.ts +++ b/src/lib/services/simulator.ts @@ -184,7 +184,6 @@ export class SimulatorService implements ISimulatorService { public async waitForSimulatorToBeReady( retries: number = STARTING_TIMEOUT_ATTEMPTS, ): Promise { - console.log("Waiting for the simulator to start up..."); try { const response = await rpcClient.request({method: "ping", params: []}); diff --git a/tests/actions/start.test.ts b/tests/actions/start.test.ts index b3a14b98..a0ea38d6 100644 --- a/tests/actions/start.test.ts +++ b/tests/actions/start.test.ts @@ -1,175 +1,174 @@ import { describe, beforeEach, afterEach, test, expect, vi, Mock } from "vitest"; import inquirer from "inquirer"; -import { startAction, StartActionOptions } from "../../src/commands/general/start"; -import { ISimulatorService } from "../../src/lib/interfaces/ISimulatorService"; +import { StartAction, StartActionOptions } from "../../src/commands/general/start"; +import { SimulatorService } from "../../src/lib/services/simulator"; -describe("startAction - Additional Tests", () => { - let simulatorService: ISimulatorService; - let logSpy: ReturnType; - let errorSpy: ReturnType; - let promptSpy: ReturnType; +vi.mock("../../src/lib/services/simulator"); +vi.mock("inquirer"); - const defaultOptions: StartActionOptions = { - resetValidators: false, - numValidators: 5, - headless: false, - resetDb: false - }; +describe("StartAction", () => { + let startAction: StartAction; + let mockSimulatorService: SimulatorService; beforeEach(() => { - logSpy = vi.spyOn(console, "log").mockImplementation(() => {}); - errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); - promptSpy = vi.spyOn(inquirer, "prompt"); - - simulatorService = { - updateSimulator: vi.fn().mockResolvedValue(undefined), - runSimulator: vi.fn().mockResolvedValue(undefined), - waitForSimulatorToBeReady: vi.fn().mockResolvedValue({ initialized: true }), - deleteAllValidators: vi.fn().mockResolvedValue(undefined), - createRandomValidators: vi.fn().mockResolvedValue(undefined), - openFrontend: vi.fn().mockResolvedValue(undefined), - setSimulatorLocation: vi.fn().mockResolvedValue(undefined), - setComposeOptions: vi.fn(), - checkCliVersion: vi.fn(), - getAiProvidersOptions: vi.fn(() => [ - { name: "Provider A", value: "providerA" }, - { name: "Provider B", value: "providerB" }, - ]), - getFrontendUrl: vi.fn(() => "http://localhost:8080"), - cleanDatabase: vi.fn().mockResolvedValue(undefined), - } as unknown as ISimulatorService; + vi.clearAllMocks(); + + mockSimulatorService = new SimulatorService(); + startAction = new StartAction(); + startAction["simulatorService"] = mockSimulatorService; + + mockSimulatorService.waitForSimulatorToBeReady = vi.fn().mockResolvedValue({ initialized: true }); + + vi.spyOn(startAction as any, "startSpinner").mockImplementation(() => {}); + vi.spyOn(startAction as any, "setSpinnerText").mockImplementation(() => {}); + vi.spyOn(startAction as any, "succeedSpinner").mockImplementation(() => {}); + vi.spyOn(startAction as any, "failSpinner").mockImplementation(() => {}); }); afterEach(() => { vi.restoreAllMocks(); }); - test("runs successfully with default options and keeps existing validators", async () => { - await startAction(defaultOptions, simulatorService); + const defaultOptions: StartActionOptions = { + resetValidators: false, + numValidators: 5, + headless: false, + resetDb: false, + }; + + test("should start the simulator successfully", async () => { + mockSimulatorService.checkCliVersion = vi.fn().mockResolvedValue(undefined); + mockSimulatorService.runSimulator = vi.fn().mockResolvedValue(undefined); + mockSimulatorService.getFrontendUrl = vi.fn().mockReturnValue("http://localhost:8080"); + + await startAction.execute(defaultOptions); + + expect(startAction["startSpinner"]).toHaveBeenCalledWith("Checking CLI version..."); + expect(mockSimulatorService.checkCliVersion).toHaveBeenCalled(); - expect(simulatorService.runSimulator).toHaveBeenCalled(); - expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled(); + expect(startAction["setSpinnerText"]).toHaveBeenCalledWith("Starting GenLayer Localnet (keeping the existing validators)..."); + expect(mockSimulatorService.runSimulator).toHaveBeenCalled(); - expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators"); - expect(logSpy).toHaveBeenCalledWith("Simulator is running!"); - expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! Go to http://localhost:8080 in your browser to access it."); + expect(startAction["setSpinnerText"]).toHaveBeenCalledWith("Waiting for the simulator to be ready..."); + expect(mockSimulatorService.waitForSimulatorToBeReady).toHaveBeenCalled(); - expect(simulatorService.openFrontend).toHaveBeenCalled(); + expect(startAction["succeedSpinner"]).toHaveBeenCalledWith("GenLayer simulator initialized successfully! Go to http://localhost:8080 in your browser to access it."); }); - test("runs successfully with custom options and keeps existing validators", async () => { - await startAction({...defaultOptions, headless: true, resetDb: true}, simulatorService); + test("should fail when simulator fails to start", async () => { + const errorMsg = new Error("runSimulator error"); + (mockSimulatorService.runSimulator as Mock).mockRejectedValueOnce(errorMsg); + + await startAction.execute(defaultOptions); + + expect(startAction["failSpinner"]).toHaveBeenCalledWith("Error starting the simulator", errorMsg); + }); - expect(simulatorService.runSimulator).toHaveBeenCalled(); - expect(simulatorService.waitForSimulatorToBeReady).toHaveBeenCalled(); + test("should fail when waiting for simulator initialization times out", async () => { + (mockSimulatorService.waitForSimulatorToBeReady as Mock).mockResolvedValue({ initialized: false, errorCode: "TIMEOUT" }); - expect(logSpy).toHaveBeenCalledWith("Starting GenLayer simulator keeping the existing validators"); + await startAction.execute(defaultOptions); - expect(logSpy).toHaveBeenCalledWith("Simulator is running!"); - expect(logSpy).toHaveBeenCalledWith("GenLayer simulator initialized successfully! "); + expect(startAction["failSpinner"]).toHaveBeenCalledWith("The simulator is taking too long to initialize. Please try again later."); }); + test("should reset the database if resetDb is true", async () => { + const options: StartActionOptions = { ...defaultOptions, resetDb: true }; - test("logs error and stops if runSimulator fails", async () => { - const errorMsg = new Error("runSimulator error"); - (simulatorService.runSimulator as Mock).mockRejectedValueOnce(errorMsg); + mockSimulatorService.cleanDatabase = vi.fn().mockResolvedValue(undefined); - await startAction(defaultOptions, simulatorService); + await startAction.execute(options); - expect(errorSpy).toHaveBeenCalledWith(errorMsg); - expect(simulatorService.waitForSimulatorToBeReady).not.toHaveBeenCalled(); + expect(startAction["setSpinnerText"]).toHaveBeenCalledWith("Resetting database..."); + expect(mockSimulatorService.cleanDatabase).toHaveBeenCalled(); }); - test("handles resetfValidators correctly by deleting and creating new validators", async () => { - promptSpy.mockResolvedValueOnce({ selectedLlmProviders: ["providerA"] }); - const optionsWithReset: StartActionOptions = { ...defaultOptions, resetValidators: true }; + test("should initialize validators when resetValidators is true", async () => { + const options: StartActionOptions = { ...defaultOptions, resetValidators: true }; + + mockSimulatorService.deleteAllValidators = vi.fn().mockResolvedValue(undefined); + mockSimulatorService.createRandomValidators = vi.fn().mockResolvedValue(undefined); + mockSimulatorService.getAiProvidersOptions = vi.fn().mockReturnValue(["Provider1", "Provider2"]); - await startAction(optionsWithReset, simulatorService); + vi.mocked(inquirer.prompt).mockResolvedValue({ selectedLlmProviders: ["Provider1"] }); - expect(simulatorService.deleteAllValidators).toHaveBeenCalled(); - expect(simulatorService.createRandomValidators).toHaveBeenCalledWith(5, ["providerA"]); - expect(logSpy).toHaveBeenCalledWith("New random validators successfully created..."); + await startAction.execute(options); + + expect(startAction["setSpinnerText"]).toHaveBeenCalledWith("Initializing validators..."); + expect(mockSimulatorService.deleteAllValidators).toHaveBeenCalled(); + expect(mockSimulatorService.createRandomValidators).toHaveBeenCalledWith(5, ["Provider1"]); }); - test("logs error if deleteAllValidators fails when resetValidators is true", async () => { - const errorMsg = new Error("deleteAllValidators error"); - (simulatorService.deleteAllValidators as Mock).mockRejectedValueOnce(errorMsg); - const optionsWithReset: StartActionOptions = { ...defaultOptions, resetValidators: true }; + test("should fail when initializing validators fails", async () => { + const options: StartActionOptions = { ...defaultOptions, resetValidators: true }; + + mockSimulatorService.deleteAllValidators = vi.fn().mockRejectedValue(new Error("Failed to delete validators")); - await startAction(optionsWithReset, simulatorService); + await startAction.execute(options); - expect(errorSpy).toHaveBeenCalledWith("Unable to initialize the validators."); - expect(errorSpy).toHaveBeenCalledWith(errorMsg); - expect(simulatorService.createRandomValidators).not.toHaveBeenCalled(); + expect(startAction["failSpinner"]).toHaveBeenCalledWith("Unable to initialize the validators", expect.any(Error)); }); - test("prompts for LLM providers and validates at least one option is selected", async () => { - const aiProviders = simulatorService.getAiProvidersOptions(false); - expect(aiProviders).toEqual([ - { name: "Provider A", value: "providerA" }, - { name: "Provider B", value: "providerB" }, - ]); + test("should open frontend when not in headless mode", async () => { + mockSimulatorService.checkCliVersion = vi.fn().mockResolvedValue(undefined); + mockSimulatorService.runSimulator = vi.fn().mockResolvedValue(undefined); + mockSimulatorService.getFrontendUrl = vi.fn().mockReturnValue("http://localhost:8080"); + mockSimulatorService.openFrontend = vi.fn().mockResolvedValue(undefined); - promptSpy.mockImplementation(async (questions: any) => { - const validateFunction = questions[0].validate; + await startAction.execute(defaultOptions); - expect(validateFunction([])).toBe("You must choose at least one option."); - expect(validateFunction(["providerA"])).toBe(true); + expect(startAction["startSpinner"]).toHaveBeenCalledWith("Opening frontend..."); + expect(mockSimulatorService.openFrontend).toHaveBeenCalled(); + expect(startAction["succeedSpinner"]).toHaveBeenCalledWith("Frontend opened successfully"); + }); - return { selectedLlmProviders: ["providerA"] }; - }); + test("should handle errors when opening frontend", async () => { + const errorMsg = new Error("Failed to open frontend"); + (mockSimulatorService.openFrontend as Mock).mockRejectedValueOnce(errorMsg); - const optionsWithReset: StartActionOptions = { ...defaultOptions, resetValidators: true }; - await startAction(optionsWithReset, simulatorService); + await startAction.execute(defaultOptions); - expect(promptSpy).toHaveBeenCalled(); - expect(simulatorService.createRandomValidators).toHaveBeenCalledWith(5, ["providerA"]); + expect(startAction["failSpinner"]).toHaveBeenCalledWith("Error opening the frontend", errorMsg); }); - test("logs specific message if waitForSimulatorToBeReady returns TIMEOUT errorCode", async () => { - (simulatorService.waitForSimulatorToBeReady as Mock).mockResolvedValue({ + test("should log specific message if waitForSimulatorToBeReady returns TIMEOUT errorCode", async () => { + (mockSimulatorService.waitForSimulatorToBeReady as Mock).mockResolvedValue({ initialized: false, errorCode: "TIMEOUT", errorMessage: "Initialization timed out", }); - await startAction(defaultOptions, simulatorService); + await startAction.execute(defaultOptions); - expect(errorSpy).toHaveBeenCalledWith( - "The simulator is taking too long to initialize. Please try again after the simulator is ready." - ); + expect(startAction["failSpinner"]).toHaveBeenCalledWith("The simulator is taking too long to initialize. Please try again later."); }); - test("logs error message if simulator fails to initialize with ERROR code", async () => { - (simulatorService.waitForSimulatorToBeReady as Mock).mockResolvedValue({ + test("should log error message if simulator fails to initialize with ERROR code", async () => { + (mockSimulatorService.waitForSimulatorToBeReady as Mock).mockResolvedValue({ initialized: false, errorCode: "ERROR", errorMessage: "Initialization failed", }); - await startAction(defaultOptions, simulatorService); + await startAction.execute(defaultOptions); - expect(logSpy).toHaveBeenCalledWith("Initialization failed"); - expect(errorSpy).toHaveBeenCalledWith("Unable to initialize the GenLayer simulator. Please try again."); + expect(startAction["failSpinner"]).toHaveBeenCalledWith("Unable to initialize the GenLayer simulator.", "Initialization failed"); }); test("catches and logs error if waitForSimulatorToBeReady throws an exception", async () => { const errorMsg = new Error("Unexpected initialization error"); - (simulatorService.waitForSimulatorToBeReady as Mock).mockRejectedValueOnce(errorMsg); + (mockSimulatorService.waitForSimulatorToBeReady as Mock).mockRejectedValueOnce(errorMsg); - await startAction(defaultOptions, simulatorService); + await startAction.execute(defaultOptions); - expect(errorSpy).toHaveBeenCalledWith(errorMsg); + expect(startAction["failSpinner"]).toHaveBeenCalledWith("Error waiting for the simulator to be ready", errorMsg); }); - test("catches and logs error if openFrontend throws an exception", async () => { - const errorMsg = new Error("Failed to open frontend"); - (simulatorService.openFrontend as Mock).mockImplementationOnce(() => { - throw errorMsg; - }); + test("should not append frontend URL when in headless mode", async () => { + await startAction.execute({ ...defaultOptions, headless: true }); - await startAction(defaultOptions, simulatorService); - - expect(errorSpy).toHaveBeenCalledWith(errorMsg); + expect(startAction["succeedSpinner"]).toHaveBeenCalledWith( + "GenLayer simulator initialized successfully! " + ); }); }); diff --git a/tests/commands/up.test.ts b/tests/commands/up.test.ts index ca8f3bde..605ca899 100644 --- a/tests/commands/up.test.ts +++ b/tests/commands/up.test.ts @@ -2,17 +2,9 @@ import { Command } from "commander"; import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import { initializeGeneralCommands } from "../../src/commands/general"; import { getCommand, getCommandOption } from "../utils"; -import simulatorService from '../../src/lib/services/simulator' +import { StartAction } from "../../src/commands/general/start"; -const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); - -const action = vi.fn(); -const defaultOptions = { - resetValidators: false, - numValidators: "5", - headless: false , - resetDb: false -} +vi.mock("../../src/commands/general/start"); describe("up command", () => { let upCommand: Command; @@ -23,10 +15,6 @@ describe("up command", () => { initializeGeneralCommands(program); upCommand = getCommand(program, "up"); - upCommand?.action(async (args) => { - action(args); - }); - vi.clearAllMocks(); }); @@ -36,6 +24,15 @@ describe("up command", () => { test("doesn't require arguments or options", async () => { expect(() => program.parse(["node", "test", "up"])).not.toThrow(); + expect(StartAction).toHaveBeenCalledTimes(1); + expect(StartAction.prototype.execute).toHaveBeenCalledWith( + expect.objectContaining({ + resetValidators: false, + numValidators: "5", + headless: false, + resetDb: false, + }) + ); }); test("option --reset-validators is accepted", async () => { @@ -56,7 +53,6 @@ describe("up command", () => { expect(numValidatorsOption?.defaultValue).toBe("5"); }); - test("unrecognized option is not accepted", async () => { upCommand?.exitOverride(); expect(() => program.parse(["node", "test", "up", "-unknown"])).toThrowError( @@ -69,8 +65,15 @@ describe("up command", () => { test("action is called with default options", async () => { program.parse(["node", "test", "up"]); - expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith(defaultOptions); + expect(StartAction).toHaveBeenCalledTimes(1); + expect(StartAction.prototype.execute).toHaveBeenCalledWith( + expect.objectContaining({ + resetValidators: false, + numValidators: "5", + headless: false, + resetDb: false, + }) + ); }); test("action is called with custom options", async () => { @@ -82,12 +85,17 @@ describe("up command", () => { "--numValidators", "10", "--headless", - "true", "--reset-db", - "true" ]); - expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true, numValidators: '10', resetValidators: true, resetDb: true}); - expect(openFrontendSpy).not.toHaveBeenCalled(); + + expect(StartAction).toHaveBeenCalledTimes(1); + expect(StartAction.prototype.execute).toHaveBeenCalledWith( + expect.objectContaining({ + resetValidators: true, + numValidators: "10", + headless: true, + resetDb: true, + }) + ); }); }); From 5544edbd02efd2195d21b4100b80b06ea4feabaf Mon Sep 17 00:00:00 2001 From: Edinaldo Junior Date: Thu, 20 Feb 2025 12:24:58 -0300 Subject: [PATCH 66/67] feat: refac init, base action and unit tests --- src/commands/config/getSetReset.ts | 13 +- src/commands/general/index.ts | 7 +- src/commands/general/init.ts | 325 ++++++------- src/commands/keygen/create.ts | 7 +- src/commands/update/index.ts | 11 +- src/commands/update/ollama.ts | 6 +- src/lib/actions/BaseAction.ts | 9 +- tests/actions/create.test.ts | 17 +- tests/actions/getSetReset.test.ts | 16 +- tests/actions/init.test.ts | 715 ++++++++++------------------- tests/actions/ollama.test.ts | 8 + tests/commands/init.test.ts | 23 +- tests/commands/update.test.ts | 7 +- tests/services/simulator.test.ts | 15 + 14 files changed, 452 insertions(+), 727 deletions(-) diff --git a/src/commands/config/getSetReset.ts b/src/commands/config/getSetReset.ts index 4774edea..b7499316 100644 --- a/src/commands/config/getSetReset.ts +++ b/src/commands/config/getSetReset.ts @@ -1,12 +1,9 @@ -import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; import { BaseAction } from "../../lib/actions/BaseAction"; export class ConfigActions extends BaseAction { - private configManager: ConfigFileManager; constructor() { super(); - this.configManager = new ConfigFileManager(); } set(keyValue: string): void { @@ -18,7 +15,7 @@ export class ConfigActions extends BaseAction { return; } - this.configManager.writeConfig(key, value); + this.writeConfig(key, value); this.succeedSpinner(`Configuration successfully updated`); } @@ -26,14 +23,14 @@ export class ConfigActions extends BaseAction { this.startSpinner(key ? `Retrieving value for: ${key}` : "Retrieving all configurations"); if (key) { - const value = this.configManager.getConfigByKey(key); + const value = this.getConfigByKey(key); if (value === null) { this.failSpinner(`No configuration found for '${key}'.`); } else { this.succeedSpinner(`Configuration successfully retrieved`, `${key}=${value}`); } } else { - const config = this.configManager.getConfig(); + const config = this.getConfig(); this.succeedSpinner("All configurations successfully retrieved", JSON.stringify(config, null, 2)); } } @@ -41,14 +38,14 @@ export class ConfigActions extends BaseAction { reset(key: string): void { this.startSpinner(`Resetting configuration: ${key}`); - const config = this.configManager.getConfig(); + const config = this.getConfig(); if (!(key in config)) { this.failSpinner(`Configuration key '${key}' does not exist.`); return; } delete config[key]; - this.configManager.writeConfig(key, undefined); + this.writeConfig(key, undefined); this.succeedSpinner(`Configuration successfully reset`); } } diff --git a/src/commands/general/index.ts b/src/commands/general/index.ts index f318c835..04512fe6 100644 --- a/src/commands/general/index.ts +++ b/src/commands/general/index.ts @@ -1,7 +1,7 @@ import { Command } from "commander"; import simulatorService from "../../lib/services/simulator"; -import { initAction, InitActionOptions } from "./init"; +import { InitAction, InitActionOptions } from "./init"; import { StartAction, StartActionOptions } from "./start"; import {localnetCompatibleVersion} from "../../lib/config/simulator"; import {StopAction} from "./stop"; @@ -14,7 +14,10 @@ export function initializeGeneralCommands(program: Command) { .option("--headless", "Headless mode", false) .option("--reset-db", "Reset Database", false) .option("--localnet-version ", "Select a specific localnet version", localnetCompatibleVersion) - .action((options: InitActionOptions) => initAction(options, simulatorService)); + .action(async (options: InitActionOptions) => { + const initAction = new InitAction(); + await initAction.execute(options) + }); program .command("up") diff --git a/src/commands/general/init.ts b/src/commands/general/init.ts index 9c1a7934..c2de9f4c 100644 --- a/src/commands/general/init.ts +++ b/src/commands/general/init.ts @@ -1,8 +1,9 @@ import inquirer from "inquirer"; -import {ISimulatorService} from "../../lib/interfaces/ISimulatorService"; -import {AI_PROVIDERS_CONFIG, AiProviders} from "../../lib/config/simulator"; +import { ISimulatorService } from "../../lib/interfaces/ISimulatorService"; +import { AI_PROVIDERS_CONFIG, AiProviders } from "../../lib/config/simulator"; import { OllamaAction } from "../update/ollama"; -import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; +import { BaseAction } from "../../lib/actions/BaseAction"; +import { SimulatorService } from "../../lib/services/simulator"; export interface InitActionOptions { numValidators: number; @@ -11,217 +12,163 @@ export interface InitActionOptions { localnetVersion: string; } -function getRequirementsErrorMessage({docker}: Record): string { - +function getRequirementsErrorMessage({ docker }: Record): string { if (!docker) { return "Docker is not installed. Please install Docker and try again.\n"; } - return ""; } -function getVersionErrorMessage({docker, node}: Record): string { +function getVersionErrorMessage({ docker, node }: Record): string { let message = ""; if (docker) { message += `Docker version ${docker} or higher is required. Please update Docker and try again.\n`; } - if (node) { message += `Node version ${node} or higher is required. Please update Node and try again.\n`; } - return message; } -export async function initAction(options: InitActionOptions, simulatorService: ISimulatorService) { - simulatorService.setComposeOptions(options.headless); - - let localnetVersion = options.localnetVersion; - - if(localnetVersion !== 'latest'){ - localnetVersion = simulatorService.normalizeLocalnetVersion(localnetVersion); +export class InitAction extends BaseAction { + private simulatorService: ISimulatorService; + constructor() { + super(); + this.simulatorService = new SimulatorService(); } - await simulatorService.checkCliVersion(); - - // Check if requirements are installed - try { - const requirementsInstalled = await simulatorService.checkInstallRequirements(); - const requirementErrorMessage = getRequirementsErrorMessage(requirementsInstalled); - - if (requirementErrorMessage) { - console.error(requirementErrorMessage); - return; - } - } catch (error) { - console.error(error); - return; - } - - // Check if the versions are correct - try { - const missingVersions = await simulatorService.checkVersionRequirements(); - const versionErrorMessage = getVersionErrorMessage(missingVersions); - if (versionErrorMessage) { - console.error(versionErrorMessage); - return; - } - } catch (error) { - console.error(error); - return; - } - - // Ask for confirmation on reseting the GenLayer Simulator from GitHub - const resetAnswers = await inquirer.prompt([ - { - type: "confirm", - name: "confirmReset", - message: `This command is going to reset GenLayer docker images and containers, providers API Keys, and GenLayer database (accounts, transactions, validators and logs). Contract code (gpy files) will be kept. Do you want to continue?`, - default: true, - }, - ]); - - if (!resetAnswers.confirmReset) { - console.log("Aborted!"); - return; - } - - console.log(`Initializing GenLayer CLI with ${options.numValidators} validators`); - - // Reset Docker containers and images - console.log(`Resetting Docker containers and images...`); - try { - await simulatorService.resetDockerContainers(); - await simulatorService.resetDockerImages(); - } catch (error) { - console.error(error); - return; - } + public async execute(options: InitActionOptions): Promise { + try { + this.simulatorService.setComposeOptions(options.headless); + let localnetVersion = options.localnetVersion; + if (localnetVersion !== "latest") { + localnetVersion = this.simulatorService.normalizeLocalnetVersion(localnetVersion); + } + + this.startSpinner("Checking CLI version..."); + await this.simulatorService.checkCliVersion(); + + this.setSpinnerText("Checking installation requirements..."); + const requirementsInstalled = await this.simulatorService.checkInstallRequirements(); + const requirementErrorMessage = getRequirementsErrorMessage(requirementsInstalled); + if (requirementErrorMessage) { + this.failSpinner(requirementErrorMessage); + return; + } + + this.setSpinnerText("Checking version requirements..."); + const missingVersions = await this.simulatorService.checkVersionRequirements(); + const versionErrorMessage = getVersionErrorMessage(missingVersions); + if (versionErrorMessage) { + this.failSpinner(versionErrorMessage); + return; + } + this.stopSpinner(); + + // Confirm reset action with the user using BaseAction's confirm prompt + await this.confirmPrompt( + `This command is going to reset GenLayer docker images and containers, providers API Keys, and GenLayer database (accounts, transactions, validators and logs). Contract code (gpy files) will be kept. Do you want to continue?` + ); - // Check LLM configuration - const questions = [ - { - type: "checkbox", - name: "selectedLlmProviders", - message: "Select which LLM providers do you want to use:", - choices: simulatorService.getAiProvidersOptions(true), - validate: function (answer: string[]) { - if (answer.length < 1) { - return "You must choose at least one option."; - } - return true; - }, - }, - ]; - - // Since ollama runs locally we can run it here and then look for the other providers - const llmProvidersAnswer = await inquirer.prompt(questions); - const selectedLlmProviders = llmProvidersAnswer.selectedLlmProviders as AiProviders[]; - - // Gather the API Keys - const aiProvidersEnvVars: Record = {}; - const configurableAiProviders = selectedLlmProviders.filter( - (provider: AiProviders) => AI_PROVIDERS_CONFIG[provider].envVar, - ); - for (let i = 0; i < configurableAiProviders.length; i++) { - const provider = configurableAiProviders[i]; - const providerConfig = AI_PROVIDERS_CONFIG[provider]; - const questions = [ - { - type: "input", - name: providerConfig.cliOptionValue, - message: `Please enter your ${providerConfig.name} API Key:`, - validate: function (value: string) { - if (value.length) { - return true; - } - return `Please enter a valid API Key for ${providerConfig.name}.`; + this.logInfo(`Initializing GenLayer CLI with ${options.numValidators} validators`); + + // Reset Docker containers and images + this.startSpinner("Resetting Docker containers and images..."); + await this.simulatorService.resetDockerContainers(); + await this.simulatorService.resetDockerImages(); + this.stopSpinner(); + + const llmQuestions = [ + { + type: "checkbox", + name: "selectedLlmProviders", + message: "Select which LLM providers do you want to use:", + choices: this.simulatorService.getAiProvidersOptions(true), + validate: (answer: string[]) => + answer.length < 1 ? "You must choose at least one option." : true, }, - }, - ]; - - const apiKeyAnswer = await inquirer.prompt(questions); - aiProvidersEnvVars[providerConfig.envVar!] = apiKeyAnswer[providerConfig.cliOptionValue]; - } - - console.log("Configuring GenLayer Simulator environment..."); - simulatorService.addConfigToEnvFile(aiProvidersEnvVars); - simulatorService.addConfigToEnvFile({LOCALNETVERSION: localnetVersion}); - - // Run the GenLayer Simulator - console.log("Running the GenLayer Simulator..."); - try { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - await simulatorService.runSimulator(); - } catch (error) { - console.error(error); - return; - } - - try { - const {initialized, errorCode, errorMessage} = await simulatorService.waitForSimulatorToBeReady(); - if (!initialized && errorCode === "ERROR") { - console.log(errorMessage); - console.error("Unable to initialize the GenLayer simulator. Please try again."); - return; - } - if (!initialized && errorCode === "TIMEOUT") { - console.error( - "The simulator is taking too long to initialize. Please try again after the simulator is ready.", + ]; + const llmProvidersAnswer = await inquirer.prompt(llmQuestions); + const selectedLlmProviders = llmProvidersAnswer.selectedLlmProviders as AiProviders[]; + + let defaultOllamaModel = this.getConfig().defaultOllamaModel; + AI_PROVIDERS_CONFIG.ollama.hint = `(This will download and run a local instance of ${defaultOllamaModel})`; + const aiProvidersEnvVars: Record = {}; + const configurableAiProviders = selectedLlmProviders.filter( + (provider: AiProviders) => AI_PROVIDERS_CONFIG[provider].envVar ); - return; - } - console.log("Simulator is running!"); - } catch (error) { - console.error(error); - return; - } - - // Ollama doesn't need changes in configuration, we just run it - if (selectedLlmProviders.includes("ollama")) { - - const ollamaAction = new OllamaAction(); - const configManager = new ConfigFileManager(); - const config = configManager.getConfig() - let ollamaModel = config.defaultOllamaModel; - - if(!config.defaultOllamaModel){ - configManager.writeConfig('defaultOllamaModel', 'llama3'); - ollamaModel = 'llama3' - } - - console.log(`Pulling ${ollamaModel} from Ollama...`); - - await ollamaAction.updateModel(ollamaModel); - } + for (const provider of configurableAiProviders) { + const providerConfig = AI_PROVIDERS_CONFIG[provider]; + const keyQuestion = [ + { + type: "input", + name: providerConfig.cliOptionValue, + message: `Please enter your ${providerConfig.name} API Key:`, + validate: (value: string) => + value.length ? true : `Please enter a valid API Key for ${providerConfig.name}.`, + }, + ]; + const apiKeyAnswer = await inquirer.prompt(keyQuestion); + aiProvidersEnvVars[providerConfig.envVar!] = apiKeyAnswer[providerConfig.cliOptionValue]; + } + + this.startSpinner("Configuring GenLayer Localnet environment..."); + this.simulatorService.addConfigToEnvFile(aiProvidersEnvVars); + this.simulatorService.addConfigToEnvFile({ LOCALNETVERSION: localnetVersion }); + + this.setSpinnerText("Running GenLayer Localnet..."); + await this.simulatorService.runSimulator(); + + this.setSpinnerText("Waiting for localnet to be ready..."); + const { initialized, errorCode, errorMessage } = + await this.simulatorService.waitForSimulatorToBeReady(); + if (!initialized) { + if (errorCode === "ERROR") { + this.failSpinner(`Unable to initialize the GenLayer Localnet: ${errorMessage}`); + return; + } + if (errorCode === "TIMEOUT") { + this.failSpinner( + "The localnet is taking too long to initialize. Please try again after the localnet is ready." + ); + return; + } + } - // Initializing validators - console.log("Initializing validators..."); - try { - //remove all validators - await simulatorService.deleteAllValidators(); - // create random validators - await simulatorService.createRandomValidators(Number(options.numValidators), selectedLlmProviders); - } catch (error) { - console.error("Unable to initialize the validators."); - console.error(error); - return; - } + this.stopSpinner(); - if(options.resetDb){ - await simulatorService.cleanDatabase() - } + if (selectedLlmProviders.includes("ollama")) { + const ollamaAction = new OllamaAction(); + if (!defaultOllamaModel) { + this.writeConfig("defaultOllamaModel", "llama3"); + defaultOllamaModel = "llama3"; + } + await ollamaAction.updateModel(defaultOllamaModel); + } + + this.startSpinner("Initializing validators..."); + await this.simulatorService.deleteAllValidators(); + await this.simulatorService.createRandomValidators( + Number(options.numValidators), + selectedLlmProviders + ); - // Simulator ready - let successMessage = "GenLayer simulator initialized successfully! " - successMessage += options.headless ? '' : `Go to ${simulatorService.getFrontendUrl()} in your browser to access it.`; - console.log(successMessage); - try { - if(!options.headless){ - await simulatorService.openFrontend(); + if (options.resetDb) { + this.setSpinnerText("Cleaning database..."); + await this.simulatorService.cleanDatabase(); + } + + let successMessage = "GenLayer Localnet initialized successfully! "; + if (!options.headless) { + successMessage += `Go to ${this.simulatorService.getFrontendUrl()} in your browser to access it.`; + } + if (!options.headless) { + await this.simulatorService.openFrontend(); + } + this.succeedSpinner(successMessage); + } catch (error) { + this.failSpinner("An error occurred during initialization.", error); } - } catch (error) { - console.error(error); } } diff --git a/src/commands/keygen/create.ts b/src/commands/keygen/create.ts index 918bfc8e..8509d090 100644 --- a/src/commands/keygen/create.ts +++ b/src/commands/keygen/create.ts @@ -1,6 +1,5 @@ import { writeFileSync, existsSync } from "fs"; import { ethers } from "ethers"; -import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; import { BaseAction } from "../../lib/actions/BaseAction"; export interface CreateKeypairOptions { @@ -9,17 +8,15 @@ export interface CreateKeypairOptions { } export class KeypairCreator extends BaseAction{ - private filePathManager: ConfigFileManager; constructor() { super() - this.filePathManager = new ConfigFileManager(); } createKeypairAction(options: CreateKeypairOptions) { try { this.startSpinner(`Creating keypair...`); - const outputPath = this.filePathManager.getFilePath(options.output); + const outputPath = this.getFilePath(options.output); if(existsSync(outputPath) && !options.overwrite) { this.failSpinner( @@ -36,7 +33,7 @@ export class KeypairCreator extends BaseAction{ writeFileSync(outputPath, JSON.stringify(keypairData, null, 2)); - this.filePathManager.writeConfig('keyPairPath', outputPath); + this.writeConfig('keyPairPath', outputPath); this.succeedSpinner(`Keypair successfully created and saved to: ${outputPath}`); } catch (error) { this.failSpinner("Failed to generate keypair:", error); diff --git a/src/commands/update/index.ts b/src/commands/update/index.ts index e0a19f74..3857b2bf 100644 --- a/src/commands/update/index.ts +++ b/src/commands/update/index.ts @@ -1,6 +1,5 @@ import { Command } from "commander"; import { OllamaAction } from "./ollama"; -import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; export function initializeUpdateCommands(program: Command) { const updateCommand = program @@ -10,19 +9,15 @@ export function initializeUpdateCommands(program: Command) { updateCommand .command("ollama") .description("Manage Ollama models (update or remove)") - .option("--model [model-name]", "Specify the model to update or remove") + .option("--model [model-name]", "Specify the model to update or remove", '') .option("--remove", "Remove the specified model instead of updating") .action(async (options) => { - const configManager = new ConfigFileManager(); - const config = configManager.getConfig() - - const modelName = options.model || config.defaultOllamaModel; const ollamaAction = new OllamaAction(); if (options.remove) { - await ollamaAction.removeModel(modelName); + await ollamaAction.removeModel(options.model); } else { - await ollamaAction.updateModel(modelName); + await ollamaAction.updateModel(options.model); } }); diff --git a/src/commands/update/ollama.ts b/src/commands/update/ollama.ts index 6fb88441..0d93c340 100644 --- a/src/commands/update/ollama.ts +++ b/src/commands/update/ollama.ts @@ -14,6 +14,10 @@ export class OllamaAction extends BaseAction { try { this.startSpinner(`Updating model "${modelName}"...`); + if(!modelName){ + modelName = this.getConfig().defaultOllamaModel; + } + const providersAndModels = await rpcClient.request({ method: "sim_getProvidersAndModels", params: [], @@ -47,7 +51,7 @@ export class OllamaAction extends BaseAction { method: "sim_addProvider", params: [newModelConfig], }); - this.succeedSpinner(`Model "${modelName}" added successfully.`); + this.succeedSpinner(`Model "${modelName}" added to Provider Presets successfully.`); } } catch (error) { this.failSpinner(`Error updating model "${modelName}"`, error); diff --git a/src/lib/actions/BaseAction.ts b/src/lib/actions/BaseAction.ts index 5ffba7b6..32dd96db 100644 --- a/src/lib/actions/BaseAction.ts +++ b/src/lib/actions/BaseAction.ts @@ -1,11 +1,14 @@ -import inquirer from "inquirer"; -import chalk from "chalk"; +import { ConfigFileManager } from "../../lib/config/ConfigFileManager"; import ora, { Ora } from "ora"; +import chalk from "chalk"; +import inquirer from "inquirer"; + -export class BaseAction { +export class BaseAction extends ConfigFileManager { private spinner: Ora; constructor() { + super() this.spinner = ora({ text: "", spinner: "dots" }); } diff --git a/tests/actions/create.test.ts b/tests/actions/create.test.ts index 101aa734..e111c2ba 100644 --- a/tests/actions/create.test.ts +++ b/tests/actions/create.test.ts @@ -13,13 +13,6 @@ vi.mock("ethers", () => ({ }, })); -vi.mock("../../src/lib/config/ConfigFileManager", () => ({ - ConfigFileManager: vi.fn().mockImplementation(() => ({ - getFilePath: vi.fn((fileName) => `/mocked/path/${fileName}`), - writeConfig: vi.fn(), - })), -})); - describe("KeypairCreator", () => { let keypairCreator: KeypairCreator; @@ -34,6 +27,8 @@ describe("KeypairCreator", () => { vi.spyOn(keypairCreator as any, "startSpinner").mockImplementation(() => {}); vi.spyOn(keypairCreator as any, "succeedSpinner").mockImplementation(() => {}); vi.spyOn(keypairCreator as any, "failSpinner").mockImplementation(() => {}); + vi.spyOn(keypairCreator as any, "writeConfig").mockImplementation(() => {}); + vi.spyOn(keypairCreator as any, "getFilePath").mockImplementation((fileName) => `/mocked/path/${fileName}`); vi.mocked(ethers.Wallet.createRandom).mockReturnValue(mockWallet); }); @@ -49,7 +44,7 @@ describe("KeypairCreator", () => { expect(keypairCreator["startSpinner"]).toHaveBeenCalledWith("Creating keypair..."); expect(ethers.Wallet.createRandom).toHaveBeenCalledTimes(1); - expect(keypairCreator["filePathManager"].getFilePath).toHaveBeenCalledWith("keypair.json"); + expect(keypairCreator["getFilePath"]).toHaveBeenCalledWith("keypair.json"); expect(writeFileSync).toHaveBeenCalledWith( @@ -64,7 +59,7 @@ describe("KeypairCreator", () => { ) ); - expect(keypairCreator["filePathManager"].writeConfig).toHaveBeenCalledWith( + expect(keypairCreator["writeConfig"]).toHaveBeenCalledWith( "keyPairPath", "/mocked/path/keypair.json" ); @@ -95,7 +90,7 @@ describe("KeypairCreator", () => { expect(keypairCreator["startSpinner"]).toHaveBeenCalledWith("Creating keypair..."); expect(ethers.Wallet.createRandom).toHaveBeenCalledTimes(1); - expect(keypairCreator["filePathManager"].getFilePath).toHaveBeenCalledWith("keypair.json"); + expect(keypairCreator["getFilePath"]).toHaveBeenCalledWith("keypair.json"); expect(writeFileSync).toHaveBeenCalledWith( "/mocked/path/keypair.json", @@ -109,7 +104,7 @@ describe("KeypairCreator", () => { ) ); - expect(keypairCreator["filePathManager"].writeConfig).toHaveBeenCalledWith( + expect(keypairCreator["writeConfig"]).toHaveBeenCalledWith( "keyPairPath", "/mocked/path/keypair.json" ); diff --git a/tests/actions/getSetReset.test.ts b/tests/actions/getSetReset.test.ts index 8a8ac17c..fb0ded72 100644 --- a/tests/actions/getSetReset.test.ts +++ b/tests/actions/getSetReset.test.ts @@ -23,7 +23,7 @@ describe("ConfigActions", () => { test("set method writes key-value pair to the configuration", () => { configActions.set("defaultNetwork=testnet"); - expect(configActions["configManager"].writeConfig).toHaveBeenCalledWith("defaultNetwork", "testnet"); + expect(configActions["writeConfig"]).toHaveBeenCalledWith("defaultNetwork", "testnet"); expect(configActions["startSpinner"]).toHaveBeenCalledWith("Updating configuration: defaultNetwork"); expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("Configuration successfully updated"); }); @@ -32,7 +32,7 @@ describe("ConfigActions", () => { configActions.set("invalidFormat"); expect(configActions["failSpinner"]).toHaveBeenCalledWith("Invalid format. Use 'key=value'."); - expect(configActions["configManager"].writeConfig).not.toHaveBeenCalled(); + expect(configActions["writeConfig"]).not.toHaveBeenCalled(); }); test("get method retrieves value for a specific key", () => { @@ -40,7 +40,7 @@ describe("ConfigActions", () => { configActions.get("defaultNetwork"); - expect(configActions["configManager"].getConfigByKey).toHaveBeenCalledWith("defaultNetwork"); + expect(configActions["getConfigByKey"]).toHaveBeenCalledWith("defaultNetwork"); expect(configActions["startSpinner"]).toHaveBeenCalledWith("Retrieving value for: defaultNetwork"); expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("Configuration successfully retrieved", "defaultNetwork=testnet"); }); @@ -50,7 +50,7 @@ describe("ConfigActions", () => { configActions.get("nonexistentKey"); - expect(configActions["configManager"].getConfigByKey).toHaveBeenCalledWith("nonexistentKey"); + expect(configActions["getConfigByKey"]).toHaveBeenCalledWith("nonexistentKey"); expect(configActions["failSpinner"]).toHaveBeenCalledWith("No configuration found for 'nonexistentKey'."); }); @@ -60,7 +60,7 @@ describe("ConfigActions", () => { configActions.get(); - expect(configActions["configManager"].getConfig).toHaveBeenCalled(); + expect(configActions["getConfig"]).toHaveBeenCalled(); expect(configActions["startSpinner"]).toHaveBeenCalledWith("Retrieving all configurations"); expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("All configurations successfully retrieved", JSON.stringify(mockConfig, null, 2)); }); @@ -71,9 +71,9 @@ describe("ConfigActions", () => { configActions.reset("defaultNetwork"); - expect(configActions["configManager"].getConfig).toHaveBeenCalled(); + expect(configActions["getConfig"]).toHaveBeenCalled(); expect(configActions["startSpinner"]).toHaveBeenCalledWith("Resetting configuration: defaultNetwork"); - expect(configActions["configManager"].writeConfig).toHaveBeenCalledWith("defaultNetwork", undefined); + expect(configActions["writeConfig"]).toHaveBeenCalledWith("defaultNetwork", undefined); expect(configActions["succeedSpinner"]).toHaveBeenCalledWith("Configuration successfully reset"); }); @@ -82,7 +82,7 @@ describe("ConfigActions", () => { configActions.reset("nonexistentKey"); - expect(configActions["configManager"].getConfig).toHaveBeenCalled(); + expect(configActions["getConfig"]).toHaveBeenCalled(); expect(configActions["failSpinner"]).toHaveBeenCalledWith("Configuration key 'nonexistentKey' does not exist."); }); }); \ No newline at end of file diff --git a/tests/actions/init.test.ts b/tests/actions/init.test.ts index 0a173eb0..bbe4a21c 100644 --- a/tests/actions/init.test.ts +++ b/tests/actions/init.test.ts @@ -1,523 +1,288 @@ -import {vi, describe, beforeEach, afterEach, test, expect} from "vitest"; +import { describe, test, vi, beforeEach, afterEach, expect } from "vitest"; import inquirer from "inquirer"; -import simulatorService from "../../src/lib/services/simulator"; -import { initAction } from "../../src/commands/general/init"; -import { tmpdir } from "os"; -import {mkdtempSync} from "fs"; -import {join} from "path"; -import fs from "fs"; -import * as dotenv from "dotenv"; -import {localnetCompatibleVersion} from "../../src/lib/config/simulator"; +import { InitAction, InitActionOptions } from "../../src/commands/general/init"; +import { SimulatorService } from "../../src/lib/services/simulator"; import { OllamaAction } from "../../src/commands/update/ollama"; -import { ConfigFileManager } from "../../src/lib/config/ConfigFileManager"; - -vi.mock("fs"); -vi.mock("dotenv"); -vi.mock("../../src/commands/update/ollama") -vi.mock("../../src/lib/config/ConfigFileManager"); - - -const tempDir = mkdtempSync(join(tmpdir(), "test-initAction-")); -const defaultActionOptions = { numValidators: 5, branch: "main", location: tempDir, headless: false, resetDb: false, localnetVersion: localnetCompatibleVersion }; - -describe("init action", () => { - let error: ReturnType; - let log: ReturnType; - let inquirerPrompt: ReturnType; - - let simServCheckInstallRequirements: ReturnType; - let simServCheckVersionRequirements: ReturnType; - let simServResetDockerContainers: ReturnType; - let simServResetDockerImages: ReturnType; - let simServgetAiProvidersOptions: ReturnType; - let simServRunSimulator: ReturnType; - let simServWaitForSimulator: ReturnType; - let simServDeleteAllValidators: ReturnType; - let simServCreateRandomValidators: ReturnType; - let simServOpenFrontend: ReturnType; - let simGetSimulatorUrl: ReturnType; - let simAddConfigToEnvFile: ReturnType; +describe("InitAction", () => { + let initAction: InitAction; + let inquirerPromptSpy: ReturnType; + let checkCliVersionSpy: ReturnType; + let checkInstallRequirementsSpy: ReturnType; + let checkVersionRequirementsSpy: ReturnType; + let resetDockerContainersSpy: ReturnType; + let resetDockerImagesSpy: ReturnType; + let addConfigToEnvFileSpy: ReturnType; + let runSimulatorSpy: ReturnType; + let waitForSimulatorSpy: ReturnType; + let deleteAllValidatorsSpy: ReturnType; + let createRandomValidatorsSpy: ReturnType; + let cleanDatabaseSpy: ReturnType; + let openFrontendSpy: ReturnType; + let getFrontendUrlSpy: ReturnType; + let normalizeLocalnetVersionSpy: ReturnType; + + const defaultConfig = { defaultOllamaModel: "llama3" }; + + const defaultOptions: InitActionOptions = { + numValidators: 5, + headless: false, + resetDb: false, + localnetVersion: "v1.0.0", + }; beforeEach(() => { vi.clearAllMocks(); - - error = vi.spyOn(console, "error").mockImplementation(() => {}); - log = vi.spyOn(console, "log").mockImplementation(() => {}); - inquirerPrompt = vi.spyOn(inquirer, "prompt"); - - simServCheckInstallRequirements = vi.spyOn(simulatorService, "checkInstallRequirements"); - simServCheckVersionRequirements = vi.spyOn(simulatorService, "checkVersionRequirements"); - simServResetDockerContainers = vi.spyOn(simulatorService, "resetDockerContainers"); - simServResetDockerImages = vi.spyOn(simulatorService, "resetDockerImages"); - simServgetAiProvidersOptions = vi.spyOn(simulatorService, "getAiProvidersOptions"); - simServRunSimulator = vi.spyOn(simulatorService, "runSimulator"); - simServWaitForSimulator = vi.spyOn(simulatorService, "waitForSimulatorToBeReady"); - simServDeleteAllValidators = vi.spyOn(simulatorService, "deleteAllValidators"); - simServCreateRandomValidators = vi.spyOn(simulatorService, "createRandomValidators"); - simServOpenFrontend = vi.spyOn(simulatorService, "openFrontend"); - simGetSimulatorUrl = vi.spyOn(simulatorService, "getFrontendUrl") - simAddConfigToEnvFile = vi.spyOn(simulatorService, "addConfigToEnvFile") - - simServCheckVersionRequirements.mockResolvedValue({ - node: '', - docker: '', - }); - simServCheckInstallRequirements.mockResolvedValue({ - git: true, - docker: true, - }) - simAddConfigToEnvFile.mockResolvedValue(true); - const mockEnvContent = "FRONTEND_PORT=8080"; - const mockEnvConfig = { FRONTEND_PORT: "8080" }; - vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); - vi.mocked(dotenv.parse).mockReturnValue(mockEnvConfig); + initAction = new InitAction(); + inquirerPromptSpy = vi.spyOn(inquirer, "prompt"); + vi.spyOn(initAction as any, "startSpinner").mockImplementation(() => {}); + vi.spyOn(initAction as any, "setSpinnerText").mockImplementation(() => {}); + vi.spyOn(initAction as any, "succeedSpinner").mockImplementation(() => {}); + vi.spyOn(initAction as any, "failSpinner").mockImplementation(() => {}); + vi.spyOn(initAction as any, "stopSpinner").mockImplementation(() => {}); + vi.spyOn(initAction as any, "logError").mockImplementation(() => {}); + vi.spyOn(initAction, "getConfig").mockReturnValue(defaultConfig); + checkCliVersionSpy = vi.spyOn(SimulatorService.prototype, "checkCliVersion").mockResolvedValue(undefined); + checkInstallRequirementsSpy = vi.spyOn(SimulatorService.prototype, "checkInstallRequirements").mockResolvedValue({ git: true, docker: true }); + checkVersionRequirementsSpy = vi.spyOn(SimulatorService.prototype, "checkVersionRequirements").mockResolvedValue({ node: "", docker: "" }); + resetDockerContainersSpy = vi.spyOn(SimulatorService.prototype, "resetDockerContainers").mockResolvedValue(undefined); + resetDockerImagesSpy = vi.spyOn(SimulatorService.prototype, "resetDockerImages").mockResolvedValue(undefined); + addConfigToEnvFileSpy = vi.spyOn(SimulatorService.prototype, "addConfigToEnvFile").mockResolvedValue(); + runSimulatorSpy = vi.spyOn(SimulatorService.prototype, "runSimulator").mockResolvedValue(undefined as any); + waitForSimulatorSpy = vi.spyOn(SimulatorService.prototype, "waitForSimulatorToBeReady").mockResolvedValue({ initialized: true }) as any; + deleteAllValidatorsSpy = vi.spyOn(SimulatorService.prototype, "deleteAllValidators").mockResolvedValue(undefined); + createRandomValidatorsSpy = vi.spyOn(SimulatorService.prototype, "createRandomValidators").mockResolvedValue(undefined) as any; + cleanDatabaseSpy = vi.spyOn(SimulatorService.prototype, "cleanDatabase").mockResolvedValue(true); + openFrontendSpy = vi.spyOn(SimulatorService.prototype, "openFrontend").mockResolvedValue(true); + getFrontendUrlSpy = vi.spyOn(SimulatorService.prototype, "getFrontendUrl").mockReturnValue("http://localhost:8080"); + normalizeLocalnetVersionSpy = vi.spyOn(SimulatorService.prototype, "normalizeLocalnetVersion").mockImplementation((v: string) => v) as any; }); afterEach(() => { vi.restoreAllMocks(); }); - test("if only docker is missing, then the execution fails", async () => { - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: false }); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith("Docker is not installed. Please install Docker and try again.\n"); - }); - - test("if check install requirements fail, then the execution aborts", async () => { - simServCheckInstallRequirements.mockRejectedValue(new Error("Error")); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(new Error("Error")); - }); - - test("if both versions are too low, then the execution fails", async () => { - const mockVersionNumber = "99.9.9"; - simServCheckVersionRequirements.mockResolvedValue({ - node: mockVersionNumber, - docker: mockVersionNumber, + describe("Successful Execution", () => { + test("executes the full flow in non-headless mode", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai", "heuristai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }) + .mockResolvedValueOnce({ heuristai: "API_KEY_HEURIST" }); + await initAction.execute(defaultOptions); + expect(checkCliVersionSpy).toHaveBeenCalled(); + expect(checkInstallRequirementsSpy).toHaveBeenCalled(); + expect(checkVersionRequirementsSpy).toHaveBeenCalled(); + expect(resetDockerContainersSpy).toHaveBeenCalled(); + expect(resetDockerImagesSpy).toHaveBeenCalled(); + expect(addConfigToEnvFileSpy).toHaveBeenCalledWith({ OPENAIKEY: "API_KEY_OPENAI", HEURISTAIAPIKEY: "API_KEY_HEURIST" }); + expect(addConfigToEnvFileSpy).toHaveBeenCalledWith({ LOCALNETVERSION: "v1.0.0" }); + expect(runSimulatorSpy).toHaveBeenCalled(); + expect(waitForSimulatorSpy).toHaveBeenCalled(); + expect(deleteAllValidatorsSpy).toHaveBeenCalled(); + expect(createRandomValidatorsSpy).toHaveBeenCalledWith(5, ["openai", "heuristai"]); + expect(getFrontendUrlSpy).toHaveBeenCalled(); + expect(openFrontendSpy).toHaveBeenCalled(); + expect((initAction as any).succeedSpinner).toHaveBeenCalledWith("GenLayer Localnet initialized successfully! Go to http://localhost:8080 in your browser to access it."); }); - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith( - `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\nNode version ${mockVersionNumber} or higher is required. Please update Node and try again.\n` - ); - }); - - test("if only docker version is too low, then the execution fails", async () => { - const mockVersionNumber = "99.9.9"; - simServCheckVersionRequirements.mockResolvedValue({ - docker: mockVersionNumber, + test("executes correctly in headless mode with DB reset and 'ollama' selected", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai", "ollama"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + const ollamaUpdateSpy = vi.spyOn(OllamaAction.prototype, "updateModel").mockResolvedValue(undefined); + const headlessOptions: InitActionOptions = { + numValidators: 5, + headless: true, + resetDb: true, + localnetVersion: "v1.0.0", + }; + await initAction.execute(headlessOptions); + expect(cleanDatabaseSpy).toHaveBeenCalled(); + expect(openFrontendSpy).not.toHaveBeenCalled(); + expect((initAction as any).succeedSpinner).toHaveBeenCalledWith("GenLayer Localnet initialized successfully! "); + expect(ollamaUpdateSpy).toHaveBeenCalledWith("llama3"); }); - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith( - `Docker version ${mockVersionNumber} or higher is required. Please update Docker and try again.\n` - ); - }); - - test("if only node version is too low, then the execution fails", async () => { - const mockVersionNumber = "99.9.9"; - simServCheckVersionRequirements.mockResolvedValue({ - node: mockVersionNumber + test("normalizes localnetVersion if not 'latest'", async () => { + const customVersion = "custom-v1"; + normalizeLocalnetVersionSpy.mockReturnValue(customVersion); + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + await initAction.execute({ ...defaultOptions, localnetVersion: customVersion }); + expect(normalizeLocalnetVersionSpy).toHaveBeenCalledWith(customVersion); + expect(addConfigToEnvFileSpy).toHaveBeenCalledWith({ LOCALNETVERSION: customVersion }); }); - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith( - `Node version ${mockVersionNumber} or higher is required. Please update Node and try again.\n` - ); - }); - - test("if reset is not confirmed, abort", async () => { - inquirerPrompt.mockResolvedValue({ confirmReset: false }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - - await initAction(defaultActionOptions, simulatorService); - - expect(log).toHaveBeenCalledWith("Aborted!"); - }); - - test("if resetDockerContainers fail, then the execution aborts", async () => { - inquirerPrompt.mockResolvedValue({ confirmReset: true }); - simServResetDockerContainers.mockRejectedValue(new Error("Error")); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(new Error("Error")); - }); - - test("should open the frontend if everything went well", async () => { - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", + test("should set defaultOllamaModel to 'llama3' if not provided in config", async () => { + vi.spyOn(initAction, "getConfig").mockReturnValue({}); + const writeConfigSpy = vi.spyOn(initAction, "writeConfig").mockImplementation(() => {}); + const ollamaUpdateSpy = vi.spyOn(OllamaAction.prototype, "updateModel").mockResolvedValue(undefined); + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["ollama"] }) + .mockResolvedValueOnce({ ollama: "API_KEY_OLLAMA" }); + await initAction.execute(defaultOptions); + expect(writeConfigSpy).toHaveBeenCalledWith("defaultOllamaModel", "llama3"); + expect(ollamaUpdateSpy).toHaveBeenCalledWith("llama3"); }); - simServgetAiProvidersOptions.mockReturnValue([ - { name: "OpenAI", value: "openai" }, - { name: "Heurist", value: "heuristai" }, - ]); - - vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); - - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServCreateRandomValidators.mockResolvedValue(true); - simServOpenFrontend.mockResolvedValue(true); - simGetSimulatorUrl.mockResolvedValue('http://localhost:8080/'); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - await initAction(defaultActionOptions, simulatorService); - - const frontendUrl = simulatorService.getFrontendUrl(); - expect(log).toHaveBeenCalledWith( - `GenLayer simulator initialized successfully! Go to ${frontendUrl} in your browser to access it.` - ); - }); - - test("should open the frontend if everything went well (custom options)", async () => { - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", + test("validates API key input for configurable provider", async () => { + inquirerPromptSpy.mockResolvedValueOnce({ confirmAction: true }); + inquirerPromptSpy.mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }); + let capturedQuestion: any; + inquirerPromptSpy.mockImplementationOnce((questions: any) => { + capturedQuestion = questions[0]; + return Promise.resolve({ openai: "dummy-key" }); + }); + await initAction.execute(defaultOptions); + expect(capturedQuestion).toBeDefined(); + const expectedError = `Please enter a valid API Key for OpenAI.`; + expect(capturedQuestion.validate("")).toBe(expectedError); + expect(capturedQuestion.validate("non-empty-key")).toBe(true); }); - simServgetAiProvidersOptions.mockReturnValue([ - { name: "OpenAI", value: "openai" }, - { name: "Heurist", value: "heuristai" }, - ]); - - vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); - - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServCreateRandomValidators.mockResolvedValue(true); - simServOpenFrontend.mockResolvedValue(true); - simGetSimulatorUrl.mockResolvedValue('http://localhost:8080/'); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - - await initAction({...defaultActionOptions, headless: true, resetDb: true, localnetVersion: "v1.0.0"}, simulatorService); - expect(log).toHaveBeenCalledWith( - `GenLayer simulator initialized successfully! ` - ); - }); - - test("should throw an error if validator are not initialized", async () => { - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai"], - openai: "API_KEY1", - heuristai: "API_KEY2", + test("validates LLM provider selection prompt", async () => { + let capturedQuestion: any; + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockImplementationOnce((questions: any) => { + capturedQuestion = questions[0]; + return Promise.resolve({ selectedLlmProviders: ["openai"] }); + }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + await initAction.execute(defaultOptions); + expect(capturedQuestion.validate([])).toBe("You must choose at least one option."); + expect(capturedQuestion.validate(["openai"])).toBe(true); }); - simServgetAiProvidersOptions.mockReturnValue([ - { name: "OpenAI", value: "openai" }, - { name: "Heurist", value: "heuristai" }, - ]); - - vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); - - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - simServCreateRandomValidators.mockRejectedValue(); - simServOpenFrontend.mockResolvedValue(true); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - - await initAction({...defaultActionOptions, headless: true}, simulatorService); - - expect(log).toHaveBeenCalledWith('Initializing validators...'); - expect(error).toHaveBeenCalledWith('Unable to initialize the validators.'); }); - test("if runSimulator fails, then the execution aborts", async () => { - inquirerPrompt.mockResolvedValue({ confirmReset: true, confirmDownload: true, selectedLlmProviders: [] }); - simServRunSimulator.mockRejectedValue(new Error("Error")); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(new Error("Error")); - }); - - test("should pull Ollama model if 'ollama' is in providers", async () => { - - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai", "ollama"], - openai: "API_KEY1", - heuristai: "API_KEY2", - ollama: "API_KEY3", + describe("Error Handling", () => { + test("fails if Docker is not installed", async () => { + checkInstallRequirementsSpy.mockResolvedValue({ git: true, docker: false }); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("Docker is not installed. Please install Docker and try again.\n"); }); - simServgetAiProvidersOptions.mockReturnValue([ - { name: "OpenAI", value: "openai" }, - { name: "Heurist", value: "heuristai" }, - { name: "Ollama", value: "ollama" }, - ]); - - vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); - - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue({}); - await initAction(defaultActionOptions, simulatorService); - - expect(log).toHaveBeenCalledWith(`Pulling llama3 from Ollama...`); - expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); - }); - - test("should pull Ollama model if 'ollama' is in providers using defaultOllamaModel", async () => { - const ollamaModel = "gemma"; - - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai", "ollama"], - openai: "API_KEY1", - heuristai: "API_KEY2", - ollama: "API_KEY3", + test("fails if checkInstallRequirements throws an error", async () => { + const error = new Error("Install error"); + checkInstallRequirementsSpy.mockRejectedValue(error); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", error); }); - simServgetAiProvidersOptions.mockReturnValue([ - { name: "OpenAI", value: "openai" }, - { name: "Heurist", value: "heuristai" }, - { name: "Ollama", value: "ollama" }, - ]); - - vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); - - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue({defaultOllamaModel: ollamaModel}); - - await initAction(defaultActionOptions, simulatorService); - expect(log).toHaveBeenCalledWith(`Pulling ${ollamaModel} from Ollama...`); - expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); - }); - - test("should set defaultOllamaModel to llama 3 if no defaultOllamaModel is provided", async () => { - - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai", "heuristai", "ollama"], - openai: "API_KEY1", - heuristai: "API_KEY2", - ollama: "API_KEY3", + test("fails if version requirements are not met (both docker and node)", async () => { + const version = "99.9.9"; + checkVersionRequirementsSpy.mockResolvedValue({ docker: version, node: version }); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith(`Docker version ${version} or higher is required. Please update Docker and try again.\nNode version ${version} or higher is required. Please update Node and try again.\n`); }); - simServgetAiProvidersOptions.mockReturnValue([ - { name: "OpenAI", value: "openai" }, - { name: "Heurist", value: "heuristai" }, - { name: "Ollama", value: "ollama" }, - ]); - - vi.mocked(ConfigFileManager.prototype.getConfig).mockResolvedValueOnce({}) - vi.mocked(OllamaAction.prototype.updateModel).mockResolvedValueOnce(undefined); - - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({})); - - await initAction(defaultActionOptions, simulatorService); - - expect(ConfigFileManager.prototype.writeConfig).toHaveBeenCalledWith('defaultOllamaModel', 'llama3') - expect(log).toHaveBeenCalledWith(`Pulling llama3 from Ollama...`); - expect(OllamaAction.prototype.updateModel).toHaveBeenCalled(); - }); - - test("logs error if checkVersionRequirements throws", async () => { - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - const errorMsg = new Error("checkVersionRequirements error"); - simServCheckVersionRequirements.mockRejectedValueOnce(errorMsg); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(errorMsg); - }); - - test("logs error if resetDockerContainers throws", async () => { - inquirerPrompt.mockResolvedValue({ confirmReset: true }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - const errorMsg = new Error("resetDockerContainers error"); - simServResetDockerContainers.mockRejectedValueOnce(errorMsg); - - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(errorMsg); - }); - - test("prompts for LLM providers and validates that at least one is selected", async () => { - const mockEnvContent = "FRONTEND_PORT=8080"; - vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); - - inquirerPrompt - .mockResolvedValueOnce({ confirmReset: true }) - .mockImplementation((questions: any) => { - if (questions[0].type === "checkbox") { - const validateFunction = questions[0].validate; - expect(validateFunction([])).toBe("You must choose at least one option."); - expect(validateFunction(["openai"])).toBe(true); - return Promise.resolve({ selectedLlmProviders: ["openai"] }); - } - - if (questions[0].type === "input") { - const validateFunction = questions[0].validate; - expect(validateFunction("")).toBe("Please enter a valid API Key for OpenAI."); - expect(validateFunction("API_KEY1")).toBe(true); - return Promise.resolve({ openai: "API_KEY1" }); - } - }); - simServCheckInstallRequirements.mockResolvedValue({ docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServCreateRandomValidators.mockResolvedValue(true); - simServOpenFrontend.mockResolvedValue(true); - - await initAction(defaultActionOptions, simulatorService); - }); - - - test("logs error message if simulator fails to initialize with ERROR code", async () => { - inquirerPrompt - .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) - .mockResolvedValueOnce({ openai: "API_KEY1" }); - - simServCheckInstallRequirements.mockResolvedValue({ docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - - simServWaitForSimulator.mockResolvedValue({ - initialized: false, - errorCode: "ERROR", - errorMessage: "Simulator failed to initialize due to configuration error.", + test("fails if version requirement for docker is not met", async () => { + const version = "99.9.9"; + checkVersionRequirementsSpy.mockResolvedValue({ docker: version }); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith(`Docker version ${version} or higher is required. Please update Docker and try again.\n`); }); - await initAction(defaultActionOptions, simulatorService); - - expect(log).toHaveBeenCalledWith("Simulator failed to initialize due to configuration error."); - expect(error).toHaveBeenCalledWith("Unable to initialize the GenLayer simulator. Please try again."); - }); - - test("logs error if runSimulator throws", async () => { - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai"], - openai: "API_KEY1", + test("fails if version requirement for node is not met", async () => { + const version = "99.9.9"; + checkVersionRequirementsSpy.mockResolvedValue({ node: version }); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith(`Node version ${version} or higher is required. Please update Node and try again.\n`); }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - const errorMsg = new Error("runSimulator error"); - simServRunSimulator.mockRejectedValueOnce(errorMsg); - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith(errorMsg); - }); - - test("logs specific message if waitForSimulatorToBeReady returns TIMEOUT errorCode", async () => { - inquirerPrompt.mockResolvedValue({ - confirmReset: true, - confirmDownload: true, - selectedLlmProviders: ["openai"], - openai: "API_KEY1", - }); - simServCheckInstallRequirements.mockResolvedValue({ git: true, docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ - initialized: false, - errorCode: "TIMEOUT", - errorMessage: "errorMessage", + test("aborts if user does not confirm reset action", async () => { + inquirerPromptSpy.mockResolvedValueOnce({ confirmAction: false }); + await initAction.execute(defaultOptions) + expect((initAction as any).logError).toHaveBeenCalledWith(`Operation aborted!`); }); - await initAction(defaultActionOptions, simulatorService); - - expect(error).toHaveBeenCalledWith( - "The simulator is taking too long to initialize. Please try again after the simulator is ready." - ); - }); - - test("catches and logs error if waitForSimulatorToBeReady throws an exception", async () => { - inquirerPrompt - .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) - .mockResolvedValueOnce({ openai: "API_KEY1" }); - - simServCheckInstallRequirements.mockResolvedValue({ docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - - const errorMsg = new Error("Unexpected simulator error"); - simServWaitForSimulator.mockRejectedValueOnce(errorMsg); + test("fails if resetDockerContainers throws an error", async () => { + inquirerPromptSpy.mockResolvedValueOnce({ confirmAction: true }); + resetDockerContainersSpy.mockRejectedValue(new Error("Container reset error")); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", new Error("Container reset error")); + }); - await initAction(defaultActionOptions, simulatorService); + test("fails if runSimulator throws an error", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + runSimulatorSpy.mockRejectedValue(new Error("Run simulator error")); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", new Error("Run simulator error")); + }); - expect(error).toHaveBeenCalledWith(errorMsg); - }); + test("fails if waitForSimulatorToBeReady returns ERROR code", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + waitForSimulatorSpy.mockResolvedValue({ initialized: false, errorCode: "ERROR", errorMessage: "Initialization failed" }); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("Unable to initialize the GenLayer Localnet: Initialization failed"); + }); - test("catches and logs error if openFrontend throws an exception", async () => { - const mockEnvContent = "FRONTEND_PORT=8080"; - vi.mocked(fs.readFileSync).mockReturnValue(mockEnvContent); + test("fails if waitForSimulatorToBeReady returns TIMEOUT code", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + waitForSimulatorSpy.mockResolvedValue({ initialized: false, errorCode: "TIMEOUT", errorMessage: "Timeout" }); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("The localnet is taking too long to initialize. Please try again after the localnet is ready."); + }); - inquirerPrompt - .mockResolvedValueOnce({ confirmReset: true }) - .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) - .mockResolvedValueOnce({ openai: "API_KEY1" }); + test("fails if deleteAllValidators throws an error", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + deleteAllValidatorsSpy.mockRejectedValue(new Error("Validator deletion error")); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", expect.any(Error)); + }); - simServCheckInstallRequirements.mockResolvedValue({ docker: true }); - simServResetDockerContainers.mockResolvedValue(true); - simServResetDockerImages.mockResolvedValue(true); - simServRunSimulator.mockResolvedValue(true); - simServWaitForSimulator.mockResolvedValue({ initialized: true }); - simServDeleteAllValidators.mockResolvedValue(true); - simServCreateRandomValidators.mockResolvedValue(true); + test("fails if createRandomValidators throws an error", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + createRandomValidatorsSpy.mockRejectedValue(new Error("Validator creation error")); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", Error("Validator creation error")); + }); - const errorMsg = new Error("Failed to open frontend"); - simServOpenFrontend.mockImplementationOnce(() => { - throw errorMsg; + test("fails if cleanDatabase throws an error when resetDb is true", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + cleanDatabaseSpy.mockRejectedValue(new Error("Database error")); + const optionsWithResetDb: InitActionOptions = { ...defaultOptions, resetDb: true }; + await initAction.execute(optionsWithResetDb); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", new Error("Database error")); }); - await initAction(defaultActionOptions, simulatorService); + test("fails if openFrontend throws an error", async () => { + inquirerPromptSpy + .mockResolvedValueOnce({ confirmAction: true }) + .mockResolvedValueOnce({ selectedLlmProviders: ["openai"] }) + .mockResolvedValueOnce({ openai: "API_KEY_OPENAI" }); + openFrontendSpy.mockRejectedValue(new Error("Frontend error")); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", new Error("Frontend error")); + }); - expect(error).toHaveBeenCalledWith(errorMsg); + test("catches and logs unexpected errors", async () => { + inquirerPromptSpy.mockRejectedValueOnce(new Error("Unexpected prompt error")); + await initAction.execute(defaultOptions); + expect((initAction as any).failSpinner).toHaveBeenCalledWith("An error occurred during initialization.", new Error("Unexpected prompt error")); + }); }); - }); \ No newline at end of file diff --git a/tests/actions/ollama.test.ts b/tests/actions/ollama.test.ts index 76aa080d..c38b343e 100644 --- a/tests/actions/ollama.test.ts +++ b/tests/actions/ollama.test.ts @@ -182,4 +182,12 @@ describe("OllamaAction", () => { expect(ollamaAction["failSpinner"]).toHaveBeenCalledWith(`Error updating model "mocked_model"`, mockError); }); + test("should call get config if modelName is empty", async () => { + const defaultModel = "default_model"; + vi.spyOn(ollamaAction as any, "getConfig").mockReturnValue({ defaultOllamaModel: defaultModel }); + + await ollamaAction.updateModel(""); + expect(ollamaAction.getConfig).toHaveBeenCalledTimes(1); + }); + }); \ No newline at end of file diff --git a/tests/commands/init.test.ts b/tests/commands/init.test.ts index bf0182ac..fd856080 100644 --- a/tests/commands/init.test.ts +++ b/tests/commands/init.test.ts @@ -4,6 +4,11 @@ import { initializeGeneralCommands } from "../../src/commands/general"; import { getCommand, getCommandOption } from "../utils"; import simulatorService from '../../src/lib/services/simulator' import {localnetCompatibleVersion} from "../../src/lib/config/simulator"; +import { InitAction } from "../../src/commands/general/init"; + + +vi.mock("../../src/commands/general/init"); + const openFrontendSpy = vi.spyOn(simulatorService, "openFrontend"); const defaultOptions = { @@ -17,8 +22,6 @@ vi.mock("inquirer", () => ({ prompt: vi.fn(() => {}), })); -const action = vi.fn(); - describe("init command", () => { let initCommand: Command; let program: Command; @@ -28,10 +31,6 @@ describe("init command", () => { initializeGeneralCommands(program); initCommand = getCommand(program, "init"); - initCommand?.action(async (args) => { - action(args); - }); - vi.clearAllMocks(); }); @@ -65,21 +64,21 @@ describe("init command", () => { test("action is called", async () => { program.parse(["node", "test", "init"]); - expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith(defaultOptions); + expect(InitAction).toHaveBeenCalledTimes(1); + expect(InitAction.prototype.execute).toHaveBeenCalledWith(defaultOptions); }); test("option --headless is accepted", async () => { program.parse(["node", "test", "init", "--headless"]); - expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({...defaultOptions, headless: true}); + expect(InitAction).toHaveBeenCalledTimes(1); + expect(InitAction.prototype.execute).toHaveBeenCalledWith({...defaultOptions, headless: true}); expect(openFrontendSpy).not.toHaveBeenCalled(); }); test("option --localnet-version is accepted", async () => { program.parse(["node", "test", "init", "--localnet-version", "v1.0.0"]); - expect(action).toHaveBeenCalledTimes(1); - expect(action).toHaveBeenCalledWith({...defaultOptions, localnetVersion: "v1.0.0"}); + expect(InitAction).toHaveBeenCalledTimes(1); + expect(InitAction.prototype.execute).toHaveBeenCalledWith({...defaultOptions, localnetVersion: "v1.0.0"}); expect(openFrontendSpy).not.toHaveBeenCalled(); }); }); diff --git a/tests/commands/update.test.ts b/tests/commands/update.test.ts index dc30bb50..d0b1694a 100644 --- a/tests/commands/update.test.ts +++ b/tests/commands/update.test.ts @@ -2,10 +2,8 @@ import { Command } from "commander"; import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import { initializeUpdateCommands } from "../../src/commands/update"; import { OllamaAction } from "../../src/commands/update/ollama"; -import { ConfigFileManager } from "../../src/lib/config/ConfigFileManager"; vi.mock("../../src/commands/update/ollama"); -vi.mock("../../src/lib/config/ConfigFileManager"); describe("ollama command", () => { let program: Command; @@ -15,7 +13,6 @@ describe("ollama command", () => { initializeUpdateCommands(program); const mockConfig = { defaultOllamaModel: "default-model" }; - vi.mocked(ConfigFileManager.prototype.getConfig).mockReturnValue(mockConfig); }); afterEach(() => { @@ -31,7 +28,7 @@ describe("ollama command", () => { test("OllamaAction.updateModel is called with default model", async () => { program.parse(["node", "test", "update", "ollama"]); expect(OllamaAction).toHaveBeenCalledTimes(1); - expect(OllamaAction.prototype.updateModel).toHaveBeenCalledWith("default-model"); + expect(OllamaAction.prototype.updateModel).toHaveBeenCalledWith(""); }); test("OllamaAction.removeModel is called with model option", async () => { @@ -43,6 +40,6 @@ describe("ollama command", () => { test("OllamaAction.removeModel is called with default model", async () => { program.parse(["node", "test", "update", "ollama", "--remove"]); expect(OllamaAction).toHaveBeenCalledTimes(1); - expect(OllamaAction.prototype.removeModel).toHaveBeenCalledWith("default-model"); + expect(OllamaAction.prototype.removeModel).toHaveBeenCalledWith(""); }); }); diff --git a/tests/services/simulator.test.ts b/tests/services/simulator.test.ts index 92782f3b..57aa0496 100644 --- a/tests/services/simulator.test.ts +++ b/tests/services/simulator.test.ts @@ -282,6 +282,21 @@ describe("SimulatorService - Basic Tests", () => { expect(rpcClient.request).toHaveBeenCalledWith({ method: "sim_clearDbTables", params: [['current_state', 'transactions']] }); }); + test("should create random validators", async () => { + const numValidators = 5; + const llmProviders = ["openai", "ollama"]; + const mockResponse = { success: true }; + vi.mocked(rpcClient.request).mockResolvedValue(mockResponse); + + const result = await simulatorService.createRandomValidators(numValidators, llmProviders); + + expect(rpcClient.request).toHaveBeenCalledWith({ + method: "sim_createRandomValidators", + params: [numValidators, 1, 10, llmProviders], + }); + expect(result).toEqual(mockResponse); + }); + }); describe("SimulatorService - Docker Tests", () => { let mockGetContainer: Mock; From 07d1f86ee83580d1a0470d04a9e60e696344fcba Mon Sep 17 00:00:00 2001 From: Edinaldo Junior Date: Thu, 20 Feb 2025 12:31:58 -0300 Subject: [PATCH 67/67] fix: merging commit --- tests/commands/call.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/commands/call.test.ts b/tests/commands/call.test.ts index 038f239c..7fd2d48e 100644 --- a/tests/commands/call.test.ts +++ b/tests/commands/call.test.ts @@ -1,7 +1,7 @@ import { Command } from "commander"; +import { CallAction } from "../../src/commands/contracts/call"; import { vi, describe, beforeEach, afterEach, test, expect } from "vitest"; import { initializeContractsCommands } from "../../src/commands/contracts"; -import { CallAction } from "../../src/commands/contracts/call"; vi.mock("../../src/commands/contracts/call");