From f30b1e406f80cf80a8bbd45934bcc7bed4b595f9 Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Mon, 21 Jul 2025 20:55:42 +0100 Subject: [PATCH 01/12] migrate to typescript --- .eslintrc.json | 19 - .gitignore | 4 +- .prettierignore | 2 + .prettierrc | 16 + .vscode/extensions.json | 8 + .vscode/settings.json | 15 + CHANGELOG.md | 146 +- README.md | 33 +- eslint.config.mjs | 16 + package-lock.json | 3248 +++++++++-------- package.json | 36 +- rslib.config.ts | 15 + src/client.js | 448 --- src/client.ts | 434 +++ src/index.js | 3 - src/index.ts | 4 + src/types/events/action-hold-info-event.ts | 21 + src/types/events/broadcast-event.ts | 25 + src/types/events/close-plugin-event.ts | 15 + src/types/events/connector-change-event.ts | 36 + .../events/connector-short-id-info-event.ts | 21 + src/types/events/event-data.ts | 10 + src/types/events/execute-action-event.ts | 19 + src/types/events/index.ts | 9 + src/types/events/list-changed-event.ts | 26 + src/types/events/notification-action-event.ts | 15 + src/types/index.ts | 5 + src/types/logging-level.ts | 6 + src/types/requests/actions/action-data.ts | 14 + .../actions/update-action-data-request.ts | 21 + .../choices/update-choice-list-request.ts | 17 + .../update-specifc-choice-list-request.ts | 21 + .../update-connector-data-request.ts | 42 + .../requests/events/trigger-event-request.ts | 17 + src/types/requests/index.ts | 13 + .../create-notification-request.ts | 31 + .../notifications/notification-option.ts | 8 + .../settings/update-setting-request.ts | 14 + .../requests/states/create-state-request.ts | 23 + .../requests/states/remove-state-request.ts | 12 + .../states/update-state-list-request.ts | 17 + .../requests/states/update-state-request.ts | 19 + src/types/touch-portal-client-options.ts | 14 + src/types/touch-portal-connect-options.ts | 10 + tests/test.js | 31 - tsconfig.json | 33 +- vitest.config.ts | 12 + 47 files changed, 3007 insertions(+), 2017 deletions(-) delete mode 100644 .eslintrc.json create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 eslint.config.mjs create mode 100644 rslib.config.ts delete mode 100644 src/client.js create mode 100644 src/client.ts delete mode 100644 src/index.js create mode 100644 src/index.ts create mode 100644 src/types/events/action-hold-info-event.ts create mode 100644 src/types/events/broadcast-event.ts create mode 100644 src/types/events/close-plugin-event.ts create mode 100644 src/types/events/connector-change-event.ts create mode 100644 src/types/events/connector-short-id-info-event.ts create mode 100644 src/types/events/event-data.ts create mode 100644 src/types/events/execute-action-event.ts create mode 100644 src/types/events/index.ts create mode 100644 src/types/events/list-changed-event.ts create mode 100644 src/types/events/notification-action-event.ts create mode 100644 src/types/index.ts create mode 100644 src/types/logging-level.ts create mode 100644 src/types/requests/actions/action-data.ts create mode 100644 src/types/requests/actions/update-action-data-request.ts create mode 100644 src/types/requests/choices/update-choice-list-request.ts create mode 100644 src/types/requests/choices/update-specifc-choice-list-request.ts create mode 100644 src/types/requests/connectors/update-connector-data-request.ts create mode 100644 src/types/requests/events/trigger-event-request.ts create mode 100644 src/types/requests/index.ts create mode 100644 src/types/requests/notifications/create-notification-request.ts create mode 100644 src/types/requests/notifications/notification-option.ts create mode 100644 src/types/requests/settings/update-setting-request.ts create mode 100644 src/types/requests/states/create-state-request.ts create mode 100644 src/types/requests/states/remove-state-request.ts create mode 100644 src/types/requests/states/update-state-list-request.ts create mode 100644 src/types/requests/states/update-state-request.ts create mode 100644 src/types/touch-portal-client-options.ts create mode 100644 src/types/touch-portal-connect-options.ts delete mode 100644 tests/test.js create mode 100644 vitest.config.ts diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 73f2b16..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "env": { - "browser": true, - "commonjs": true, - "es2021": true - }, - "extends": [ - "airbnb-base" - ], - "parserOptions": { - "ecmaVersion": 13 - }, - "rules": { - "global-require": "off", - "max-len": "off", - "no-console": "off", - "no-param-reassign": "off" - } -} diff --git a/.gitignore b/.gitignore index 71f91d3..decc079 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -node_modules/** -dist/** +node_modules +dist/ *.tgz diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ff6fd30 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +# Lock files +package-lock.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..5e487d6 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,16 @@ +{ + "semi": true, + "singleQuote": true, + "trailingComma": "none", + "bracketSameLine": true, + "htmlWhitespaceSensitivity": "ignore", + "endOfLine": "auto", + "overrides": [ + { + "files": "*.ts", + "options": { + "printWidth": 120 + } + } + ] +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..bc3c1a8 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "vitest.explorer" + ], + "unwantedRecommendations": [] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0c95786 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "[typescript]": { + "editor.tabSize": 2, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "prettier.semi": true, + "prettier.singleQuote": true, + "prettier.trailingComma": "none", + "prettier.bracketSameLine": true, + "prettier.htmlWhitespaceSensitivity": "ignore", + "prettier.endOfLine": "auto", + "prettier.printWidth": 120, + "typescript.preferences.quoteStyle": "single", + "oxc.enable": true +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 5836b37..01b0895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,43 +1,51 @@ # Touch Portal Node API - Change Log ## v4.0.0 - ### New Features: - - Developers may now initiate a plugin update check at any time using the `checkForUpdate` function from TPClient - - Allows option to include pre-releases from github allowing users to decide to download alpha/beta versions ([#44]) - ### Changes - - `TPClient.Connect` no longer accepts `updateUrl` to initate a github update check upon plugin connect. - - `TPClient.checkForUpdate` now takes the args `githubUser`, `githubRepo` and `includePrerelease` - - Example: `TPClient.checkForUpdate("spdermn02", "TouchPortal_Discord_Plugin", includePrerelease)` +### New Features: + +- Developers may now initiate a plugin update check at any time using the `checkForUpdate` function from TPClient + - Allows option to include pre-releases from github allowing users to decide to download alpha/beta versions ([#44]) + +### Changes + +- `TPClient.Connect` no longer accepts `updateUrl` to initate a github update check upon plugin connect. +- `TPClient.checkForUpdate` now takes the args `githubUser`, `githubRepo` and `includePrerelease` + - Example: `TPClient.checkForUpdate("spdermn02", "TouchPortal_Discord_Plugin", includePrerelease)` [#44]: https://github.com/spdermn02/touchportal-node-api/pull/44 ## v3.3.0 - ### New Features: - - Allow plugin "stateful" disconnection/exit ([#36]): - - Added `exitOnClose` option to `connect()` method to control if client automatically calls `process.exit(0)` upon socket error/close (default is `true`). - - Added `disconnected` event with `hadError ` parameter passed on from socket's `close` event (`true` if the socket had a transmission error). - - Added `socketError` event with `err ` parameter passed on from socket's `error` event. - - Added `disconnect()` method which closes any current connection with `socket.end()`. - - Logging output can now be directed to a custom callback function instead of `console.log()` or disabled entirely (see PR [#38] for details): - - ### Fixes - - Fixed handling of incoming messages from TP when the complete data could not fit into the client socket's buffer at the same time. This could happen on very long messages (with lots of data in an action), or when messages get queued in the operating system's buffer w/out being read, for example when plugin is paused in debugger or otherwise spends a long time being unresponsive. ([#40]) - - ### Changes - - `TouchPortalClient` constructor now accepts an optional `options` object argument with the following properties: - - `pluginId` - Can be specified here instead of in the `connect()` method. - - `captureRejections` - Passed through to `EventEmitter`. - - `logCallback` - Can be a callback function or `null` to disable logging (see PR [#38] for details). - - An exception is now thrown (and logged) if `pluginId` is empty when `connect()` is invoked. ([#38]) - - `removeState()` no longer validates that the state exists before sending the command to TP (allows removing states after a plugin restart, for example). ([#33]) - - `choiceUpdate()` and `choiceUpdateSpecific()` now allow sending an empty array of choices. ([#34]) - - `logIt()` method now allows direct passthrough of object to `console.log()` (or configured callback) without strignifying anything explicitly. ([#32]) - - Minor performance improvements whith reading and writing socket data strings. ([#31], [#40]) - - ### Package - - GitHub URL can now be used as a _package.json_ dependency specification instead of NPM. ([#35]) - - Updated various dependencies to newer versions. ([#39], [#41]) + +### New Features: + +- Allow plugin "stateful" disconnection/exit ([#36]): + - Added `exitOnClose` option to `connect()` method to control if client automatically calls `process.exit(0)` upon socket error/close (default is `true`). + - Added `disconnected` event with `hadError ` parameter passed on from socket's `close` event (`true` if the socket had a transmission error). + - Added `socketError` event with `err ` parameter passed on from socket's `error` event. + - Added `disconnect()` method which closes any current connection with `socket.end()`. +- Logging output can now be directed to a custom callback function instead of `console.log()` or disabled entirely (see PR [#38] for details): + +### Fixes + +- Fixed handling of incoming messages from TP when the complete data could not fit into the client socket's buffer at the same time. This could happen on very long messages (with lots of data in an action), or when messages get queued in the operating system's buffer w/out being read, for example when plugin is paused in debugger or otherwise spends a long time being unresponsive. ([#40]) + +### Changes + +- `TouchPortalClient` constructor now accepts an optional `options` object argument with the following properties: + - `pluginId` - Can be specified here instead of in the `connect()` method. + - `captureRejections` - Passed through to `EventEmitter`. + - `logCallback` - Can be a callback function or `null` to disable logging (see PR [#38] for details). +- An exception is now thrown (and logged) if `pluginId` is empty when `connect()` is invoked. ([#38]) +- `removeState()` no longer validates that the state exists before sending the command to TP (allows removing states after a plugin restart, for example). ([#33]) +- `choiceUpdate()` and `choiceUpdateSpecific()` now allow sending an empty array of choices. ([#34]) +- `logIt()` method now allows direct passthrough of object to `console.log()` (or configured callback) without strignifying anything explicitly. ([#32]) +- Minor performance improvements whith reading and writing socket data strings. ([#31], [#40]) + +### Package + +- GitHub URL can now be used as a _package.json_ dependency specification instead of NPM. ([#35]) +- Updated various dependencies to newer versions. ([#39], [#41]) [#31]: https://github.com/spdermn02/touchportal-node-api/pull/31 [#32]: https://github.com/spdermn02/touchportal-node-api/pull/32 @@ -48,41 +56,59 @@ [#38]: https://github.com/spdermn02/touchportal-node-api/pull/38 [#39]: https://github.com/spdermn02/touchportal-node-api/pull/39 [#40]: https://github.com/spdermn02/touchportal-node-api/pull/40 -[#41]: https://github.com/spdermn02/touchportal-node-api/pull/41 ---- + +## [#41]: https://github.com/spdermn02/touchportal-node-api/pull/41 + ## v3.2.1 - ESLint implementation and Typescript support - ### Updates - - Big thank you to riverrun-git for the PR's and the assitance - - TypeScript support is just being implemented in increments, more support for it coming soon + +### Updates + +- Big thank you to riverrun-git for the PR's and the assitance +- TypeScript support is just being implemented in increments, more support for it coming soon --- + ## v3.2.0 - ### New Features: +### New Features: + - Support for Parent Groups on State creation added in Touch Portal 3.1 - ### Fixes: + +### Fixes: + - Fixed Spelling for `showNotification` type sent to Touch Portal, so now Notifications should work properly if you use them. --- + ## v3.1.2 - ## New Features: + +## New Features: + - Added createStateMany function - This allows state creation to be batched together rather than one at a time. - ## Fixes: + +## Fixes: + - force id, desc, defaultValue on createState to send as a string - Fix update check process to error properly versus killing the process --- + ## v3.1.1 - ### New Features: + +### New Features: + - Support for Short Ids for Connectors - Updated connectorUpdate function with additional flag to indicate if id is ShortId, default is false - Updated connectorUpdateMany function to take id, or shortId - Support for ConnectorShortIdNotification event --- + ## v3.0.0 - ### New Features: + +### New Features: + - Support for new Connectors in to v3.0.0 - Added connectorUpdate function - Added buildConnectorUpdate function @@ -93,52 +119,74 @@ - Support for notificationOptionClick event --- + ## v2.1.1 - ### Fixes: + +### Fixes: + - Fixed issue with createState and removeState to setup using the object internally to keep track --- + ## v2.1.0 - ### New Features: + +### New Features: + - Updates to add in missed features from TouchPortal SDK v3 updates - Support for removeState message type - Support for updateActionData message type --- + ## v2.0.0 - Updates to include new features from Touch Portal 2.3, minor enhancements, Fixes - ### New Features: + +### New Features: + - Support for new TouchPortal Settings configuration - Support for On Hold events of Up and Down actions - Support for Broadcast messages from Touch Portal - Support to handle checking for updates against a remote package.json file for your project - UTF-8 encoding on the socket will help with non-standard ascii character issues - ### Fixes: + +### Fixes: + - Refactored Some code slightly - Refactored logging to a single method to output a consistent format - Fixed issue if multiple messages were received at the same time it could cause the json parse to fail and thus causing the code to throw and exception, so now it splits on newlines and works all messages that came in during the read in the order they came in - Fixed #5 Issue - forces ids and values to strings during stateUpdate and stateUpdateMany --- + ## v1.0.6 - ### Fixes: + +### Fixes: + - Removing 5 second "wait" for socket close event to fire - no need for it - it is synchronous anyways --- + ## v1.0.5 - bug fix for socket connection end --- + ## v1.0.4 - End socket connection from the client side when a close message is received --- + ## v1.0.3 - Fixes - fixing all the typeof checks that weren't correct, adding some console.log messages, and throwing new errors instead of just using throw - ### New Features: + +### New Features: + - Create State functionality was added --- + ## v1.0.2 - Documentation Update --- + ## v1.0.1 - minor bug fix emite -> emit, log message update, and invalid variable definition fixed --- + ## v1.0.0 - Initial Release of the API diff --git a/README.md b/README.md index 6bcfcdd..943285e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Touch Portal API for Node.JS -Build a plugin to Touch Portal with Node.JS utlizing this easy to use library. No need to understand the inner workings of the Touch Portal Socket connection, just install this package, and connect! +Build a plugin to Touch Portal with Node.JS utlizing this easy to use library. No need to understand the inner workings of the Touch Portal Socket connection, just install this package, and connect! - [Touch Portal API for Node.JS](#touch-portal-api-for-nodejs) - [ChangeLog](#changelog) @@ -15,12 +15,14 @@ Build a plugin to Touch Portal with Node.JS utlizing this easy to use library. - [License](#license) - [Touch Portal](#touch-portal) -*NOTE*: Make sure your Touch Portal is up-to-date to use the latest features. +_NOTE_: Make sure your Touch Portal is up-to-date to use the latest features. ## ChangeLog + see [CHANGELOG.md](CHANGELOG.md) -## Usage +## Usage + ### Install using npm ```shell @@ -28,8 +30,8 @@ npm install --save touchportal-api ``` ### How To Use -What is described below, is pretty basic functionality, the usage of the below is very basic, and not intended to describe the full complexity of a plugin. +What is described below, is pretty basic functionality, the usage of the below is very basic, and not intended to describe the full complexity of a plugin. ```javascript // Node.JS style @@ -91,7 +93,7 @@ TPClient.on("Action", (data,hold) => { //Will cause a 100ms wait await new Promise(r => setTimeout(r,100)); - + // If we aren't holding(so just a keypress) or we no longer are being held, break this loop if( hold === undefined || !heldAction[message.actionId] ) { break; } } @@ -186,7 +188,7 @@ TPClient.on("ConnectorChange",(data) => { // Or multiple connectors, data key is optional per connector // can now take in shortId instead of id - let connectors = [ + let connectors = [ { id: ", value: 23, data: [{"dataId1":"value1"}] }, { id: ", value: 65 }, { shortId: ", value: 20 } @@ -231,13 +233,13 @@ TPClient.on("Broadcast", (data) => { // If you want to handle page change events - this is what happens // more info here: https://www.touch-portal.com/api/index.php?section=dynamic-actions - /* + /* {"type":"broadcast", "event":"pageChange", "pageName":"name of the page switched to" } */ - + }); TPClient.on("NotificationClicked", (data) => { @@ -257,7 +259,7 @@ TPClient.on("Settings",(data) => { //Do something with the Settings message here // Note: this can be called any time settings are modified or saved in the TouchPortal Settings window. - /* + /* [{"Setting 1":"Value 1"},{"Setting 2":"Value 2"},...,{"Setting N":"Value N"}] */ @@ -287,29 +289,38 @@ TPClient.on("Update", (curVersion, remoteVersion) => { //Connects and Pairs to Touch Portal via Sockete TPClient.connect({ pluginId }); -//If you want touchportal-node-api to check for updates on startup, +//If you want touchportal-node-api to check for updates on startup, TPClient.connect({ pluginId, "updateUrl":"" }); ``` ## Full Touch Portal API Documentation -Touch Portal interface Documentation here: + +Touch Portal interface Documentation here: [Touch Portal Interface Documentation](https://www.touch-portal.com/api) # Support + If you need support, drop a question in the github issues tab, and I'll get to it as soon as possible. # Bugs + Please report bugs using the github issues tab # Contribute + Feel free to fork this repo and suggest pull requests. I cannot guarantee they will be included, but I'm definitely open to changes, enhancements, bug fixes! + ## Contributors + - [Jameson Allen (spdermn02)](https://github.com/spdermn02) - [Andreas Schneider (riverrun-git)](https://github.com/riverrun-git) - [Pjiesco](https://github.com/pjiesco) + # License + This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details # Touch Portal + If you got here, and are like "WTF is this?" it is for integrating custom functionality as a Touch Portal plugin. check out https://touch-portal.com to learn more about Touch Portal and it's amazing features and community. diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..9665b51 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,16 @@ +import js from '@eslint/js'; +import globals from 'globals'; +import ts from 'typescript-eslint'; + +export default [ + { + languageOptions: { + globals: globals.browser + } + }, + js.configs.recommended, + ...ts.configs.recommended, + { + ignores: ['dist/'] + } +]; diff --git a/package-lock.json b/package-lock.json index 88acdd2..1c9cccb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,14 +10,18 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "compare-versions": "^3.6.0", + "compare-versions": "^6.1.1", "require-from-app-root": "^0.2.1" }, "devDependencies": { - "eslint": "^8.21.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.28.1", - "typescript": "^4.7.4" + "@rslib/core": "^0.10.6", + "@types/node": "^24.0.15", + "eslint": "^9.30.0", + "globals": "^16.2.0", + "prettier": "^3.6.2", + "typescript": "^5.8.3", + "typescript-eslint": "^8.35.1", + "vitest": "^3.2.4" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -29,40 +33,139 @@ "node": ">=0.10.0" } }, + "node_modules/@ast-grep/napi": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi/-/napi-0.37.0.tgz", + "integrity": "sha512-Hb4o6h1Pf6yRUAX07DR4JVY7dmQw+RVQMW5/m55GoiAT/VRoKCWBtIUPPOnqDVhbx1Cjfil9b6EDrgJsUAujEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@ast-grep/napi-darwin-arm64": "0.37.0", + "@ast-grep/napi-darwin-x64": "0.37.0", + "@ast-grep/napi-linux-arm64-gnu": "0.37.0", + "@ast-grep/napi-linux-arm64-musl": "0.37.0", + "@ast-grep/napi-linux-x64-gnu": "0.37.0", + "@ast-grep/napi-linux-x64-musl": "0.37.0", + "@ast-grep/napi-win32-arm64-msvc": "0.37.0", + "@ast-grep/napi-win32-ia32-msvc": "0.37.0", + "@ast-grep/napi-win32-x64-msvc": "0.37.0" + } + }, + "node_modules/@ast-grep/napi-win32-x64-msvc": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-x64-msvc/-/napi-win32-x64-msvc-0.37.0.tgz", + "integrity": "sha512-vCiFOT3hSCQuHHfZ933GAwnPzmL0G04JxQEsBRfqONywyT8bSdDc/ECpAfr3S9VcS4JZ9/F6tkePKW/Om2Dq2g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "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==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "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", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -70,33 +173,98 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", + "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", + "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -112,17 +280,92 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/error-codes": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.16.0.tgz", + "integrity": "sha512-TfmA45b8vvISniGudMg8jjIy1q3tLPon0QN/JdFp5f8AJ8/peICN5b+dkEQnWsAVg2fEusYhk9dO7z3nUeJM8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.16.0.tgz", + "integrity": "sha512-6o84WI8Qhc9O3HwPLx89kTvOSkyUOHQr73R/zr0I04sYhlMJgw5xTwXeGE7bQAmNgbJclzW9Kh7JTP7+3o3CHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.16.0", + "@module-federation/runtime-core": "0.16.0", + "@module-federation/sdk": "0.16.0" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.16.0.tgz", + "integrity": "sha512-5SECQowG4hlUVBRk/y6bnYLfxbsl5NcMmqn043WPe7NDOhGQWbTuYibJ3Bk+ZBv5U4uYLEmXipBGDc1FKsHklQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.16.0", + "@module-federation/sdk": "0.16.0" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.16.0.tgz", + "integrity": "sha512-OzmXNluXBQ2E6znzX4m9CJt1MFHVGmbN8c8MSKcYIDcLzLSKBQAiaz9ZUMhkyWx2YrPgD134glyPEqJrc+fY8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.16.0", + "@module-federation/webpack-bundler-runtime": "0.16.0" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.16.0.tgz", + "integrity": "sha512-UXJW1WWuDoDmScX0tpISjl4xIRPzAiN62vg9etuBdAEUM+ja9rz/zwNZaByiUPFS2aqlj2RHenCRvIapE8mYEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.16.0.tgz", + "integrity": "sha512-yqIDQTelJZP0Rxml0OXv4Er8Kbdxy7NFh6PCzPwDFWI1SkiokJ3uXQJBvtlxZ3lOnCDYOzdHstqa8sJG4JP02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.16.0", + "@module-federation/sdk": "0.16.0" + } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -136,6 +379,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -145,6 +389,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -153,1371 +398,1380 @@ "node": ">= 8" } }, - "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": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "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/@rollup/rollup-win32-x64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", + "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "node_modules/@rsbuild/core": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.4.8.tgz", + "integrity": "sha512-IJhpLl8lrp5ynlf04V5l7rMrVTNuGLG36ZDadHiBIC5qLRGSS3rMF8cVLSkSA6qM1OiRlPpMgwQbqFYh325RvQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@rspack/core": "1.4.8", + "@rspack/lite-tapable": "~1.0.1", + "@swc/helpers": "^0.5.17", + "core-js": "~3.44.0", + "jiti": "^2.4.2" + }, "bin": { - "acorn": "bin/acorn" + "rsbuild": "bin/rsbuild.js" }, "engines": { - "node": ">=0.4.0" + "node": ">=16.10.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==", + "node_modules/@rslib/core": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/@rslib/core/-/core-0.10.6.tgz", + "integrity": "sha512-7OLdmmQbY116gNAAsY9baCid9REr+z11qfAzwVVFw+Q8avCE6YqpcBLfrBXlfmpBikfshDmHH8EpRrQwz8gZJQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@rsbuild/core": "~1.4.7", + "rsbuild-plugin-dts": "0.10.6", + "tinyglobby": "^0.2.14" + }, + "bin": { + "rslib": "bin/rslib.js" + }, + "engines": { + "node": ">=16.7.0" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@microsoft/api-extractor": "^7", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "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/@rspack/binding": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.4.8.tgz", + "integrity": "sha512-VKE+2InUdudBUOn3xMZfK9a6KlOwmSifA0Nupjsh7N9/brcBfJtJGSDCnfrIKCq54FF+QAUCgcNAS0DB4/tZmw==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.4.8", + "@rspack/binding-darwin-x64": "1.4.8", + "@rspack/binding-linux-arm64-gnu": "1.4.8", + "@rspack/binding-linux-arm64-musl": "1.4.8", + "@rspack/binding-linux-x64-gnu": "1.4.8", + "@rspack/binding-linux-x64-musl": "1.4.8", + "@rspack/binding-wasm32-wasi": "1.4.8", + "@rspack/binding-win32-arm64-msvc": "1.4.8", + "@rspack/binding-win32-ia32-msvc": "1.4.8", + "@rspack/binding-win32-x64-msvc": "1.4.8" + } + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.4.8.tgz", + "integrity": "sha512-BVkOfJDZnexHNpGgc/sWENyGrsle1jUQTeUEdSyNYsu4Elsgk/T9gnGK8xyLRd2c6k20M5FN38t0TumCp4DscQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.4.8.tgz", + "integrity": "sha512-ARHuZ+gx3P//RIUKSjk/riQUn/D5tCwCWbfgeM5pk/Ti2JsgVnqiP9Sksge8JovVPf7b6Zgw73Cq5FpX4aOXeQ==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@module-federation/runtime-tools": "0.16.0", + "@rspack/binding": "1.4.8", + "@rspack/lite-tapable": "1.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "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==", + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "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==", + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "tslib": "^2.8.0" } }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } }, - "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/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "node_modules/@types/node": { + "version": "24.0.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", + "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "undici-types": "~7.8.0" } }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz", + "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/type-utils": "8.37.0", + "@typescript-eslint/utils": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.37.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz", + "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "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==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz", + "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "@typescript-eslint/tsconfig-utils": "^8.37.0", + "@typescript-eslint/types": "^8.37.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "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==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz", + "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz", + "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz", + "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/utils": "8.37.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/@typescript-eslint/types": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz", + "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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/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_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "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/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz", + "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@typescript-eslint/project-service": "8.37.0", + "@typescript-eslint/tsconfig-utils": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" - }, - "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/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "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==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "balanced-match": "^1.0.0" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "ms": "2.1.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=16 || 14 >=14.17" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "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/@typescript-eslint/utils": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz", + "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==", "dev": true, + "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz", + "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "@typescript-eslint/types": "8.37.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", - "@humanwhocodes/config-array": "^0.11.13", - "@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" + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" }, - "bin": { - "eslint": "bin/eslint.js" + "funding": { + "url": "https://opencollective.com/vitest" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, + "license": "MIT", "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "tinyrainbow": "^2.0.0" }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^3.2.7" + "tinyspy": "^4.0.3" }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "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", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=0.4.0" } }, - "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/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, - "dependencies": { - "ms": "^2.1.1" + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "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": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "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/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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/app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + }, + "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, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "Python-2.0" }, - "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/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "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" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "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==", + "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/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": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=4.0" + "node": ">=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==", + "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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=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==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "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/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.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" + "node": ">=6" } }, - "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==", + "node_modules/chai": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", + "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "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": "^10.12.0 || >=12.0.0" + "node": ">=18" } }, - "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "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==", "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">= 16" } }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "is-callable": "^1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.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==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "license": "MIT" }, - "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==", - "dev": true, - "dependencies": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "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/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/core-js": { + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", + "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 8" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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/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==", "dev": true, - "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" - }, + "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "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/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/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" } }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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": { + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", + "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.31.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "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-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "get-intrinsic": "^1.1.3" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "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/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-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "engines": { + "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-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "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, "dependencies": { - "has-symbols": "^1.0.2" + "estraverse": "^5.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10" } }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "function-bind": "^1.1.2" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4.0" } }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "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, "engines": { - "node": ">= 4" + "node": ">=4.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==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/estree": "^1.0.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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, "engines": { - "node": ">=0.8.19" + "node": ">=0.10.0" } }, - "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/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 0.4" + "node": ">=8.6.0" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "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": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "is-glob": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "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/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "reusify": "^1.0.4" } }, - "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/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "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/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16.0.0" } }, - "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==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "to-regex-range": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "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/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "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-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, - "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/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "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/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, - "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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "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/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8.19" } }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "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==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "is-extglob": "^2.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "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/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1529,13 +1783,15 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -1543,23 +1799,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -1598,143 +1843,112 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "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/loupe": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "MIT" }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "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 - }, - "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/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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "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/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=8.6" } }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "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, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" + "node": "*" } }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "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, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } + "license": "MIT" }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/once": { + "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/optionator": { "version": "0.9.3", @@ -1788,6 +2002,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -1804,29 +2019,81 @@ "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, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -1837,11 +2104,28 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1864,24 +2148,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + ], + "license": "MIT" }, "node_modules/require-from-app-root": { "version": "0.2.1", @@ -1892,55 +2160,129 @@ "app-root-dir": "^1.0.2" } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/require-from-app-root/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "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/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", + "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.45.1", + "@rollup/rollup-android-arm64": "4.45.1", + "@rollup/rollup-darwin-arm64": "4.45.1", + "@rollup/rollup-darwin-x64": "4.45.1", + "@rollup/rollup-freebsd-arm64": "4.45.1", + "@rollup/rollup-freebsd-x64": "4.45.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", + "@rollup/rollup-linux-arm-musleabihf": "4.45.1", + "@rollup/rollup-linux-arm64-gnu": "4.45.1", + "@rollup/rollup-linux-arm64-musl": "4.45.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-musl": "4.45.1", + "@rollup/rollup-linux-s390x-gnu": "4.45.1", + "@rollup/rollup-linux-x64-gnu": "4.45.1", + "@rollup/rollup-linux-x64-musl": "4.45.1", + "@rollup/rollup-win32-arm64-msvc": "4.45.1", + "@rollup/rollup-win32-ia32-msvc": "4.45.1", + "@rollup/rollup-win32-x64-msvc": "4.45.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rsbuild-plugin-dts": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/rsbuild-plugin-dts/-/rsbuild-plugin-dts-0.10.6.tgz", + "integrity": "sha512-rVP82fFMDHW0GirhYx+w2bER1HhkOKJ8e/bAAF2OkMUP2k2fviMpl/gsnbO8KI9vcSqsQE2QXHkj781m6W84Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ast-grep/napi": "0.37.0", + "magic-string": "^0.30.17", + "picocolors": "1.1.1", + "tinyglobby": "^0.2.14", + "tsconfig-paths": "^4.2.0" + }, + "engines": { + "node": ">=16.7.0" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7", + "@rsbuild/core": "1.x", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/rsbuild-plugin-dts/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, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=6" } }, - "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/rsbuild-plugin-dts/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6" } }, "node_modules/run-parallel": { @@ -1962,85 +2304,17 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2053,80 +2327,41 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "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==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "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==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "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==", + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/strip-bom": { "version": "3.0.0", @@ -2142,6 +2377,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2149,6 +2385,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2161,217 +2410,370 @@ "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==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "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/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "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/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": "^18.0.0 || >=20.0.0" } }, - "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/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "node_modules/tinyspy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14.0.0" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "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": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "is-number": "^7.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "prelude-ls": "^1.2.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, - "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/typescript-eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.37.0.tgz", + "integrity": "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "@typescript-eslint/eslint-plugin": "8.37.0", + "@typescript-eslint/parser": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/utils": "8.37.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "dev": true, + "license": "MIT" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { - "node-which": "bin/node-which" + "vite": "bin/vite.js" }, "engines": { - "node": ">= 8" + "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "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==", + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, + "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" + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">= 0.4" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } }, "node_modules/yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index 2d7873d..3354d86 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,24 @@ "name": "touchportal-api", "version": "4.0.0", "description": "TouchPortal API in Node.JS", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "lint": "eslint src tests", - "build": "tsc", + "build": "rslib build", + "dev": "rslib build --watch", + "format": "prettier --write .", + "lint": "eslint .", "install": "npm run build" }, "keywords": [ @@ -17,13 +29,17 @@ "author": "Jameson Allen aka Spdermn02", "license": "MIT", "dependencies": { - "compare-versions": "^3.6.0", + "compare-versions": "^6.1.1", "require-from-app-root": "^0.2.1" }, "devDependencies": { - "eslint": "^8.21.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.28.1", - "typescript": "^4.7.4" + "@rslib/core": "^0.10.6", + "@types/node": "^24.0.15", + "eslint": "^9.30.0", + "globals": "^16.2.0", + "prettier": "^3.6.2", + "typescript": "^5.8.3", + "typescript-eslint": "^8.35.1", + "vitest": "^3.2.4" } } diff --git a/rslib.config.ts b/rslib.config.ts new file mode 100644 index 0000000..9ae5fe9 --- /dev/null +++ b/rslib.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + lib: [ + { + format: 'esm', + syntax: ['node 18'], + dts: true + }, + { + format: 'cjs', + syntax: ['node 18'] + } + ] +}); diff --git a/src/client.js b/src/client.js deleted file mode 100644 index fff4e09..0000000 --- a/src/client.js +++ /dev/null @@ -1,448 +0,0 @@ -const EventEmitter = require('events'); -const net = require('net'); -const http = require('https'); -const compareVersions = require('compare-versions'); -const { requireFromAppRoot } = require('require-from-app-root'); - -const pluginVersion = requireFromAppRoot('package.json').version; - -const SOCKET_IP = '127.0.0.1'; -const SOCKET_PORT = 12136; -const CONNECTOR_PREFIX = 'pc'; - -class TouchPortalClient extends EventEmitter { - /** - * Creates a new `TouchPortalClient` instance. - * @param {Object} [options] Optional runtime settings for TouchPortalClient and EventEmitter. - * @param {boolean} [options.captureRejections] - * Passed through to {@linkcode https://nodejs.org/docs/latest/api/events.html#class-eventemitter EventEmitter} constructor. - * @param {string} [options.pluginId] ID of the plugin using this client, matching the definition in `entry.tp`. - * Also used in logging output. If omitted here then must be specified in `connect()` method options instead. - * @param {(function(string, string | any, ...any?):void) | null} [options.logCallback] - * Log callback function called by `logIt()` method instead of `console.log()`, or `null` to disable logging. - * - * Arguments passed to callback: - * * `level: string` - Logging level string, eg. "DEBUG"/"INFO"/"WARN"/"ERROR". - * * `message?: string | any` - The log message or some other value type to log, possibly `undefined`. - * * `...args: any[]` - Possible further argument(s) passed to the callback if logIt() was called with > 2 arguments. - * @constructs {TouchPortalClient} - */ - constructor(options = {}) { - //@ts-ignore TS doesn't seem to have proper typing for Node's EventEmitter c'tor which accepts an options object - super(options); - this.touchPortal = null; - this.pluginId = options?.pluginId; - this.socket = null; - this.customStates = {}; - if (options && (options.logCallback === null || typeof options.logCallback == 'function')) - this.logCallback = options.logCallback; - else - this.logCallback = undefined; - } - - createState(id, desc, defaultValue, parentGroup) { - if (this.customStates[id]) { - this.logIt('ERROR', `createState: Custom state of ${id} already created`); - throw new Error(`createState: Custom state of ${id} already created`); - } - this.customStates[id] = desc; - const newState = { - type: 'createState', - id: `${id}`, - desc: `${desc}`, - defaultValue: `${defaultValue}`, - }; - if (parentGroup !== '' || parentGroup !== undefined) { - newState.parentGroup = `${parentGroup}`; - } - this.send(newState); - } - - createStateMany(states) { - const createStateArray = []; - - if (states.length <= 0) { - this.logIt('ERROR', 'createStateMany : states contains no data'); - throw new Error('createStateMany: states contains no data'); - } - - states.forEach((state) => { - if (this.customStates[state.id]) { - this.logIt('WARN', `createState: Custom state of ${state.id} already created`); - } else { - this.customStates[state.id] = state.desc; - const newState = { - type: 'createState', - id: `${state.id}`, - desc: `${state.desc}`, - defaultValue: `${state.defaultValue}`, - }; - if (state.parentGroup !== '' || state.parentGroup !== undefined) { - newState.parentGroup = `${state.parentGroup}`; - } - createStateArray.push(newState); - } - }); - - this.sendArray(createStateArray); - } - - removeState(id) { - if (!id) { - this.logIt('ERROR', `removeState: ID parameter is empty`); - throw new Error(`removeState: ID parameter is empty`); - } - delete this.customStates[id]; - this.send({ - type: 'removeState', - id, - }); - } - - choiceUpdate(id, value) { - if (!id) { - this.logIt('ERROR', 'choiceUpdate: ID parameter is empty'); - throw new Error('choiceUpdate: ID parameter is empty'); - } - if (!Array.isArray(value)) { - this.logIt('ERROR', 'choiceUpdate : value parameter must be an array'); - throw new Error( 'choiceUpdate: value parameter must be an array'); - } - this.send({ type: 'choiceUpdate', id, value }); - } - - choiceUpdateSpecific(id, value, instanceId) { - if (!id) { - this.logIt('ERROR', 'choiceUpdateSpecific: ID parameter is empty'); - throw new Error('choiceUpdateSpecific: ID parameter is empty'); - } - if (!Array.isArray(value)) { - this.logIt('ERROR', 'choiceUpdateSpecific : value parameter must be an array'); - throw new Error('choiceUpdateSpecific: value parameter must be an array'); - } - if (!instanceId) { - this.logIt('ERROR', 'choiceUpdateSpecific : instanceId is not populated'); - throw new Error('choiceUpdateSpecific: instanceId is not populated'); - } - this.send({ - type: 'choiceUpdate', - id, - instanceId, - value, - }); - } - - settingUpdate(name, value) { - this.send({ - type: 'settingUpdate', - name, - value, - }); - } - - stateUpdate(id, value) { - this.send({ type: 'stateUpdate', id: `${id}`, value: `${value}` }); - } - - stateUpdateMany(states) { - const stateArray = []; - - if (states.length <= 0) { - this.logIt('ERROR', 'stateUpdateMany : states contains no data'); - throw new Error('stateUpdateMany: states contains no data'); - } - - states.forEach((state) => { - stateArray.push({ - type: 'stateUpdate', - id: `${state.id}`, - value: `${state.value}`, - }); - }); - - this.sendArray(stateArray); - } - - connectorUpdate(id, value, data, isShortId = false) { - this.send(this.buildConnectorUpdate(id, value, data, isShortId)); - } - - buildConnectorUpdate(id, value, data, isShortId) { - const newValue = parseInt(value, 10); - if (newValue < 0 || newValue > 100) { - this.logIt('ERROR', `connectorUpdate: value has to be between 0 and 100 ${newValue}`); - throw new Error(`connectorUpdate: value has to be between 0 and 100 ${newValue}`); - } - - const connectorUpdateObj = { - type: 'connectorUpdate', - value: newValue, - }; - if (isShortId) { - connectorUpdateObj.shortId = id; - } else { - let dataStr = ''; - if (typeof data === 'object' && Array.isArray(data)) { - data.forEach((dataItem) => { - dataStr = dataStr.concat('|', dataItem.id, '=', dataItem.value); - }); - } - - const connectorId = `${CONNECTOR_PREFIX}_${this.pluginId}_${id}${dataStr}`; - connectorUpdateObj.connectorId = connectorId; - } - return connectorUpdateObj; - } - - connectorUpdateMany(connectors) { - const connectorArray = []; - - if (connectors.length <= 0) { - this.logIt('ERROR', 'connectorManyUpdate : connectors contains no data'); - throw new Error('connectorManyUpdate: connectors contains no data'); - } - connectors.forEach((connector) => { - const isShortId = connector.shortId !== undefined; - connector.id = (isShortId) ? connector.shortId : connector.id; - connectorArray.push(this.buildConnectorUpdate(connector.id, connector.value, connector.data, isShortId)); - }); - this.sendArray(connectorArray); - } - - updateActionData(actionInstanceId, data) { - if (data.id === undefined || data.id === '' || data.minValue === undefined || data.minValue === '' || data.maxValue === undefined || data.maxValue === '' || data.type === undefined || data.type === '') { - this.logIt('ERROR', 'updateActionData : required data is missing from instance', JSON.stringify(data)); - throw new Error(`updateActionData: required data is missing from instance. ${JSON.stringify(data)}`); - } - if (data.type !== 'number') { - this.logIt('ERROR', 'updateActionData : only number types are supported'); - throw new Error('updateActionData: only number types are supported'); - } - this.send({ - type: 'updateActionData', - instanceId: actionInstanceId, - data, - }); - } - - sendNotification(notificationId, title, msg, optionsArray) { - if (optionsArray === undefined || optionsArray.length <= 0) { - this.logIt('ERROR', 'sendNotification: at least one option is required'); - throw new Error('sendNotification: at least one option is required'); - } - this.send({ - type: 'showNotification', - notificationId, - title, - msg, - options: optionsArray, - }); - } - - sendArray(dataArray) { - let dataStr = ''; - if (dataArray.length <= 0) { - this.logIt('ERROR', 'sendArray : dataArray has no length'); - throw new Error('sendArray: dataArray has no length'); - } - dataArray.forEach((element) => { - dataStr = `${dataStr + JSON.stringify(element)}\n`; - }); - - if (dataStr == null) { - return; - } - - this.socket.write(dataStr); - } - - send(data) { - this.socket.write(JSON.stringify(data)); - this.socket.write('\n'); - } - - pair() { - const pairMsg = { - type: 'pair', - id: this.pluginId, - }; - this.send(pairMsg); - } - - checkForUpdate(githubUser, githubRepo, includePrerelease) { - const parent = this; - const updateUrl = `https://api.github.com/repos/${githubUser}/${githubRepo}/releases`; - http.get(updateUrl, {headers: {'User-Agent': this.pluginId } - }, (res) => { - const { statusCode } = res; - // Any 2xx status code signals a successful response but - // here we're only checking for 200. - if (statusCode !== 200) { - const error = new Error(`${this.pluginId}:ERROR: Request Failed.\nStatus Code: ${statusCode}`); - parent.logIt('ERROR', `check for update errored: ${error.message}`); - res.resume(); - return; - } - - res.setEncoding('utf8'); - let updateData = ''; - res.on('data', (chunk) => { - updateData += chunk; - }); - - res.on('end', () => { - try { - const jsonData = JSON.parse(updateData); - for (const release of jsonData) { - const releaseVersion = release.tag_name.replace('v', ''); - if (includePrerelease || !release.prerelease) { - if (compareVersions(releaseVersion, pluginVersion) > 0) { - parent.emit('Update', pluginVersion, releaseVersion); - return; - } - } - } - } catch (e) { - parent.logIt('ERROR: Check for Update error=', e.message); - } - }); - res.on('error', (error) => { - parent.logIt('ERROR', 'error received attempting to check for update:', error); - }); - }).on('error', (error) => { - parent.logIt('ERROR', 'error received attempting to check for update:', error); - }); - } - - connect(options = {}) { - let { pluginId, exitOnClose } = options; - - if (pluginId) - this.pluginId = pluginId; - if (!this.pluginId) { - this.logIt('ERROR', "connect: Plugin ID is missing or empty."); - throw new Error('connect: Plugin ID is missing or empty.'); - } - - if (typeof exitOnClose != 'boolean') - exitOnClose = true; - const parent = this; - - this.socket = new net.Socket(); - this.socket.setEncoding('utf8'); - this.socket.connect(SOCKET_PORT, SOCKET_IP, () => { - parent.emit('connected'); - parent.pair(); - }); - - // Set up a buffer to potentially store partial incoming messages. - let lineBuffer = ""; - this.socket.on('data', - /** @param {string} data is a String type since we set an encoding on the socket (VSCode thinks it's a Buffer). */ - (data) => - { - // Track current newline search position in data string, starting from the beginning. - let pos = 0; - while (pos < data.length) { - // Find the next newline character starting from our last search position in the data string. - const n = data.indexOf('\n', pos); - // If no newline was found then this is a partial message -- buffer it for later and wait for more data. - if (n < 0) { - lineBuffer += data.substring(pos); - break; - } - - // Prepend any buffered data to current line. Buffer may be empty, but is it worth checking for that? - const line = lineBuffer + data.substring(pos, n); - pos = n + 1; // advance next newline search position - lineBuffer = ""; // we're done with the line buffer - - // Try to decode the message. - let message; - try { - message = JSON.parse(line); - } - catch (ex) { - parent.logIt('ERROR', 'JSON exception while parsing line:', line, '\n', ex); - continue; - } - - // Handle internal TP Messages here, else pass to user code - switch (message.type) { - case 'closePlugin': - if (message.pluginId === parent.pluginId) { - parent.emit('Close', message); - parent.socket.end(); - } - break; - case 'info': - parent.emit('Info', message); - if (message.settings) { - parent.emit('Settings', message.settings); - } - break; - case 'notificationOptionClicked': - parent.emit('NotificationClicked', message); - break; - case 'settings': - // values is the key that is the same as how info contains settings key, for direct settings saving - parent.emit('Settings', message.values); - break; - case 'listChange': - parent.emit('ListChange', message); - break; - case 'action': - parent.emit('Action', message, null); - break; - case 'broadcast': - parent.emit('Broadcast', message); - break; - case 'shortConnectorIdNotification': - parent.emit('ConnectorShortIdNotification', message); - break; - case 'connectorChange': - parent.emit('ConnectorChange', message); - break; - case 'up': - parent.emit('Action', message, false); - break; - case 'down': - parent.emit('Action', message, true); - break; - default: - parent.emit('Message', message); - } - } - - }); - - this.socket.on('error', (err) => { - parent.emit('socketError', err); - parent.logIt('ERROR', 'Socket Error', err.message); - }); - - this.socket.on('close', (hadError) => { - parent.emit('disconnected', hadError); - parent.logIt('WARN', 'Connection closed'); - if (exitOnClose) - process.exit(0); - }); - } - - disconnect() { - if (this.socket && !this.socket.destroyed) - this.socket.end(); - } - - logIt(...args) { - // must be a strict compare - if (this.logCallback === undefined) { - console.log(`${new Date().toISOString()} : ${this.pluginId} :${args.shift()}:`, ...args); - } - else if (this.logCallback) { - this.logCallback(args.shift(), args.shift(), ...args); - } - } -} - -module.exports = TouchPortalClient; diff --git a/src/client.ts b/src/client.ts new file mode 100644 index 0000000..ab5d110 --- /dev/null +++ b/src/client.ts @@ -0,0 +1,434 @@ +import EventEmitter from 'events'; +import net from 'net'; +import { + LoggingLevel, + TouchPortalClientOptions, + TouchPortalConnectOptions, + CreateNotificationRequest, + CreateStateRequest, + NotificationOption, + RemoveStateRequest, + UpdateChoiceListRequest, + UpdateSettingRequest, + UpdateSpecificChoiceListRequest, + UpdateStateRequest, + ActionData, + UpdateActionDataRequest, + UpdateConnectorDataRequest +} from './types'; + +const SOCKET_IP = '127.0.0.1'; +const SOCKET_PORT = 12136; +const CONNECTOR_PREFIX = 'pc'; + +export default class TouchPortalClient extends EventEmitter { + private pluginId?: string; + private socket: net.Socket | null; + private customStates: Record; + private logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void; + + /** + * Creates an instance of TouchPortalClient. + * + * @param options - Optional configuration options for the client. + */ + constructor(options: TouchPortalClientOptions = {}) { + super(options); + + this.pluginId = options?.pluginId; + this.socket = null; + this.customStates = {}; + this.logCallback = options?.logCallback; + } + + // Connection + public connect(options: TouchPortalConnectOptions = {}): void { + const { pluginId, exitOnClose = true } = options ?? {}; + + if (pluginId) { + this.pluginId = pluginId; + } + + if (!this.pluginId) { + this.log(LoggingLevel.ERROR, 'connect: Plugin ID is missing or empty.'); + throw new Error('connect: Plugin ID is missing or empty.'); + } + + this.socket = new net.Socket(); + this.socket.setEncoding('utf8'); + this.socket.connect(SOCKET_PORT, SOCKET_IP, () => { + this.emit('connected'); + this.pair(); + }); + + // Set up a buffer to potentially store partial incoming messages. + let lineBuffer = ''; + this.socket.on('data', (data: string) => { + // Track current newline search position in data string, starting from the beginning. + let pos = 0; + while (pos < data.length) { + // Find the next newline character starting from our last search position in the data string. + const n = data.indexOf('\n', pos); + // If no newline was found then this is a partial message -- buffer it for later and wait for more data. + if (n < 0) { + lineBuffer += data.substring(pos); + break; + } + + // Prepend any buffered data to current line. Buffer may be empty, but is it worth checking for that? + const line = lineBuffer + data.substring(pos, n); + pos = n + 1; // advance next newline search position + lineBuffer = ''; // we're done with the line buffer + + // Try to decode the message. + let message; + try { + message = JSON.parse(line); + } catch (ex) { + this.log(LoggingLevel.ERROR, 'JSON exception while parsing line:', line, '\n', ex); + continue; + } + + // Handle internal TP Messages here, else pass to user code + switch (message.type) { + case 'closePlugin': + if (message.pluginId === this.pluginId) { + this.emit('Close', message); + this.socket?.end(); + } + break; + case 'info': + this.emit('Info', message); + + if (message.settings) { + this.emit('Settings', message.settings); + } + + break; + case 'notificationOptionClicked': + this.emit('NotificationClicked', message); + break; + case 'settings': + // values is the key that is the same as how info contains settings key, for direct settings saving + this.emit('Settings', message.values); + break; + case 'listChange': + this.emit('ListChange', message); + break; + case 'action': + this.emit('Action', message, null); + break; + case 'broadcast': + this.emit('Broadcast', message); + break; + case 'shortConnectorIdNotification': + this.emit('ConnectorShortIdNotification', message); + break; + case 'connectorChange': + this.emit('ConnectorChange', message); + break; + case 'up': + this.emit('Action', message, false); + break; + case 'down': + this.emit('Action', message, true); + break; + default: + this.emit('Message', message); + } + } + }); + + this.socket.on('error', (err) => { + this.emit('socketError', err); + this.log(LoggingLevel.ERROR, 'Socket Error', err.message); + }); + + this.socket.on('close', (hadError) => { + this.emit('disconnected', hadError); + this.log(LoggingLevel.WARNING, 'Connection closed'); + + if (exitOnClose) { + process.exit(0); + } + }); + } + + public disconnect(): void { + if (this.socket && !this.socket.destroyed) { + this.socket.end(); + } + } + + // Actions + public updateActionData(data: ActionData, instanceId?: string): void { + if ([data.id, data.minValue, data.maxValue, data.type].some((value) => value === undefined || value === '')) { + this.log(LoggingLevel.ERROR, 'updateActionData : required data is missing from instance', JSON.stringify(data)); + throw new Error(`updateActionData: required data is missing from instance. ${JSON.stringify(data)}`); + } + + if (data.type !== 'number') { + this.log(LoggingLevel.ERROR, 'updateActionData: only number types are supported'); + throw new Error('updateActionData: only number types are supported'); + } + + const request: UpdateActionDataRequest = { type: 'updateActionData', instanceId, data }; + this.send(request); + } + + // Choices + public updateChoice(id: string, value: string[]): void { + if (!id) { + this.log(LoggingLevel.ERROR, 'updateChoice: id parameter is empty'); + throw new Error('updateChoice: id parameter is empty'); + } + + if (!Array.isArray(value)) { + this.log(LoggingLevel.ERROR, 'updateChoice: value parameter must be an array'); + throw new Error('updateChoice: value parameter must be an array'); + } + + const request: UpdateChoiceListRequest = { type: 'choiceUpdate', id, value }; + this.send(request); + } + + public updateSpecificChoice(id: string, instanceId: string, value: string[]): void { + if (!id) { + this.log(LoggingLevel.ERROR, 'updateSpecificChoice: id parameter is empty'); + throw new Error('updateSpecificChoice: id parameter is empty'); + } + + if (!instanceId) { + this.log(LoggingLevel.ERROR, 'updateSpecificChoice: instanceId is not populated'); + throw new Error('updateSpecificChoice: instanceId is not populated'); + } + + if (!Array.isArray(value)) { + this.log(LoggingLevel.ERROR, 'updateSpecificChoice: value parameter must be an array'); + throw new Error('updateSpecificChoice: value parameter must be an array'); + } + + const request: UpdateSpecificChoiceListRequest = { type: 'choiceUpdate', id, instanceId, value }; + this.send(request); + } + + // Connectors + public updateConnector(value: number, connectorId?: string, shortId?: string, data?: Record): void { + const request = this.buildUpdateConnectorDataRequest(value, connectorId, shortId, data); + this.send(request); + } + + public updateMultipleConnectors( + connectors: { + value: number; + connectorId?: string; + shortId?: string; + data?: Record; + }[] + ): void { + if (connectors?.length <= 0) { + this.log(LoggingLevel.ERROR, 'updateMultipleConnectors : connectors contains no data'); + throw new Error('updateMultipleConnectors: connectors contains no data'); + } + + const request: UpdateConnectorDataRequest[] = connectors.map((connector) => + this.buildUpdateConnectorDataRequest(connector.value, connector.connectorId, connector.shortId, connector.data) + ); + + this.sendArray(request); + } + + private buildUpdateConnectorDataRequest( + value: number, + connectorId?: string, + shortId?: string, + data?: Record + ): UpdateConnectorDataRequest { + if (value < 0 || value > 100) { + this.log(LoggingLevel.ERROR, `connectorUpdate: value has to be between 0 and 100 ${value}`); + throw new Error(`connectorUpdate: value has to be between 0 and 100 ${value}`); + } + + if (!connectorId && !shortId) { + this.log(LoggingLevel.ERROR, 'connectorUpdate: both connectorId and shortId are not provided'); + throw new Error('connectorUpdate: both connectorId and shortId are not provided'); + } + + if (connectorId && shortId) { + this.log(LoggingLevel.ERROR, 'connectorUpdate: both connectorId and shortId are provided'); + throw new Error('connectorUpdate: both connectorId and shortId are provided'); + } + + if (connectorId && !Object.keys(data || {}).length) { + this.log(LoggingLevel.ERROR, 'connectorUpdate: when connectorId is provided, data must be an array'); + throw new Error('connectorUpdate: when connectorId is provided, data must be an array'); + } + + if (shortId && Object.keys(data || {}).length >= 0) { + this.log(LoggingLevel.ERROR, 'connectorUpdate: when shortId is provided, data is not allowed'); + throw new Error('connectorUpdate: when shortId is provided, data is not allowed'); + } + + if (connectorId) { + const dataStr = Object.entries(data || {}) + .map(([key, value]) => `${key}=${value}`) + .join('|'); + + return { + type: 'connectorUpdate', + connectorId: `${CONNECTOR_PREFIX}_${this.pluginId}_${connectorId}${dataStr}`, + value + }; + } + + return { type: 'connectorUpdate', shortId, value }; + } + + // Notifications + public showNotification(notificationId: string, title: string, msg: string, options: NotificationOption[]): void { + if (options?.length <= 0) { + this.log(LoggingLevel.ERROR, 'showNotification: at least one option is required'); + throw new Error('showNotification: at least one option is required'); + } + + const request: CreateNotificationRequest = { type: 'showNotification', notificationId, title, msg, options }; + this.send(request); + } + + // Settings + public updateSetting(name: string, value: string) { + const request: UpdateSettingRequest = { type: 'settingUpdate', name, value }; + this.send(request); + } + + // States + public createState( + id: string, + desc: string, + defaultValue: string | number | boolean, + parentGroup?: string, + forceUpdate?: boolean + ): void { + if (this.customStates[id]) { + this.log(LoggingLevel.ERROR, `createState: Custom state of ${id} already created`); + throw new Error(`createState: Custom state of ${id} already created`); + } + + this.customStates[id] = desc; + + const request: CreateStateRequest = { + type: 'createState', + id, + desc, + defaultValue: `${defaultValue}`, + parentGroup, + forceUpdate + }; + + this.send(request); + } + + public createMultipleStates( + states: { + id: string; + desc: string; + defaultValue: string | number | boolean; + parentGroup?: string; + forceUpdate?: boolean; + }[] + ): void { + if (states?.length <= 0) { + this.log(LoggingLevel.ERROR, 'createMultipleStates : states contains no data'); + throw new Error('createMultipleStates: states contains no data'); + } + + const request: CreateStateRequest[] = states + .filter((state) => { + if (this.customStates[state.id]) { + this.log(LoggingLevel.WARNING, `createMultipleStates: Custom state of ${state.id} already created`); + return false; + } + + return true; + }) + .map((state) => { + this.customStates[state.id] = state.desc; + + return { + type: 'createState', + id: state.id, + desc: state.desc, + defaultValue: String(state.defaultValue), + parentGroup: state.parentGroup, + forceUpdate: state.forceUpdate + }; + }); + + this.sendArray(request); + } + + public updateState(id: string, value: string | number | boolean): void { + const request: UpdateStateRequest = { type: 'stateUpdate', id, value: `${value}` }; + this.send(request); + } + + public updateMultpleStates(states: { id: string; value: string | number | boolean }[]): void { + if (states?.length <= 0) { + this.log(LoggingLevel.ERROR, 'updateMultpleStates : states contains no data'); + throw new Error('updateMultpleStates: states contains no data'); + } + + const request: UpdateStateRequest[] = states.map((state) => ({ + type: 'stateUpdate', + id: state.id, + value: String(state.value) + })); + + this.sendArray(request); + } + + public removeState(id: string): void { + if (!id) { + this.log(LoggingLevel.ERROR, `removeState: id parameter is empty`); + throw new Error(`removeState: id parameter is empty`); + } + + delete this.customStates[id]; + + const request: RemoveStateRequest = { type: 'removeState', id }; + this.send(request); + } + + // Internal + private send(data: unknown): void { + this.socket?.write(JSON.stringify(data)); + this.socket?.write('\n'); + } + + private sendArray(dataArray: unknown[]): void { + if (dataArray.length <= 0) { + this.log(LoggingLevel.ERROR, 'sendArray : dataArray has no length'); + throw new Error('sendArray: dataArray has no length'); + } + + const dataStr = dataArray.map((data: unknown) => JSON.stringify(data)).join('\n'); + + if (!dataStr) { + return; + } + + this.socket?.write(dataStr); + } + + private pair(): void { + this.send({ type: 'pair', id: this.pluginId }); + } + + private log(level: LoggingLevel, ...args: unknown[]): void { + if (this.logCallback) { + this.logCallback(level, ...args); + } else { + console.log(`${new Date().toISOString()} : ${this.pluginId} :${level}:`, ...args); + } + } +} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index a275149..0000000 --- a/src/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - Client: require('./client'), -}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..7ff6368 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,4 @@ +import TouchPortalClient from './client'; + +export * from './types'; +export { TouchPortalClient }; diff --git a/src/types/events/action-hold-info-event.ts b/src/types/events/action-hold-info-event.ts new file mode 100644 index 0000000..02073fe --- /dev/null +++ b/src/types/events/action-hold-info-event.ts @@ -0,0 +1,21 @@ +import { EventData } from './event-data'; + +/** + * Touch Portal will send messages to your plugin when the action is used in a hold button event. + * When the user presses the Touch Portal button down, Touch Portal will send the "down" event. + * When the user releases the button, Touch Portal will send the "up" event. + * Only actions that have hold settings can be used in Touch Portal in the Hold tab. + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_action_hold_info + * + * @property type - Indicates whether the action is pressed down ('down') or released ('up'). + * @property pluginId - The id of the plugin. + * @property actionId - The id of the action. + * @property data - An array of id's and value's containing additional data for the event. + */ +export type ActionHoldInfoEvent = { + type: 'up' | 'down'; + pluginId: string; + actionId: string; + data: EventData[]; +}; diff --git a/src/types/events/broadcast-event.ts b/src/types/events/broadcast-event.ts new file mode 100644 index 0000000..d40dabd --- /dev/null +++ b/src/types/events/broadcast-event.ts @@ -0,0 +1,25 @@ +/** + * Touch Portal will send messages to the plug-in at certain events. + * Currently the only message that is broadcast is the page change event. + * You can use this broadcast for example to resend states whenever a page is loaded. + * This will allow the user to get the latest states just as a page is loaded. + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_broadcast + * + * @property type - The "broadcast" corresponts to a message type that is send from Touch Portal to all plug-ins. This is information non specific to your plug-in.. + * @property event - The type of broadcast event that is triggered. Currently only the "pageChange" is supported. + * @property pageName - (Optional) The name of the page navigated to. The value will be send only when the broadcast is of the type "pageChange". + * @property previousPageName - (Optional) The name of the page navigated from. The value will be send only when the broadcast is of the type "pageChange". + * @property deviceIp - (Optional) The device ip of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". + * @property deviceName - (Optional) The device name of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". + * @property deviceId - (Optional) The device id (set for multiple devices upgrade) of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". + */ +export type BroadcastEvent = { + type: 'broadcast'; + event: string; + pageName?: string; + previousPageName?: string; + deviceIp?: string; + deviceName?: string; + deviceId?: string; +}; diff --git a/src/types/events/close-plugin-event.ts b/src/types/events/close-plugin-event.ts new file mode 100644 index 0000000..f332fd2 --- /dev/null +++ b/src/types/events/close-plugin-event.ts @@ -0,0 +1,15 @@ +/** + * Touch Portal will send a message when it is closing the plugin for some reason. + * Touch Portal will also try to close the process. This will happen approximately after 500 ms. + * This will only happen if the process is being started through the entry.tp start command attribute. + * This means that if this close call is received, be sure to properly shut down the plugin application/service otherwise it may be hard killed by Touch Portal. + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_close_call + * + * @property type - The event type, always set to 'closePlugin'. + * @property pluginId - The id of the plugin. + */ +export type CloseEvent = { + type: 'closePlugin'; + pluginId: string; +}; diff --git a/src/types/events/connector-change-event.ts b/src/types/events/connector-change-event.ts new file mode 100644 index 0000000..9c9cf3c --- /dev/null +++ b/src/types/events/connector-change-event.ts @@ -0,0 +1,36 @@ +import { EventData } from './event-data'; + +/** + * Touch Portal will send messages to your plugin when the connector is used in a connector event. + * Currently this is when a user has connected the connector to a slider and uses the slider control to change the value. + * This will trigger the "connectorChange" type of message. The value is an integer number ranging from 0 to 100. + * + * Touch Portal will send the connector data and value in the following way: + * - On Finger Down, is always send + * - On Finger Move, send each 100ms interval if value changed. + * - On Finger Up, is always send + * + * Touch Portal will send a value when the user presses his finger on the associated slider. + * While the finger is still pressing on the slider control it will send every 100ms the value. + * If the value is not updated because the finger does not move it will not resend the same value. + * The 100ms is also an indication and can be slower on different set ups and network quality. The minimum however is 100ms. + * + * The slider will always send at least two messages. When the user presses the slider like a button, the same value will be send twice due to the UP and DOWN event. + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_connector_change + * + * @property type - The event type, always set to 'connectorChange'. + * @property pluginId - The id of the plugin. + * @property connectorId - The id of the action. + * @property value - Number between 0-100, sliders only. + * @property valueDecimal - Double number, dials only. + * @property data - An array of id's and value's containing additional data for the event. + */ +export type ConnectorChangeEvent = { + type: 'connectorChange'; + pluginId: string; + connectorId: string; + value: number; + valueDecimal: number; + data: EventData[]; +}; diff --git a/src/types/events/connector-short-id-info-event.ts b/src/types/events/connector-short-id-info-event.ts new file mode 100644 index 0000000..afdd0ad --- /dev/null +++ b/src/types/events/connector-short-id-info-event.ts @@ -0,0 +1,21 @@ +/** + * Whenever a user creates a connector for the first time a shortId is generated for that connector that represents the long connectorId. + * This short id is useful for when you create long connector ids and the id will be longer than the max of 200 characters. + * + * You can use this shortId instead of the long connectorId to update the connector value in Touch Portal. + * + * This message can be send by Touch Portal on several occassions and can be sent multiple times per connectorId and shortId combination. + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_connector_short_id_info + * + * @property type - The event type, always set to 'shortConnectorIdNotification'. + * @property pluginId - The id of the plugin. + * @property shortId - The shortid of the connector. + * @property connectorId - The long normal connector id. + */ +export type ConnectorShortIdInfoEvent = { + type: 'shortConnectorIdNotification'; + pluginId: string; + shortId: number; + connectorId: string; +}; diff --git a/src/types/events/event-data.ts b/src/types/events/event-data.ts new file mode 100644 index 0000000..6558b3e --- /dev/null +++ b/src/types/events/event-data.ts @@ -0,0 +1,10 @@ +/** + * Represents the data associated with an event. + * + * @property id - The id of the data field. + * @property value - The value of the data field. + */ +export type EventData = { + id: string; + value: string; +}; diff --git a/src/types/events/execute-action-event.ts b/src/types/events/execute-action-event.ts new file mode 100644 index 0000000..6ded6d3 --- /dev/null +++ b/src/types/events/execute-action-event.ts @@ -0,0 +1,19 @@ +import { EventData } from './event-data'; + +/** + * Touch Portal will send messages when an action is being triggered (when the button containing one of your plug-in actions + * is pressed or when an event is triggered that contains your action.) + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_execute_action + * + * @property type - The event type, always set to 'action'. + * @property pluginId - The id of the plugin. + * @property actionId - The id of the action. + * @property data - An array of id's and value's containing additional data for the event. + */ +export type ExecuteActionEvent = { + type: 'action'; + pluginId: string; + actionId: string; + data: EventData[]; +}; diff --git a/src/types/events/index.ts b/src/types/events/index.ts new file mode 100644 index 0000000..424357d --- /dev/null +++ b/src/types/events/index.ts @@ -0,0 +1,9 @@ +export * from './event-data'; +export * from './execute-action-event'; +export * from './action-hold-info-event'; +export * from './connector-change-event'; +export * from './connector-short-id-info-event'; +export * from './list-changed-event'; +export * from './close-plugin-event'; +export * from './broadcast-event'; +export * from './notification-action-event'; diff --git a/src/types/events/list-changed-event.ts b/src/types/events/list-changed-event.ts new file mode 100644 index 0000000..77e8415 --- /dev/null +++ b/src/types/events/list-changed-event.ts @@ -0,0 +1,26 @@ +import { EventData } from './event-data'; + +/** + * Touch Portal will send messages when a list of choices value is changed. + * Your software needs to handle these messages and act on it if you want to use this functionality. + * This is especially useful when your action (or event/connector) has multiple drop down list boxes where selecting an item in the first needs to repopulate the second. + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_list_changed + * + * @property type - The event type, always set to 'listChange'. + * @property pluginId - The id of the plugin. + * @property actionId - The id of the action. + * @property listId - The id of the list being used in the inline action. + * @property instanceId - The id of the instance. + * @property value - The value that was added. + * @property values - An array of event data representing the new state of the list. + */ +export type ListChangedEvent = { + type: 'listChange'; + pluginId: string; + actionId: string; + listId: string; + instanceId: string; + value: string; + values: EventData[]; +}; diff --git a/src/types/events/notification-action-event.ts b/src/types/events/notification-action-event.ts new file mode 100644 index 0000000..8753ed9 --- /dev/null +++ b/src/types/events/notification-action-event.ts @@ -0,0 +1,15 @@ +/** + * Touch Portal will send a message when a user clicks on a notification action. + * When they do the notification is also marked as read/handled. + * + * https://www.touch-portal.com/api/index.php?section=communication_listen_notification_action + * + * @property type - The event type, always set to 'notificationOptionClicked'. + * @property notificationId - The id of the notification. + * @property optionId - The id of the option. + */ +export type NotificationActionEvent = { + type: 'notificationOptionClicked'; + notificationId: string; + optionId: string; +}; diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..df2227e --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,5 @@ +export * from './events'; +export * from './requests'; +export * from './logging-level'; +export * from './touch-portal-client-options'; +export * from './touch-portal-connect-options'; diff --git a/src/types/logging-level.ts b/src/types/logging-level.ts new file mode 100644 index 0000000..ebbf88d --- /dev/null +++ b/src/types/logging-level.ts @@ -0,0 +1,6 @@ +export enum LoggingLevel { + DEBUG = 'DEBUG', + INFORMATION = 'INFO', + WARNING = 'WARN', + ERROR = 'ERROR' +} diff --git a/src/types/requests/actions/action-data.ts b/src/types/requests/actions/action-data.ts new file mode 100644 index 0000000..d9c7082 --- /dev/null +++ b/src/types/requests/actions/action-data.ts @@ -0,0 +1,14 @@ +/** + * Represents the data structure for an action. + * + * @property minValue - The new minimal value for the action data. + * @property maxValue - he new maximum value for the action data. + * @property id - The id of the action data to be altered. + * @property type - We only support this for the type "number" at this moment. + */ +export type ActionData = { + minValue: number; + maxValue: number; + id: string; + type: string; +}; diff --git a/src/types/requests/actions/update-action-data-request.ts b/src/types/requests/actions/update-action-data-request.ts new file mode 100644 index 0000000..b306e84 --- /dev/null +++ b/src/types/requests/actions/update-action-data-request.ts @@ -0,0 +1,21 @@ +import { ActionData } from './action-data'; + +/** + * You can change the characteristich of certain action data using this message. + * + * At this moment you can only change the minValue and the maxValue attributes of action data. + * + * Sending a piece of data (a message) to Touch Portal should always end with a newline character. + * This will indicate Touch Portal that it is the whole message. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_update_action_data + * + * @property type - The type of the request, always set to 'updateActionData'. + * @property instanceId - (Optional) This is the id of the instance that should be updated by this call. + * @property data - The object containing all new data for the action data object. + */ +export type UpdateActionDataRequest = { + type: 'updateActionData'; + instanceId?: string; + data: ActionData; +}; diff --git a/src/types/requests/choices/update-choice-list-request.ts b/src/types/requests/choices/update-choice-list-request.ts new file mode 100644 index 0000000..4b27be8 --- /dev/null +++ b/src/types/requests/choices/update-choice-list-request.ts @@ -0,0 +1,17 @@ +/** + * You can also update choice lists in Touch Portal. This will update the choice lists with the given ID. + * + * Sending a piece of data (a message) to Touch Portal should always end with a newline character. + * This will indicate Touch Portal that it is the whole message. + * + * https://www.touch-portal.com/api/index.php?section=choiceUpdate + * + * @property type - The type of the request, always set to 'choiceUpdate'. + * @property id - The state id to set/update. + * @property value - The collection of texts that should be the new list to display for this given choice list id. + */ +export type UpdateChoiceListRequest = { + type: 'choiceUpdate'; + id: string; + value: string[]; +}; diff --git a/src/types/requests/choices/update-specifc-choice-list-request.ts b/src/types/requests/choices/update-specifc-choice-list-request.ts new file mode 100644 index 0000000..1dbcc7f --- /dev/null +++ b/src/types/requests/choices/update-specifc-choice-list-request.ts @@ -0,0 +1,21 @@ +/** + * You can update specific lists in Touch Portal. This is different from state lists as these will update the dropdown list associated. + * Still this is very handy when you want to fill in a list for the user based on changes in your plug-in. + * + * Sending a piece of data (a message) to Touch Portal should always end with a newline character. This will indicate Touch Portal that it is the whole message. + * + * Please note, This functionality only works for inline actions. Actions with a popup window do not support this functionality. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_update_specific_list + * + * @property type - The type of the request, always set to 'choiceUpdate'. + * @property id - The state id to set/update. + * @property instanceId - This is the id of the instance that should be updated by this call. + * @property value - The collection of texts that should be the new list to display for this given choice list id. + */ +export type UpdateSpecificChoiceListRequest = { + type: 'choiceUpdate'; + id: string; + instanceId: string; + value: string[]; +}; diff --git a/src/types/requests/connectors/update-connector-data-request.ts b/src/types/requests/connectors/update-connector-data-request.ts new file mode 100644 index 0000000..7634f7c --- /dev/null +++ b/src/types/requests/connectors/update-connector-data-request.ts @@ -0,0 +1,42 @@ +/** + * Connectors within Touch Portal can be bi-directional. + * This means that your plug-in will receive updates when the user uses a connector supported control that has your connector connected + * but it also means that your plug-in is able to update the connector value within Touch Portal which will update the controls position as well. + * + * You can update connectors as a whole. This means that every control that has the connector will show the change, + * you cannot single out a specific control. This is because the nature of connectors is that they always represent the current state if used bi-directional. + * + * When sending the value to Touch Portal, please be advised that Touch Portal will throttle the communication by sending an update of the value + * to the mobile device each 100ms. This 100ms is an indication and can be slower on different set ups and network quality. The minimum however is 100ms. + * + * While the minimum supported update speed is 100ms we strongly suggest to only send that when necessary. + * Touch Portal actively checks for when a plug-in sends too much redundant connector states. Only send this data when the value actually changes. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_update_connector_data + * + * @property type - The type of the request, always set to 'connectorUpdate'. + * @property connectorId - (Optional) The id of the connector. This has the following syntax for connectors: pc_pluginId_connectorId + * Then for each data object it will include a pipe plus the combination of the id and the value of the data object + * + * Example: |dataId=uservalue + * + * This will result in a long id for this particular connector, for example: + * pc_testpluginid_connectorid1|setting1=testvalue|setting2=anothervalue + * + * Touch Portal will not allow id's longer than 200 characters so keep this as small as possible. + * + * NOTE: pc_pluginId are automatically added by the client and should not be included in the connectorId. + * @property shortId - This is a small by Touch Portal generated representation of the connectorId. + * Please understand that this is just a mapping from the short id to the full connectorId and has not dynamic function. + * @property value - A value from 0-100. All other values will be ignored. This field is used for Slider values. + * @property valueDecimal - (Optional) A decimal value. This field is used for Dial controls. + * Depending on the set up of the user, updating this might not have an actual effect or the value can be capped functionally and/or visually. + * Please note, if this attribute is set, the message is being interpreted as this type of message and the "value" attribute is ignored. + */ +export type UpdateConnectorDataRequest = { + type: 'connectorUpdate'; + connectorId?: string; + shortId?: string; + value: number; + valueDecimal?: number; +}; diff --git a/src/types/requests/events/trigger-event-request.ts b/src/types/requests/events/trigger-event-request.ts new file mode 100644 index 0000000..aa7da6e --- /dev/null +++ b/src/types/requests/events/trigger-event-request.ts @@ -0,0 +1,17 @@ +/** + * You can trigger predefined Events by sending a message to Touch Portal with the given eventId and additional data. + * + * Sending a piece of data (a message) to Touch Portal should always end with a newline character. + * This will indicate Touch Portal that it is the whole message. + * + * https://www.touch-portal.com/api/index.php?section=communication_trigger_event + * + * @property type - The type of the request, always set to 'triggerEvent'. + * @property eventId - The event id to trigger. + * @property states - This is a JSON Object that holds key value pairs of data that are used within Touch Portal as Local States. + */ +export type TriggerEventRequest = { + type: 'triggerEvent'; + eventId: string; + states?: Record; +}; diff --git a/src/types/requests/index.ts b/src/types/requests/index.ts new file mode 100644 index 0000000..c013bc6 --- /dev/null +++ b/src/types/requests/index.ts @@ -0,0 +1,13 @@ +export * from './actions/action-data'; +export * from './notifications/notification-option'; +export * from './actions/update-action-data-request'; +export * from './choices/update-choice-list-request'; +export * from './choices/update-specifc-choice-list-request'; +export * from './connectors/update-connector-data-request'; +export * from './events/trigger-event-request'; +export * from './notifications/create-notification-request'; +export * from './settings/update-setting-request'; +export * from './states/create-state-request'; +export * from './states/update-state-list-request'; +export * from './states/update-state-request'; +export * from './states/remove-state-request'; diff --git a/src/types/requests/notifications/create-notification-request.ts b/src/types/requests/notifications/create-notification-request.ts new file mode 100644 index 0000000..02a8c45 --- /dev/null +++ b/src/types/requests/notifications/create-notification-request.ts @@ -0,0 +1,31 @@ +import { NotificationOption } from './notification-option'; + +/** + * As a plug-in developer you can alert your users within Touch Portal for certain events. + * This system should only be used for important messages that the user has to act on. + * Examples are new updates for the plugin or changing settings like credentials. + * Maybe your user has set up the plug-in incorrectly which is also a good reason to send a notification to alert them to the issue and propose a solution. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_notification + * + * @property type - The type of the request, always set to 'showNotification'. + * @property notificationId - This is the id of this notification. + * Every notification with a unique id will have its own entry in the notification center. + * The same id should be used for the same kind of message to the user. + * For example; if you want to show a notification to update to a specific version, use the same id each time you send this notification. + * This will just show the one notification to the user. + * @property title - This is the title of the notification. + * @property msg - This is the message that is shown in the notification to the user. + * @property options - This is the collection of options to go with your notification. + * When a user clicks on the action it will be send to the plugin. + * The plug-in then can react on the choice the user made. + * Usually this will contain only one option such as an "Update" or "More Info" option. + * At least one option is required. + */ +export type CreateNotificationRequest = { + type: 'showNotification'; + notificationId: string; + title: string; + msg: string; + options: NotificationOption[]; +}; diff --git a/src/types/requests/notifications/notification-option.ts b/src/types/requests/notifications/notification-option.ts new file mode 100644 index 0000000..171716e --- /dev/null +++ b/src/types/requests/notifications/notification-option.ts @@ -0,0 +1,8 @@ +/** + * @property id - This is the id of the notification option. This id will be send back to the plug-in if the user selects the option. + * @property title - This is the title of the notification option.. + */ +export type NotificationOption = { + id: string; + title: string; +}; diff --git a/src/types/requests/settings/update-setting-request.ts b/src/types/requests/settings/update-setting-request.ts new file mode 100644 index 0000000..aaec013 --- /dev/null +++ b/src/types/requests/settings/update-setting-request.ts @@ -0,0 +1,14 @@ +/** + * With this option you can update a setting from your plug-in. This will overwrite the user setting. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_update_setting + * + * @property type - The type of the request, always set to 'settingUpdate'. + * @property name - The name of the settings, should be case sensitive correct. + * @property value - The new value the setting should hold. + */ +export type UpdateSettingRequest = { + type: 'settingUpdate'; + name: string; + value: string; +}; diff --git a/src/types/requests/states/create-state-request.ts b/src/types/requests/states/create-state-request.ts new file mode 100644 index 0000000..1076a58 --- /dev/null +++ b/src/types/requests/states/create-state-request.ts @@ -0,0 +1,23 @@ +/** + * States can be created on runtime using by sending a "createState" message to Touch Portal with the given information. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_state + * + * @property type - The type of the request, always set to 'createState'. + * @property id - The id of the newly created plug-in state. Please ensure unique names, otherwise you may corrupt other plug-ins. + * @property desc - The displayed name within Touch Portal which represents the state.. + * @property defaultValue - The default value the state will have on creation. + * @property parentGroup - (Optional) The name of the parent group of this state. + * The parent group of this state will be used to group the state in the menus used throughout Touch Portal. + * Every state belonging to the same parent group name will be in the same selection menu. + * @property forceUpdate - (Optional) This will force the update of the state if it is already created or + * existing and will trigger the state changed event even if the value is the same as the already existing one. + */ +export type CreateStateRequest = { + type: 'createState'; + id: string; + desc: string; + defaultValue: string; + parentGroup?: string; + forceUpdate?: boolean; +}; diff --git a/src/types/requests/states/remove-state-request.ts b/src/types/requests/states/remove-state-request.ts new file mode 100644 index 0000000..a263ad9 --- /dev/null +++ b/src/types/requests/states/remove-state-request.ts @@ -0,0 +1,12 @@ +/** + * You can remove states at runtime. + * + * https://www.touch-portal.com/api/index.php?section=communication_remove_state + * + * @property type - The type of the request, always set to 'removeState'. + * @property id - The id of the plug-in state to remove. + */ +export type RemoveStateRequest = { + type: 'removeState'; + id: string; +}; diff --git a/src/types/requests/states/update-state-list-request.ts b/src/types/requests/states/update-state-list-request.ts new file mode 100644 index 0000000..a7ba20e --- /dev/null +++ b/src/types/requests/states/update-state-list-request.ts @@ -0,0 +1,17 @@ +/** + * You can also update state lists in Touch Portal. These state lists needs to be defined in the entry file. + * + * Sending a piece of data (a message) to Touch Portal should always end with a newline character. + * This will indicate Touch Portal that it is the whole message. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_update_state_lists + * + * @property type - The type of the request, always set to 'stateListUpdate'. + * @property id - The state id to set/update. + * @property value - The collection of texts that should be the new list to display for this given choice list id. + */ +export type UpdateStateListRequest = { + type: 'stateListUpdate'; + id: string; + value: string[]; +}; diff --git a/src/types/requests/states/update-state-request.ts b/src/types/requests/states/update-state-request.ts new file mode 100644 index 0000000..ada2ba0 --- /dev/null +++ b/src/types/requests/states/update-state-request.ts @@ -0,0 +1,19 @@ +/** + * You can send state updates to Touch Portal. + * More information about states and how to set them up in the description file can be found in the states section. + * You can only change the states from your own plug-in. Changing states of Touch Portal itself may result in undesired behaviour. + * + * Sending a piece of data (a message) to Touch Portal should always end with a newline character. + * This will indicate Touch Portal that it is the whole message. + * + * https://www.touch-portal.com/api/index.php?section=communication_create_update_state + * + * @property type - The type of the request, always set to 'stateUpdate'. + * @property id - The state id to set/update. + * @property value - The value of the state. Ensure this is a text and nothing else. Touch Portal will handle this value as a piece of text (string). + */ +export type UpdateStateRequest = { + type: 'stateUpdate'; + id: string; + value: string; +}; diff --git a/src/types/touch-portal-client-options.ts b/src/types/touch-portal-client-options.ts new file mode 100644 index 0000000..7f457fd --- /dev/null +++ b/src/types/touch-portal-client-options.ts @@ -0,0 +1,14 @@ +import { LoggingLevel } from './logging-level'; + +/** + * Options for configuring the Touch Portal client. + * + * @property pluginId - (Optional) The unique identifier for the plugin. + * @property captureRejections - (Optional) If true, promise rejections will be captured and handled. + * @property logCallback - (Optional) A callback function for handling log messages, receiving the logging level and additional arguments. + */ +export type TouchPortalClientOptions = { + pluginId?: string; + captureRejections?: boolean; + logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void; +}; diff --git a/src/types/touch-portal-connect-options.ts b/src/types/touch-portal-connect-options.ts new file mode 100644 index 0000000..f46e159 --- /dev/null +++ b/src/types/touch-portal-connect-options.ts @@ -0,0 +1,10 @@ +/** + * Options for connecting to the Touch Portal API. + * + * @property pluginId - (Optional) The unique identifier for the plugin. Used to identify the plugin instance when connecting. + * @property exitOnClose - (Optional) If true, the process will exit when the connection is closed. Defaults to false. + */ +export type TouchPortalConnectOptions = { + pluginId?: string; + exitOnClose?: boolean; +}; diff --git a/tests/test.js b/tests/test.js deleted file mode 100644 index c32487b..0000000 --- a/tests/test.js +++ /dev/null @@ -1,31 +0,0 @@ -const TP = require('../src/index'); - -const pluginId = 'TPExample'; - -const client = new TP.Client(); -client.on('Action', (data, isHeld) => { - console.log('Action:', JSON.stringify(data), `isHeld=${isHeld}`); -}); -client.on('ListChange', (data) => { - console.log('ListChange:', JSON.stringify(data)); -}); -client.on('Message', (data) => { - console.log('Message:', JSON.stringify(data)); -}); -client.on('Info', (data) => { - console.log('Info:', JSON.stringify(data)); -}); -client.on('Settings', (data) => { - console.log('Info:', JSON.stringify(data)); -}); -client.on('ConnectorChange', (data) => { - console.log('Info:', JSON.stringify(data)); -}); -client.on('Broadcast', (data) => { - console.log('Info:', JSON.stringify(data)); -}); -client.on('Close', (data) => { - console.log('Closing Plugin:', JSON.stringify(data)); -}); - -client.connect({ pluginId }); diff --git a/tsconfig.json b/tsconfig.json index 59befa0..37f6194 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,15 @@ { - "include": ["src/**/*.js", "tests/**/*.js"], "compilerOptions": { - // Tells TypeScript to read JS files, as - // normally they are ignored as source files - "allowJs": true, - // flag any errors found in .js files - "checkJs": true, - // Generate d.ts files - "declaration": true, - // This compiler run should - // only output d.ts files - "emitDeclarationOnly": false, - // go to js file when using IDE functions like - // "Go to Definition" in VSCode - "declarationMap": true, - // The type definition files go here: - "outDir": "dist", - // The output will be in ES6, not the default ES3 - "target": "es6", - // modules in src are the old fashioned "node" type modules - "moduleResolution":"node", - } + "lib": ["ES2020"], + "module": "ESNext", + "noEmit": true, + "strict": true, + "skipLibCheck": true, + "isolatedModules": true, + "resolveJsonModule": true, + "moduleResolution": "bundler", + "useDefineForClassFields": true, + "allowImportingTsExtensions": true + }, + "include": ["src"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..1473816 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + root: '.', + include: ['./src/**/*.spec.ts'], + globals: true, + watch: false, + environment: 'node' + }, + plugins: [] +}); From 837201b9a71931c4dd7a967feb89da6e782c85cf Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Tue, 22 Jul 2025 06:16:08 +0100 Subject: [PATCH 02/12] Address own comments, (linting, file reverts, public methods), Restore null logger --- .eslintrc.json | 35 + .gitignore | 4 +- .prettierrc | 2 +- .vscode/settings.json | 3 +- CHANGELOG.md | 146 +- README.md | 33 +- eslint.config.mjs | 16 - package-lock.json | 5815 +++++++++++++++++----- package.json | 8 +- src/client.ts | 50 +- src/index.ts | 6 +- src/types/events/broadcast-event.ts | 2 +- src/types/touch-portal-client-options.ts | 2 +- 13 files changed, 4779 insertions(+), 1343 deletions(-) create mode 100644 .eslintrc.json delete mode 100644 eslint.config.mjs diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..154a185 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,35 @@ +{ + "env": { + "browser": true, + "commonjs": true, + "es2021": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 13, + "sourceType": "module", + "project": "./tsconfig.json" + }, + "plugins": ["@typescript-eslint", "import"], + "extends": [ + "airbnb-base", + "plugin:@typescript-eslint/recommended", + "plugin:import/typescript" + ], + "rules": { + "global-require": "off", + "max-len": "off", + "no-console": "off", + "no-continue": "off", + "no-param-reassign": "off", + "comma-dangle": "off", + "import/extensions": "off", + "import/prefer-default-export": "off" + }, + "ignorePatterns": ["dist/", "*.config.ts"], + "settings": { + "import/resolver": { + "typescript": {} + } + } +} diff --git a/.gitignore b/.gitignore index decc079..71f91d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -node_modules -dist/ +node_modules/** +dist/** *.tgz diff --git a/.prettierrc b/.prettierrc index 5e487d6..8b867fb 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,7 +4,7 @@ "trailingComma": "none", "bracketSameLine": true, "htmlWhitespaceSensitivity": "ignore", - "endOfLine": "auto", + "endOfLine": "lf", "overrides": [ { "files": "*.ts", diff --git a/.vscode/settings.json b/.vscode/settings.json index 0c95786..bf4ab21 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,5 @@ "prettier.htmlWhitespaceSensitivity": "ignore", "prettier.endOfLine": "auto", "prettier.printWidth": 120, - "typescript.preferences.quoteStyle": "single", - "oxc.enable": true + "typescript.preferences.quoteStyle": "single" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 01b0895..5836b37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,51 +1,43 @@ # Touch Portal Node API - Change Log ## v4.0.0 + ### New Features: + - Developers may now initiate a plugin update check at any time using the `checkForUpdate` function from TPClient + - Allows option to include pre-releases from github allowing users to decide to download alpha/beta versions ([#44]) -### New Features: - -- Developers may now initiate a plugin update check at any time using the `checkForUpdate` function from TPClient - - Allows option to include pre-releases from github allowing users to decide to download alpha/beta versions ([#44]) - -### Changes - -- `TPClient.Connect` no longer accepts `updateUrl` to initate a github update check upon plugin connect. -- `TPClient.checkForUpdate` now takes the args `githubUser`, `githubRepo` and `includePrerelease` - - Example: `TPClient.checkForUpdate("spdermn02", "TouchPortal_Discord_Plugin", includePrerelease)` + ### Changes + - `TPClient.Connect` no longer accepts `updateUrl` to initate a github update check upon plugin connect. + - `TPClient.checkForUpdate` now takes the args `githubUser`, `githubRepo` and `includePrerelease` + - Example: `TPClient.checkForUpdate("spdermn02", "TouchPortal_Discord_Plugin", includePrerelease)` [#44]: https://github.com/spdermn02/touchportal-node-api/pull/44 ## v3.3.0 - -### New Features: - -- Allow plugin "stateful" disconnection/exit ([#36]): - - Added `exitOnClose` option to `connect()` method to control if client automatically calls `process.exit(0)` upon socket error/close (default is `true`). - - Added `disconnected` event with `hadError ` parameter passed on from socket's `close` event (`true` if the socket had a transmission error). - - Added `socketError` event with `err ` parameter passed on from socket's `error` event. - - Added `disconnect()` method which closes any current connection with `socket.end()`. -- Logging output can now be directed to a custom callback function instead of `console.log()` or disabled entirely (see PR [#38] for details): - -### Fixes - -- Fixed handling of incoming messages from TP when the complete data could not fit into the client socket's buffer at the same time. This could happen on very long messages (with lots of data in an action), or when messages get queued in the operating system's buffer w/out being read, for example when plugin is paused in debugger or otherwise spends a long time being unresponsive. ([#40]) - -### Changes - -- `TouchPortalClient` constructor now accepts an optional `options` object argument with the following properties: - - `pluginId` - Can be specified here instead of in the `connect()` method. - - `captureRejections` - Passed through to `EventEmitter`. - - `logCallback` - Can be a callback function or `null` to disable logging (see PR [#38] for details). -- An exception is now thrown (and logged) if `pluginId` is empty when `connect()` is invoked. ([#38]) -- `removeState()` no longer validates that the state exists before sending the command to TP (allows removing states after a plugin restart, for example). ([#33]) -- `choiceUpdate()` and `choiceUpdateSpecific()` now allow sending an empty array of choices. ([#34]) -- `logIt()` method now allows direct passthrough of object to `console.log()` (or configured callback) without strignifying anything explicitly. ([#32]) -- Minor performance improvements whith reading and writing socket data strings. ([#31], [#40]) - -### Package - -- GitHub URL can now be used as a _package.json_ dependency specification instead of NPM. ([#35]) -- Updated various dependencies to newer versions. ([#39], [#41]) + ### New Features: + - Allow plugin "stateful" disconnection/exit ([#36]): + - Added `exitOnClose` option to `connect()` method to control if client automatically calls `process.exit(0)` upon socket error/close (default is `true`). + - Added `disconnected` event with `hadError ` parameter passed on from socket's `close` event (`true` if the socket had a transmission error). + - Added `socketError` event with `err ` parameter passed on from socket's `error` event. + - Added `disconnect()` method which closes any current connection with `socket.end()`. + - Logging output can now be directed to a custom callback function instead of `console.log()` or disabled entirely (see PR [#38] for details): + + ### Fixes + - Fixed handling of incoming messages from TP when the complete data could not fit into the client socket's buffer at the same time. This could happen on very long messages (with lots of data in an action), or when messages get queued in the operating system's buffer w/out being read, for example when plugin is paused in debugger or otherwise spends a long time being unresponsive. ([#40]) + + ### Changes + - `TouchPortalClient` constructor now accepts an optional `options` object argument with the following properties: + - `pluginId` - Can be specified here instead of in the `connect()` method. + - `captureRejections` - Passed through to `EventEmitter`. + - `logCallback` - Can be a callback function or `null` to disable logging (see PR [#38] for details). + - An exception is now thrown (and logged) if `pluginId` is empty when `connect()` is invoked. ([#38]) + - `removeState()` no longer validates that the state exists before sending the command to TP (allows removing states after a plugin restart, for example). ([#33]) + - `choiceUpdate()` and `choiceUpdateSpecific()` now allow sending an empty array of choices. ([#34]) + - `logIt()` method now allows direct passthrough of object to `console.log()` (or configured callback) without strignifying anything explicitly. ([#32]) + - Minor performance improvements whith reading and writing socket data strings. ([#31], [#40]) + + ### Package + - GitHub URL can now be used as a _package.json_ dependency specification instead of NPM. ([#35]) + - Updated various dependencies to newer versions. ([#39], [#41]) [#31]: https://github.com/spdermn02/touchportal-node-api/pull/31 [#32]: https://github.com/spdermn02/touchportal-node-api/pull/32 @@ -56,59 +48,41 @@ [#38]: https://github.com/spdermn02/touchportal-node-api/pull/38 [#39]: https://github.com/spdermn02/touchportal-node-api/pull/39 [#40]: https://github.com/spdermn02/touchportal-node-api/pull/40 - -## [#41]: https://github.com/spdermn02/touchportal-node-api/pull/41 - +[#41]: https://github.com/spdermn02/touchportal-node-api/pull/41 +--- ## v3.2.1 - ESLint implementation and Typescript support - -### Updates - -- Big thank you to riverrun-git for the PR's and the assitance -- TypeScript support is just being implemented in increments, more support for it coming soon + ### Updates + - Big thank you to riverrun-git for the PR's and the assitance + - TypeScript support is just being implemented in increments, more support for it coming soon --- - ## v3.2.0 -### New Features: - + ### New Features: - Support for Parent Groups on State creation added in Touch Portal 3.1 - -### Fixes: - + ### Fixes: - Fixed Spelling for `showNotification` type sent to Touch Portal, so now Notifications should work properly if you use them. --- - ## v3.1.2 - -## New Features: - + ## New Features: - Added createStateMany function - This allows state creation to be batched together rather than one at a time. - -## Fixes: - + ## Fixes: - force id, desc, defaultValue on createState to send as a string - Fix update check process to error properly versus killing the process --- - ## v3.1.1 - -### New Features: - + ### New Features: - Support for Short Ids for Connectors - Updated connectorUpdate function with additional flag to indicate if id is ShortId, default is false - Updated connectorUpdateMany function to take id, or shortId - Support for ConnectorShortIdNotification event --- - ## v3.0.0 - -### New Features: - + ### New Features: - Support for new Connectors in to v3.0.0 - Added connectorUpdate function - Added buildConnectorUpdate function @@ -119,74 +93,52 @@ - Support for notificationOptionClick event --- - ## v2.1.1 - -### Fixes: - + ### Fixes: - Fixed issue with createState and removeState to setup using the object internally to keep track --- - ## v2.1.0 - -### New Features: - + ### New Features: - Updates to add in missed features from TouchPortal SDK v3 updates - Support for removeState message type - Support for updateActionData message type --- - ## v2.0.0 - Updates to include new features from Touch Portal 2.3, minor enhancements, Fixes - -### New Features: - + ### New Features: - Support for new TouchPortal Settings configuration - Support for On Hold events of Up and Down actions - Support for Broadcast messages from Touch Portal - Support to handle checking for updates against a remote package.json file for your project - UTF-8 encoding on the socket will help with non-standard ascii character issues - -### Fixes: - + ### Fixes: - Refactored Some code slightly - Refactored logging to a single method to output a consistent format - Fixed issue if multiple messages were received at the same time it could cause the json parse to fail and thus causing the code to throw and exception, so now it splits on newlines and works all messages that came in during the read in the order they came in - Fixed #5 Issue - forces ids and values to strings during stateUpdate and stateUpdateMany --- - ## v1.0.6 - -### Fixes: - + ### Fixes: - Removing 5 second "wait" for socket close event to fire - no need for it - it is synchronous anyways --- - ## v1.0.5 - bug fix for socket connection end --- - ## v1.0.4 - End socket connection from the client side when a close message is received --- - ## v1.0.3 - Fixes - fixing all the typeof checks that weren't correct, adding some console.log messages, and throwing new errors instead of just using throw - -### New Features: - + ### New Features: - Create State functionality was added --- - ## v1.0.2 - Documentation Update --- - ## v1.0.1 - minor bug fix emite -> emit, log message update, and invalid variable definition fixed --- - ## v1.0.0 - Initial Release of the API diff --git a/README.md b/README.md index 943285e..6bcfcdd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Touch Portal API for Node.JS -Build a plugin to Touch Portal with Node.JS utlizing this easy to use library. No need to understand the inner workings of the Touch Portal Socket connection, just install this package, and connect! +Build a plugin to Touch Portal with Node.JS utlizing this easy to use library. No need to understand the inner workings of the Touch Portal Socket connection, just install this package, and connect! - [Touch Portal API for Node.JS](#touch-portal-api-for-nodejs) - [ChangeLog](#changelog) @@ -15,14 +15,12 @@ Build a plugin to Touch Portal with Node.JS utlizing this easy to use library. N - [License](#license) - [Touch Portal](#touch-portal) -_NOTE_: Make sure your Touch Portal is up-to-date to use the latest features. +*NOTE*: Make sure your Touch Portal is up-to-date to use the latest features. ## ChangeLog - see [CHANGELOG.md](CHANGELOG.md) -## Usage - +## Usage ### Install using npm ```shell @@ -30,9 +28,9 @@ npm install --save touchportal-api ``` ### How To Use - What is described below, is pretty basic functionality, the usage of the below is very basic, and not intended to describe the full complexity of a plugin. + ```javascript // Node.JS style const TouchPortalAPI = require('touchportal-api'); @@ -93,7 +91,7 @@ TPClient.on("Action", (data,hold) => { //Will cause a 100ms wait await new Promise(r => setTimeout(r,100)); - + // If we aren't holding(so just a keypress) or we no longer are being held, break this loop if( hold === undefined || !heldAction[message.actionId] ) { break; } } @@ -188,7 +186,7 @@ TPClient.on("ConnectorChange",(data) => { // Or multiple connectors, data key is optional per connector // can now take in shortId instead of id - let connectors = [ + let connectors = [ { id: ", value: 23, data: [{"dataId1":"value1"}] }, { id: ", value: 65 }, { shortId: ", value: 20 } @@ -233,13 +231,13 @@ TPClient.on("Broadcast", (data) => { // If you want to handle page change events - this is what happens // more info here: https://www.touch-portal.com/api/index.php?section=dynamic-actions - /* + /* {"type":"broadcast", "event":"pageChange", "pageName":"name of the page switched to" } */ - + }); TPClient.on("NotificationClicked", (data) => { @@ -259,7 +257,7 @@ TPClient.on("Settings",(data) => { //Do something with the Settings message here // Note: this can be called any time settings are modified or saved in the TouchPortal Settings window. - /* + /* [{"Setting 1":"Value 1"},{"Setting 2":"Value 2"},...,{"Setting N":"Value N"}] */ @@ -289,38 +287,29 @@ TPClient.on("Update", (curVersion, remoteVersion) => { //Connects and Pairs to Touch Portal via Sockete TPClient.connect({ pluginId }); -//If you want touchportal-node-api to check for updates on startup, +//If you want touchportal-node-api to check for updates on startup, TPClient.connect({ pluginId, "updateUrl":"" }); ``` ## Full Touch Portal API Documentation - -Touch Portal interface Documentation here: +Touch Portal interface Documentation here: [Touch Portal Interface Documentation](https://www.touch-portal.com/api) # Support - If you need support, drop a question in the github issues tab, and I'll get to it as soon as possible. # Bugs - Please report bugs using the github issues tab # Contribute - Feel free to fork this repo and suggest pull requests. I cannot guarantee they will be included, but I'm definitely open to changes, enhancements, bug fixes! - ## Contributors - - [Jameson Allen (spdermn02)](https://github.com/spdermn02) - [Andreas Schneider (riverrun-git)](https://github.com/riverrun-git) - [Pjiesco](https://github.com/pjiesco) - # License - This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details # Touch Portal - If you got here, and are like "WTF is this?" it is for integrating custom functionality as a Touch Portal plugin. check out https://touch-portal.com to learn more about Touch Portal and it's amazing features and community. diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 9665b51..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,16 +0,0 @@ -import js from '@eslint/js'; -import globals from 'globals'; -import ts from 'typescript-eslint'; - -export default [ - { - languageOptions: { - globals: globals.browser - } - }, - js.configs.recommended, - ...ts.configs.recommended, - { - ignores: ['dist/'] - } -]; diff --git a/package-lock.json b/package-lock.json index 1c9cccb..02470bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,23 +16,18 @@ "devDependencies": { "@rslib/core": "^0.10.6", "@types/node": "^24.0.15", - "eslint": "^9.30.0", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", "globals": "^16.2.0", "prettier": "^3.6.2", "typescript": "^5.8.3", - "typescript-eslint": "^8.35.1", "vitest": "^3.2.4" } }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ast-grep/napi": { "version": "0.37.0", "resolved": "https://registry.npmjs.org/@ast-grep/napi/-/napi-0.37.0.tgz", @@ -54,27 +49,27 @@ "@ast-grep/napi-win32-x64-msvc": "0.37.0" } }, - "node_modules/@ast-grep/napi-win32-x64-msvc": { + "node_modules/@ast-grep/napi-darwin-arm64": { "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-x64-msvc/-/napi-win32-x64-msvc-0.37.0.tgz", - "integrity": "sha512-vCiFOT3hSCQuHHfZ933GAwnPzmL0G04JxQEsBRfqONywyT8bSdDc/ECpAfr3S9VcS4JZ9/F6tkePKW/Om2Dq2g==", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-arm64/-/napi-darwin-arm64-0.37.0.tgz", + "integrity": "sha512-QAiIiaAbLvMEg/yBbyKn+p1gX2/FuaC0SMf7D7capm/oG4xGMzdeaQIcSosF4TCxxV+hIH4Bz9e4/u7w6Bnk3Q==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">= 10" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "node_modules/@ast-grep/napi-darwin-x64": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-darwin-x64/-/napi-darwin-x64-0.37.0.tgz", + "integrity": "sha512-zvcvdgekd4ySV3zUbUp8HF5nk5zqwiMXTuVzTUdl/w08O7JjM6XPOIVT+d2o/MqwM9rsXdzdergY5oY2RdhSPA==", "cpu": [ "x64" ], @@ -82,255 +77,761 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { - "node": ">=18" + "node": ">= 10" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "node_modules/@ast-grep/napi-linux-arm64-gnu": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-gnu/-/napi-linux-arm64-gnu-0.37.0.tgz", + "integrity": "sha512-L7Sj0lXy8X+BqSMgr1LB8cCoWk0rericdeu+dC8/c8zpsav5Oo2IQKY1PmiZ7H8IHoFBbURLf8iklY9wsD+cyA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "optional": true, + "os": [ + "linux" + ], "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": ">= 10" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "node_modules/@ast-grep/napi-linux-arm64-musl": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-arm64-musl/-/napi-linux-arm64-musl-0.37.0.tgz", + "integrity": "sha512-LF9sAvYy6es/OdyJDO3RwkX3I82Vkfsng1sqUBcoWC1jVb1wX5YVzHtpQox9JrEhGl+bNp7FYxB4Qba9OdA5GA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 10" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "node_modules/@ast-grep/napi-linux-x64-gnu": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-gnu/-/napi-linux-x64-gnu-0.37.0.tgz", + "integrity": "sha512-TViz5/klqre6aSmJzswEIjApnGjJzstG/SE8VDWsrftMBMYt2PTu3MeluZVwzSqDao8doT/P+6U11dU05UOgxw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 10" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "node_modules/@ast-grep/napi-linux-x64-musl": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-linux-x64-musl/-/napi-linux-x64-musl-0.37.0.tgz", + "integrity": "sha512-/BcCH33S9E3ovOAEoxYngUNXgb+JLg991sdyiNP2bSoYd30a9RHrG7CYwW6fMgua3ijQ474eV6cq9yZO1bCpXg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 10" } }, - "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "node_modules/@ast-grep/napi-win32-arm64-msvc": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-arm64-msvc/-/napi-win32-arm64-msvc-0.37.0.tgz", + "integrity": "sha512-TjQA4cFoIEW2bgjLkaL9yqT4XWuuLa5MCNd0VCDhGRDMNQ9+rhwi9eLOWRaap3xzT7g+nlbcEHL3AkVCD2+b3A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 10" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "node_modules/@ast-grep/napi-win32-ia32-msvc": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-ia32-msvc/-/napi-win32-ia32-msvc-0.37.0.tgz", + "integrity": "sha512-uNmVka8fJCdYsyOlF9aZqQMLTatEYBynjChVTzUfFMDfmZ0bihs/YTqJVbkSm8TZM7CUX82apvn50z/dX5iWRA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 10" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/@ast-grep/napi-win32-x64-msvc": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@ast-grep/napi-win32-x64-msvc/-/napi-win32-x64-msvc-0.37.0.tgz", + "integrity": "sha512-vCiFOT3hSCQuHHfZ933GAwnPzmL0G04JxQEsBRfqONywyT8bSdDc/ECpAfr3S9VcS4JZ9/F6tkePKW/Om2Dq2g==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/@eslint/js": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", - "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", + "node_modules/@emnapi/core": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", + "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.4", + "tslib": "^2.4.0" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "node_modules/@emnapi/runtime": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", - "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", + "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, "dependencies": { - "@eslint/core": "^0.15.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "tslib": "^2.4.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=18.18.0" + "node": ">=18" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=18.18.0" + "node": ">=18" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/error-codes": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.16.0.tgz", - "integrity": "sha512-TfmA45b8vvISniGudMg8jjIy1q3tLPon0QN/JdFp5f8AJ8/peICN5b+dkEQnWsAVg2fEusYhk9dO7z3nUeJM8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/runtime": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.16.0.tgz", - "integrity": "sha512-6o84WI8Qhc9O3HwPLx89kTvOSkyUOHQr73R/zr0I04sYhlMJgw5xTwXeGE7bQAmNgbJclzW9Kh7JTP7+3o3CHg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.16.0", - "@module-federation/runtime-core": "0.16.0", - "@module-federation/sdk": "0.16.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@module-federation/runtime-core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.16.0.tgz", - "integrity": "sha512-5SECQowG4hlUVBRk/y6bnYLfxbsl5NcMmqn043WPe7NDOhGQWbTuYibJ3Bk+ZBv5U4uYLEmXipBGDc1FKsHklQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.16.0", - "@module-federation/sdk": "0.16.0" - } - }, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.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", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/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", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/error-codes": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.16.0.tgz", + "integrity": "sha512-TfmA45b8vvISniGudMg8jjIy1q3tLPon0QN/JdFp5f8AJ8/peICN5b+dkEQnWsAVg2fEusYhk9dO7z3nUeJM8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.16.0.tgz", + "integrity": "sha512-6o84WI8Qhc9O3HwPLx89kTvOSkyUOHQr73R/zr0I04sYhlMJgw5xTwXeGE7bQAmNgbJclzW9Kh7JTP7+3o3CHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.16.0", + "@module-federation/runtime-core": "0.16.0", + "@module-federation/sdk": "0.16.0" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.16.0.tgz", + "integrity": "sha512-5SECQowG4hlUVBRk/y6bnYLfxbsl5NcMmqn043WPe7NDOhGQWbTuYibJ3Bk+ZBv5U4uYLEmXipBGDc1FKsHklQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.16.0", + "@module-federation/sdk": "0.16.0" + } + }, "node_modules/@module-federation/runtime-tools": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.16.0.tgz", @@ -338,1410 +839,3523 @@ "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.16.0", - "@module-federation/webpack-bundler-runtime": "0.16.0" + "@module-federation/runtime": "0.16.0", + "@module-federation/webpack-bundler-runtime": "0.16.0" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.16.0.tgz", + "integrity": "sha512-UXJW1WWuDoDmScX0tpISjl4xIRPzAiN62vg9etuBdAEUM+ja9rz/zwNZaByiUPFS2aqlj2RHenCRvIapE8mYEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.16.0.tgz", + "integrity": "sha512-yqIDQTelJZP0Rxml0OXv4Er8Kbdxy7NFh6PCzPwDFWI1SkiokJ3uXQJBvtlxZ3lOnCDYOzdHstqa8sJG4JP02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.16.0", + "@module-federation/sdk": "0.16.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", + "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", + "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", + "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", + "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", + "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", + "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", + "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", + "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", + "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", + "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", + "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", + "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", + "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", + "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", + "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", + "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", + "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", + "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", + "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", + "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rsbuild/core": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.4.8.tgz", + "integrity": "sha512-IJhpLl8lrp5ynlf04V5l7rMrVTNuGLG36ZDadHiBIC5qLRGSS3rMF8cVLSkSA6qM1OiRlPpMgwQbqFYh325RvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rspack/core": "1.4.8", + "@rspack/lite-tapable": "~1.0.1", + "@swc/helpers": "^0.5.17", + "core-js": "~3.44.0", + "jiti": "^2.4.2" + }, + "bin": { + "rsbuild": "bin/rsbuild.js" + }, + "engines": { + "node": ">=16.10.0" + } + }, + "node_modules/@rslib/core": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/@rslib/core/-/core-0.10.6.tgz", + "integrity": "sha512-7OLdmmQbY116gNAAsY9baCid9REr+z11qfAzwVVFw+Q8avCE6YqpcBLfrBXlfmpBikfshDmHH8EpRrQwz8gZJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rsbuild/core": "~1.4.7", + "rsbuild-plugin-dts": "0.10.6", + "tinyglobby": "^0.2.14" + }, + "bin": { + "rslib": "bin/rslib.js" + }, + "engines": { + "node": ">=16.7.0" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@rspack/binding": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.4.8.tgz", + "integrity": "sha512-VKE+2InUdudBUOn3xMZfK9a6KlOwmSifA0Nupjsh7N9/brcBfJtJGSDCnfrIKCq54FF+QAUCgcNAS0DB4/tZmw==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.4.8", + "@rspack/binding-darwin-x64": "1.4.8", + "@rspack/binding-linux-arm64-gnu": "1.4.8", + "@rspack/binding-linux-arm64-musl": "1.4.8", + "@rspack/binding-linux-x64-gnu": "1.4.8", + "@rspack/binding-linux-x64-musl": "1.4.8", + "@rspack/binding-wasm32-wasi": "1.4.8", + "@rspack/binding-win32-arm64-msvc": "1.4.8", + "@rspack/binding-win32-ia32-msvc": "1.4.8", + "@rspack/binding-win32-x64-msvc": "1.4.8" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.4.8.tgz", + "integrity": "sha512-PQRNjC3Fc0avpx8Gk+sT5P+HAXxTSzmBA8lU7QLlmbW5GGXO2taVhNstbZ4oxyIX5uDVZpQ2yQ2E0zXirK6/UQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.4.8.tgz", + "integrity": "sha512-ZnPZbo1dhhbfevxSS99y8w02xuEbxyiV1HaUie/S8jzy9DPmk+4Br+DddufnibPNU85e3BZKjp+HDFMYkdn6cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.4.8.tgz", + "integrity": "sha512-mJK9diM4Gd8RIGO90AZnl27WwUuAOoRplPQv9G+Vxu2baCt1xE1ccf8PntIJ70/rMgsUdnmkR5qQBaGxhAMJvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.4.8.tgz", + "integrity": "sha512-+n9QxeDDZKwVB4D6cwpNRJzsCeuwNqd/fwwbMQVTctJ+GhIHlUPsE8y5tXN7euU7kDci81wMBBFlt6LtXNcssA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.4.8.tgz", + "integrity": "sha512-rEypDlbIfv9B/DcZ2vYVWs56wo5VWE5oj/TvM9JT+xuqwvVWsN/A2TPMiU6QBgOKGXat3EM/MEgx8NhNZUpkXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.4.8.tgz", + "integrity": "sha512-o9OsvJ7olH0JPU9exyIaYTNQ+aaR5CNAiinkxr+LkV2i3DMIi/+pDVveDiodYjVhzZjWfsP/z8QPO4c6Z06bEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.4.8.tgz", + "integrity": "sha512-hF5gqT0aQ66VUclM2A9MSB6zVdEJqzp++TAXaShBK/eVBI0R4vWrMfJ2TOdzEsSbg4gXgeG4swURpHva3PKbcA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.12" + } + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.4.8.tgz", + "integrity": "sha512-umD0XzesJq4nnStv9/2/VOmzNUWHfLMIjeHmiHYHpc7iVC0SkXgIdc6Ac7c+g2q7/V3/MFxL66Y60oy7lQE3fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.4.8.tgz", + "integrity": "sha512-Uu+F/sxz7GgIMbuCCZVOD1HPjoHQdyrFHi/TE2EmuZzs9Ji9a9mtNJNrKc8+h9YFpaLeade7cbMDjRu4MHxiVA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.4.8.tgz", + "integrity": "sha512-BVkOfJDZnexHNpGgc/sWENyGrsle1jUQTeUEdSyNYsu4Elsgk/T9gnGK8xyLRd2c6k20M5FN38t0TumCp4DscQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.4.8.tgz", + "integrity": "sha512-ARHuZ+gx3P//RIUKSjk/riQUn/D5tCwCWbfgeM5pk/Ti2JsgVnqiP9Sksge8JovVPf7b6Zgw73Cq5FpX4aOXeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.16.0", + "@rspack/binding": "1.4.8", + "@rspack/lite-tapable": "1.0.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "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/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", + "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", + "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/type-utils": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", + "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", + "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", + "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", + "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", + "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "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" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", + "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", + "dev": true, + "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": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", + "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@module-federation/sdk": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.16.0.tgz", - "integrity": "sha512-UXJW1WWuDoDmScX0tpISjl4xIRPzAiN62vg9etuBdAEUM+ja9rz/zwNZaByiUPFS2aqlj2RHenCRvIapE8mYEg==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, - "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.16.0.tgz", - "integrity": "sha512-yqIDQTelJZP0Rxml0OXv4Er8Kbdxy7NFh6PCzPwDFWI1SkiokJ3uXQJBvtlxZ3lOnCDYOzdHstqa8sJG4JP02Q==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.16.0", - "@module-federation/sdk": "0.16.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "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/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^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.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", - "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", - "cpu": [ - "x64" - ], + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.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==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rsbuild/core": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.4.8.tgz", - "integrity": "sha512-IJhpLl8lrp5ynlf04V5l7rMrVTNuGLG36ZDadHiBIC5qLRGSS3rMF8cVLSkSA6qM1OiRlPpMgwQbqFYh325RvQ==", + "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.", "dev": true, "license": "MIT", "dependencies": { - "@rspack/core": "1.4.8", - "@rspack/lite-tapable": "~1.0.1", - "@swc/helpers": "^0.5.17", - "core-js": "~3.44.0", - "jiti": "^2.4.2" + "@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": { - "rsbuild": "bin/rsbuild.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=16.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@rslib/core": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@rslib/core/-/core-0.10.6.tgz", - "integrity": "sha512-7OLdmmQbY116gNAAsY9baCid9REr+z11qfAzwVVFw+Q8avCE6YqpcBLfrBXlfmpBikfshDmHH8EpRrQwz8gZJQ==", + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, "license": "MIT", "dependencies": { - "@rsbuild/core": "~1.4.7", - "rsbuild-plugin-dts": "0.10.6", - "tinyglobby": "^0.2.14" - }, - "bin": { - "rslib": "bin/rslib.js" + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" }, "engines": { - "node": ">=16.7.0" + "node": "^10.12.0 || >=12.0.0" }, "peerDependencies": { - "@microsoft/api-extractor": "^7", - "typescript": "^5" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "typescript": { - "optional": true - } + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" } }, - "node_modules/@rspack/binding": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.4.8.tgz", - "integrity": "sha512-VKE+2InUdudBUOn3xMZfK9a6KlOwmSifA0Nupjsh7N9/brcBfJtJGSDCnfrIKCq54FF+QAUCgcNAS0DB4/tZmw==", + "node_modules/eslint-config-airbnb-base/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, - "license": "MIT", - "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.4.8", - "@rspack/binding-darwin-x64": "1.4.8", - "@rspack/binding-linux-arm64-gnu": "1.4.8", - "@rspack/binding-linux-arm64-musl": "1.4.8", - "@rspack/binding-linux-x64-gnu": "1.4.8", - "@rspack/binding-linux-x64-musl": "1.4.8", - "@rspack/binding-wasm32-wasi": "1.4.8", - "@rspack/binding-win32-arm64-msvc": "1.4.8", - "@rspack/binding-win32-ia32-msvc": "1.4.8", - "@rspack/binding-win32-x64-msvc": "1.4.8" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.4.8.tgz", - "integrity": "sha512-BVkOfJDZnexHNpGgc/sWENyGrsle1jUQTeUEdSyNYsu4Elsgk/T9gnGK8xyLRd2c6k20M5FN38t0TumCp4DscQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/core": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.4.8.tgz", - "integrity": "sha512-ARHuZ+gx3P//RIUKSjk/riQUn/D5tCwCWbfgeM5pk/Ti2JsgVnqiP9Sksge8JovVPf7b6Zgw73Cq5FpX4aOXeQ==", + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.16.0", - "@rspack/binding": "1.4.8", - "@rspack/lite-tapable": "1.0.1" + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" }, "engines": { - "node": ">=16.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" }, "peerDependencies": { - "@swc/helpers": ">=0.5.1" + "unrs-resolver": "^1.0.0" }, "peerDependenciesMeta": { - "@swc/helpers": { + "unrs-resolver": { "optional": true } } }, - "node_modules/@rspack/lite-tapable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", - "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "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==", "dev": true, "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, - "license": "Apache-2.0", "dependencies": { - "tslib": "^2.8.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*" + "ms": "^2.1.1" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.0.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", - "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", + "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "undici-types": "~7.8.0" + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz", - "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==", + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/type-utils": "8.37.0", - "@typescript-eslint/utils": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "debug": "^3.2.7" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=4" }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.37.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "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==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz", - "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", - "debug": "^4.3.4" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=4" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz", - "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.37.0", - "@typescript-eslint/types": "^8.37.0", - "debug": "^4.3.4" + "ms": "^2.1.1" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "node": ">=0.10.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz", - "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==", + "node_modules/eslint-plugin-import/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==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "minimist": "^1.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz", - "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==", + "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==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/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==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz", - "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==", + "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==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/utils": "8.37.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz", - "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz", - "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.37.0", - "@typescript-eslint/tsconfig-utils": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/visitor-keys": "8.37.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "type-fest": "^0.20.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "brace-expansion": "^2.0.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" }, "engines": { - "node": ">=10" + "node": ">=0.10" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz", - "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.37.0", - "@typescript-eslint/types": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0" + "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "node": ">=4.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz", - "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.37.0", - "eslint-visitor-keys": "^4.2.1" - }, + "@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, + "license": "BSD-2-Clause", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=0.10.0" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12.0.0" } }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=8.6.0" } }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "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": "MIT", + "license": "ISC", "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "is-glob": "^4.0.1" }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "engines": { + "node": ">= 6" } }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "reusify": "^1.0.4" } }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "funding": { - "url": "https://opencollective.com/vitest" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "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, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" + "flat-cache": "^3.0.4" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "to-regex-range": "^5.0.1" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=8" } }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "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==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=0.4.0" + "node": "^10.12.0 || >=12.0.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==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } + "license": "ISC" }, - "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/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "is-callable": "^1.2.7" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" - }, - "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==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, - "license": "Python-2.0" + "license": "ISC" }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" + "node": "^8.16.0 || ^10.6.0 || >=11.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/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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "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": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "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==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "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" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "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/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 16" + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "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==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "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": ">=7.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/core-js": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", - "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "dev": true, "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } - }, - "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==", + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, - "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escape-string-regexp": { + "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", - "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.31.0", - "@eslint/plugin-kit": "^0.3.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "dunder-proto": "^1.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "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==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "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/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">= 0.4" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 4" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.8.19" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "once": "^1.3.0", + "wrappy": "1" } }, - "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==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expect-type": { + "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "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.8" + "hasown": "^2.0.2" }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/is-data-view": { + "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==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "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==", "dev": true, "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "call-bound": "^1.0.3" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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/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==", "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "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==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "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==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=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==", + "node_modules/is-regex": { + "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==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "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==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/is-shared-array-buffer": { + "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==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">= 4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "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==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" + }, + "funding": { + "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, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1797,7 +4411,21 @@ "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 + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/keyv": { "version": "4.5.4", @@ -1814,6 +4442,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1827,6 +4456,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -1841,7 +4471,8 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/loupe": { "version": "3.1.4", @@ -1860,6 +4491,16 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1902,6 +4543,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" }, @@ -1914,6 +4556,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1944,34 +4587,194 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz", + "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "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 + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "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" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1987,6 +4790,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -2015,10 +4819,21 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2029,6 +4844,13 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -2066,6 +4888,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -2100,6 +4932,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -2151,10 +4984,55 @@ ], "license": "MIT" }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-from-app-root": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/require-from-app-root/-/require-from-app-root-0.2.1.tgz", "integrity": "sha512-TuNPLCO3uAA6Za80Vtz9F8YL0KpJiJ+ZQxOhdyV0N9j1VzweqXuHqVgacBdYo+25rWPA9jzqusijtKiTd2vW2g==", + "license": "MIT", "dependencies": { "@types/node": "^10.0.0", "app-root-dir": "^1.0.2" @@ -2166,6 +5044,27 @@ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "license": "MIT" }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "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-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2176,6 +5075,16 @@ "node": ">=4" } }, + "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/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -2187,6 +5096,23 @@ "node": ">=0.10.0" } }, + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { "version": "4.45.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", @@ -2257,34 +5183,6 @@ } } }, - "node_modules/rsbuild-plugin-dts/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, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/rsbuild-plugin-dts/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2306,7 +5204,124 @@ ], "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "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": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/shebang-command": { @@ -2332,6 +5347,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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" + }, + "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", @@ -2349,6 +5440,16 @@ "node": ">=0.10.0" } }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -2363,11 +5464,98 @@ "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trim": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "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.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "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" } @@ -2403,6 +5591,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2410,6 +5599,26 @@ "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT" + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -2497,6 +5706,21 @@ "typescript": ">=4.8.4" } }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -2509,6 +5733,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -2516,6 +5741,97 @@ "node": ">= 0.8.0" } }, + "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -2530,28 +5846,23 @@ "node": ">=14.17" } }, - "node_modules/typescript-eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.37.0.tgz", - "integrity": "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==", + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.37.0", - "@typescript-eslint/parser": "8.37.0", - "@typescript-eslint/typescript-estree": "8.37.0", - "@typescript-eslint/utils": "8.37.0" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undici-types": { @@ -2561,6 +5872,41 @@ "dev": true, "license": "MIT" }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2572,24 +5918,24 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", + "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", + "fdir": "^6.4.6", "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -2598,14 +5944,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -2758,6 +6104,95 @@ "node": ">= 8" } }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "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.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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", @@ -2775,11 +6210,29 @@ "node": ">=8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/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/package.json b/package.json index 3354d86..2cb69ca 100644 --- a/package.json +++ b/package.json @@ -35,11 +35,15 @@ "devDependencies": { "@rslib/core": "^0.10.6", "@types/node": "^24.0.15", - "eslint": "^9.30.0", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^8.57.1", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", "globals": "^16.2.0", "prettier": "^3.6.2", "typescript": "^5.8.3", - "typescript-eslint": "^8.35.1", "vitest": "^3.2.4" } } diff --git a/src/client.ts b/src/client.ts index ab5d110..1c28fa0 100644 --- a/src/client.ts +++ b/src/client.ts @@ -23,9 +23,12 @@ const CONNECTOR_PREFIX = 'pc'; export default class TouchPortalClient extends EventEmitter { private pluginId?: string; + private socket: net.Socket | null; + private customStates: Record; - private logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void; + + private logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void | null; /** * Creates an instance of TouchPortalClient. @@ -208,7 +211,13 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('updateSpecificChoice: value parameter must be an array'); } - const request: UpdateSpecificChoiceListRequest = { type: 'choiceUpdate', id, instanceId, value }; + const request: UpdateSpecificChoiceListRequest = { + type: 'choiceUpdate', + id, + instanceId, + value + }; + this.send(request); } @@ -231,8 +240,8 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('updateMultipleConnectors: connectors contains no data'); } - const request: UpdateConnectorDataRequest[] = connectors.map((connector) => - this.buildUpdateConnectorDataRequest(connector.value, connector.connectorId, connector.shortId, connector.data) + const request: UpdateConnectorDataRequest[] = connectors.map( + (connector) => this.buildUpdateConnectorDataRequest(connector.value, connector.connectorId, connector.shortId, connector.data) ); this.sendArray(request); @@ -271,7 +280,7 @@ export default class TouchPortalClient extends EventEmitter { if (connectorId) { const dataStr = Object.entries(data || {}) - .map(([key, value]) => `${key}=${value}`) + .map(([settingKey, settingValue]) => `${settingKey}=${settingValue}`) .join('|'); return { @@ -291,7 +300,14 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('showNotification: at least one option is required'); } - const request: CreateNotificationRequest = { type: 'showNotification', notificationId, title, msg, options }; + const request: CreateNotificationRequest = { + type: 'showNotification', + notificationId, + title, + msg, + options + }; + this.send(request); } @@ -338,7 +354,7 @@ export default class TouchPortalClient extends EventEmitter { }[] ): void { if (states?.length <= 0) { - this.log(LoggingLevel.ERROR, 'createMultipleStates : states contains no data'); + this.log(LoggingLevel.ERROR, 'createMultipleStates: states contains no data'); throw new Error('createMultipleStates: states contains no data'); } @@ -374,7 +390,7 @@ export default class TouchPortalClient extends EventEmitter { public updateMultpleStates(states: { id: string; value: string | number | boolean }[]): void { if (states?.length <= 0) { - this.log(LoggingLevel.ERROR, 'updateMultpleStates : states contains no data'); + this.log(LoggingLevel.ERROR, 'updateMultpleStates: states contains no data'); throw new Error('updateMultpleStates: states contains no data'); } @@ -389,8 +405,8 @@ export default class TouchPortalClient extends EventEmitter { public removeState(id: string): void { if (!id) { - this.log(LoggingLevel.ERROR, `removeState: id parameter is empty`); - throw new Error(`removeState: id parameter is empty`); + this.log(LoggingLevel.ERROR, 'removeState: id parameter is empty'); + throw new Error('removeState: id parameter is empty'); } delete this.customStates[id]; @@ -399,15 +415,14 @@ export default class TouchPortalClient extends EventEmitter { this.send(request); } - // Internal - private send(data: unknown): void { + public send(data: unknown): void { this.socket?.write(JSON.stringify(data)); this.socket?.write('\n'); } - private sendArray(dataArray: unknown[]): void { + public sendArray(dataArray: unknown[]): void { if (dataArray.length <= 0) { - this.log(LoggingLevel.ERROR, 'sendArray : dataArray has no length'); + this.log(LoggingLevel.ERROR, 'sendArray: dataArray has no length'); throw new Error('sendArray: dataArray has no length'); } @@ -420,15 +435,16 @@ export default class TouchPortalClient extends EventEmitter { this.socket?.write(dataStr); } + // Internal private pair(): void { this.send({ type: 'pair', id: this.pluginId }); } private log(level: LoggingLevel, ...args: unknown[]): void { - if (this.logCallback) { - this.logCallback(level, ...args); - } else { + if (this.logCallback === undefined) { console.log(`${new Date().toISOString()} : ${this.pluginId} :${level}:`, ...args); + } else if (this.logCallback !== null) { + this.logCallback(level, ...args); } } } diff --git a/src/index.ts b/src/index.ts index 7ff6368..96d6e9b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,8 @@ import TouchPortalClient from './client'; +const TouchPortalAPI: { Client: typeof TouchPortalClient } = { + Client: TouchPortalClient +}; + export * from './types'; -export { TouchPortalClient }; +export default TouchPortalAPI; diff --git a/src/types/events/broadcast-event.ts b/src/types/events/broadcast-event.ts index d40dabd..2943186 100644 --- a/src/types/events/broadcast-event.ts +++ b/src/types/events/broadcast-event.ts @@ -10,7 +10,7 @@ * @property event - The type of broadcast event that is triggered. Currently only the "pageChange" is supported. * @property pageName - (Optional) The name of the page navigated to. The value will be send only when the broadcast is of the type "pageChange". * @property previousPageName - (Optional) The name of the page navigated from. The value will be send only when the broadcast is of the type "pageChange". - * @property deviceIp - (Optional) The device ip of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". + * @property deviceIp - (Optional) The device ip of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". * @property deviceName - (Optional) The device name of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". * @property deviceId - (Optional) The device id (set for multiple devices upgrade) of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". */ diff --git a/src/types/touch-portal-client-options.ts b/src/types/touch-portal-client-options.ts index 7f457fd..1778570 100644 --- a/src/types/touch-portal-client-options.ts +++ b/src/types/touch-portal-client-options.ts @@ -10,5 +10,5 @@ import { LoggingLevel } from './logging-level'; export type TouchPortalClientOptions = { pluginId?: string; captureRejections?: boolean; - logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void; + logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void | null; }; From c310d3020df4c11a3853474c052ce37561cbb9ef Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Tue, 22 Jul 2025 06:39:23 +0100 Subject: [PATCH 03/12] vscode settings for prettier endofline --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index bf4ab21..4736a2d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ "prettier.trailingComma": "none", "prettier.bracketSameLine": true, "prettier.htmlWhitespaceSensitivity": "ignore", - "prettier.endOfLine": "auto", + "prettier.endOfLine": "lf", "prettier.printWidth": 120, "typescript.preferences.quoteStyle": "single" } From 96ac048dad2bac1bd0f2b5fa4a32e9a7bdb14b32 Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Tue, 22 Jul 2025 21:14:08 +0100 Subject: [PATCH 04/12] Adds missing request, event adds markdown files to prettierignore add a reuseable helper for validating arrays --- .eslintrc.json | 1 + .prettierignore | 2 + .vscode/settings.json | 1 + src/client.ts | 51 +++++++++++++++---------- src/types/events/device-info.ts | 12 ++++++ src/types/events/index.ts | 2 + src/types/events/info-event.ts | 26 +++++++++++++ src/types/index.ts | 1 + src/types/models/connector-data.ts | 10 +++++ src/types/models/index.ts | 1 + src/types/requests/index.ts | 1 + src/types/requests/pair/pair-request.ts | 8 ++++ 12 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 src/types/events/device-info.ts create mode 100644 src/types/events/info-event.ts create mode 100644 src/types/models/connector-data.ts create mode 100644 src/types/models/index.ts create mode 100644 src/types/requests/pair/pair-request.ts diff --git a/.eslintrc.json b/.eslintrc.json index 154a185..1cb7346 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,6 +23,7 @@ "no-continue": "off", "no-param-reassign": "off", "comma-dangle": "off", + "class-methods-use-this": "off", "import/extensions": "off", "import/prefer-default-export": "off" }, diff --git a/.prettierignore b/.prettierignore index ff6fd30..22c34f7 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,4 @@ # Lock files package-lock.json +CHANGELOG.md +README.md diff --git a/.vscode/settings.json b/.vscode/settings.json index 4736a2d..bd4f759 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { + "files.eol": "\n", "[typescript]": { "editor.tabSize": 2, "editor.defaultFormatter": "esbenp.prettier-vscode" diff --git a/src/client.ts b/src/client.ts index 1c28fa0..dfcd2fe 100644 --- a/src/client.ts +++ b/src/client.ts @@ -14,7 +14,9 @@ import { UpdateStateRequest, ActionData, UpdateActionDataRequest, - UpdateConnectorDataRequest + UpdateConnectorDataRequest, + PairRequest, + ConnectorData } from './types'; const SOCKET_IP = '127.0.0.1'; @@ -53,8 +55,8 @@ export default class TouchPortalClient extends EventEmitter { } if (!this.pluginId) { - this.log(LoggingLevel.ERROR, 'connect: Plugin ID is missing or empty.'); - throw new Error('connect: Plugin ID is missing or empty.'); + this.log(LoggingLevel.ERROR, 'connect: pluginId is missing or empty.'); + throw new Error('connect: pluginId is missing or empty.'); } this.socket = new net.Socket(); @@ -186,7 +188,7 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('updateChoice: id parameter is empty'); } - if (!Array.isArray(value)) { + if (!this.isValidArray(value, false)) { this.log(LoggingLevel.ERROR, 'updateChoice: value parameter must be an array'); throw new Error('updateChoice: value parameter must be an array'); } @@ -206,7 +208,7 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('updateSpecificChoice: instanceId is not populated'); } - if (!Array.isArray(value)) { + if (!this.isValidArray(value, false)) { this.log(LoggingLevel.ERROR, 'updateSpecificChoice: value parameter must be an array'); throw new Error('updateSpecificChoice: value parameter must be an array'); } @@ -222,7 +224,7 @@ export default class TouchPortalClient extends EventEmitter { } // Connectors - public updateConnector(value: number, connectorId?: string, shortId?: string, data?: Record): void { + public updateConnector(value: number, connectorId?: string, shortId?: string, data?: ConnectorData[]): void { const request = this.buildUpdateConnectorDataRequest(value, connectorId, shortId, data); this.send(request); } @@ -232,11 +234,11 @@ export default class TouchPortalClient extends EventEmitter { value: number; connectorId?: string; shortId?: string; - data?: Record; + data?: ConnectorData[]; }[] ): void { - if (connectors?.length <= 0) { - this.log(LoggingLevel.ERROR, 'updateMultipleConnectors : connectors contains no data'); + if (!this.isValidArray(connectors, true)) { + this.log(LoggingLevel.ERROR, 'updateMultipleConnectors: connectors contains no data'); throw new Error('updateMultipleConnectors: connectors contains no data'); } @@ -251,7 +253,7 @@ export default class TouchPortalClient extends EventEmitter { value: number, connectorId?: string, shortId?: string, - data?: Record + data?: ConnectorData[] ): UpdateConnectorDataRequest { if (value < 0 || value > 100) { this.log(LoggingLevel.ERROR, `connectorUpdate: value has to be between 0 and 100 ${value}`); @@ -268,19 +270,18 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('connectorUpdate: both connectorId and shortId are provided'); } - if (connectorId && !Object.keys(data || {}).length) { + if (connectorId && !this.isValidArray(data, false)) { this.log(LoggingLevel.ERROR, 'connectorUpdate: when connectorId is provided, data must be an array'); throw new Error('connectorUpdate: when connectorId is provided, data must be an array'); } - if (shortId && Object.keys(data || {}).length >= 0) { + if (shortId && this.isValidArray(data, false)) { this.log(LoggingLevel.ERROR, 'connectorUpdate: when shortId is provided, data is not allowed'); throw new Error('connectorUpdate: when shortId is provided, data is not allowed'); } if (connectorId) { - const dataStr = Object.entries(data || {}) - .map(([settingKey, settingValue]) => `${settingKey}=${settingValue}`) + const dataStr = data!.map((item) => `${item.id}=${item.value}`) .join('|'); return { @@ -295,7 +296,7 @@ export default class TouchPortalClient extends EventEmitter { // Notifications public showNotification(notificationId: string, title: string, msg: string, options: NotificationOption[]): void { - if (options?.length <= 0) { + if (!this.isValidArray(options, true)) { this.log(LoggingLevel.ERROR, 'showNotification: at least one option is required'); throw new Error('showNotification: at least one option is required'); } @@ -353,7 +354,7 @@ export default class TouchPortalClient extends EventEmitter { forceUpdate?: boolean; }[] ): void { - if (states?.length <= 0) { + if (!this.isValidArray(states, true)) { this.log(LoggingLevel.ERROR, 'createMultipleStates: states contains no data'); throw new Error('createMultipleStates: states contains no data'); } @@ -388,8 +389,8 @@ export default class TouchPortalClient extends EventEmitter { this.send(request); } - public updateMultpleStates(states: { id: string; value: string | number | boolean }[]): void { - if (states?.length <= 0) { + public updateMultipleStates(states: { id: string; value: string | number | boolean }[]): void { + if (!this.isValidArray(states, true)) { this.log(LoggingLevel.ERROR, 'updateMultpleStates: states contains no data'); throw new Error('updateMultpleStates: states contains no data'); } @@ -421,7 +422,7 @@ export default class TouchPortalClient extends EventEmitter { } public sendArray(dataArray: unknown[]): void { - if (dataArray.length <= 0) { + if (!this.isValidArray(dataArray, true)) { this.log(LoggingLevel.ERROR, 'sendArray: dataArray has no length'); throw new Error('sendArray: dataArray has no length'); } @@ -437,7 +438,17 @@ export default class TouchPortalClient extends EventEmitter { // Internal private pair(): void { - this.send({ type: 'pair', id: this.pluginId }); + if (!this.pluginId) { + this.log(LoggingLevel.ERROR, 'pair: pluginId is missing or empty.'); + throw new Error('pair: pluginId is missing or empty.'); + } + + const request: PairRequest = { type: 'pair', id: this.pluginId }; + this.send(request); + } + + private isValidArray(data: unknown[] | undefined, mustHaveData: boolean): boolean { + return mustHaveData ? Array.isArray(data) && data.length > 0 : Array.isArray(data); } private log(level: LoggingLevel, ...args: unknown[]): void { diff --git a/src/types/events/device-info.ts b/src/types/events/device-info.ts new file mode 100644 index 0000000..21e3ccf --- /dev/null +++ b/src/types/events/device-info.ts @@ -0,0 +1,12 @@ +/** + * Represents a device associated with an event. + * + * @property tpDeviceId - The id of the device. + * @property currentPagePath - The page the device is currently on. + * @property deviceName - The name of the device. + */ +export type DeviceInfo = { + tpDeviceId: string; + currentPagePath: string; + deviceName: string; +}; diff --git a/src/types/events/index.ts b/src/types/events/index.ts index 424357d..4b86523 100644 --- a/src/types/events/index.ts +++ b/src/types/events/index.ts @@ -1,4 +1,6 @@ export * from './event-data'; +export * from './device-info'; +export * from './info-event'; export * from './execute-action-event'; export * from './action-hold-info-event'; export * from './connector-change-event'; diff --git a/src/types/events/info-event.ts b/src/types/events/info-event.ts new file mode 100644 index 0000000..181de00 --- /dev/null +++ b/src/types/events/info-event.ts @@ -0,0 +1,26 @@ +import { DeviceInfo } from './device-info'; + +/** + * Represents an informational event received from Touch Portal. + * + * @property type The type of the event, always set to 'info'. + * @property sdkVersion The version of the SDK in use. + * @property tpVersionString The Touch Portal version as a string. + * @property tpVersionCode The Touch Portal version as a numeric code. + * @property pluginVersion The version of the plugin. + * @property settings An array of settings objects, each represented as a record of string key-value pairs. + * @property currentPagePathMainDevice The current page path for the main device. + * @property currentPagePathSecondaryDevices An array of device information for secondary devices. + * @property status The current status of the plugin. + */ +export type InfoEvent = { + type: 'info'; + sdkVersion: string; + tpVersionString: string; + tpVersionCode: number; + pluginVersion: number; + settings: Record[]; + currentPagePathMainDevice: string; + currentPagePathSecondaryDevices: DeviceInfo[]; + status: string; +}; diff --git a/src/types/index.ts b/src/types/index.ts index df2227e..b2157dd 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,5 +1,6 @@ export * from './events'; export * from './requests'; +export * from './models'; export * from './logging-level'; export * from './touch-portal-client-options'; export * from './touch-portal-connect-options'; diff --git a/src/types/models/connector-data.ts b/src/types/models/connector-data.ts new file mode 100644 index 0000000..b2b91c2 --- /dev/null +++ b/src/types/models/connector-data.ts @@ -0,0 +1,10 @@ +/** + * Represents the data associated with a connector. + * + * @property id - The id of the data field. + * @property value - The value of the data field. + */ +export type ConnectorData = { + id: string; + value: string; +}; diff --git a/src/types/models/index.ts b/src/types/models/index.ts new file mode 100644 index 0000000..7fbf006 --- /dev/null +++ b/src/types/models/index.ts @@ -0,0 +1 @@ +export * from './connector-data'; diff --git a/src/types/requests/index.ts b/src/types/requests/index.ts index c013bc6..40a9ab3 100644 --- a/src/types/requests/index.ts +++ b/src/types/requests/index.ts @@ -6,6 +6,7 @@ export * from './choices/update-specifc-choice-list-request'; export * from './connectors/update-connector-data-request'; export * from './events/trigger-event-request'; export * from './notifications/create-notification-request'; +export * from './pair/pair-request'; export * from './settings/update-setting-request'; export * from './states/create-state-request'; export * from './states/update-state-list-request'; diff --git a/src/types/requests/pair/pair-request.ts b/src/types/requests/pair/pair-request.ts new file mode 100644 index 0000000..a8c187c --- /dev/null +++ b/src/types/requests/pair/pair-request.ts @@ -0,0 +1,8 @@ +/** + * @property type - The type of the request, always set to 'pair'. + * @property id - The id of the plugin. + */ +export type PairRequest = { + type: 'pair'; + id: string; +} From 2d0607815677289079ee96b4cd45e8d4a5bdaf41 Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Wed, 23 Jul 2025 13:49:05 +0100 Subject: [PATCH 05/12] Adds tests for connect, disconnect and log (more still to come) --- .eslintrc.json | 14 +- .vscode/launch.json | 19 ++ .vscode/settings.json | 3 +- package.json | 5 +- src/client.ts | 22 +- src/types/touch-portal-client-options.ts | 2 +- tests/connect.spec.ts | 353 +++++++++++++++++++++++ tests/disconnect.spec.ts | 41 +++ tests/log.spec.ts | 57 ++++ tests/mocks/mock-socket.ts | 32 ++ tests/tsconfig.test.json | 10 + vitest.config.ts => vitest.config.mts | 2 +- 12 files changed, 541 insertions(+), 19 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 tests/connect.spec.ts create mode 100644 tests/disconnect.spec.ts create mode 100644 tests/log.spec.ts create mode 100644 tests/mocks/mock-socket.ts create mode 100644 tests/tsconfig.test.json rename vitest.config.ts => vitest.config.mts (82%) diff --git a/.eslintrc.json b/.eslintrc.json index 1cb7346..752ce52 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -24,6 +24,7 @@ "no-param-reassign": "off", "comma-dangle": "off", "class-methods-use-this": "off", + "lines-between-class-members": "off", "import/extensions": "off", "import/prefer-default-export": "off" }, @@ -32,5 +33,16 @@ "import/resolver": { "typescript": {} } - } + }, + "overrides": [ + { + "files": ["tests/**/*.ts", "vitest.config.mts"], + "parserOptions": { + "project": "./tests/tsconfig.test.json" + }, + "rules": { + "import/no-extraneous-dependencies": ["error", { "devDependencies": true }] + } + } + ] } diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0dabfda --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,19 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug Current Test File", + "autoAttachChildProcesses": true, + "skipFiles": ["/**", "**/node_modules/**"], + "program": "${workspaceRoot}/node_modules/vitest/vitest.mjs", + "args": ["run", "${relativeFile}"], + "smartStep": true, + "console": "integratedTerminal" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index bd4f759..e9b9215 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,5 +11,6 @@ "prettier.htmlWhitespaceSensitivity": "ignore", "prettier.endOfLine": "lf", "prettier.printWidth": 120, - "typescript.preferences.quoteStyle": "single" + "typescript.preferences.quoteStyle": "single", + "vitest.shellType": "terminal" } diff --git a/package.json b/package.json index 2cb69ca..66d2c76 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "dev": "rslib build --watch", "format": "prettier --write .", "lint": "eslint .", - "install": "npm run build" + "install": "npm run build", + "test": "vitest --config vitest.config.mts" }, "keywords": [ "TouchPortal" @@ -46,4 +47,4 @@ "typescript": "^5.8.3", "vitest": "^3.2.4" } -} +} \ No newline at end of file diff --git a/src/client.ts b/src/client.ts index dfcd2fe..0e38b58 100644 --- a/src/client.ts +++ b/src/client.ts @@ -25,12 +25,9 @@ const CONNECTOR_PREFIX = 'pc'; export default class TouchPortalClient extends EventEmitter { private pluginId?: string; - private socket: net.Socket | null; - private customStates: Record; - - private logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void | null; + private logCallback?: ((level: LoggingLevel, ...args: unknown[]) => void) | null; /** * Creates an instance of TouchPortalClient. @@ -99,7 +96,7 @@ export default class TouchPortalClient extends EventEmitter { case 'closePlugin': if (message.pluginId === this.pluginId) { this.emit('Close', message); - this.socket?.end(); + this.disconnect(); } break; case 'info': @@ -168,7 +165,7 @@ export default class TouchPortalClient extends EventEmitter { // Actions public updateActionData(data: ActionData, instanceId?: string): void { if ([data.id, data.minValue, data.maxValue, data.type].some((value) => value === undefined || value === '')) { - this.log(LoggingLevel.ERROR, 'updateActionData : required data is missing from instance', JSON.stringify(data)); + this.log(LoggingLevel.ERROR, 'updateActionData: required data is missing from instance', JSON.stringify(data)); throw new Error(`updateActionData: required data is missing from instance. ${JSON.stringify(data)}`); } @@ -242,8 +239,8 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('updateMultipleConnectors: connectors contains no data'); } - const request: UpdateConnectorDataRequest[] = connectors.map( - (connector) => this.buildUpdateConnectorDataRequest(connector.value, connector.connectorId, connector.shortId, connector.data) + const request: UpdateConnectorDataRequest[] = connectors.map((connector) => + this.buildUpdateConnectorDataRequest(connector.value, connector.connectorId, connector.shortId, connector.data) ); this.sendArray(request); @@ -281,8 +278,7 @@ export default class TouchPortalClient extends EventEmitter { } if (connectorId) { - const dataStr = data!.map((item) => `${item.id}=${item.value}`) - .join('|'); + const dataStr = data!.map((item) => `${item.id}=${item.value}`).join('|'); return { type: 'connectorUpdate', @@ -452,10 +448,10 @@ export default class TouchPortalClient extends EventEmitter { } private log(level: LoggingLevel, ...args: unknown[]): void { - if (this.logCallback === undefined) { - console.log(`${new Date().toISOString()} : ${this.pluginId} :${level}:`, ...args); - } else if (this.logCallback !== null) { + if (typeof this.logCallback === 'function') { this.logCallback(level, ...args); + } else if (this.logCallback === undefined) { + console.log(`${new Date().toISOString()} : ${this.pluginId || ''} :${level}:`, ...args); } } } diff --git a/src/types/touch-portal-client-options.ts b/src/types/touch-portal-client-options.ts index 1778570..8a88a5c 100644 --- a/src/types/touch-portal-client-options.ts +++ b/src/types/touch-portal-client-options.ts @@ -10,5 +10,5 @@ import { LoggingLevel } from './logging-level'; export type TouchPortalClientOptions = { pluginId?: string; captureRejections?: boolean; - logCallback?: (loggingLevel: LoggingLevel, ...args: unknown[]) => void | null; + logCallback?: ((level: LoggingLevel, ...args: unknown[]) => void) | null; }; diff --git a/tests/connect.spec.ts b/tests/connect.spec.ts new file mode 100644 index 0000000..b9d1aaf --- /dev/null +++ b/tests/connect.spec.ts @@ -0,0 +1,353 @@ +import { + describe, + expect, + Mock, + test, + vi +} from 'vitest'; +import { getMockSocketFrom } from './mocks/mock-socket'; +import TouchPortalClient from '../src/client'; +import { PairRequest, TouchPortalClientOptions, TouchPortalConnectOptions } from '../src/types'; + +describe('connect', () => { + const pluginId: string = 'test.plugin'; + const logCallback: Mock = vi.fn(); + const defaultConstructorOptions: TouchPortalClientOptions = { pluginId, logCallback }; + + test.each([ + null, + undefined, + {}, + { pluginId: null }, + { pluginId: undefined }, + { pluginId: '' } + ] as TouchPortalConnectOptions[])('throws if "pluginId" is invaid value', (options) => { + const client = new TouchPortalClient({ logCallback }); + + expect(() => client.connect(options)).toThrow('connect: pluginId is missing or empty.'); + }); + + test('on connect emits "connected" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('connected', listener); + + const mockSocket = getMockSocketFrom(() => client.connect()); + + expect(mockSocket.connect).toHaveBeenCalled(); + expect(listener).toHaveBeenCalled(); + }); + + test('on connect sends "pair" request', () => { + const expectedPairRequest: PairRequest = { type: 'pair', id: pluginId }; + const client = new TouchPortalClient(defaultConstructorOptions); + const mockSocket = getMockSocketFrom(() => client.connect()); + + expect(mockSocket.connect).toHaveBeenCalled(); + expect(mockSocket.write).toHaveBeenCalled(); + expect(mockSocket.write.mock.calls).toEqual([[JSON.stringify(expectedPairRequest)], ['\n']]); + }); + + describe('event handling', () => { + test('on "data" should handle partial messages', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Message', listener); + + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', '{"id":'); + mockSocket.emit('data', '123}\n'); + + expect(listener).toHaveBeenCalledWith({ id: 123 }); + }); + + test('on "data" should handle multiple messages', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Message', listener); + + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', '{"id":1}\n{"id":2}\n'); + + expect(listener).toHaveBeenCalledTimes(2); + expect(listener).toHaveBeenCalledWith({ id: 1 }); + expect(listener).toHaveBeenCalledWith({ id: 2 }); + }); + + test('on "error" emits "socketError" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('socketError', listener); + + const testError = new Error('Test socket failure'); + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('error', testError); + + expect(listener).toHaveBeenCalledWith(testError); + }); + + test.each([ + true, + false + ])('on "close" emits "disconnected" event', (hasError) => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('disconnected', listener); + + const mockSocket = getMockSocketFrom(() => client.connect({ exitOnClose: false })); + mockSocket.emit('close', hasError); + + expect(listener).toHaveBeenCalledWith(hasError); + }); + + test.each([ + { shouldCallExit: true }, + { options: null, shouldCallExit: true }, + { options: {}, shouldCallExit: true }, + { options: { exitOnClose: true }, shouldCallExit: true }, + { options: { exitOnClose: false }, shouldCallExit: false } + ])('on "close" should handle exiting the process', ({ options, shouldCallExit }) => { + const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => { + throw new Error('exit'); + }); + + const client = new TouchPortalClient(defaultConstructorOptions); + const mockSocket = getMockSocketFrom(() => client.connect(options as TouchPortalConnectOptions)); + + if (shouldCallExit) { + expect(() => mockSocket.emit('close', false)).toThrow('exit'); + expect(exitSpy).toHaveBeenCalledWith(0); + } else { + expect(() => mockSocket.emit('close', false)).not.toThrow('exit'); + expect(exitSpy).not.toBeCalled(); + } + + exitSpy.mockRestore(); + }); + + describe('touch portal events', () => { + describe('closePlugin', () => { + test.each([ + { type: 'closePlugin' }, + { type: 'closePlugin', pluginId: null }, + { type: 'closePlugin', pluginId: '' }, + { type: 'closePlugin', pluginId: 'test.anotherPlugin' } + ])('"closePlugin" should ignore if message pluginId differs', (message) => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Close', listener); + + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).not.toBeCalled(); + }); + + test('"closePlugin" should emit "close" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Close', listener); + + const message = { type: 'closePlugin', pluginId }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + + test('"closePlugin" should disconnect the socket', () => { + const client = new TouchPortalClient(defaultConstructorOptions); + const message = { type: 'closePlugin', pluginId }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(mockSocket.end).toHaveBeenCalled(); + }); + }); + + describe('info', () => { + test('"info" should emit "Info" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Info', listener); + + const message = { type: 'info' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + + test.each([ + { message: { type: 'info' }, shouldEmitSettings: false }, + { message: { type: 'info', settings: undefined }, shouldEmitSettings: false }, + { message: { type: 'info', settings: null }, shouldEmitSettings: false }, + { message: { type: 'info', settings: {} }, shouldEmitSettings: true }, + { message: { type: 'info', settings: { setting: 'value' } }, shouldEmitSettings: true } + ])('"info" emits "Settings" event', ({ message, shouldEmitSettings }) => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Settings', listener); + + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + if (shouldEmitSettings) { + expect(listener).toHaveBeenCalledWith(message.settings); + } else { + expect(listener).not.toBeCalled(); + } + }); + }); + + describe('notificationOptionClicked', () => { + test('"notificationOptionClicked" should emit "NotificationClicked" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('NotificationClicked', listener); + + const message = { type: 'notificationOptionClicked' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + }); + + describe('settings', () => { + test.each([ + { type: 'settings' }, + { type: 'settings', values: null }, + { type: 'settings', values: {} }, + { type: 'settings', values: { setting: 'value' } } + ])('"settings" should emit "Settings" event', (message) => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Settings', listener); + + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message.values); + }); + }); + + describe('listChange', () => { + test('"listChange" should emit "ListChange" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('ListChange', listener); + + const message = { type: 'listChange' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + }); + + describe('action', () => { + test('"action" should emit "Action" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Action', listener); + + const message = { type: 'action' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message, null); + }); + }); + + describe('broadcast', () => { + test('"broadcast" should emit "Broadcast" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Broadcast', listener); + + const message = { type: 'broadcast' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + }); + + describe('shortConnectorIdNotification', () => { + test('"shortConnectorIdNotification" should emit "ConnectorShortIdNotification" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('ConnectorShortIdNotification', listener); + + const message = { type: 'shortConnectorIdNotification' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + }); + + describe('connectorChange', () => { + test('"connectorChange" should emit "ConnectorChange" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('ConnectorChange', listener); + + const message = { type: 'connectorChange' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + }); + + describe('up', () => { + test('"up" should emit "Action" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Action', listener); + + const message = { type: 'up' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message, false); + }); + }); + + describe('down', () => { + test('"down" should emit "Action" event', () => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Action', listener); + + const message = { type: 'down' }; + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message, true); + }); + }); + + describe('unhandled type', () => { + test.each([ + {}, + { type: undefined }, + { type: null }, + { type: '' }, + { type: 'unknown' } + ])('"down" should emit "Message" event', (message) => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Message', listener); + + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); + + expect(listener).toHaveBeenCalledWith(message); + }); + }); + }); + }); +}); diff --git a/tests/disconnect.spec.ts b/tests/disconnect.spec.ts new file mode 100644 index 0000000..63638b1 --- /dev/null +++ b/tests/disconnect.spec.ts @@ -0,0 +1,41 @@ +import { + describe, + expect, + Mock, + test, + vi +} from 'vitest'; +import { getMockSocketFrom } from './mocks/mock-socket'; +import TouchPortalClient from '../src/client'; +import { TouchPortalClientOptions } from '../src/types'; + +describe('disconnect', () => { + const pluginId: string = 'test.plugin'; + const logCallback: Mock = vi.fn(); + const defaultConstructorOptions: TouchPortalClientOptions = { pluginId, logCallback }; + + test('should call socket.end() if socket exists and is not destroyed', () => { + const client = new TouchPortalClient(defaultConstructorOptions); + const socket = getMockSocketFrom(() => client.connect()); + + client.disconnect(); + + expect(socket.end).toHaveBeenCalled(); + }); + + test('should not call socket.end() if socket is already destroyed', () => { + const client = new TouchPortalClient(defaultConstructorOptions); + const socket = getMockSocketFrom(() => client.connect()); + + socket.destroyed = true; + client.disconnect(); + + expect(socket.end).not.toHaveBeenCalled(); + }); + + test('should not throw if socket is null', () => { + const client = new TouchPortalClient(); + + expect(() => client.disconnect()).not.toThrow(); + }); +}); diff --git a/tests/log.spec.ts b/tests/log.spec.ts new file mode 100644 index 0000000..26e869a --- /dev/null +++ b/tests/log.spec.ts @@ -0,0 +1,57 @@ +import { + describe, + expect, + test, + vi +} from 'vitest'; +import TouchPortalClient from '../src/client'; +import { TouchPortalClientOptions } from '../src/types'; + +describe('log', () => { + test('should call logCallback when defined', async () => { + const logCallback = vi.fn(); + const client = new TouchPortalClient({ logCallback }); + + expect(() => client.connect()).toThrow(); + expect(logCallback).toHaveBeenCalled(); + + const [level, ...args] = logCallback.mock.calls[0]; + + expect(typeof level).toBe('string'); + expect(args.length).toBeGreaterThan(0); + }); + + test('should call console.log when logCallback is undefined', () => { + const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); + const client = new TouchPortalClient(); + + expect(() => client.connect()).toThrow(); + expect(logSpy).toHaveBeenCalled(); + logSpy.mockRestore(); + }); + + test('should not call console.log if logCallback is null', () => { + const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); + const client = new TouchPortalClient({ logCallback: null }); + + expect(() => client.connect()).toThrow(); + expect(logSpy).not.toHaveBeenCalled(); + + logSpy.mockRestore(); + }); + + test.each([ + { logCallback: '' }, + { logCallback: true }, + { logCallback: 1 }, + { logCallback: {} } + ] as unknown as TouchPortalClientOptions[])('should not call console.log if logCallback is not a function', (options) => { + const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); + const client = new TouchPortalClient(options); + + expect(() => client.connect()).toThrow(); + expect(logSpy).not.toHaveBeenCalled(); + + logSpy.mockRestore(); + }); +}); diff --git a/tests/mocks/mock-socket.ts b/tests/mocks/mock-socket.ts new file mode 100644 index 0000000..1ef4b01 --- /dev/null +++ b/tests/mocks/mock-socket.ts @@ -0,0 +1,32 @@ +import { vi } from 'vitest'; +import { EventEmitter } from 'events'; + +class MockSocket extends EventEmitter { + public destroyed = false; + public write = vi.fn(); + public setEncoding = vi.fn(); + public connect = vi.fn((_, __, cb) => cb()); + public end = vi.fn(() => { + this.destroyed = true; + }); +} + +const mockSocketFactory = vi.fn(() => new MockSocket()); + +vi.mock('net', () => ({ + Socket: mockSocketFactory, + default: { Socket: mockSocketFactory } +})); + +export function getMockSocketFrom(cb: () => void): MockSocket { + mockSocketFactory.mockClear(); + + cb(); + + const { results } = mockSocketFactory.mock; + if (results.length === 0) { + throw new Error('No mock socket instance was created during callback.'); + } + + return results[results.length - 1].value; +} diff --git a/tests/tsconfig.test.json b/tests/tsconfig.test.json new file mode 100644 index 0000000..9335240 --- /dev/null +++ b/tests/tsconfig.test.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["vitest"], + "module": "ESNext", + "target": "ESNext", + "noEmit": true + }, + "include": ["**/*.ts", "../vitest.config.mts"] +} diff --git a/vitest.config.ts b/vitest.config.mts similarity index 82% rename from vitest.config.ts rename to vitest.config.mts index 1473816..51b3155 100644 --- a/vitest.config.ts +++ b/vitest.config.mts @@ -3,7 +3,7 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { root: '.', - include: ['./src/**/*.spec.ts'], + include: ['./tests/**/*.spec.ts'], globals: true, watch: false, environment: 'node' From d2e64a6a214531f0f3745d295f62c16dc18c1cb3 Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Wed, 23 Jul 2025 18:21:23 +0100 Subject: [PATCH 06/12] Add check for update with tests, fix prettier and eslint battling it out --- .eslintrc.json | 9 ++- package-lock.json | 98 +++++++++++++++++++++++++ package.json | 4 +- src/client.ts | 35 ++++++++- src/types/requests/pair/pair-request.ts | 2 +- tests/check-for-update.spec.ts | 92 +++++++++++++++++++++++ tests/connect.spec.ts | 40 ++++------ tests/disconnect.spec.ts | 10 +-- tests/log.spec.ts | 30 ++++---- 9 files changed, 264 insertions(+), 56 deletions(-) create mode 100644 tests/check-for-update.spec.ts diff --git a/.eslintrc.json b/.eslintrc.json index 752ce52..1d049a9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -10,11 +10,12 @@ "sourceType": "module", "project": "./tsconfig.json" }, - "plugins": ["@typescript-eslint", "import"], + "plugins": ["@typescript-eslint", "import", "prettier"], "extends": [ "airbnb-base", "plugin:@typescript-eslint/recommended", - "plugin:import/typescript" + "plugin:import/typescript", + "plugin:prettier/recommended" ], "rules": { "global-require": "off", @@ -25,8 +26,10 @@ "comma-dangle": "off", "class-methods-use-this": "off", "lines-between-class-members": "off", + "consistent-return": "off", "import/extensions": "off", - "import/prefer-default-export": "off" + "import/prefer-default-export": "off", + "prettier/prettier": "error" }, "ignorePatterns": ["dist/", "*.config.ts"], "settings": { diff --git a/package-lock.json b/package-lock.json index 02470bc..e5098e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,8 +20,10 @@ "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.1", "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.3", "globals": "^16.2.0", "prettier": "^3.6.2", "typescript": "^5.8.3", @@ -912,6 +914,19 @@ "node": ">= 8" } }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.45.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", @@ -3065,6 +3080,22 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-context": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", @@ -3268,6 +3299,37 @@ "strip-bom": "^3.0.0" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz", + "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -3405,6 +3467,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -4953,6 +5022,19 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5612,6 +5694,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", diff --git a/package.json b/package.json index 66d2c76..c7c153f 100644 --- a/package.json +++ b/package.json @@ -40,11 +40,13 @@ "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.1", "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.3", "globals": "^16.2.0", "prettier": "^3.6.2", "typescript": "^5.8.3", "vitest": "^3.2.4" } -} \ No newline at end of file +} diff --git a/src/client.ts b/src/client.ts index 0e38b58..af324b8 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,5 +1,7 @@ import EventEmitter from 'events'; import net from 'net'; +import compareVersions from 'compare-versions'; +import { requireFromAppRoot } from 'require-from-app-root'; import { LoggingLevel, TouchPortalClientOptions, @@ -19,6 +21,7 @@ import { ConnectorData } from './types'; +const pluginVersion = requireFromAppRoot('package.json').version; const SOCKET_IP = '127.0.0.1'; const SOCKET_PORT = 12136; const CONNECTOR_PREFIX = 'pc'; @@ -43,6 +46,37 @@ export default class TouchPortalClient extends EventEmitter { this.logCallback = options?.logCallback; } + async checkForUpdate(githubUser: string, githubRepo: string, includePrerelease: boolean = false): Promise { + const updateUrl = `https://api.github.com/repos/${githubUser}/${githubRepo}/releases`; + + try { + const response = await fetch(updateUrl, { + headers: { 'User-Agent': this.pluginId } + }); + + if (!response.ok) { + throw new Error(`${this.pluginId}: Request failed with status ${response.status}`); + } + + const releases = (await response.json()) as { tag_name: string; prerelease: boolean }[]; + releases.some((release: { tag_name: string; prerelease: boolean }) => { + const releaseVersion = release.tag_name.replace(/^v/, ''); + + if (includePrerelease || !release.prerelease) { + if (compareVersions.compare(releaseVersion, pluginVersion, '>')) { + this.emit('Update', pluginVersion, releaseVersion); + return true; + } + } + + return false; + }); + } catch (ex: unknown) { + const err = ex instanceof Error ? ex : new Error(String(ex)); + this.log(LoggingLevel.ERROR, `checkForUpdate: Check for update failed: ${err.message}`); + } + } + // Connection public connect(options: TouchPortalConnectOptions = {}): void { const { pluginId, exitOnClose = true } = options ?? {}; @@ -242,7 +276,6 @@ export default class TouchPortalClient extends EventEmitter { const request: UpdateConnectorDataRequest[] = connectors.map((connector) => this.buildUpdateConnectorDataRequest(connector.value, connector.connectorId, connector.shortId, connector.data) ); - this.sendArray(request); } diff --git a/src/types/requests/pair/pair-request.ts b/src/types/requests/pair/pair-request.ts index a8c187c..77cf947 100644 --- a/src/types/requests/pair/pair-request.ts +++ b/src/types/requests/pair/pair-request.ts @@ -5,4 +5,4 @@ export type PairRequest = { type: 'pair'; id: string; -} +}; diff --git a/tests/check-for-update.spec.ts b/tests/check-for-update.spec.ts new file mode 100644 index 0000000..69639c3 --- /dev/null +++ b/tests/check-for-update.spec.ts @@ -0,0 +1,92 @@ +import { describe, expect, Mock, test, vi } from 'vitest'; +import { TouchPortalClientOptions } from '../src/types'; +import TouchPortalClient from '../src/client'; + +vi.mock('require-from-app-root', () => ({ + requireFromAppRoot: () => { + return { version: '1.0.0' }; + } +})); + +global.fetch = vi.fn(); + +describe('checkForUpdate', () => { + const pluginVersion = '1.0.0'; + const pluginId: string = 'test.plugin'; + const logCallback: Mock = vi.fn(); + const defaultConstructorOptions: TouchPortalClientOptions = { pluginId, logCallback }; + + test.each([ + { version: { tag_name: 'v1.3.0-beta', prerelease: true }, shouldEmitUpdate: false }, + { version: { tag_name: 'v1.2.0', prerelease: false }, shouldEmitUpdate: true }, + { version: { tag_name: 'v1.0.0', prerelease: false }, shouldEmitUpdate: false }, + { version: { tag_name: 'v0.1.0', prerelease: false }, shouldEmitUpdate: false } + ])('should emit a "Update" event if a newer stable version is found', async ({ version, shouldEmitUpdate }) => { + vi.mocked(fetch).mockResolvedValueOnce({ ok: true, json: async () => [version] } as Response); + + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Update', listener); + + await client.checkForUpdate('user', 'repo'); + + if (shouldEmitUpdate) { + expect(listener).toHaveBeenCalledWith(pluginVersion, version.tag_name.replace(/^v/, '')); + } else { + expect(listener).not.toHaveBeenCalled(); + } + }); + + test.each([ + { version: { tag_name: 'v1.3.0-beta', prerelease: true }, shouldEmitUpdate: true }, + { version: { tag_name: 'v1.2.0-alpha', prerelease: true }, shouldEmitUpdate: true }, + { version: { tag_name: 'v1.1.0', prerelease: false }, shouldEmitUpdate: true }, + { version: { tag_name: 'v1.0.0', prerelease: false }, shouldEmitUpdate: false }, + { version: { tag_name: 'v0.1.0', prerelease: false }, shouldEmitUpdate: false } + ])( + 'should emit a "Update" event if a newer stable or prerelease version is found', + async ({ version, shouldEmitUpdate }) => { + vi.mocked(fetch).mockResolvedValueOnce({ ok: true, json: async () => [version] } as Response); + + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Update', listener); + + await client.checkForUpdate('user', 'repo', true); + + if (shouldEmitUpdate) { + expect(listener).toHaveBeenCalledWith(pluginVersion, version.tag_name.replace(/^v/, '')); + } else { + expect(listener).not.toHaveBeenCalled(); + } + } + ); + + test('should log if fetch errors', async () => { + vi.mocked(fetch).mockRejectedValueOnce(new Error('Network fail')); + + const client = new TouchPortalClient(defaultConstructorOptions); + await client.checkForUpdate('user', 'repo'); + + expect(logCallback).toHaveBeenCalled(); + + const [level, ...args] = logCallback.mock.calls[0]; + + expect(typeof level).toBe('string'); + expect(args.length).toBeGreaterThan(0); + }); + + test('should log if response is not ok', async () => { + vi.mocked(fetch).mockResolvedValueOnce({ ok: false } as Response); + + const client = new TouchPortalClient(defaultConstructorOptions); + await client.checkForUpdate('user', 'repo'); + + expect(logCallback).toHaveBeenCalled(); + + const [level, ...args] = logCallback.mock.calls[0]; + + expect(typeof level).toBe('string'); + expect(args.length).toBeGreaterThan(0); + }); +}); diff --git a/tests/connect.spec.ts b/tests/connect.spec.ts index b9d1aaf..f2002b8 100644 --- a/tests/connect.spec.ts +++ b/tests/connect.spec.ts @@ -1,13 +1,7 @@ -import { - describe, - expect, - Mock, - test, - vi -} from 'vitest'; +import { describe, expect, Mock, test, vi } from 'vitest'; import { getMockSocketFrom } from './mocks/mock-socket'; -import TouchPortalClient from '../src/client'; import { PairRequest, TouchPortalClientOptions, TouchPortalConnectOptions } from '../src/types'; +import TouchPortalClient from '../src/client'; describe('connect', () => { const pluginId: string = 'test.plugin'; @@ -86,10 +80,7 @@ describe('connect', () => { expect(listener).toHaveBeenCalledWith(testError); }); - test.each([ - true, - false - ])('on "close" emits "disconnected" event', (hasError) => { + test.each([true, false])('on "close" emits "disconnected" event', (hasError) => { const listener = vi.fn(); const client = new TouchPortalClient(defaultConstructorOptions); client.on('disconnected', listener); @@ -331,22 +322,19 @@ describe('connect', () => { }); describe('unhandled type', () => { - test.each([ - {}, - { type: undefined }, - { type: null }, - { type: '' }, - { type: 'unknown' } - ])('"down" should emit "Message" event', (message) => { - const listener = vi.fn(); - const client = new TouchPortalClient(defaultConstructorOptions); - client.on('Message', listener); + test.each([{}, { type: undefined }, { type: null }, { type: '' }, { type: 'unknown' }])( + '"down" should emit "Message" event', + (message) => { + const listener = vi.fn(); + const client = new TouchPortalClient(defaultConstructorOptions); + client.on('Message', listener); - const mockSocket = getMockSocketFrom(() => client.connect()); - mockSocket.emit('data', `${JSON.stringify(message)}\n`); + const mockSocket = getMockSocketFrom(() => client.connect()); + mockSocket.emit('data', `${JSON.stringify(message)}\n`); - expect(listener).toHaveBeenCalledWith(message); - }); + expect(listener).toHaveBeenCalledWith(message); + } + ); }); }); }); diff --git a/tests/disconnect.spec.ts b/tests/disconnect.spec.ts index 63638b1..b9f04f9 100644 --- a/tests/disconnect.spec.ts +++ b/tests/disconnect.spec.ts @@ -1,13 +1,7 @@ -import { - describe, - expect, - Mock, - test, - vi -} from 'vitest'; +import { describe, expect, Mock, test, vi } from 'vitest'; import { getMockSocketFrom } from './mocks/mock-socket'; -import TouchPortalClient from '../src/client'; import { TouchPortalClientOptions } from '../src/types'; +import TouchPortalClient from '../src/client'; describe('disconnect', () => { const pluginId: string = 'test.plugin'; diff --git a/tests/log.spec.ts b/tests/log.spec.ts index 26e869a..56e9b12 100644 --- a/tests/log.spec.ts +++ b/tests/log.spec.ts @@ -1,11 +1,6 @@ -import { - describe, - expect, - test, - vi -} from 'vitest'; -import TouchPortalClient from '../src/client'; +import { describe, expect, test, vi } from 'vitest'; import { TouchPortalClientOptions } from '../src/types'; +import TouchPortalClient from '../src/client'; describe('log', () => { test('should call logCallback when defined', async () => { @@ -45,13 +40,16 @@ describe('log', () => { { logCallback: true }, { logCallback: 1 }, { logCallback: {} } - ] as unknown as TouchPortalClientOptions[])('should not call console.log if logCallback is not a function', (options) => { - const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - const client = new TouchPortalClient(options); - - expect(() => client.connect()).toThrow(); - expect(logSpy).not.toHaveBeenCalled(); - - logSpy.mockRestore(); - }); + ] as unknown as TouchPortalClientOptions[])( + 'should not call console.log if logCallback is not a function', + (options) => { + const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); + const client = new TouchPortalClient(options); + + expect(() => client.connect()).toThrow(); + expect(logSpy).not.toHaveBeenCalled(); + + logSpy.mockRestore(); + } + ); }); From b5d589228f632a814389a2750194a0386e7212df Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Wed, 23 Jul 2025 22:02:59 +0100 Subject: [PATCH 07/12] Remove dependency on require-from-app-root --- package-lock.json | 224 ++++++++++++++++----------------- package.json | 9 +- rslib.config.ts | 8 +- src/client.ts | 40 +++--- src/types/globals.d.ts | 1 + tests/check-for-update.spec.ts | 8 -- tests/connect.spec.ts | 2 +- tests/disconnect.spec.ts | 2 +- tests/log.spec.ts | 2 +- tests/vitest.setup.ts | 4 + vitest.config.mts | 3 +- 11 files changed, 148 insertions(+), 155 deletions(-) create mode 100644 src/types/globals.d.ts create mode 100644 tests/vitest.setup.ts diff --git a/package-lock.json b/package-lock.json index e5098e4..e879689 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,11 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "compare-versions": "^6.1.1", - "require-from-app-root": "^0.2.1" + "compare-versions": "^6.1.1" }, "devDependencies": { - "@rslib/core": "^0.10.6", - "@types/node": "^24.0.15", + "@rslib/core": "^0.11.0", + "@types/node": "^24.1.0", "@typescript-eslint/eslint-plugin": "^8.38.0", "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.1", @@ -805,62 +804,62 @@ "license": "MIT" }, "node_modules/@module-federation/error-codes": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.16.0.tgz", - "integrity": "sha512-TfmA45b8vvISniGudMg8jjIy1q3tLPon0QN/JdFp5f8AJ8/peICN5b+dkEQnWsAVg2fEusYhk9dO7z3nUeJM8A==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.17.0.tgz", + "integrity": "sha512-+pZ12frhaDqh4Xs/MQj4Vu4CAjnJTiEb8Z6fqPfn/TLHh4YLWMOzpzxGuMFDHqXwMb3o8FRAUhNB0eX2ZmhwTA==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/runtime": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.16.0.tgz", - "integrity": "sha512-6o84WI8Qhc9O3HwPLx89kTvOSkyUOHQr73R/zr0I04sYhlMJgw5xTwXeGE7bQAmNgbJclzW9Kh7JTP7+3o3CHg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.17.0.tgz", + "integrity": "sha512-eMtrtCSSV6neJpMmQ8WdFpYv93raSgsG5RiAPsKUuSCXfZ5D+yzvleZ+gPcEpFT9HokmloxAn0jep50/1upTQw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.16.0", - "@module-federation/runtime-core": "0.16.0", - "@module-federation/sdk": "0.16.0" + "@module-federation/error-codes": "0.17.0", + "@module-federation/runtime-core": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, "node_modules/@module-federation/runtime-core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.16.0.tgz", - "integrity": "sha512-5SECQowG4hlUVBRk/y6bnYLfxbsl5NcMmqn043WPe7NDOhGQWbTuYibJ3Bk+ZBv5U4uYLEmXipBGDc1FKsHklQ==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.17.0.tgz", + "integrity": "sha512-MYwDDevYnBB9gXFfNOmJVIX5XZcbCHd0dral7gT7yVmlwOhbuGOLlm2dh2icwwdCYHA9AFDCfU9l1nJR4ex/ng==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.16.0", - "@module-federation/sdk": "0.16.0" + "@module-federation/error-codes": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.16.0.tgz", - "integrity": "sha512-OzmXNluXBQ2E6znzX4m9CJt1MFHVGmbN8c8MSKcYIDcLzLSKBQAiaz9ZUMhkyWx2YrPgD134glyPEqJrc+fY8A==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.17.0.tgz", + "integrity": "sha512-t4QcKfhmwOHedwByDKUlTQVw4+gPotySYPyNa8GFrBSr1F6wcGdGyOhzP+PdgpiJLIM03cB6V+IKGGHE28SfDQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.16.0", - "@module-federation/webpack-bundler-runtime": "0.16.0" + "@module-federation/runtime": "0.17.0", + "@module-federation/webpack-bundler-runtime": "0.17.0" } }, "node_modules/@module-federation/sdk": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.16.0.tgz", - "integrity": "sha512-UXJW1WWuDoDmScX0tpISjl4xIRPzAiN62vg9etuBdAEUM+ja9rz/zwNZaByiUPFS2aqlj2RHenCRvIapE8mYEg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.17.0.tgz", + "integrity": "sha512-tjrNaYdDocHZsWu5iXlm83lwEK8A64r4PQB3/kY1cW1iOvggR2RESLAWPxRJXC2cLF8fg8LDKOBdgERZW1HPFA==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.16.0.tgz", - "integrity": "sha512-yqIDQTelJZP0Rxml0OXv4Er8Kbdxy7NFh6PCzPwDFWI1SkiokJ3uXQJBvtlxZ3lOnCDYOzdHstqa8sJG4JP02Q==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.17.0.tgz", + "integrity": "sha512-o8XtXwqTDlqLgcALOfObcCbqXvUcSDHIEXrkcb4W+I8GJY7IqV0+x6rX4mJ3f59tca9qOF8zsZsOA6BU93Pvgw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.16.0", - "@module-federation/sdk": "0.16.0" + "@module-federation/runtime": "0.17.0", + "@module-federation/sdk": "0.17.0" } }, "node_modules/@napi-rs/wasm-runtime": { @@ -1208,13 +1207,13 @@ ] }, "node_modules/@rsbuild/core": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.4.8.tgz", - "integrity": "sha512-IJhpLl8lrp5ynlf04V5l7rMrVTNuGLG36ZDadHiBIC5qLRGSS3rMF8cVLSkSA6qM1OiRlPpMgwQbqFYh325RvQ==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.4.9.tgz", + "integrity": "sha512-LvF0YQ2IQf6ddDQQCkWxgPxHJFrZT8bvwwsHYo8K9g8KJTlrrstMV85lU3DROaH5tm98jN3zYZIOCbqQzklx5g==", "dev": true, "license": "MIT", "dependencies": { - "@rspack/core": "1.4.8", + "@rspack/core": "1.4.9", "@rspack/lite-tapable": "~1.0.1", "@swc/helpers": "^0.5.17", "core-js": "~3.44.0", @@ -1228,14 +1227,14 @@ } }, "node_modules/@rslib/core": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@rslib/core/-/core-0.10.6.tgz", - "integrity": "sha512-7OLdmmQbY116gNAAsY9baCid9REr+z11qfAzwVVFw+Q8avCE6YqpcBLfrBXlfmpBikfshDmHH8EpRrQwz8gZJQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@rslib/core/-/core-0.11.0.tgz", + "integrity": "sha512-ku5Qs3sSBZSmUVRQHM0JG2ZHXmw7aGvxmf0fseUjYWCAWzuBvTeXcthO2eCYKlYvYOIZBQH4QO1eVgz6fWfPkw==", "dev": true, "license": "MIT", "dependencies": { - "@rsbuild/core": "~1.4.7", - "rsbuild-plugin-dts": "0.10.6", + "@rsbuild/core": "~1.4.8", + "rsbuild-plugin-dts": "0.11.0", "tinyglobby": "^0.2.14" }, "bin": { @@ -1258,28 +1257,28 @@ } }, "node_modules/@rspack/binding": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.4.8.tgz", - "integrity": "sha512-VKE+2InUdudBUOn3xMZfK9a6KlOwmSifA0Nupjsh7N9/brcBfJtJGSDCnfrIKCq54FF+QAUCgcNAS0DB4/tZmw==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.4.9.tgz", + "integrity": "sha512-9EY8OMCNZrwCupQMZccMgrTxWGUQvZGFrLFw/rxfTt+uT4fS4CAbNwHVFxsnROaRd+EE6EXfUpUYu66j6vd4qA==", "dev": true, "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.4.8", - "@rspack/binding-darwin-x64": "1.4.8", - "@rspack/binding-linux-arm64-gnu": "1.4.8", - "@rspack/binding-linux-arm64-musl": "1.4.8", - "@rspack/binding-linux-x64-gnu": "1.4.8", - "@rspack/binding-linux-x64-musl": "1.4.8", - "@rspack/binding-wasm32-wasi": "1.4.8", - "@rspack/binding-win32-arm64-msvc": "1.4.8", - "@rspack/binding-win32-ia32-msvc": "1.4.8", - "@rspack/binding-win32-x64-msvc": "1.4.8" + "@rspack/binding-darwin-arm64": "1.4.9", + "@rspack/binding-darwin-x64": "1.4.9", + "@rspack/binding-linux-arm64-gnu": "1.4.9", + "@rspack/binding-linux-arm64-musl": "1.4.9", + "@rspack/binding-linux-x64-gnu": "1.4.9", + "@rspack/binding-linux-x64-musl": "1.4.9", + "@rspack/binding-wasm32-wasi": "1.4.9", + "@rspack/binding-win32-arm64-msvc": "1.4.9", + "@rspack/binding-win32-ia32-msvc": "1.4.9", + "@rspack/binding-win32-x64-msvc": "1.4.9" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.4.8.tgz", - "integrity": "sha512-PQRNjC3Fc0avpx8Gk+sT5P+HAXxTSzmBA8lU7QLlmbW5GGXO2taVhNstbZ4oxyIX5uDVZpQ2yQ2E0zXirK6/UQ==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.4.9.tgz", + "integrity": "sha512-P0O10aXEaLLrwKXK7muSXl64wGJsLGbJEE97zeFe0mFVFo44m3iVC+KVpRpBFBrXhnL1ylCYsu2mS/dTJ+970g==", "cpu": [ "arm64" ], @@ -1291,9 +1290,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.4.8.tgz", - "integrity": "sha512-ZnPZbo1dhhbfevxSS99y8w02xuEbxyiV1HaUie/S8jzy9DPmk+4Br+DddufnibPNU85e3BZKjp+HDFMYkdn6cg==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.4.9.tgz", + "integrity": "sha512-eCbjVEkrSpFzLYye8Xd3SJgoaJ+GXCEVXJNLIqqt+BwxAknuVcHOHWFtppCw5/FcPWZkB03fWMah7aW8/ZqDyg==", "cpu": [ "x64" ], @@ -1305,9 +1304,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.4.8.tgz", - "integrity": "sha512-mJK9diM4Gd8RIGO90AZnl27WwUuAOoRplPQv9G+Vxu2baCt1xE1ccf8PntIJ70/rMgsUdnmkR5qQBaGxhAMJvA==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.4.9.tgz", + "integrity": "sha512-OTsco8WagOax9o6W66i//GjgrjhNFFOXhcS/vl81t7Hx5APEpEXX+pnccirH0e67Gs5sNlm/uLVS1cyA/B77Sg==", "cpu": [ "arm64" ], @@ -1319,9 +1318,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.4.8.tgz", - "integrity": "sha512-+n9QxeDDZKwVB4D6cwpNRJzsCeuwNqd/fwwbMQVTctJ+GhIHlUPsE8y5tXN7euU7kDci81wMBBFlt6LtXNcssA==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.4.9.tgz", + "integrity": "sha512-vxnh8TwTX5tquZz8naGd1NIBOESyKAPRemHZUWfAnK1p4WzM+dbTkGeIU7Z1fUzF/AXEbdRQ/omWlvp5nCOOZA==", "cpu": [ "arm64" ], @@ -1333,9 +1332,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.4.8.tgz", - "integrity": "sha512-rEypDlbIfv9B/DcZ2vYVWs56wo5VWE5oj/TvM9JT+xuqwvVWsN/A2TPMiU6QBgOKGXat3EM/MEgx8NhNZUpkXg==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.4.9.tgz", + "integrity": "sha512-MitSilaS23e7EPNqYT9PEr2Zomc51GZSaCRCXscNOica5V/oAVBcEMUFbrNoD4ugohDXM68RvK0kVyFmfYuW+Q==", "cpu": [ "x64" ], @@ -1347,9 +1346,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.4.8.tgz", - "integrity": "sha512-o9OsvJ7olH0JPU9exyIaYTNQ+aaR5CNAiinkxr+LkV2i3DMIi/+pDVveDiodYjVhzZjWfsP/z8QPO4c6Z06bEw==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.4.9.tgz", + "integrity": "sha512-fdBLz3RPvEEaz91IHXP4pMDNh9Nfl6nkYDmmLBJRu4yHi97j1BEeymrq3lKssy/1kDR70t6T47ZjfRJIgM6nYg==", "cpu": [ "x64" ], @@ -1361,9 +1360,9 @@ ] }, "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.4.8.tgz", - "integrity": "sha512-hF5gqT0aQ66VUclM2A9MSB6zVdEJqzp++TAXaShBK/eVBI0R4vWrMfJ2TOdzEsSbg4gXgeG4swURpHva3PKbcA==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.4.9.tgz", + "integrity": "sha512-yWd5llZHBCsA0S5W0UGuXdQQ5zkZC4PQbOQS7XiblBII9RIMZZKJV/3AsYAHUeskTBPnwYMQsm8QCV52BNAE9A==", "cpu": [ "wasm32" ], @@ -1371,13 +1370,26 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.12" + "@napi-rs/wasm-runtime": "^1.0.1" + } + }, + "node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.1.tgz", + "integrity": "sha512-KVlQ/jgywZpixGCKMNwxStmmbYEMyokZpCf2YuIChhfJA2uqfAKNEM8INz7zzTo55iEXfBhIIs3VqYyqzDLj8g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@tybys/wasm-util": "^0.10.0" } }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.4.8.tgz", - "integrity": "sha512-umD0XzesJq4nnStv9/2/VOmzNUWHfLMIjeHmiHYHpc7iVC0SkXgIdc6Ac7c+g2q7/V3/MFxL66Y60oy7lQE3fg==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.4.9.tgz", + "integrity": "sha512-3+oG19ye2xOmVGGKHao0EXmvPaiGvaFnxJRQ6tc6T7MSxhOvvDhQ1zmx+9X/wXKv/iytAHXMuoLGLHwdGd7GJg==", "cpu": [ "arm64" ], @@ -1389,9 +1401,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.4.8.tgz", - "integrity": "sha512-Uu+F/sxz7GgIMbuCCZVOD1HPjoHQdyrFHi/TE2EmuZzs9Ji9a9mtNJNrKc8+h9YFpaLeade7cbMDjRu4MHxiVA==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.4.9.tgz", + "integrity": "sha512-l9K68LNP2j2QnCFYz17Rea7wdk04m4jnGB6CyRrS0iuanTn+Hvz3wgAn1fqADJxE4dtX+wNbTPOWJr0SrVHccw==", "cpu": [ "ia32" ], @@ -1403,9 +1415,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.4.8.tgz", - "integrity": "sha512-BVkOfJDZnexHNpGgc/sWENyGrsle1jUQTeUEdSyNYsu4Elsgk/T9gnGK8xyLRd2c6k20M5FN38t0TumCp4DscQ==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.4.9.tgz", + "integrity": "sha512-2i4+/E5HjqobNBA86DuqQfqw6mW/jsHGUzUfgwKEKW8I6wLU0Gz7dUcz0fExvr8W5I8f/ccOfqR2bPGnxJ8vNw==", "cpu": [ "x64" ], @@ -1417,14 +1429,14 @@ ] }, "node_modules/@rspack/core": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.4.8.tgz", - "integrity": "sha512-ARHuZ+gx3P//RIUKSjk/riQUn/D5tCwCWbfgeM5pk/Ti2JsgVnqiP9Sksge8JovVPf7b6Zgw73Cq5FpX4aOXeQ==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.4.9.tgz", + "integrity": "sha512-fHEGOzVcyESVfprFTqgeJ7vAnmkmY/nbljaeGsJY4zLmROmkbGTh4xgLEY3O5nEukLfEFbdLapvBqYb5tE/fmA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.16.0", - "@rspack/binding": "1.4.8", + "@module-federation/runtime-tools": "0.17.0", + "@rspack/binding": "1.4.9", "@rspack/lite-tapable": "1.0.1" }, "engines": { @@ -1509,9 +1521,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", - "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", "dev": true, "license": "MIT", "dependencies": { @@ -2246,12 +2258,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5110,22 +5116,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-from-app-root": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/require-from-app-root/-/require-from-app-root-0.2.1.tgz", - "integrity": "sha512-TuNPLCO3uAA6Za80Vtz9F8YL0KpJiJ+ZQxOhdyV0N9j1VzweqXuHqVgacBdYo+25rWPA9jzqusijtKiTd2vW2g==", - "license": "MIT", - "dependencies": { - "@types/node": "^10.0.0", - "app-root-dir": "^1.0.2" - } - }, - "node_modules/require-from-app-root/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -5236,9 +5226,9 @@ } }, "node_modules/rsbuild-plugin-dts": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/rsbuild-plugin-dts/-/rsbuild-plugin-dts-0.10.6.tgz", - "integrity": "sha512-rVP82fFMDHW0GirhYx+w2bER1HhkOKJ8e/bAAF2OkMUP2k2fviMpl/gsnbO8KI9vcSqsQE2QXHkj781m6W84Ow==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/rsbuild-plugin-dts/-/rsbuild-plugin-dts-0.11.0.tgz", + "integrity": "sha512-z2ltq3wgHL622Q0b2r/6QKRY6sAzkgP5xnyOtOuYfVyKyrlw/R/ES7x4/3dsYWPVt1rTuIebxX6zMfBwKQRIzw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index c7c153f..2a55e3b 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,11 @@ "author": "Jameson Allen aka Spdermn02", "license": "MIT", "dependencies": { - "compare-versions": "^6.1.1", - "require-from-app-root": "^0.2.1" + "compare-versions": "^6.1.1" }, "devDependencies": { - "@rslib/core": "^0.10.6", - "@types/node": "^24.0.15", + "@rslib/core": "^0.11.0", + "@types/node": "^24.1.0", "@typescript-eslint/eslint-plugin": "^8.38.0", "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.1", @@ -49,4 +48,4 @@ "typescript": "^5.8.3", "vitest": "^3.2.4" } -} +} \ No newline at end of file diff --git a/rslib.config.ts b/rslib.config.ts index 9ae5fe9..207131f 100644 --- a/rslib.config.ts +++ b/rslib.config.ts @@ -1,4 +1,5 @@ import { defineConfig } from '@rslib/core'; +import { version } from './package.json'; export default defineConfig({ lib: [ @@ -11,5 +12,10 @@ export default defineConfig({ format: 'cjs', syntax: ['node 18'] } - ] + ], + source: { + define: { + TOUCHPORTAL_NODE_API_VERSION: JSON.stringify(version) + } + } }); diff --git a/src/client.ts b/src/client.ts index af324b8..43bacff 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,27 +1,25 @@ import EventEmitter from 'events'; import net from 'net'; -import compareVersions from 'compare-versions'; -import { requireFromAppRoot } from 'require-from-app-root'; +import { compare } from 'compare-versions'; import { LoggingLevel, - TouchPortalClientOptions, - TouchPortalConnectOptions, - CreateNotificationRequest, - CreateStateRequest, - NotificationOption, - RemoveStateRequest, - UpdateChoiceListRequest, - UpdateSettingRequest, - UpdateSpecificChoiceListRequest, - UpdateStateRequest, - ActionData, - UpdateActionDataRequest, - UpdateConnectorDataRequest, - PairRequest, - ConnectorData + type TouchPortalClientOptions, + type TouchPortalConnectOptions, + type CreateNotificationRequest, + type CreateStateRequest, + type NotificationOption, + type RemoveStateRequest, + type UpdateChoiceListRequest, + type UpdateSettingRequest, + type UpdateSpecificChoiceListRequest, + type UpdateStateRequest, + type ActionData, + type UpdateActionDataRequest, + type UpdateConnectorDataRequest, + type PairRequest, + type ConnectorData } from './types'; -const pluginVersion = requireFromAppRoot('package.json').version; const SOCKET_IP = '127.0.0.1'; const SOCKET_PORT = 12136; const CONNECTOR_PREFIX = 'pc'; @@ -46,6 +44,7 @@ export default class TouchPortalClient extends EventEmitter { this.logCallback = options?.logCallback; } + // Plugin Updates async checkForUpdate(githubUser: string, githubRepo: string, includePrerelease: boolean = false): Promise { const updateUrl = `https://api.github.com/repos/${githubUser}/${githubRepo}/releases`; @@ -63,8 +62,8 @@ export default class TouchPortalClient extends EventEmitter { const releaseVersion = release.tag_name.replace(/^v/, ''); if (includePrerelease || !release.prerelease) { - if (compareVersions.compare(releaseVersion, pluginVersion, '>')) { - this.emit('Update', pluginVersion, releaseVersion); + if (compare(releaseVersion, TOUCHPORTAL_NODE_API_VERSION, '>')) { + this.emit('Update', TOUCHPORTAL_NODE_API_VERSION, releaseVersion); return true; } } @@ -445,6 +444,7 @@ export default class TouchPortalClient extends EventEmitter { this.send(request); } + // Socket Communication public send(data: unknown): void { this.socket?.write(JSON.stringify(data)); this.socket?.write('\n'); diff --git a/src/types/globals.d.ts b/src/types/globals.d.ts new file mode 100644 index 0000000..8575483 --- /dev/null +++ b/src/types/globals.d.ts @@ -0,0 +1 @@ +declare const TOUCHPORTAL_NODE_API_VERSION: string; diff --git a/tests/check-for-update.spec.ts b/tests/check-for-update.spec.ts index 69639c3..ec28fdf 100644 --- a/tests/check-for-update.spec.ts +++ b/tests/check-for-update.spec.ts @@ -2,14 +2,6 @@ import { describe, expect, Mock, test, vi } from 'vitest'; import { TouchPortalClientOptions } from '../src/types'; import TouchPortalClient from '../src/client'; -vi.mock('require-from-app-root', () => ({ - requireFromAppRoot: () => { - return { version: '1.0.0' }; - } -})); - -global.fetch = vi.fn(); - describe('checkForUpdate', () => { const pluginVersion = '1.0.0'; const pluginId: string = 'test.plugin'; diff --git a/tests/connect.spec.ts b/tests/connect.spec.ts index f2002b8..80a865e 100644 --- a/tests/connect.spec.ts +++ b/tests/connect.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, Mock, test, vi } from 'vitest'; import { getMockSocketFrom } from './mocks/mock-socket'; -import { PairRequest, TouchPortalClientOptions, TouchPortalConnectOptions } from '../src/types'; +import type { PairRequest, TouchPortalClientOptions, TouchPortalConnectOptions } from '../src/types'; import TouchPortalClient from '../src/client'; describe('connect', () => { diff --git a/tests/disconnect.spec.ts b/tests/disconnect.spec.ts index b9f04f9..b324f1a 100644 --- a/tests/disconnect.spec.ts +++ b/tests/disconnect.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, Mock, test, vi } from 'vitest'; import { getMockSocketFrom } from './mocks/mock-socket'; -import { TouchPortalClientOptions } from '../src/types'; +import type { TouchPortalClientOptions } from '../src/types'; import TouchPortalClient from '../src/client'; describe('disconnect', () => { diff --git a/tests/log.spec.ts b/tests/log.spec.ts index 56e9b12..ad72188 100644 --- a/tests/log.spec.ts +++ b/tests/log.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test, vi } from 'vitest'; -import { TouchPortalClientOptions } from '../src/types'; +import type { TouchPortalClientOptions } from '../src/types'; import TouchPortalClient from '../src/client'; describe('log', () => { diff --git a/tests/vitest.setup.ts b/tests/vitest.setup.ts new file mode 100644 index 0000000..0b2f2da --- /dev/null +++ b/tests/vitest.setup.ts @@ -0,0 +1,4 @@ +import { vi } from 'vitest'; + +vi.stubGlobal('fetch', vi.fn()); +vi.stubGlobal('TOUCHPORTAL_NODE_API_VERSION', '1.0.0'); diff --git a/vitest.config.mts b/vitest.config.mts index 51b3155..1ad344f 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -6,7 +6,8 @@ export default defineConfig({ include: ['./tests/**/*.spec.ts'], globals: true, watch: false, - environment: 'node' + environment: 'node', + setupFiles: ['./tests/vitest.setup.ts'] }, plugins: [] }); From e238c6e6ca2c45a9bb7d94f69614fe556948d258 Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Thu, 24 Jul 2025 20:16:50 +0100 Subject: [PATCH 08/12] Add trigger event function and strongly type events --- src/client.ts | 94 +++++++++++-------- src/types/events/action-hold-info-event.ts | 5 +- src/types/events/broadcast-event.ts | 4 +- src/types/events/close-plugin-event.ts | 4 +- src/types/events/connector-change-event.ts | 5 +- .../events/connector-short-id-info-event.ts | 4 +- src/types/events/execute-action-event.ts | 5 +- src/types/events/index.ts | 1 + src/types/events/info-event.ts | 5 +- src/types/events/list-changed-event.ts | 5 +- src/types/events/notification-action-event.ts | 4 +- .../touch-portal-incoming-event-type.ts | 13 +++ src/types/index.ts | 1 + .../actions/update-action-data-request.ts | 5 +- .../choices/update-choice-list-request.ts | 4 +- .../update-specifc-choice-list-request.ts | 4 +- .../update-connector-data-request.ts | 4 +- .../requests/events/trigger-event-request.ts | 4 +- src/types/requests/index.ts | 1 + .../create-notification-request.ts | 5 +- src/types/requests/pair/pair-request.ts | 4 +- .../settings/update-setting-request.ts | 4 +- .../requests/states/create-state-request.ts | 4 +- .../requests/states/remove-state-request.ts | 4 +- .../states/update-state-list-request.ts | 4 +- .../requests/states/update-state-request.ts | 4 +- .../touch-portal-outgoing-request-type.ts | 16 ++++ src/types/touch-portal-client-event.ts | 14 +++ tests/connect.spec.ts | 9 +- 29 files changed, 170 insertions(+), 70 deletions(-) create mode 100644 src/types/events/touch-portal-incoming-event-type.ts create mode 100644 src/types/requests/touch-portal-outgoing-request-type.ts create mode 100644 src/types/touch-portal-client-event.ts diff --git a/src/client.ts b/src/client.ts index 43bacff..d312b35 100644 --- a/src/client.ts +++ b/src/client.ts @@ -3,6 +3,9 @@ import net from 'net'; import { compare } from 'compare-versions'; import { LoggingLevel, + TouchPortalIncomingEventType, + TouchPortalOutgoingRequestType, + TouchPortalClientEvent, type TouchPortalClientOptions, type TouchPortalConnectOptions, type CreateNotificationRequest, @@ -17,7 +20,8 @@ import { type UpdateActionDataRequest, type UpdateConnectorDataRequest, type PairRequest, - type ConnectorData + type ConnectorData, + type TriggerEventRequest } from './types'; const SOCKET_IP = '127.0.0.1'; @@ -63,7 +67,7 @@ export default class TouchPortalClient extends EventEmitter { if (includePrerelease || !release.prerelease) { if (compare(releaseVersion, TOUCHPORTAL_NODE_API_VERSION, '>')) { - this.emit('Update', TOUCHPORTAL_NODE_API_VERSION, releaseVersion); + this.emit(TouchPortalClientEvent.Update, TOUCHPORTAL_NODE_API_VERSION, releaseVersion); return true; } } @@ -92,7 +96,7 @@ export default class TouchPortalClient extends EventEmitter { this.socket = new net.Socket(); this.socket.setEncoding('utf8'); this.socket.connect(SOCKET_PORT, SOCKET_IP, () => { - this.emit('connected'); + this.emit(TouchPortalClientEvent.Connected); this.pair(); }); @@ -126,50 +130,50 @@ export default class TouchPortalClient extends EventEmitter { // Handle internal TP Messages here, else pass to user code switch (message.type) { - case 'closePlugin': + case TouchPortalIncomingEventType.ClosePluginCall: if (message.pluginId === this.pluginId) { - this.emit('Close', message); + this.emit(TouchPortalClientEvent.Close, message); this.disconnect(); } break; - case 'info': - this.emit('Info', message); + case TouchPortalIncomingEventType.Info: + this.emit(TouchPortalClientEvent.Info, message); if (message.settings) { - this.emit('Settings', message.settings); + this.emit(TouchPortalClientEvent.Settings, message.settings); } break; - case 'notificationOptionClicked': - this.emit('NotificationClicked', message); + case TouchPortalIncomingEventType.NotificationAction: + this.emit(TouchPortalClientEvent.NotificationClicked, message); break; - case 'settings': + case TouchPortalIncomingEventType.Settings: // values is the key that is the same as how info contains settings key, for direct settings saving - this.emit('Settings', message.values); + this.emit(TouchPortalClientEvent.Settings, message.values); break; - case 'listChange': - this.emit('ListChange', message); + case TouchPortalIncomingEventType.ListChanged: + this.emit(TouchPortalClientEvent.ListChange, message); break; - case 'action': - this.emit('Action', message, null); + case TouchPortalIncomingEventType.ExecuteAction: + this.emit(TouchPortalClientEvent.Action, message, null); break; - case 'broadcast': - this.emit('Broadcast', message); + case TouchPortalIncomingEventType.Broadcast: + this.emit(TouchPortalClientEvent.Broadcast, message); break; - case 'shortConnectorIdNotification': - this.emit('ConnectorShortIdNotification', message); + case TouchPortalIncomingEventType.ConnectorShortIdInfo: + this.emit(TouchPortalClientEvent.ConnectorShortIdNotification, message); break; - case 'connectorChange': - this.emit('ConnectorChange', message); + case TouchPortalIncomingEventType.ConnectorChange: + this.emit(TouchPortalClientEvent.ConnectorChange, message); break; - case 'up': - this.emit('Action', message, false); + case TouchPortalIncomingEventType.ActionHoldInfo_Up: + this.emit(TouchPortalClientEvent.Action, message, false); break; - case 'down': - this.emit('Action', message, true); + case TouchPortalIncomingEventType.ActionHoldInfo_Down: + this.emit(TouchPortalClientEvent.Action, message, true); break; default: - this.emit('Message', message); + this.emit(TouchPortalClientEvent.Message, message); } } }); @@ -207,7 +211,11 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('updateActionData: only number types are supported'); } - const request: UpdateActionDataRequest = { type: 'updateActionData', instanceId, data }; + const request: UpdateActionDataRequest = { + type: TouchPortalOutgoingRequestType.UpdateSpecificAction, + instanceId, + data + }; this.send(request); } @@ -223,7 +231,7 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('updateChoice: value parameter must be an array'); } - const request: UpdateChoiceListRequest = { type: 'choiceUpdate', id, value }; + const request: UpdateChoiceListRequest = { type: TouchPortalOutgoingRequestType.UpdateChoiceList, id, value }; this.send(request); } @@ -244,7 +252,7 @@ export default class TouchPortalClient extends EventEmitter { } const request: UpdateSpecificChoiceListRequest = { - type: 'choiceUpdate', + type: TouchPortalOutgoingRequestType.UpdateSpecificList, id, instanceId, value @@ -313,13 +321,19 @@ export default class TouchPortalClient extends EventEmitter { const dataStr = data!.map((item) => `${item.id}=${item.value}`).join('|'); return { - type: 'connectorUpdate', + type: TouchPortalOutgoingRequestType.UpdateConnectorData, connectorId: `${CONNECTOR_PREFIX}_${this.pluginId}_${connectorId}${dataStr}`, value }; } - return { type: 'connectorUpdate', shortId, value }; + return { type: TouchPortalOutgoingRequestType.UpdateConnectorData, shortId, value }; + } + + // Events + public triggerEvent(eventId: string, states?: Record) { + const request: TriggerEventRequest = { type: TouchPortalOutgoingRequestType.TriggerEvent, eventId, states }; + this.send(request); } // Notifications @@ -330,7 +344,7 @@ export default class TouchPortalClient extends EventEmitter { } const request: CreateNotificationRequest = { - type: 'showNotification', + type: TouchPortalOutgoingRequestType.CreateANotification, notificationId, title, msg, @@ -342,7 +356,7 @@ export default class TouchPortalClient extends EventEmitter { // Settings public updateSetting(name: string, value: string) { - const request: UpdateSettingRequest = { type: 'settingUpdate', name, value }; + const request: UpdateSettingRequest = { type: TouchPortalOutgoingRequestType.UpdateSetting, name, value }; this.send(request); } @@ -362,7 +376,7 @@ export default class TouchPortalClient extends EventEmitter { this.customStates[id] = desc; const request: CreateStateRequest = { - type: 'createState', + type: TouchPortalOutgoingRequestType.CreateAState, id, desc, defaultValue: `${defaultValue}`, @@ -400,7 +414,7 @@ export default class TouchPortalClient extends EventEmitter { this.customStates[state.id] = state.desc; return { - type: 'createState', + type: TouchPortalOutgoingRequestType.CreateAState, id: state.id, desc: state.desc, defaultValue: String(state.defaultValue), @@ -413,7 +427,7 @@ export default class TouchPortalClient extends EventEmitter { } public updateState(id: string, value: string | number | boolean): void { - const request: UpdateStateRequest = { type: 'stateUpdate', id, value: `${value}` }; + const request: UpdateStateRequest = { type: TouchPortalOutgoingRequestType.UpdateState, id, value: `${value}` }; this.send(request); } @@ -424,7 +438,7 @@ export default class TouchPortalClient extends EventEmitter { } const request: UpdateStateRequest[] = states.map((state) => ({ - type: 'stateUpdate', + type: TouchPortalOutgoingRequestType.UpdateState, id: state.id, value: String(state.value) })); @@ -440,7 +454,7 @@ export default class TouchPortalClient extends EventEmitter { delete this.customStates[id]; - const request: RemoveStateRequest = { type: 'removeState', id }; + const request: RemoveStateRequest = { type: TouchPortalOutgoingRequestType.RemoveState, id }; this.send(request); } @@ -472,7 +486,7 @@ export default class TouchPortalClient extends EventEmitter { throw new Error('pair: pluginId is missing or empty.'); } - const request: PairRequest = { type: 'pair', id: this.pluginId }; + const request: PairRequest = { type: TouchPortalOutgoingRequestType.Pair, id: this.pluginId }; this.send(request); } diff --git a/src/types/events/action-hold-info-event.ts b/src/types/events/action-hold-info-event.ts index 02073fe..c8e7f99 100644 --- a/src/types/events/action-hold-info-event.ts +++ b/src/types/events/action-hold-info-event.ts @@ -1,4 +1,5 @@ -import { EventData } from './event-data'; +import type { EventData } from './event-data'; +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; /** * Touch Portal will send messages to your plugin when the action is used in a hold button event. @@ -14,7 +15,7 @@ import { EventData } from './event-data'; * @property data - An array of id's and value's containing additional data for the event. */ export type ActionHoldInfoEvent = { - type: 'up' | 'down'; + type: TouchPortalIncomingEventType.ActionHoldInfo_Up | TouchPortalIncomingEventType.ActionHoldInfo_Down; pluginId: string; actionId: string; data: EventData[]; diff --git a/src/types/events/broadcast-event.ts b/src/types/events/broadcast-event.ts index 2943186..f54e11a 100644 --- a/src/types/events/broadcast-event.ts +++ b/src/types/events/broadcast-event.ts @@ -1,3 +1,5 @@ +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; + /** * Touch Portal will send messages to the plug-in at certain events. * Currently the only message that is broadcast is the page change event. @@ -15,7 +17,7 @@ * @property deviceId - (Optional) The device id (set for multiple devices upgrade) of the device navigating pages. The value will be send only when the broadcast is of the type "pageChange". */ export type BroadcastEvent = { - type: 'broadcast'; + type: TouchPortalIncomingEventType.Broadcast; event: string; pageName?: string; previousPageName?: string; diff --git a/src/types/events/close-plugin-event.ts b/src/types/events/close-plugin-event.ts index f332fd2..024b0e5 100644 --- a/src/types/events/close-plugin-event.ts +++ b/src/types/events/close-plugin-event.ts @@ -1,3 +1,5 @@ +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; + /** * Touch Portal will send a message when it is closing the plugin for some reason. * Touch Portal will also try to close the process. This will happen approximately after 500 ms. @@ -10,6 +12,6 @@ * @property pluginId - The id of the plugin. */ export type CloseEvent = { - type: 'closePlugin'; + type: TouchPortalIncomingEventType.ClosePluginCall; pluginId: string; }; diff --git a/src/types/events/connector-change-event.ts b/src/types/events/connector-change-event.ts index 9c9cf3c..69e0697 100644 --- a/src/types/events/connector-change-event.ts +++ b/src/types/events/connector-change-event.ts @@ -1,4 +1,5 @@ -import { EventData } from './event-data'; +import type { EventData } from './event-data'; +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; /** * Touch Portal will send messages to your plugin when the connector is used in a connector event. @@ -27,7 +28,7 @@ import { EventData } from './event-data'; * @property data - An array of id's and value's containing additional data for the event. */ export type ConnectorChangeEvent = { - type: 'connectorChange'; + type: TouchPortalIncomingEventType.ConnectorChange; pluginId: string; connectorId: string; value: number; diff --git a/src/types/events/connector-short-id-info-event.ts b/src/types/events/connector-short-id-info-event.ts index afdd0ad..11f9531 100644 --- a/src/types/events/connector-short-id-info-event.ts +++ b/src/types/events/connector-short-id-info-event.ts @@ -1,3 +1,5 @@ +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; + /** * Whenever a user creates a connector for the first time a shortId is generated for that connector that represents the long connectorId. * This short id is useful for when you create long connector ids and the id will be longer than the max of 200 characters. @@ -14,7 +16,7 @@ * @property connectorId - The long normal connector id. */ export type ConnectorShortIdInfoEvent = { - type: 'shortConnectorIdNotification'; + type: TouchPortalIncomingEventType.ConnectorShortIdInfo; pluginId: string; shortId: number; connectorId: string; diff --git a/src/types/events/execute-action-event.ts b/src/types/events/execute-action-event.ts index 6ded6d3..ab7835a 100644 --- a/src/types/events/execute-action-event.ts +++ b/src/types/events/execute-action-event.ts @@ -1,4 +1,5 @@ -import { EventData } from './event-data'; +import type { EventData } from './event-data'; +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; /** * Touch Portal will send messages when an action is being triggered (when the button containing one of your plug-in actions @@ -12,7 +13,7 @@ import { EventData } from './event-data'; * @property data - An array of id's and value's containing additional data for the event. */ export type ExecuteActionEvent = { - type: 'action'; + type: TouchPortalIncomingEventType.ExecuteAction; pluginId: string; actionId: string; data: EventData[]; diff --git a/src/types/events/index.ts b/src/types/events/index.ts index 4b86523..7164fce 100644 --- a/src/types/events/index.ts +++ b/src/types/events/index.ts @@ -1,4 +1,5 @@ export * from './event-data'; +export * from './touch-portal-incoming-event-type'; export * from './device-info'; export * from './info-event'; export * from './execute-action-event'; diff --git a/src/types/events/info-event.ts b/src/types/events/info-event.ts index 181de00..421ddb0 100644 --- a/src/types/events/info-event.ts +++ b/src/types/events/info-event.ts @@ -1,4 +1,5 @@ -import { DeviceInfo } from './device-info'; +import type { DeviceInfo } from './device-info'; +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; /** * Represents an informational event received from Touch Portal. @@ -14,7 +15,7 @@ import { DeviceInfo } from './device-info'; * @property status The current status of the plugin. */ export type InfoEvent = { - type: 'info'; + type: TouchPortalIncomingEventType.Info; sdkVersion: string; tpVersionString: string; tpVersionCode: number; diff --git a/src/types/events/list-changed-event.ts b/src/types/events/list-changed-event.ts index 77e8415..25f40be 100644 --- a/src/types/events/list-changed-event.ts +++ b/src/types/events/list-changed-event.ts @@ -1,4 +1,5 @@ -import { EventData } from './event-data'; +import type { EventData } from './event-data'; +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; /** * Touch Portal will send messages when a list of choices value is changed. @@ -16,7 +17,7 @@ import { EventData } from './event-data'; * @property values - An array of event data representing the new state of the list. */ export type ListChangedEvent = { - type: 'listChange'; + type: TouchPortalIncomingEventType.ListChanged; pluginId: string; actionId: string; listId: string; diff --git a/src/types/events/notification-action-event.ts b/src/types/events/notification-action-event.ts index 8753ed9..fe7bc1a 100644 --- a/src/types/events/notification-action-event.ts +++ b/src/types/events/notification-action-event.ts @@ -1,3 +1,5 @@ +import type { TouchPortalIncomingEventType } from './touch-portal-incoming-event-type'; + /** * Touch Portal will send a message when a user clicks on a notification action. * When they do the notification is also marked as read/handled. @@ -9,7 +11,7 @@ * @property optionId - The id of the option. */ export type NotificationActionEvent = { - type: 'notificationOptionClicked'; + type: TouchPortalIncomingEventType.NotificationAction; notificationId: string; optionId: string; }; diff --git a/src/types/events/touch-portal-incoming-event-type.ts b/src/types/events/touch-portal-incoming-event-type.ts new file mode 100644 index 0000000..bffce92 --- /dev/null +++ b/src/types/events/touch-portal-incoming-event-type.ts @@ -0,0 +1,13 @@ +export enum TouchPortalIncomingEventType { + ExecuteAction = 'action', + ActionHoldInfo_Up = 'up', + ActionHoldInfo_Down = 'down', + ConnectorChange = 'connectorChange', + ConnectorShortIdInfo = 'shortConnectorIdNotification', + ListChanged = 'listChange', + ClosePluginCall = 'closePlugin', + Broadcast = 'broadcast', + NotificationAction = 'notificationOptionClicked', + Info = 'info', + Settings = 'settings' +} diff --git a/src/types/index.ts b/src/types/index.ts index b2157dd..338574c 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -2,5 +2,6 @@ export * from './events'; export * from './requests'; export * from './models'; export * from './logging-level'; +export * from './touch-portal-client-event'; export * from './touch-portal-client-options'; export * from './touch-portal-connect-options'; diff --git a/src/types/requests/actions/update-action-data-request.ts b/src/types/requests/actions/update-action-data-request.ts index b306e84..2946ac5 100644 --- a/src/types/requests/actions/update-action-data-request.ts +++ b/src/types/requests/actions/update-action-data-request.ts @@ -1,4 +1,5 @@ -import { ActionData } from './action-data'; +import type { ActionData } from './action-data'; +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; /** * You can change the characteristich of certain action data using this message. @@ -15,7 +16,7 @@ import { ActionData } from './action-data'; * @property data - The object containing all new data for the action data object. */ export type UpdateActionDataRequest = { - type: 'updateActionData'; + type: TouchPortalOutgoingRequestType.UpdateSpecificAction; instanceId?: string; data: ActionData; }; diff --git a/src/types/requests/choices/update-choice-list-request.ts b/src/types/requests/choices/update-choice-list-request.ts index 4b27be8..89b9917 100644 --- a/src/types/requests/choices/update-choice-list-request.ts +++ b/src/types/requests/choices/update-choice-list-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * You can also update choice lists in Touch Portal. This will update the choice lists with the given ID. * @@ -11,7 +13,7 @@ * @property value - The collection of texts that should be the new list to display for this given choice list id. */ export type UpdateChoiceListRequest = { - type: 'choiceUpdate'; + type: TouchPortalOutgoingRequestType.UpdateChoiceList; id: string; value: string[]; }; diff --git a/src/types/requests/choices/update-specifc-choice-list-request.ts b/src/types/requests/choices/update-specifc-choice-list-request.ts index 1dbcc7f..647a5c1 100644 --- a/src/types/requests/choices/update-specifc-choice-list-request.ts +++ b/src/types/requests/choices/update-specifc-choice-list-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * You can update specific lists in Touch Portal. This is different from state lists as these will update the dropdown list associated. * Still this is very handy when you want to fill in a list for the user based on changes in your plug-in. @@ -14,7 +16,7 @@ * @property value - The collection of texts that should be the new list to display for this given choice list id. */ export type UpdateSpecificChoiceListRequest = { - type: 'choiceUpdate'; + type: TouchPortalOutgoingRequestType.UpdateSpecificList; id: string; instanceId: string; value: string[]; diff --git a/src/types/requests/connectors/update-connector-data-request.ts b/src/types/requests/connectors/update-connector-data-request.ts index 7634f7c..ef767bc 100644 --- a/src/types/requests/connectors/update-connector-data-request.ts +++ b/src/types/requests/connectors/update-connector-data-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * Connectors within Touch Portal can be bi-directional. * This means that your plug-in will receive updates when the user uses a connector supported control that has your connector connected @@ -34,7 +36,7 @@ * Please note, if this attribute is set, the message is being interpreted as this type of message and the "value" attribute is ignored. */ export type UpdateConnectorDataRequest = { - type: 'connectorUpdate'; + type: TouchPortalOutgoingRequestType.UpdateConnectorData; connectorId?: string; shortId?: string; value: number; diff --git a/src/types/requests/events/trigger-event-request.ts b/src/types/requests/events/trigger-event-request.ts index aa7da6e..3c64ebe 100644 --- a/src/types/requests/events/trigger-event-request.ts +++ b/src/types/requests/events/trigger-event-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * You can trigger predefined Events by sending a message to Touch Portal with the given eventId and additional data. * @@ -11,7 +13,7 @@ * @property states - This is a JSON Object that holds key value pairs of data that are used within Touch Portal as Local States. */ export type TriggerEventRequest = { - type: 'triggerEvent'; + type: TouchPortalOutgoingRequestType.TriggerEvent; eventId: string; states?: Record; }; diff --git a/src/types/requests/index.ts b/src/types/requests/index.ts index 40a9ab3..99ea8ab 100644 --- a/src/types/requests/index.ts +++ b/src/types/requests/index.ts @@ -1,3 +1,4 @@ +export * from './touch-portal-outgoing-request-type'; export * from './actions/action-data'; export * from './notifications/notification-option'; export * from './actions/update-action-data-request'; diff --git a/src/types/requests/notifications/create-notification-request.ts b/src/types/requests/notifications/create-notification-request.ts index 02a8c45..db709bf 100644 --- a/src/types/requests/notifications/create-notification-request.ts +++ b/src/types/requests/notifications/create-notification-request.ts @@ -1,4 +1,5 @@ -import { NotificationOption } from './notification-option'; +import type { NotificationOption } from './notification-option'; +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; /** * As a plug-in developer you can alert your users within Touch Portal for certain events. @@ -23,7 +24,7 @@ import { NotificationOption } from './notification-option'; * At least one option is required. */ export type CreateNotificationRequest = { - type: 'showNotification'; + type: TouchPortalOutgoingRequestType.CreateANotification; notificationId: string; title: string; msg: string; diff --git a/src/types/requests/pair/pair-request.ts b/src/types/requests/pair/pair-request.ts index 77cf947..47e445d 100644 --- a/src/types/requests/pair/pair-request.ts +++ b/src/types/requests/pair/pair-request.ts @@ -1,8 +1,10 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * @property type - The type of the request, always set to 'pair'. * @property id - The id of the plugin. */ export type PairRequest = { - type: 'pair'; + type: TouchPortalOutgoingRequestType.Pair; id: string; }; diff --git a/src/types/requests/settings/update-setting-request.ts b/src/types/requests/settings/update-setting-request.ts index aaec013..28a6cee 100644 --- a/src/types/requests/settings/update-setting-request.ts +++ b/src/types/requests/settings/update-setting-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * With this option you can update a setting from your plug-in. This will overwrite the user setting. * @@ -8,7 +10,7 @@ * @property value - The new value the setting should hold. */ export type UpdateSettingRequest = { - type: 'settingUpdate'; + type: TouchPortalOutgoingRequestType.UpdateSetting; name: string; value: string; }; diff --git a/src/types/requests/states/create-state-request.ts b/src/types/requests/states/create-state-request.ts index 1076a58..2b6a5f7 100644 --- a/src/types/requests/states/create-state-request.ts +++ b/src/types/requests/states/create-state-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * States can be created on runtime using by sending a "createState" message to Touch Portal with the given information. * @@ -14,7 +16,7 @@ * existing and will trigger the state changed event even if the value is the same as the already existing one. */ export type CreateStateRequest = { - type: 'createState'; + type: TouchPortalOutgoingRequestType.CreateAState; id: string; desc: string; defaultValue: string; diff --git a/src/types/requests/states/remove-state-request.ts b/src/types/requests/states/remove-state-request.ts index a263ad9..0850ccf 100644 --- a/src/types/requests/states/remove-state-request.ts +++ b/src/types/requests/states/remove-state-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * You can remove states at runtime. * @@ -7,6 +9,6 @@ * @property id - The id of the plug-in state to remove. */ export type RemoveStateRequest = { - type: 'removeState'; + type: TouchPortalOutgoingRequestType.RemoveState; id: string; }; diff --git a/src/types/requests/states/update-state-list-request.ts b/src/types/requests/states/update-state-list-request.ts index a7ba20e..714a5df 100644 --- a/src/types/requests/states/update-state-list-request.ts +++ b/src/types/requests/states/update-state-list-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * You can also update state lists in Touch Portal. These state lists needs to be defined in the entry file. * @@ -11,7 +13,7 @@ * @property value - The collection of texts that should be the new list to display for this given choice list id. */ export type UpdateStateListRequest = { - type: 'stateListUpdate'; + type: TouchPortalOutgoingRequestType.UpdateStateList; id: string; value: string[]; }; diff --git a/src/types/requests/states/update-state-request.ts b/src/types/requests/states/update-state-request.ts index ada2ba0..2a6f9e6 100644 --- a/src/types/requests/states/update-state-request.ts +++ b/src/types/requests/states/update-state-request.ts @@ -1,3 +1,5 @@ +import type { TouchPortalOutgoingRequestType } from '../touch-portal-outgoing-request-type'; + /** * You can send state updates to Touch Portal. * More information about states and how to set them up in the description file can be found in the states section. @@ -13,7 +15,7 @@ * @property value - The value of the state. Ensure this is a text and nothing else. Touch Portal will handle this value as a piece of text (string). */ export type UpdateStateRequest = { - type: 'stateUpdate'; + type: TouchPortalOutgoingRequestType.UpdateState; id: string; value: string; }; diff --git a/src/types/requests/touch-portal-outgoing-request-type.ts b/src/types/requests/touch-portal-outgoing-request-type.ts new file mode 100644 index 0000000..a512f8f --- /dev/null +++ b/src/types/requests/touch-portal-outgoing-request-type.ts @@ -0,0 +1,16 @@ +/* eslint-disable @typescript-eslint/no-duplicate-enum-values */ + +export enum TouchPortalOutgoingRequestType { + CreateAState = 'createState', + CreateANotification = 'showNotification', + UpdateState = 'stateUpdate', + UpdateStateList = 'stateListUpdate', + UpdateChoiceList = 'choiceUpdate', + UpdateSpecificList = 'choiceUpdate', + UpdateSpecificAction = 'updateActionData', + UpdateSetting = 'settingUpdate', + UpdateConnectorData = 'connectorUpdate', + TriggerEvent = 'triggerEvent', + RemoveState = 'removeState', + Pair = 'pair' +} diff --git a/src/types/touch-portal-client-event.ts b/src/types/touch-portal-client-event.ts new file mode 100644 index 0000000..350ff87 --- /dev/null +++ b/src/types/touch-portal-client-event.ts @@ -0,0 +1,14 @@ +export enum TouchPortalClientEvent { + Connected = 'connected', + Close = 'Close', + Info = 'Info', + Settings = 'Settings', + NotificationClicked = 'NotificationClicked', + ListChange = 'ListChange', + Action = 'Action', + Broadcast = 'Broadcast', + ConnectorChange = 'ConnectorChange', + Message = 'Message', + ConnectorShortIdNotification = 'ConnectorShortIdNotification', + Update = 'Update' +} diff --git a/tests/connect.spec.ts b/tests/connect.spec.ts index 80a865e..a3099ff 100644 --- a/tests/connect.spec.ts +++ b/tests/connect.spec.ts @@ -1,6 +1,11 @@ import { describe, expect, Mock, test, vi } from 'vitest'; import { getMockSocketFrom } from './mocks/mock-socket'; -import type { PairRequest, TouchPortalClientOptions, TouchPortalConnectOptions } from '../src/types'; +import { + TouchPortalOutgoingRequestType, + type PairRequest, + type TouchPortalClientOptions, + type TouchPortalConnectOptions +} from '../src/types'; import TouchPortalClient from '../src/client'; describe('connect', () => { @@ -33,7 +38,7 @@ describe('connect', () => { }); test('on connect sends "pair" request', () => { - const expectedPairRequest: PairRequest = { type: 'pair', id: pluginId }; + const expectedPairRequest: PairRequest = { type: TouchPortalOutgoingRequestType.Pair, id: pluginId }; const client = new TouchPortalClient(defaultConstructorOptions); const mockSocket = getMockSocketFrom(() => client.connect()); From a574b7abd7815bd0c7456ba8a95880c3207ab493 Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Thu, 24 Jul 2025 20:47:44 +0100 Subject: [PATCH 09/12] cleanup unused eslint rules --- .eslintrc.json | 5 --- package-lock.json | 14 ------- package.json | 1 - src/client.ts | 102 +++++++++++++++++++++++----------------------- 4 files changed, 50 insertions(+), 72 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 1d049a9..3e02837 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -18,15 +18,10 @@ "plugin:prettier/recommended" ], "rules": { - "global-require": "off", - "max-len": "off", "no-console": "off", - "no-continue": "off", - "no-param-reassign": "off", "comma-dangle": "off", "class-methods-use-this": "off", "lines-between-class-members": "off", - "consistent-return": "off", "import/extensions": "off", "import/prefer-default-export": "off", "prettier/prettier": "error" diff --git a/package-lock.json b/package-lock.json index e879689..b825919 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,6 @@ "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-prettier": "^5.5.3", - "globals": "^16.2.0", "prettier": "^3.6.2", "typescript": "^5.8.3", "vitest": "^3.2.4" @@ -3798,19 +3797,6 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", diff --git a/package.json b/package.json index 2a55e3b..f77e320 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-prettier": "^5.5.3", - "globals": "^16.2.0", "prettier": "^3.6.2", "typescript": "^5.8.3", "vitest": "^3.2.4" diff --git a/src/client.ts b/src/client.ts index d312b35..c4cdf82 100644 --- a/src/client.ts +++ b/src/client.ts @@ -119,61 +119,59 @@ export default class TouchPortalClient extends EventEmitter { pos = n + 1; // advance next newline search position lineBuffer = ''; // we're done with the line buffer - // Try to decode the message. - let message; try { - message = JSON.parse(line); + // Try to decode the message. + const message = JSON.parse(line); + + // Handle internal TP Messages here, else pass to user code + switch (message.type) { + case TouchPortalIncomingEventType.ClosePluginCall: + if (message.pluginId === this.pluginId) { + this.emit(TouchPortalClientEvent.Close, message); + this.disconnect(); + } + break; + case TouchPortalIncomingEventType.Info: + this.emit(TouchPortalClientEvent.Info, message); + + if (message.settings) { + this.emit(TouchPortalClientEvent.Settings, message.settings); + } + + break; + case TouchPortalIncomingEventType.NotificationAction: + this.emit(TouchPortalClientEvent.NotificationClicked, message); + break; + case TouchPortalIncomingEventType.Settings: + // values is the key that is the same as how info contains settings key, for direct settings saving + this.emit(TouchPortalClientEvent.Settings, message.values); + break; + case TouchPortalIncomingEventType.ListChanged: + this.emit(TouchPortalClientEvent.ListChange, message); + break; + case TouchPortalIncomingEventType.ExecuteAction: + this.emit(TouchPortalClientEvent.Action, message, null); + break; + case TouchPortalIncomingEventType.Broadcast: + this.emit(TouchPortalClientEvent.Broadcast, message); + break; + case TouchPortalIncomingEventType.ConnectorShortIdInfo: + this.emit(TouchPortalClientEvent.ConnectorShortIdNotification, message); + break; + case TouchPortalIncomingEventType.ConnectorChange: + this.emit(TouchPortalClientEvent.ConnectorChange, message); + break; + case TouchPortalIncomingEventType.ActionHoldInfo_Up: + this.emit(TouchPortalClientEvent.Action, message, false); + break; + case TouchPortalIncomingEventType.ActionHoldInfo_Down: + this.emit(TouchPortalClientEvent.Action, message, true); + break; + default: + this.emit(TouchPortalClientEvent.Message, message); + } } catch (ex) { this.log(LoggingLevel.ERROR, 'JSON exception while parsing line:', line, '\n', ex); - continue; - } - - // Handle internal TP Messages here, else pass to user code - switch (message.type) { - case TouchPortalIncomingEventType.ClosePluginCall: - if (message.pluginId === this.pluginId) { - this.emit(TouchPortalClientEvent.Close, message); - this.disconnect(); - } - break; - case TouchPortalIncomingEventType.Info: - this.emit(TouchPortalClientEvent.Info, message); - - if (message.settings) { - this.emit(TouchPortalClientEvent.Settings, message.settings); - } - - break; - case TouchPortalIncomingEventType.NotificationAction: - this.emit(TouchPortalClientEvent.NotificationClicked, message); - break; - case TouchPortalIncomingEventType.Settings: - // values is the key that is the same as how info contains settings key, for direct settings saving - this.emit(TouchPortalClientEvent.Settings, message.values); - break; - case TouchPortalIncomingEventType.ListChanged: - this.emit(TouchPortalClientEvent.ListChange, message); - break; - case TouchPortalIncomingEventType.ExecuteAction: - this.emit(TouchPortalClientEvent.Action, message, null); - break; - case TouchPortalIncomingEventType.Broadcast: - this.emit(TouchPortalClientEvent.Broadcast, message); - break; - case TouchPortalIncomingEventType.ConnectorShortIdInfo: - this.emit(TouchPortalClientEvent.ConnectorShortIdNotification, message); - break; - case TouchPortalIncomingEventType.ConnectorChange: - this.emit(TouchPortalClientEvent.ConnectorChange, message); - break; - case TouchPortalIncomingEventType.ActionHoldInfo_Up: - this.emit(TouchPortalClientEvent.Action, message, false); - break; - case TouchPortalIncomingEventType.ActionHoldInfo_Down: - this.emit(TouchPortalClientEvent.Action, message, true); - break; - default: - this.emit(TouchPortalClientEvent.Message, message); } } }); From 4a36c7c7851aeb1fd87bc0520e0315bae861f4ef Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Fri, 25 Jul 2025 06:44:26 +0100 Subject: [PATCH 10/12] remove install build step --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index f77e320..bc28a72 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "dev": "rslib build --watch", "format": "prettier --write .", "lint": "eslint .", - "install": "npm run build", "test": "vitest --config vitest.config.mts" }, "keywords": [ From 2ebb5363b92e81f47e951e80d439e33678bf1e89 Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Fri, 25 Jul 2025 07:51:45 +0100 Subject: [PATCH 11/12] few fixes --- rslib.config.ts | 8 +------- src/client.ts | 11 ++++++++--- src/index.ts | 8 +++----- src/types/globals.d.ts | 1 - tests/check-for-update.spec.ts | 8 ++++---- tests/vitest.setup.ts | 1 - 6 files changed, 16 insertions(+), 21 deletions(-) delete mode 100644 src/types/globals.d.ts diff --git a/rslib.config.ts b/rslib.config.ts index 207131f..9ae5fe9 100644 --- a/rslib.config.ts +++ b/rslib.config.ts @@ -1,5 +1,4 @@ import { defineConfig } from '@rslib/core'; -import { version } from './package.json'; export default defineConfig({ lib: [ @@ -12,10 +11,5 @@ export default defineConfig({ format: 'cjs', syntax: ['node 18'] } - ], - source: { - define: { - TOUCHPORTAL_NODE_API_VERSION: JSON.stringify(version) - } - } + ] }); diff --git a/src/client.ts b/src/client.ts index c4cdf82..f349779 100644 --- a/src/client.ts +++ b/src/client.ts @@ -49,7 +49,12 @@ export default class TouchPortalClient extends EventEmitter { } // Plugin Updates - async checkForUpdate(githubUser: string, githubRepo: string, includePrerelease: boolean = false): Promise { + async checkForUpdate( + githubUser: string, + githubRepo: string, + currentVersion: string, + includePrerelease: boolean = false + ): Promise { const updateUrl = `https://api.github.com/repos/${githubUser}/${githubRepo}/releases`; try { @@ -66,8 +71,8 @@ export default class TouchPortalClient extends EventEmitter { const releaseVersion = release.tag_name.replace(/^v/, ''); if (includePrerelease || !release.prerelease) { - if (compare(releaseVersion, TOUCHPORTAL_NODE_API_VERSION, '>')) { - this.emit(TouchPortalClientEvent.Update, TOUCHPORTAL_NODE_API_VERSION, releaseVersion); + if (compare(releaseVersion, currentVersion, '>')) { + this.emit(TouchPortalClientEvent.Update, currentVersion, releaseVersion); return true; } } diff --git a/src/index.ts b/src/index.ts index 96d6e9b..17c2284 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,6 @@ import TouchPortalClient from './client'; -const TouchPortalAPI: { Client: typeof TouchPortalClient } = { - Client: TouchPortalClient -}; - +export const Client = TouchPortalClient; export * from './types'; -export default TouchPortalAPI; + +export default { Client }; diff --git a/src/types/globals.d.ts b/src/types/globals.d.ts deleted file mode 100644 index 8575483..0000000 --- a/src/types/globals.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare const TOUCHPORTAL_NODE_API_VERSION: string; diff --git a/tests/check-for-update.spec.ts b/tests/check-for-update.spec.ts index ec28fdf..13950fc 100644 --- a/tests/check-for-update.spec.ts +++ b/tests/check-for-update.spec.ts @@ -20,7 +20,7 @@ describe('checkForUpdate', () => { const client = new TouchPortalClient(defaultConstructorOptions); client.on('Update', listener); - await client.checkForUpdate('user', 'repo'); + await client.checkForUpdate('user', 'repo', pluginVersion); if (shouldEmitUpdate) { expect(listener).toHaveBeenCalledWith(pluginVersion, version.tag_name.replace(/^v/, '')); @@ -44,7 +44,7 @@ describe('checkForUpdate', () => { const client = new TouchPortalClient(defaultConstructorOptions); client.on('Update', listener); - await client.checkForUpdate('user', 'repo', true); + await client.checkForUpdate('user', 'repo', pluginVersion, true); if (shouldEmitUpdate) { expect(listener).toHaveBeenCalledWith(pluginVersion, version.tag_name.replace(/^v/, '')); @@ -58,7 +58,7 @@ describe('checkForUpdate', () => { vi.mocked(fetch).mockRejectedValueOnce(new Error('Network fail')); const client = new TouchPortalClient(defaultConstructorOptions); - await client.checkForUpdate('user', 'repo'); + await client.checkForUpdate('user', 'repo', pluginVersion); expect(logCallback).toHaveBeenCalled(); @@ -72,7 +72,7 @@ describe('checkForUpdate', () => { vi.mocked(fetch).mockResolvedValueOnce({ ok: false } as Response); const client = new TouchPortalClient(defaultConstructorOptions); - await client.checkForUpdate('user', 'repo'); + await client.checkForUpdate('user', 'repo', pluginVersion); expect(logCallback).toHaveBeenCalled(); diff --git a/tests/vitest.setup.ts b/tests/vitest.setup.ts index 0b2f2da..136e913 100644 --- a/tests/vitest.setup.ts +++ b/tests/vitest.setup.ts @@ -1,4 +1,3 @@ import { vi } from 'vitest'; vi.stubGlobal('fetch', vi.fn()); -vi.stubGlobal('TOUCHPORTAL_NODE_API_VERSION', '1.0.0'); From 73d4fdd3515a9eea00f1625584b4365da265033b Mon Sep 17 00:00:00 2001 From: DynamiteAndy Date: Sat, 26 Jul 2025 10:05:02 +0100 Subject: [PATCH 12/12] revert back to sync checkforupdate using .get --- .eslintrc.json | 5 ++ src/client.ts | 66 ++++++++++++++++--------- tests/check-for-update.spec.ts | 42 ++++++++++++---- tests/mocks/mock-https.ts | 90 ++++++++++++++++++++++++++++++++++ tests/utilities/next-tick.ts | 1 + tests/vitest.setup.ts | 3 -- tsconfig.json | 6 +-- vitest.config.mts | 2 +- 8 files changed, 176 insertions(+), 39 deletions(-) create mode 100644 tests/mocks/mock-https.ts create mode 100644 tests/utilities/next-tick.ts delete mode 100644 tests/vitest.setup.ts diff --git a/.eslintrc.json b/.eslintrc.json index 3e02837..8882744 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -22,6 +22,8 @@ "comma-dangle": "off", "class-methods-use-this": "off", "lines-between-class-members": "off", + "consistent-return": "off", + "no-return-assign": "off", "import/extensions": "off", "import/prefer-default-export": "off", "prettier/prettier": "error" @@ -39,6 +41,9 @@ "project": "./tests/tsconfig.test.json" }, "rules": { + "max-classes-per-file": "off", + "no-promise-executor-return": "off", + "no-underscore-dangle": "off", "import/no-extraneous-dependencies": ["error", { "devDependencies": true }] } } diff --git a/src/client.ts b/src/client.ts index f349779..20e7f88 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,5 +1,6 @@ import EventEmitter from 'events'; import net from 'net'; +import https from 'https'; import { compare } from 'compare-versions'; import { LoggingLevel, @@ -49,40 +50,61 @@ export default class TouchPortalClient extends EventEmitter { } // Plugin Updates - async checkForUpdate( + checkForUpdate( githubUser: string, githubRepo: string, currentVersion: string, includePrerelease: boolean = false - ): Promise { + ): void { const updateUrl = `https://api.github.com/repos/${githubUser}/${githubRepo}/releases`; - try { - const response = await fetch(updateUrl, { - headers: { 'User-Agent': this.pluginId } - }); + https + .get(updateUrl, { headers: { 'User-Agent': this.pluginId } }, (res) => { + const { statusCode } = res; - if (!response.ok) { - throw new Error(`${this.pluginId}: Request failed with status ${response.status}`); - } + if (statusCode !== 200) { + this.log(LoggingLevel.ERROR, `${this.pluginId}: Request failed with status ${statusCode}`); + res.resume(); + return; + } + + res.setEncoding('utf8'); + let updateData = ''; + + res.on('data', (chunk: string) => { + updateData += chunk; + }); - const releases = (await response.json()) as { tag_name: string; prerelease: boolean }[]; - releases.some((release: { tag_name: string; prerelease: boolean }) => { - const releaseVersion = release.tag_name.replace(/^v/, ''); + res.on('end', () => { + try { + const releases = JSON.parse(updateData) as { tag_name: string; prerelease: boolean }[]; + releases.some((release: { tag_name: string; prerelease: boolean }) => { + const releaseVersion = release.tag_name.replace(/^v/, ''); - if (includePrerelease || !release.prerelease) { - if (compare(releaseVersion, currentVersion, '>')) { - this.emit(TouchPortalClientEvent.Update, currentVersion, releaseVersion); - return true; + if (includePrerelease || !release.prerelease) { + if (compare(releaseVersion, currentVersion, '>')) { + this.emit(TouchPortalClientEvent.Update, currentVersion, releaseVersion); + return true; + } + } + + return false; + }); + } catch (e) { + const err = e instanceof Error ? e : new Error(String(e)); + this.log(LoggingLevel.ERROR, `${this.pluginId}: Failed to parse update response: ${err.message}`); } - } + }); - return false; + res.on('error', (ex: unknown) => { + const err = ex instanceof Error ? ex : new Error(String(ex)); + this.log(LoggingLevel.ERROR, `checkForUpdate: Response error: ${err.message}`); + }); + }) + .on('error', (ex: unknown) => { + const err = ex instanceof Error ? ex : new Error(String(ex)); + this.log(LoggingLevel.ERROR, `checkForUpdate: Request error: ${err.message}`); }); - } catch (ex: unknown) { - const err = ex instanceof Error ? ex : new Error(String(ex)); - this.log(LoggingLevel.ERROR, `checkForUpdate: Check for update failed: ${err.message}`); - } } // Connection diff --git a/tests/check-for-update.spec.ts b/tests/check-for-update.spec.ts index 13950fc..f93a83c 100644 --- a/tests/check-for-update.spec.ts +++ b/tests/check-for-update.spec.ts @@ -1,6 +1,8 @@ import { describe, expect, Mock, test, vi } from 'vitest'; +import { mockResponse, mockResponseError, mockRequestError } from './mocks/mock-https'; import { TouchPortalClientOptions } from '../src/types'; import TouchPortalClient from '../src/client'; +import { nextTick } from './utilities/next-tick'; describe('checkForUpdate', () => { const pluginVersion = '1.0.0'; @@ -14,13 +16,14 @@ describe('checkForUpdate', () => { { version: { tag_name: 'v1.0.0', prerelease: false }, shouldEmitUpdate: false }, { version: { tag_name: 'v0.1.0', prerelease: false }, shouldEmitUpdate: false } ])('should emit a "Update" event if a newer stable version is found', async ({ version, shouldEmitUpdate }) => { - vi.mocked(fetch).mockResolvedValueOnce({ ok: true, json: async () => [version] } as Response); + mockResponse(JSON.stringify([version]), 200); const listener = vi.fn(); const client = new TouchPortalClient(defaultConstructorOptions); client.on('Update', listener); + client.checkForUpdate('user', 'repo', pluginVersion); - await client.checkForUpdate('user', 'repo', pluginVersion); + await nextTick(); if (shouldEmitUpdate) { expect(listener).toHaveBeenCalledWith(pluginVersion, version.tag_name.replace(/^v/, '')); @@ -38,13 +41,14 @@ describe('checkForUpdate', () => { ])( 'should emit a "Update" event if a newer stable or prerelease version is found', async ({ version, shouldEmitUpdate }) => { - vi.mocked(fetch).mockResolvedValueOnce({ ok: true, json: async () => [version] } as Response); + mockResponse(JSON.stringify([version]), 200); const listener = vi.fn(); const client = new TouchPortalClient(defaultConstructorOptions); client.on('Update', listener); + client.checkForUpdate('user', 'repo', pluginVersion, true); - await client.checkForUpdate('user', 'repo', pluginVersion, true); + await nextTick(); if (shouldEmitUpdate) { expect(listener).toHaveBeenCalledWith(pluginVersion, version.tag_name.replace(/^v/, '')); @@ -54,11 +58,29 @@ describe('checkForUpdate', () => { } ); - test('should log if fetch errors', async () => { - vi.mocked(fetch).mockRejectedValueOnce(new Error('Network fail')); + test('should log if get request errors', async () => { + mockRequestError(new Error('Network fail')); const client = new TouchPortalClient(defaultConstructorOptions); - await client.checkForUpdate('user', 'repo', pluginVersion); + client.checkForUpdate('user', 'repo', pluginVersion); + + await nextTick(); + + expect(logCallback).toHaveBeenCalled(); + + const [level, ...args] = logCallback.mock.calls[0]; + + expect(typeof level).toBe('string'); + expect(args.length).toBeGreaterThan(0); + }); + + test('should log if get response errors', async () => { + mockResponseError(new Error('Response error')); + + const client = new TouchPortalClient(defaultConstructorOptions); + client.checkForUpdate('user', 'repo', pluginVersion); + + await nextTick(); expect(logCallback).toHaveBeenCalled(); @@ -69,10 +91,12 @@ describe('checkForUpdate', () => { }); test('should log if response is not ok', async () => { - vi.mocked(fetch).mockResolvedValueOnce({ ok: false } as Response); + mockResponse('', 404); const client = new TouchPortalClient(defaultConstructorOptions); - await client.checkForUpdate('user', 'repo', pluginVersion); + client.checkForUpdate('user', 'repo', pluginVersion); + + await nextTick(); expect(logCallback).toHaveBeenCalled(); diff --git a/tests/mocks/mock-https.ts b/tests/mocks/mock-https.ts new file mode 100644 index 0000000..9073a9d --- /dev/null +++ b/tests/mocks/mock-https.ts @@ -0,0 +1,90 @@ +import { EventEmitter } from 'events'; +import { Readable } from 'stream'; +import { vi } from 'vitest'; + +class MockResponse extends Readable { + public statusCode: number; + public headers: Record = {}; + public rawHeaders: string[] = []; + public body: string; + + public setEncoding = vi.fn(); + + constructor(body: string, statusCode: number) { + super(); + this.statusCode = statusCode; + this.body = body; + } + + _read() { + this.push(this.body); + this.push(null); + } + + emitError(err: unknown) { + process.nextTick(() => this.emit('error', err)); + } +} + +class MockRequest extends EventEmitter { + public end = vi.fn(); + public abort = vi.fn(); + + emitError(err: unknown) { + process.nextTick(() => this.emit('error', err)); + } +} + +type MockHttpConfig = + | { type: 'response'; body: string; statusCode: number } + | { type: 'request-error'; error: Error } + | { type: 'response-error'; error: Error }; + +const mockHttpConfigs: MockHttpConfig[] = []; +const mockHttpGetFactory = vi.fn((_, __, callback) => { + const config = mockHttpConfigs.shift(); + const req = new MockRequest(); + + if (!config) { + throw new Error('No mock config specified for https.get call'); + } + + if (config.type === 'request-error') { + process.nextTick(() => req.emitError(config.error)); + return req; + } + + const res = new MockResponse( + config.type === 'response' ? config.body : '', + config.type === 'response' && config.statusCode ? config.statusCode : 200 + ); + + process.nextTick(() => { + callback(res); + + if (config.type === 'response-error') { + res.emitError(config.error); + } else { + res._read(); + } + }); + + return req; +}); + +vi.mock('https', () => ({ + get: mockHttpGetFactory, + default: { get: mockHttpGetFactory } +})); + +export const mockResponse = (body: string, statusCode: number) => { + mockHttpConfigs.push({ type: 'response', body, statusCode }); +}; + +export const mockRequestError = (error: Error) => { + mockHttpConfigs.push({ type: 'request-error', error }); +}; + +export const mockResponseError = (error: Error) => { + mockHttpConfigs.push({ type: 'response-error', error }); +}; diff --git a/tests/utilities/next-tick.ts b/tests/utilities/next-tick.ts new file mode 100644 index 0000000..0ca90be --- /dev/null +++ b/tests/utilities/next-tick.ts @@ -0,0 +1 @@ +export const nextTick = (): Promise => new Promise((resolve) => process.nextTick(resolve)); diff --git a/tests/vitest.setup.ts b/tests/vitest.setup.ts deleted file mode 100644 index 136e913..0000000 --- a/tests/vitest.setup.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { vi } from 'vitest'; - -vi.stubGlobal('fetch', vi.fn()); diff --git a/tsconfig.json b/tsconfig.json index 37f6194..69b6980 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,14 +2,12 @@ "compilerOptions": { "lib": ["ES2020"], "module": "ESNext", - "noEmit": true, "strict": true, - "skipLibCheck": true, "isolatedModules": true, "resolveJsonModule": true, "moduleResolution": "bundler", - "useDefineForClassFields": true, - "allowImportingTsExtensions": true + "declaration": true, + "declarationMap": true }, "include": ["src"] } diff --git a/vitest.config.mts b/vitest.config.mts index 1ad344f..5a5c6c5 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -7,7 +7,7 @@ export default defineConfig({ globals: true, watch: false, environment: 'node', - setupFiles: ['./tests/vitest.setup.ts'] + setupFiles: [] }, plugins: [] });