diff --git a/web-wallet/.editorconfig b/web-wallet/.editorconfig deleted file mode 100644 index 4843a5e1a2..0000000000 --- a/web-wallet/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -indent_style = tab -indent_size = 4 -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.yml] -indent_style = space -indent_size = 2 diff --git a/web-wallet/.eslintrc.cjs b/web-wallet/.eslintrc.cjs index 496a8229ac..6447794580 100644 --- a/web-wallet/.eslintrc.cjs +++ b/web-wallet/.eslintrc.cjs @@ -1,73 +1,50 @@ module.exports = { - "env": { - "browser": true, - "es2022": true, - "node": true - }, - "extends": [ - "@dusk-network/eslint-config/js", - "@dusk-network/eslint-config/svelte" - ], - "globals": { - "CONFIG": false - }, - "overrides": [{ - "files": ["*.svelte"], - "rules": { - "no-undef-init": 0, - "svelte/require-optimized-style-attribute": 0 - } - }, { - "files": ["*.spec.js", "*.test.js"], - "rules": { - "brace-style": [ - "error", - "1tbs", - { "allowSingleLine": true } - ], - "jsdoc/require-jsdoc": 0, - "max-len": [ - "error", { - "code": 110, - "comments": 110, - "ignorePattern": "^\\s*it\\(", - "ignoreUrls": true - } - ], - "max-nested-callbacks": [ - "error", - 5 - ], - "max-statements": 0, - "max-statements-per-line": [ - "error", { - "max": 2 - } - ], - "object-curly-newline": 0, - "quote-props": [ - "error", - "consistent" - ], - "sort-keys": 0 - } - }], - "root": true, - "settings": { - "import/resolver": { - "eslint-import-resolver-custom-alias": { - "alias": { - "$app": "node_modules/@sveltejs/kit/src/runtime/app", - "$config": "./src/config", - "$lib": "./src/lib", - "@sveltejs/kit": "node_modules/@sveltejs/kit/src/exports/index.js", - "@testing-library/svelte": "node_modules/@testing-library/svelte/src/index.js", - "svelte/motion": "node_modules/svelte/src/runtime/motion/index.js", - "svelte/store": "node_modules/svelte/src/runtime/store/index.js", - "svelte/transition": "node_modules/svelte/src/runtime/transition/index.js" - }, - "extensions": [".cjs", ".js", ".json", ".svelte"] - } - } - } + env: { + browser: true, + es2022: true, + node: true, + }, + extends: [ + "@dusk-network/eslint-config/js", + "@dusk-network/eslint-config/svelte", + ], + globals: { + CONFIG: false, + }, + overrides: [ + { + files: ["*.svelte"], + rules: { + "svelte/require-optimized-style-attribute": 0, + }, + }, + { + // Rules for conventional testing practices using Vitest. + files: ["*.spec.js", "*.test.js"], + rules: { + "max-nested-callbacks": ["error", 5], + "max-statements": 0, + }, + }, + ], + root: true, + settings: { + "import/resolver": { + "eslint-import-resolver-custom-alias": { + alias: { + $app: "node_modules/@sveltejs/kit/src/runtime/app", + $config: "./src/config", + $lib: "./src/lib", + "@sveltejs/kit": "node_modules/@sveltejs/kit/src/exports/index.js", + "@testing-library/svelte": + "node_modules/@testing-library/svelte/src/index.js", + "svelte/motion": "node_modules/svelte/src/runtime/motion/index.js", + "svelte/store": "node_modules/svelte/src/runtime/store/index.js", + "svelte/transition": + "node_modules/svelte/src/runtime/transition/index.js", + }, + extensions: [".cjs", ".js", ".json", ".svelte"], + }, + }, + }, }; diff --git a/web-wallet/CHANGELOG.md b/web-wallet/CHANGELOG.md index e92f89112d..e684c94ced 100644 --- a/web-wallet/CHANGELOG.md +++ b/web-wallet/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Refactor beta notice as constant [#1469] - Refactor `settingsStore` and create readable `gasStore` to store `limitLower`, `limitUpper`, `priceLower` [#1308] +- Refactor add Prettier for formatting and format all files [#1458] ### Removed @@ -26,7 +27,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Mismatch between param and JSDoc param's type definition (OperationResult.spec.js) [#1471] - Fix gas limits update on ENV change [#1308] - ## [0.3.0] - 2024-02-28 ### Added @@ -108,6 +108,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add initial commit + +[#1458]: https://github.com/dusk-network/rusk/issues/1458 [#1308]: https://github.com/dusk-network/rusk/issues/1308 [#1359]: https://github.com/dusk-network/rusk/issues/1359 [#1311]: https://github.com/dusk-network/rusk/issues/1311 @@ -142,9 +144,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#1469]: https://github.com/dusk-network/rusk/issues/1469 [#1470]: https://github.com/dusk-network/rusk/issues/1470 [#1471]: https://github.com/dusk-network/rusk/issues/1471 -[#1362]: https://github.com/dusk-network/rusk/issues/1362 + [Unreleased]: https://github.com/dusk-network/rusk/tree/master/web-wallet [0.3.0]: https://github.com/dusk-network/rusk/tree/web-wallet-0.3.0 [0.2.1]: https://github.com/dusk-network/rusk/tree/web-wallet-0.2.1 diff --git a/web-wallet/README.md b/web-wallet/README.md index 77cb060c37..20b98cb09b 100644 --- a/web-wallet/README.md +++ b/web-wallet/README.md @@ -5,11 +5,11 @@ Web Wallet website. ## TOC - [Web Wallet](#web-wallet) - - [TOC](#toc) - - [Build system and dev environment](#build-system-and-dev-environment) - - [Environment variables](#environment-variables) + - [TOC](#toc) + - [Build system and dev environment](#build-system-and-dev-environment) + - [Environment variables](#environment-variables) - [NPM scripts](#npm-scripts) - - [Running a local Rusk node](#running-a-local-rusk-node) + - [Running a local Rusk node](#running-a-local-rusk-node) ## Build system and dev environment @@ -23,6 +23,7 @@ As the application uses the [Web Crypto API](https://developer.mozilla.org/en-US The staging environment is at https://web-wallet-staging-oxs3z.ondigitalocean.app/ ## Environment variables + The `dusk-wallet-js` library uses some [environment variables](https://github.com/dusk-network/dusk-wallet-js/blob/main/.env). The application defines these variables by reading a local `.env` file containing the same variables used in the `dusk-wallet-js`, with the addition of the `VITE_` prefix. diff --git a/web-wallet/__mocks__/Wallet.js b/web-wallet/__mocks__/Wallet.js index 96c610d579..f465ef3a98 100644 --- a/web-wallet/__mocks__/Wallet.js +++ b/web-wallet/__mocks__/Wallet.js @@ -1,27 +1,27 @@ class Wallet { - constructor (seed, gasLimit = 2900000000, gasPrice = 1) { - this.gasLimit = gasLimit; - this.gasPrice = gasPrice; - this.seed = seed; - this.wasm = {}; - } + constructor(seed, gasLimit = 2900000000, gasPrice = 1) { + this.gasLimit = gasLimit; + this.gasPrice = gasPrice; + this.seed = seed; + this.wasm = {}; + } - gasLimit; - gasPrice; - seed; - wasm; + gasLimit; + gasPrice; + seed; + wasm; - async history () {} - async getBalance () {} - async getPsks () {} - async stake () {} - async stakeAllow () {} - async stakeInfo () {} - async reset () {} - async sync () {} - async transfer () {} - async unstake () {} - async withdrawReward () {} + async history() {} + async getBalance() {} + async getPsks() {} + async stake() {} + async stakeAllow() {} + async stakeInfo() {} + async reset() {} + async sync() {} + async transfer() {} + async unstake() {} + async withdrawReward() {} } export default Wallet; diff --git a/web-wallet/jsconfig.json b/web-wallet/jsconfig.json index 0f45dc0b32..56a5ef226f 100644 --- a/web-wallet/jsconfig.json +++ b/web-wallet/jsconfig.json @@ -1,21 +1,19 @@ { - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "noImplicitAny": true, - "resolveJsonModule": true, - "skipLibCheck": false, - "sourceMap": true, - "strict": true, - "paths": { - "$lib": ["./src/lib"], - "$lib/*": ["./src/lib/*"] - }, - "types": [ - "./node_modules/@testing-library/jest-dom/types/vitest.d.ts" - ] - } + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "noImplicitAny": true, + "resolveJsonModule": true, + "skipLibCheck": false, + "sourceMap": true, + "strict": true, + "paths": { + "$lib": ["./src/lib"], + "$lib/*": ["./src/lib/*"] + }, + "types": ["./node_modules/@testing-library/jest-dom/types/vitest.d.ts"] + } } diff --git a/web-wallet/package-lock.json b/web-wallet/package-lock.json index c256a4216e..1f4dfa551d 100644 --- a/web-wallet/package-lock.json +++ b/web-wallet/package-lock.json @@ -1,7417 +1,7471 @@ { - "name": "web-wallet", - "version": "0.3.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "web-wallet", - "version": "0.3.0", - "license": "MPL-2.0", - "dependencies": { - "@dusk-network/dusk-wallet-js": "0.4.2", - "@floating-ui/dom": "1.5.3", - "@mdi/js": "7.3.67", - "bip39": "3.1.0", - "css-doodle": "0.37.4", - "lamb": "0.61.1", - "qr-scanner": "1.4.2", - "qrcode": "1.5.3", - "svelte-persisted-store": "0.7.0" - }, - "devDependencies": { - "@dusk-network/eslint-config": "2.1.0", - "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.27.6", - "@testing-library/jest-dom": "6.1.4", - "@testing-library/svelte": "4.0.5", - "@vitejs/plugin-basic-ssl": "1.0.2", - "@vitest/browser": "0.34.6", - "@vitest/coverage-v8": "0.34.6", - "@zerodevx/svelte-toast": "^0.9.5", - "autoprefixer": "10.4.16", - "eslint": "8.54.0", - "eslint-import-resolver-custom-alias": "1.3.2", - "eslint-plugin-svelte": "2.35.1", - "jsdom": "23.0.0", - "jsdom-worker": "0.3.0", - "postcss-nested": "6.0.1", - "svelte": "4.2.7", - "svelte-check": "3.6.2", - "svelte-preprocess": "5.1.1", - "typescript": "5.3.2", - "vite": "4.5.0", - "vite-plugin-node-polyfills": "0.17.0", - "vite-tsconfig-paths": "4.2.1", - "vitest": "0.34.6" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "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/@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", - "dev": true - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@dusk-network/dusk-wallet-js": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@dusk-network/dusk-wallet-js/-/dusk-wallet-js-0.4.2.tgz", - "integrity": "sha512-9Jy/Amm4oKkPvjw9/xo7/RRwm9U6fRobkFArVcPXwN5sL2uz6/UPd7b6w4X5bBTrdEyCZHNBwtslmwAHrwV6dA==", - "dependencies": { - "dexie": "3.2.4", - "fake-indexeddb": "5.0.1" - } - }, - "node_modules/@dusk-network/eslint-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@dusk-network/eslint-config/-/eslint-config-2.1.0.tgz", - "integrity": "sha512-A9qT+pg0MFJnWFZtQOBK2jdIyufg1nxPSxuFHThGJN+yqRSYV3GYQA7HkfkSJLGHSqxgfqhKz/FTYNzSjoJWhw==", - "dev": true, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "eslint-plugin-svelte": ">=2.31.0" - }, - "peerDependencies": { - "eslint": ">=8.0.0", - "eslint-plugin-import": ">=2.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "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==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "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==", - "dev": true, - "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, - "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/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dependencies": { - "@floating-ui/utils": "^0.2.1" - } - }, - "node_modules/@floating-ui/core/node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "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, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jspm/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", - "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", - "dev": true - }, - "node_modules/@mdi/js": { - "version": "7.3.67", - "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz", - "integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw==" - }, - "node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "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, - "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, - "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, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", - "dev": true - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sveltejs/adapter-static": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", - "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", - "dev": true, - "peerDependencies": { - "@sveltejs/kit": "^1.5.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "1.27.6", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.6.tgz", - "integrity": "sha512-GsjTkMbKzXdbeRg0tk8S7HNShQ4879ftRr0ZHaZfjbig1xQwG57Bvcm9U9/mpLJtCapLbLWUnygKrgcLISLC8A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte": "^2.5.0", - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0", - "devalue": "^4.3.1", - "esm-env": "^1.0.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.0", - "mrmime": "^1.0.1", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^2.0.2", - "tiny-glob": "^0.2.9", - "undici": "~5.26.2" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": "^16.14 || >=18" - }, - "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", - "vite": "^4.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.3.tgz", - "integrity": "sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==", - "dev": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", - "debug": "^4.3.4", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.3", - "svelte-hmr": "^0.15.3", - "vitefu": "^0.2.4" - }, - "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", - "vite": "^4.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", - "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^2.2.0", - "svelte": "^3.54.0 || ^4.0.0", - "vite": "^4.0.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz", - "integrity": "sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==", - "dev": true, - "dependencies": { - "@adobe/css-tools": "^4.3.1", - "@babel/runtime": "^7.9.2", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - }, - "peerDependencies": { - "@jest/globals": ">= 28", - "@types/jest": ">= 28", - "jest": ">= 28", - "vitest": ">= 0.32" - }, - "peerDependenciesMeta": { - "@jest/globals": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "jest": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@testing-library/svelte": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-4.0.5.tgz", - "integrity": "sha512-P7X3mpYv/My4hBZfxVxTFV5KcA+EoWfRCguWP7WQdYj6HMdg/L+LiwG4ocvLe+hupedrC7dwcy85JlxKplJp2g==", - "dev": true, - "dependencies": { - "@testing-library/dom": "^9.3.1" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "svelte": "^3 || ^4" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", - "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", - "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "peer": true - }, - "node_modules/@types/node": { - "version": "20.11.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", - "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" - }, - "node_modules/@types/pug": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", - "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", - "dev": true - }, - "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/@vitejs/plugin-basic-ssl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.2.tgz", - "integrity": "sha512-DKHKVtpI+eA5fvObVgQ3QtTGU70CcCnedalzqmGSR050AzKZMdUzgC8KmlOneHWH8dF2hJ3wkC9+8FDVAaDRCw==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@vitest/browser": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-0.34.6.tgz", - "integrity": "sha512-XCIGROVgw3L+PwYw/T2l+HP/SPrXvh2MfmQNU3aULl5ekE+QVj9A1RYu/1mcYXdac9ES4ahxUz6n4wgcVd9tbA==", - "dev": true, - "dependencies": { - "estree-walker": "^3.0.3", - "magic-string": "^0.30.1", - "modern-node-polyfills": "^1.0.0", - "sirv": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": ">=0.34.0" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.6.tgz", - "integrity": "sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.1.5", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": ">=0.32.0 <1" - } - }, - "node_modules/@vitest/expect": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.34.6", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/snapshot/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/@vitest/spy": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", - "dev": true, - "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/@zerodevx/svelte-toast": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@zerodevx/svelte-toast/-/svelte-toast-0.9.5.tgz", - "integrity": "sha512-JLeB/oRdJfT+dz9A5bgd3Z7TuQnBQbeUtXrGIrNWMGqWbabpepBF2KxtWVhL2qtxpRqhae2f6NAOzH7xs4jUSw==", - "dev": true, - "peerDependencies": { - "svelte": "^3.57.0 || ^4.0.0" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "peer": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "peer": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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==", - "dev": true, - "peer": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bip39": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", - "dependencies": { - "@noble/hashes": "^1.2.0" - } - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "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/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", - "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.4", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.6", - "readable-stream": "^3.6.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-polyfill": { - "name": "buffer", - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001583", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz", - "integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/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, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/css-doodle": { - "version": "0.37.4", - "resolved": "https://registry.npmjs.org/css-doodle/-/css-doodle-0.37.4.tgz", - "integrity": "sha512-OWfEVRI3FvwitIpgBCsk48oFRas7wzH7gNSeRyWIJFWZ05KoJu9YmtcHdZdr2nbQmAZ4rJFKX/SrR37tmvQaLA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/css-doodle" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dev": true, - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "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/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", - "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", - "dev": true - }, - "node_modules/dexie": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.4.tgz", - "integrity": "sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/dijkstrajs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", - "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" - }, - "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/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "node_modules/domain-browser": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", - "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.656", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz", - "integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "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, - "peer": 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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-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==", - "dev": true, - "peer": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "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, - "peer": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-import-resolver-custom-alias": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-custom-alias/-/eslint-import-resolver-custom-alias-1.3.2.tgz", - "integrity": "sha512-wBPcZA2k6/IXaT8FsLMyiyVSG6WVEuaYIAbeKLXeGwr523BmeB9lKAAoLJWSqp3txsnU4gpkgD2x1q6K8k0uDQ==", - "dev": true, - "dependencies": { - "glob-parent": "^6.0.2", - "resolve": "^1.22.2" - }, - "peerDependencies": { - "eslint-plugin-import": ">=2.2.0" - } - }, - "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, - "peer": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "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, - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "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, - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "peer": 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.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "dependencies": { - "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, - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-svelte": { - "version": "2.35.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz", - "integrity": "sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "debug": "^4.3.1", - "eslint-compat-utils": "^0.1.2", - "esutils": "^2.0.3", - "known-css-properties": "^0.29.0", - "postcss": "^8.4.5", - "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "semver": "^7.5.3", - "svelte-eslint-parser": ">=0.33.0 <1.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0-0", - "svelte": "^3.37.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-svelte/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/esm-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", - "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", - "dev": true - }, - "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, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "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==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/fake-indexeddb": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-5.0.1.tgz", - "integrity": "sha512-vxybH29Owtc6khV/Usy47B1g+eKwyhFiX8nwpCC4td320jvwrKQDH6vNtcJZgUzVxmfsSIlHzLKQzT76JMCO7A==", - "engines": { - "node": ">=18" - } - }, - "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-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-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, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "peer": true, - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "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, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "peer": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/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, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "peer": 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/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, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "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, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "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==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "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==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "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-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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-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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "peer": true, - "engines": { - "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==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, - "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-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "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 - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isomorphic-timers-promises": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", - "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "23.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.0.tgz", - "integrity": "sha512-cbL/UCtohJguhFC7c2/hgW6BeZCNvP7URQGnx9tSJRYKCdnfbfWOrtuLTMfiB2VxKsx5wPHVsh/J0aBy9lIIhQ==", - "dev": true, - "dependencies": { - "cssstyle": "^3.0.0", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.14.2", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom-worker": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/jsdom-worker/-/jsdom-worker-0.3.0.tgz", - "integrity": "sha512-nlPmN0i93+e6vxzov8xqLMR+MBs/TAYeSviehivzqovHH0AgooVx9pQ/otrygASppPvdR+V9Jqx5SMe8+FcADg==", - "dev": true, - "dependencies": { - "mitt": "^3.0.0", - "uuid-v4": "^0.1.0" - }, - "peerDependencies": { - "node-fetch": "*" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/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, - "peer": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "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, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", - "dev": true - }, - "node_modules/lamb": { - "version": "0.61.1", - "resolved": "https://registry.npmjs.org/lamb/-/lamb-0.61.1.tgz", - "integrity": "sha512-KnJe/9ezIxQjeK5idtlffn9PlA2y4BNW0FslBZK20+EuMmvePfNL4qO2ZGdP187Vd3yWgrEnrBsfMal/Ggzowg==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.6", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.6.tgz", - "integrity": "sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "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, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "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==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } - }, - "node_modules/modern-node-polyfills": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-1.0.0.tgz", - "integrity": "sha512-w1yb6ae5qSUJJ2u41krkUAxs+L7i9143Qam8EuXwDMeZHxl1JN8RfTSXG4S2bt0RHIRMeoWm/HCeO0pNIHmIYQ==", - "dev": true, - "dependencies": { - "@jspm/core": "^2.0.1", - "@rollup/pluginutils": "^5.0.2", - "local-pkg": "^0.4.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "esbuild": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "peer": true, - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "peer": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/node-stdlib-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz", - "integrity": "sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==", - "dev": true, - "dependencies": { - "assert": "^2.0.0", - "browser-resolve": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^5.7.1", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "create-require": "^1.1.1", - "crypto-browserify": "^3.11.0", - "domain-browser": "^4.22.0", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "isomorphic-timers-promises": "^1.0.1", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "pkg-dir": "^5.0.0", - "process": "^0.11.10", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-stdlib-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "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==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "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, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "peer": 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==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "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==", - "dev": true, - "peer": 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/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, - "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==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true - }, - "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, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "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" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qr-scanner": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/qr-scanner/-/qr-scanner-1.4.2.tgz", - "integrity": "sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==", - "dependencies": { - "@types/offscreencanvas": "^2019.6.4" - } - }, - "node_modules/qrcode": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", - "dependencies": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "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" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "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/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, - "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==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "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==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sander": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", - "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", - "dev": true, - "dependencies": { - "es6-promise": "^3.1.2", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" - } - }, - "node_modules/sander/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "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/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "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, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "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==", - "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" - } - }, - "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 - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sirv/node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/sorcery": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", - "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.14", - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0" - }, - "bin": { - "sorcery": "bin/sorcery" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "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 - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "peer": 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/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, - "peer": 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_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==", - "dev": true, - "peer": 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_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "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", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svelte": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.7.tgz", - "integrity": "sha512-UExR1KS7raTdycsUrKLtStayu4hpdV3VZQgM0akX8XbXgLBlosdE/Sf3crOgyh9xIjqSYB3UEBuUlIQKRQX2hg==", - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^3.2.1", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-check": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.2.tgz", - "integrity": "sha512-E6iFh4aUCGJLRz6QZXH3gcN/VFfkzwtruWSRmlKrLWQTiO6VzLsivR6q02WYLGNAGecV3EocqZuCDrC2uttZ0g==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "chokidar": "^3.4.1", - "fast-glob": "^3.2.7", - "import-fresh": "^3.2.1", - "picocolors": "^1.0.0", - "sade": "^1.7.4", - "svelte-preprocess": "^5.1.0", - "typescript": "^5.0.3" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "peerDependencies": { - "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" - } - }, - "node_modules/svelte-eslint-parser": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", - "integrity": "sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==", - "dev": true, - "dependencies": { - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "postcss": "^8.4.29", - "postcss-scss": "^4.0.8" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/svelte-hmr": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", - "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", - "dev": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, - "node_modules/svelte-persisted-store": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/svelte-persisted-store/-/svelte-persisted-store-0.7.0.tgz", - "integrity": "sha512-PczYS60ysScQ0DmTCPXQm5rwt8FfQzSlx0lCbljbE6hTCKqXaw2bP8KH1+B7QTPmuiy/QbAk4pjYpNCmZhjyRw==", - "engines": { - "node": ">=0.14" - }, - "peerDependencies": { - "svelte": "^3.48.0 || >4.0.0" - } - }, - "node_modules/svelte-preprocess": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.1.tgz", - "integrity": "sha512-p/Dp4hmrBW5mrCCq29lEMFpIJT2FZsRlouxEc5qpbOmXRbaFs7clLs8oKPwD3xCFyZfv1bIhvOzpQkhMEVQdMw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/pug": "^2.0.6", - "detect-indent": "^6.1.0", - "magic-string": "^0.27.0", - "sorcery": "^0.11.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">= 14.10.0" - }, - "peerDependencies": { - "@babel/core": "^7.10.2", - "coffeescript": "^2.5.1", - "less": "^3.11.3 || ^4.0.0", - "postcss": "^7 || ^8", - "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", - "pug": "^3.0.0", - "sass": "^1.26.8", - "stylus": "^0.55.0", - "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", - "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "coffeescript": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-load-config": { - "optional": true - }, - "pug": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/svelte-preprocess/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "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/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsconfck": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", - "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", - "dev": true, - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^14.13.1 || ^16 || >=18" - }, - "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "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, - "peer": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "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": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "peer": 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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", - "dev": true - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", - "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "dev": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid-v4": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/uuid-v4/-/uuid-v4-0.1.0.tgz", - "integrity": "sha512-m11RYDtowtAIihBXMoGajOEKpAXrKbpKlpmxqyztMYQNGSY5nZAZ/oYch/w2HNS1RMA4WLGcZvuD8/wFMuCEzA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-node-polyfills": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.17.0.tgz", - "integrity": "sha512-iPmPn7376e5u6QvoTSJa16hf5Q0DFwHFXJk2uYpsNlmI3JdPms7hWyh55o+OysJ5jo9J5XPhLC9sMOYifwFd1w==", - "dev": true, - "dependencies": { - "@rollup/plugin-inject": "^5.0.5", - "buffer-polyfill": "npm:buffer@^6.0.3", - "node-stdlib-browser": "^1.2.0", - "process": "^0.11.10" - }, - "funding": { - "url": "https://github.com/sponsors/davidmyersdev" - }, - "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", - "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "dev": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.6", - "@vitest/runner": "0.34.6", - "@vitest/snapshot": "0.34.6", - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.6", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", - "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } + "name": "web-wallet", + "version": "0.3.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web-wallet", + "version": "0.3.0", + "license": "MPL-2.0", + "dependencies": { + "@dusk-network/dusk-wallet-js": "0.4.2", + "@floating-ui/dom": "1.5.3", + "@mdi/js": "7.3.67", + "bip39": "3.1.0", + "css-doodle": "0.37.4", + "lamb": "0.61.1", + "qr-scanner": "1.4.2", + "qrcode": "1.5.3", + "svelte-persisted-store": "0.7.0" + }, + "devDependencies": { + "@dusk-network/eslint-config": "3.1.0", + "@dusk-network/prettier-config": "1.0.0", + "@sveltejs/adapter-static": "2.0.3", + "@sveltejs/kit": "1.27.6", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/svelte": "4.0.5", + "@vitejs/plugin-basic-ssl": "1.0.2", + "@vitest/browser": "0.34.6", + "@vitest/coverage-v8": "0.34.6", + "@zerodevx/svelte-toast": "0.9.5", + "autoprefixer": "10.4.16", + "eslint": "8.57.0", + "eslint-import-resolver-custom-alias": "1.3.2", + "eslint-plugin-svelte": "2.35.1", + "jsdom": "23.0.0", + "jsdom-worker": "0.3.0", + "postcss-nested": "6.0.1", + "prettier": "3.2.5", + "prettier-plugin-svelte": "3.2.2", + "svelte": "4.2.7", + "svelte-check": "3.6.2", + "svelte-preprocess": "5.1.1", + "typescript": "5.3.2", + "vite": "4.5.0", + "vite-plugin-node-polyfills": "0.17.0", + "vite-tsconfig-paths": "4.2.1", + "vitest": "0.34.6" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@dusk-network/dusk-wallet-js": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@dusk-network/dusk-wallet-js/-/dusk-wallet-js-0.4.2.tgz", + "integrity": "sha512-9Jy/Amm4oKkPvjw9/xo7/RRwm9U6fRobkFArVcPXwN5sL2uz6/UPd7b6w4X5bBTrdEyCZHNBwtslmwAHrwV6dA==", + "dependencies": { + "dexie": "3.2.4", + "fake-indexeddb": "5.0.1" + } + }, + "node_modules/@dusk-network/eslint-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@dusk-network/eslint-config/-/eslint-config-3.1.0.tgz", + "integrity": "sha512-g6rR7S84Y7jCeAy6+uAK7Vc1jhQvkTx6zXNujifiBmmPDn5Pa41PD8khWZMs586OO1BfsbhfY7CqBelZ67l2Jw==", + "dev": true, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "eslint-plugin-svelte": ">=2.35.1" + }, + "peerDependencies": { + "eslint": ">=8.56.0", + "eslint-config-prettier": ">=9.1.0", + "eslint-plugin-import": ">=2.29.1" + } + }, + "node_modules/@dusk-network/prettier-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dusk-network/prettier-config/-/prettier-config-1.0.0.tgz", + "integrity": "sha512-tEmXgJ1MFqz6W0cTPq5o8TLBZBmAUeJM56gWh/0Ssh7Ol2uc1qXtB/EhylPagBPcbCwcR67XCteELQ12aFvgDw==", + "dev": true, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "prettier-plugin-svelte": ">=3.2.1" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "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==", + "dev": true, + "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, + "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/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/core/node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "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, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jspm/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", + "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", + "dev": true + }, + "node_modules/@mdi/js": { + "version": "7.3.67", + "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz", + "integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw==" + }, + "node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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, + "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, + "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, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", + "dev": true + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sveltejs/adapter-static": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", + "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", + "dev": true, + "peerDependencies": { + "@sveltejs/kit": "^1.5.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "1.27.6", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.6.tgz", + "integrity": "sha512-GsjTkMbKzXdbeRg0tk8S7HNShQ4879ftRr0ZHaZfjbig1xQwG57Bvcm9U9/mpLJtCapLbLWUnygKrgcLISLC8A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte": "^2.5.0", + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0", + "devalue": "^4.3.1", + "esm-env": "^1.0.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "mrmime": "^1.0.1", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^2.0.2", + "tiny-glob": "^0.2.9", + "undici": "~5.26.2" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": "^16.14 || >=18" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.3.tgz", + "integrity": "sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.3", + "svelte-hmr": "^0.15.3", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", + "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.2.0", + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/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": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz", + "integrity": "sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.3.1", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@jest/globals": ">= 28", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "@jest/globals": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/svelte": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-4.0.5.tgz", + "integrity": "sha512-P7X3mpYv/My4hBZfxVxTFV5KcA+EoWfRCguWP7WQdYj6HMdg/L+LiwG4ocvLe+hupedrC7dwcy85JlxKplJp2g==", + "dev": true, + "dependencies": { + "@testing-library/dom": "^9.3.1" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "svelte": "^3 || ^4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", + "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", + "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, + "node_modules/@types/pug": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", + "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", + "dev": true + }, + "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/@vitejs/plugin-basic-ssl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.2.tgz", + "integrity": "sha512-DKHKVtpI+eA5fvObVgQ3QtTGU70CcCnedalzqmGSR050AzKZMdUzgC8KmlOneHWH8dF2hJ3wkC9+8FDVAaDRCw==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@vitest/browser": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-0.34.6.tgz", + "integrity": "sha512-XCIGROVgw3L+PwYw/T2l+HP/SPrXvh2MfmQNU3aULl5ekE+QVj9A1RYu/1mcYXdac9ES4ahxUz6n4wgcVd9tbA==", + "dev": true, + "dependencies": { + "estree-walker": "^3.0.3", + "magic-string": "^0.30.1", + "modern-node-polyfills": "^1.0.0", + "sirv": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.34.0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.6.tgz", + "integrity": "sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.32.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", + "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", + "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.6", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", + "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@vitest/spy": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", + "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", + "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@zerodevx/svelte-toast": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@zerodevx/svelte-toast/-/svelte-toast-0.9.5.tgz", + "integrity": "sha512-JLeB/oRdJfT+dz9A5bgd3Z7TuQnBQbeUtXrGIrNWMGqWbabpepBF2KxtWVhL2qtxpRqhae2f6NAOzH7xs4jUSw==", + "dev": true, + "peerDependencies": { + "svelte": "^3.57.0 || ^4.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "peer": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "peer": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true, + "peer": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", + "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-polyfill": { + "name": "buffer", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001583", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz", + "integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-doodle": { + "version": "0.37.4", + "resolved": "https://registry.npmjs.org/css-doodle/-/css-doodle-0.37.4.tgz", + "integrity": "sha512-OWfEVRI3FvwitIpgBCsk48oFRas7wzH7gNSeRyWIJFWZ05KoJu9YmtcHdZdr2nbQmAZ4rJFKX/SrR37tmvQaLA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/css-doodle" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", + "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", + "dev": true + }, + "node_modules/dexie": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.4.tgz", + "integrity": "sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" + }, + "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/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.656", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz", + "integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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, + "peer": 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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-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==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "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, + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", + "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-custom-alias": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-custom-alias/-/eslint-import-resolver-custom-alias-1.3.2.tgz", + "integrity": "sha512-wBPcZA2k6/IXaT8FsLMyiyVSG6WVEuaYIAbeKLXeGwr523BmeB9lKAAoLJWSqp3txsnU4gpkgD2x1q6K8k0uDQ==", + "dev": true, + "dependencies": { + "glob-parent": "^6.0.2", + "resolve": "^1.22.2" + }, + "peerDependencies": { + "eslint-plugin-import": ">=2.2.0" + } + }, + "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, + "peer": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "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, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "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, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "peer": 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.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "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, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "2.35.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz", + "integrity": "sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "debug": "^4.3.1", + "eslint-compat-utils": "^0.1.2", + "esutils": "^2.0.3", + "known-css-properties": "^0.29.0", + "postcss": "^8.4.5", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "semver": "^7.5.3", + "svelte-eslint-parser": ">=0.33.0 <1.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0", + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-svelte/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/esm-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", + "dev": true + }, + "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, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "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==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/fake-indexeddb": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-5.0.1.tgz", + "integrity": "sha512-vxybH29Owtc6khV/Usy47B1g+eKwyhFiX8nwpCC4td320jvwrKQDH6vNtcJZgUzVxmfsSIlHzLKQzT76JMCO7A==", + "engines": { + "node": ">=18" + } + }, + "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-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "peer": true, + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "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, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "peer": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/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, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "peer": 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/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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "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==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "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-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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-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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "peer": true, + "engines": { + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "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-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "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 + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-timers-promises": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", + "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.0.tgz", + "integrity": "sha512-cbL/UCtohJguhFC7c2/hgW6BeZCNvP7URQGnx9tSJRYKCdnfbfWOrtuLTMfiB2VxKsx5wPHVsh/J0aBy9lIIhQ==", + "dev": true, + "dependencies": { + "cssstyle": "^3.0.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.7", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.14.2", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom-worker": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jsdom-worker/-/jsdom-worker-0.3.0.tgz", + "integrity": "sha512-nlPmN0i93+e6vxzov8xqLMR+MBs/TAYeSviehivzqovHH0AgooVx9pQ/otrygASppPvdR+V9Jqx5SMe8+FcADg==", + "dev": true, + "dependencies": { + "mitt": "^3.0.0", + "uuid-v4": "^0.1.0" + }, + "peerDependencies": { + "node-fetch": "*" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/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, + "peer": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "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, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "dev": true + }, + "node_modules/lamb": { + "version": "0.61.1", + "resolved": "https://registry.npmjs.org/lamb/-/lamb-0.61.1.tgz", + "integrity": "sha512-KnJe/9ezIxQjeK5idtlffn9PlA2y4BNW0FslBZK20+EuMmvePfNL4qO2ZGdP187Vd3yWgrEnrBsfMal/Ggzowg==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.6", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.6.tgz", + "integrity": "sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", + "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "node_modules/modern-node-polyfills": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-1.0.0.tgz", + "integrity": "sha512-w1yb6ae5qSUJJ2u41krkUAxs+L7i9143Qam8EuXwDMeZHxl1JN8RfTSXG4S2bt0RHIRMeoWm/HCeO0pNIHmIYQ==", + "dev": true, + "dependencies": { + "@jspm/core": "^2.0.1", + "@rollup/pluginutils": "^5.0.2", + "local-pkg": "^0.4.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "esbuild": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "peer": true, + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "peer": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/node-stdlib-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz", + "integrity": "sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "create-require": "^1.1.1", + "crypto-browserify": "^3.11.0", + "domain-browser": "^4.22.0", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "isomorphic-timers-promises": "^1.0.1", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "pkg-dir": "^5.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-stdlib-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "peer": 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==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "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==", + "dev": true, + "peer": 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/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, + "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==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "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, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.2.tgz", + "integrity": "sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==", + "dev": true, + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qr-scanner": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/qr-scanner/-/qr-scanner-1.4.2.tgz", + "integrity": "sha512-kV1yQUe2FENvn59tMZW6mOVfpq9mGxGf8l6+EGaXUOd4RBOLg7tRC83OrirM5AtDvZRpdjdlXURsHreAOSPOUw==", + "dependencies": { + "@types/offscreencanvas": "^2019.6.4" + } + }, + "node_modules/qrcode": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "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" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "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/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, + "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==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "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==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "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, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "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/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "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, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "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==", + "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" + } + }, + "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 + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "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 + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "peer": 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/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, + "peer": 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_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==", + "dev": true, + "peer": 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_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "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", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.7.tgz", + "integrity": "sha512-UExR1KS7raTdycsUrKLtStayu4hpdV3VZQgM0akX8XbXgLBlosdE/Sf3crOgyh9xIjqSYB3UEBuUlIQKRQX2hg==", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^3.2.1", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-check": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.2.tgz", + "integrity": "sha512-E6iFh4aUCGJLRz6QZXH3gcN/VFfkzwtruWSRmlKrLWQTiO6VzLsivR6q02WYLGNAGecV3EocqZuCDrC2uttZ0g==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.1.0", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", + "integrity": "sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "postcss": "^8.4.29", + "postcss-scss": "^4.0.8" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-hmr": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", + "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } + }, + "node_modules/svelte-persisted-store": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/svelte-persisted-store/-/svelte-persisted-store-0.7.0.tgz", + "integrity": "sha512-PczYS60ysScQ0DmTCPXQm5rwt8FfQzSlx0lCbljbE6hTCKqXaw2bP8KH1+B7QTPmuiy/QbAk4pjYpNCmZhjyRw==", + "engines": { + "node": ">=0.14" + }, + "peerDependencies": { + "svelte": "^3.48.0 || >4.0.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.1.tgz", + "integrity": "sha512-p/Dp4hmrBW5mrCCq29lEMFpIJT2FZsRlouxEc5qpbOmXRbaFs7clLs8oKPwD3xCFyZfv1bIhvOzpQkhMEVQdMw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 14.10.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tinybench": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", + "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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, + "peer": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "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": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "peer": 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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", + "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", + "dev": true + }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid-v4": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/uuid-v4/-/uuid-v4-0.1.0.tgz", + "integrity": "sha512-m11RYDtowtAIihBXMoGajOEKpAXrKbpKlpmxqyztMYQNGSY5nZAZ/oYch/w2HNS1RMA4WLGcZvuD8/wFMuCEzA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", + "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-node-polyfills": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.17.0.tgz", + "integrity": "sha512-iPmPn7376e5u6QvoTSJa16hf5Q0DFwHFXJk2uYpsNlmI3JdPms7hWyh55o+OysJ5jo9J5XPhLC9sMOYifwFd1w==", + "dev": true, + "dependencies": { + "@rollup/plugin-inject": "^5.0.5", + "buffer-polyfill": "npm:buffer@^6.0.3", + "node-stdlib-browser": "^1.2.0", + "process": "^0.11.10" + }, + "funding": { + "url": "https://github.com/sponsors/davidmyersdev" + }, + "peerDependencies": { + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", + "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", + "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.6", + "@vitest/runner": "0.34.6", + "@vitest/snapshot": "0.34.6", + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.10", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.6", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } } diff --git a/web-wallet/package.json b/web-wallet/package.json index b7972a1724..3f0c4baca9 100644 --- a/web-wallet/package.json +++ b/web-wallet/package.json @@ -1,72 +1,77 @@ { - "author": { - "name": "Dusk Network B.V.", - "url": "https://dusk.network/", - "mail": "info@dusk.network" - }, - "bugs": "https://github.com/dusk-network/rusk/issues", - "engines": { - "node": ">=18.0.0" - }, - "homepage": "https://github.com/dusk-network/rusk/tree/master/web-wallet", - "license": "MPL-2.0", - "name": "web-wallet", - "private": true, - "repository": { - "type": "git", - "url": "https://github.com/dusk-network/rusk.git" - }, - "scripts": { - "build": "vite build", - "checks": "npm run lint && npm run typecheck && npm test", - "dev": "vite dev", - "dev:host": "vite dev --host", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "preview": "vite preview", - "test": "vitest --run", - "test:coverage": "vitest --run --coverage.enabled", - "test:watch": "vitest", - "typecheck": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --fail-on-warnings", - "typecheck:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch --fail-on-warnings" - }, - "type": "module", - "version": "0.3.0", - "dependencies": { - "@dusk-network/dusk-wallet-js": "0.4.2", - "@floating-ui/dom": "1.5.3", - "@mdi/js": "7.3.67", - "bip39": "3.1.0", - "css-doodle": "0.37.4", - "lamb": "0.61.1", - "qr-scanner": "1.4.2", - "qrcode": "1.5.3", - "svelte-persisted-store": "0.7.0" - }, - "devDependencies": { - "@dusk-network/eslint-config": "2.1.0", - "@sveltejs/adapter-static": "2.0.3", - "@sveltejs/kit": "1.27.6", - "@testing-library/jest-dom": "6.1.4", - "@testing-library/svelte": "4.0.5", - "@vitejs/plugin-basic-ssl": "1.0.2", - "@vitest/browser": "0.34.6", - "@vitest/coverage-v8": "0.34.6", - "@zerodevx/svelte-toast": "^0.9.5", - "autoprefixer": "10.4.16", - "eslint": "8.54.0", - "eslint-import-resolver-custom-alias": "1.3.2", - "eslint-plugin-svelte": "2.35.1", - "jsdom": "23.0.0", - "jsdom-worker": "0.3.0", - "postcss-nested": "6.0.1", - "svelte": "4.2.7", - "svelte-check": "3.6.2", - "svelte-preprocess": "5.1.1", - "typescript": "5.3.2", - "vite": "4.5.0", - "vite-plugin-node-polyfills": "0.17.0", - "vite-tsconfig-paths": "4.2.1", - "vitest": "0.34.6" - } + "author": { + "name": "Dusk Network B.V.", + "url": "https://dusk.network/", + "mail": "info@dusk.network" + }, + "bugs": "https://github.com/dusk-network/rusk/issues", + "engines": { + "node": ">=18.0.0" + }, + "homepage": "https://github.com/dusk-network/rusk/tree/master/web-wallet", + "license": "MPL-2.0", + "name": "web-wallet", + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/dusk-network/rusk.git" + }, + "scripts": { + "build": "vite build", + "checks": "npm run lint && npm run typecheck && npm test", + "dev": "vite dev", + "dev:host": "vite dev --host", + "format": "prettier . --check", + "format:fix": "prettier . --write", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "preview": "vite preview", + "test": "vitest --run", + "test:coverage": "vitest --run --coverage.enabled", + "test:watch": "vitest", + "typecheck": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --fail-on-warnings", + "typecheck:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch --fail-on-warnings" + }, + "type": "module", + "version": "0.3.0", + "dependencies": { + "@dusk-network/dusk-wallet-js": "0.4.2", + "@floating-ui/dom": "1.5.3", + "@mdi/js": "7.3.67", + "bip39": "3.1.0", + "css-doodle": "0.37.4", + "lamb": "0.61.1", + "qr-scanner": "1.4.2", + "qrcode": "1.5.3", + "svelte-persisted-store": "0.7.0" + }, + "devDependencies": { + "@dusk-network/eslint-config": "3.1.0", + "@dusk-network/prettier-config": "1.0.0", + "@sveltejs/adapter-static": "2.0.3", + "@sveltejs/kit": "1.27.6", + "@testing-library/jest-dom": "6.1.4", + "@testing-library/svelte": "4.0.5", + "@vitejs/plugin-basic-ssl": "1.0.2", + "@vitest/browser": "0.34.6", + "@vitest/coverage-v8": "0.34.6", + "@zerodevx/svelte-toast": "0.9.5", + "autoprefixer": "10.4.16", + "eslint": "8.57.0", + "eslint-import-resolver-custom-alias": "1.3.2", + "eslint-plugin-svelte": "2.35.1", + "jsdom": "23.0.0", + "jsdom-worker": "0.3.0", + "prettier": "3.2.5", + "prettier-plugin-svelte": "3.2.2", + "postcss-nested": "6.0.1", + "svelte": "4.2.7", + "svelte-check": "3.6.2", + "svelte-preprocess": "5.1.1", + "typescript": "5.3.2", + "vite": "4.5.0", + "vite-plugin-node-polyfills": "0.17.0", + "vite-tsconfig-paths": "4.2.1", + "vitest": "0.34.6" + } } diff --git a/web-wallet/src/app.html b/web-wallet/src/app.html index bb6bc7f624..f50111ecbe 100644 --- a/web-wallet/src/app.html +++ b/web-wallet/src/app.html @@ -1,14 +1,21 @@ - + - - Dusk Web Wallet - v%sveltekit.env.PUBLIC_APP_VERSION% - - - - - %sveltekit.head% - - -
%sveltekit.body%
- + + Dusk Web Wallet - v%sveltekit.env.PUBLIC_APP_VERSION% + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ diff --git a/web-wallet/src/env.d.ts b/web-wallet/src/env.d.ts index 14218c023e..5cb7bc3a2e 100644 --- a/web-wallet/src/env.d.ts +++ b/web-wallet/src/env.d.ts @@ -1,3 +1,3 @@ declare const CONFIG: { - LOCAL_STORAGE_APP_KEY: string + LOCAL_STORAGE_APP_KEY: string; }; diff --git a/web-wallet/src/error.html b/web-wallet/src/error.html index ccbc754e74..6785528536 100644 --- a/web-wallet/src/error.html +++ b/web-wallet/src/error.html @@ -1,12 +1,12 @@ - + - - - %sveltekit.error.message% - - -

Error

-

Status: %sveltekit.status%

-

Message: %sveltekit.error.message%

- + + + %sveltekit.error.message% + + +

Error

+

Status: %sveltekit.status%

+

Message: %sveltekit.error.message%

+ diff --git a/web-wallet/src/lamb.d.ts b/web-wallet/src/lamb.d.ts index 5f2c390f24..e738d47339 100644 --- a/web-wallet/src/lamb.d.ts +++ b/web-wallet/src/lamb.d.ts @@ -1,687 +1,681 @@ declare module "lamb" { - /* ------------------------- * - * ***** UTILITY TYPES ***** * - * ------------------------- */ - - type AnyFunction = (...args: any) => any; - - type FoldAccumulatorCallback< - L extends ArrayLike, - R, - I extends keyof L & number = any - > = (result: R, current: L[I], idx: I, list: L) => R; - - type ListIteratorCallback< - L extends ArrayLike, - R, - I extends keyof L & number = any - > = (element: L[I], idx: I, list: L) => R; - - type ObjectIteratorCallback< - S extends Record, - R, - K extends keyof S & string = any - > = (value: S[K], key: K, source: S) => R; - - type Ord = Number | number | String | string | Boolean | boolean | Date; - - /** @see https://dev.to/ecyrbe/how-to-use-advanced-typescript-to-define-a-pipe-function-381h */ - type PipeArgs< - Fns extends AnyFunction[], - AccFns extends AnyFunction[] = [] - > = Fns extends [(...args: infer A) => infer B] - ? [...AccFns, (...args: A) => B] - : Fns extends [(...args: infer A) => any, ...infer Tail] - ? Tail extends [(arg: infer B) => any, ...any[]] - ? PipeArgs B]> - : AccFns - : AccFns; - - type PipeArgsLastReturnType< - Fns extends AnyFunction[], - Else = never - > = Fns extends [...any[], (...args: any) => infer R] ? R : Else; - - type Predicate = (v: T) => v is U; - - type ReduceAccumulatorCallback< - T, - L extends ArrayLike, - I extends keyof L & number = any - > = (prev: T, current: L[I], idx: I, list: L) => T; - - type Sorter = { - compare: (a: T, b: T) => number; - isDescending: IsDesc; - }; - - type SorterComparer = (a: T, b: T) => number; - - type SorterReader = (value: T) => any; - - type UnaryFunction = (v: A) => B; - - /* ------------------------- * - * ***** ARRAY ***** * - * ------------------------- */ - - function append (value: T): (arrayLike: ArrayLike) => Array; - - function appendTo (arrayLike: ArrayLike, value: T): Array; - - function contains (value: T): (arrayLike: ArrayLike) => boolean; - - function count< - R extends string, - L extends ArrayLike, - F extends ListIteratorCallback - > (arrayLike: L, iteratee: F): Record; - - function countBy< - R extends string, - L extends ArrayLike, - F extends ListIteratorCallback - > (iteratee: F): (arrayLike: L) => Record; - - function difference (a: ArrayLike, b: ArrayLike): Array; - - function drop (n: number): (arrayLike: ArrayLike) => Array; - - function dropFrom (arrayLike: ArrayLike, n: number): Array; - - function dropLastWhile< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => Array; - - function dropWhile< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => Array; - - function every< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => boolean; - - function everyIn< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): boolean; - - function filter< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): Array; - - function filterWith< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => Array; - - function find< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): T | undefined; - - function findIndex< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): number; - - function findIndexWhere< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => number; - - function findLast< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): T | undefined; - - function findLastIndex< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): number; - - function findLastIndexWhere< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => number; - - function findLastWhere< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => T | undefined; - - function findWhere< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => T | undefined; - - function flatMap< - T extends any | any[], - R, - A extends Array, - F extends ListIteratorCallback - > (array: A, iteratee: F): Array; - - function flatMapWith< - T extends any | any[], - R, - A extends Array, - F extends ListIteratorCallback - > (iteratee: F): (array: A) => Array; - - function flatten< - T, - U extends T | T[], - A extends Array - > (array: A): Array; - - function getAt (index: number): (arrayLike: ArrayLike) => T | undefined; - - function getIndex (arrayLike: ArrayLike, index: number): T | undefined; - - function group< - T extends Record, - V extends T[keyof T], - L extends ArrayLike, - F extends ListIteratorCallback - > (arrayLike: L, iteratee: F): Record>; - - function groupBy< - T extends Record, - V extends T[keyof T], - L extends ArrayLike, - F extends ListIteratorCallback, - > (iteratee: F): (arrayLike: L) => Record>; - - function head> (arrayLike: L): L["length"] extends 0 ? undefined : L[0]; - - function index< - T extends Record, - V extends T[keyof T], - L extends ArrayLike, - F extends ListIteratorCallback - > (arrayLike: L, iteratee: F): Record; - - function indexBy< - T extends Record, - V extends T[keyof T], - L extends ArrayLike, - F extends ListIteratorCallback - > (iteratee: F): (arrayLike: L) => Record; - - function init (arrayLike: ArrayLike): Array; - - function insert (arrayLike: ArrayLike, index: number, element: T): Array; - - function insertAt (index: number, element: T): (arrayLike: ArrayLike) => Array; - - function intersection (a: ArrayLike, b: ArrayLike): Array; - - function isIn (arrayLike: ArrayLike, value: T): boolean; - - function join (arrayLike: ArrayLike, separator: string): string; - - function joinWith (separator: string): (arrayLike: ArrayLike) => string; - - function last> (arrayLike: L): L["length"] extends 0 ? undefined : L[-1]; - - function list (...values: T[]): Array; - - function map< - T, - L extends ArrayLike, - R - > (arrayLike: L, iteratee: ListIteratorCallback): Array; - - function mapWith< - T, - L extends ArrayLike, - R - > (iteratee: ListIteratorCallback): (arrayLike: L) => Array; - - function partition< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): [Array, Array]; - - function partitionWith< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => [Array, Array]; - - function pluck< - T, - U extends Record, - K extends keyof U - > (key: K): (arrayLike: ArrayLike) => Array; - - function pluckFrom< - T, - U extends Record, - K extends keyof U - > (arrayLike: ArrayLike, key: K): Array; - - function pullFrom< - T, - L extends ArrayLike, - V extends ArrayLike - > (arrayLike: L, values: V): Array; - - function pull< - T, - L extends ArrayLike, - V extends ArrayLike - > (values: V): (arrayLike: L) => Array; - - function reduceRight< - T, - L extends ArrayLike, - Acc extends ReduceAccumulatorCallback - > (arrayLike: L, accumulator: Acc): T; - function reduceRight< - R, - L extends ArrayLike, - Acc extends FoldAccumulatorCallback - > (arrayLike: L, accumulator: Acc, initialValue: R): R; - - function reduceRightWith< - T, - L extends ArrayLike, - Acc extends ReduceAccumulatorCallback - > (accumulator: Acc): (arrayLike: L) => T; - function reduceRightWith< - R, - L extends ArrayLike, - Acc extends FoldAccumulatorCallback - > (accumulator: Acc, initialValue: R): (list: L) => R; - - function reverse< - T, - L extends ArrayLike - > (arrayLike: L): Array; - - function rotate< - T, - L extends ArrayLike - > (arrayLike: L, amount: number): Array; - - function rotateBy< - T, - L extends ArrayLike - > (amount: number): (arrayLike: L) => Array; - - function setAt< - T, - L extends ArrayLike - > (index: number, value: T): (arrayLike: L) => Array; - - function setIndex< - T, - L extends ArrayLike - > (arrayLike: L, index: number, value: T): Array; - - function shallowFlatten< - T, - U extends T | T[] - > (array: Array): Array; - - function some< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (predicate: P): (arrayLike: L) => boolean; - - function someIn< - T, - L extends ArrayLike, - P extends ListIteratorCallback - > (arrayLike: L, predicate: P): boolean; - - function sort< - T, - L extends ArrayLike, - S extends Array | SorterReader> = [Sorter] - > (arrayLike: L, sorters?: S): Array; - - function sortedInsert< - T, - L extends ArrayLike, - S extends Array | SorterReader> = [Sorter] - > (arrayLike: L, element: T, sorters?: S): Array; - - function sorter< - T, - RD extends SorterReader = (value: T) => T, - > (reader?: RD, comparer?: SorterComparer): Sorter; - - function sorterDesc< - T, - RD extends SorterReader = (value: T) => T, - > (reader?: RD, comparer?: SorterComparer): Sorter; - - function sortWith< - T, - L extends ArrayLike, - S extends Array | SorterReader> = [Sorter] - > (sorters?: S): (arrayLike: L) => Array; - - function take< - T, - L extends ArrayLike - > (amount: number): (arrayLike: L) => Array; - - function uniques (arrayLike: ArrayLike): Array; - - function uniquesBy< - T, - L extends ArrayLike, - F extends ListIteratorCallback - > (iteratee: F): (arrayLike: L) => Array; - - /* ------------------------- * - * ***** CORE ***** * - * ------------------------- */ - - type __ = {}; - - function always (value: T): (...args: unknown[]) => T; - - function areSVZ (a: any, b: any): boolean; - - function binary< - A, - B, - R, - F extends (...args: [A, B, ...any[]]) => R - > (fn: F): (a: A, b: B) => R; - - function clamp (n: number, min: number, max: number): number; - - function clampWithin (min: number, max: number): (n: number) => number; - - function compose< - A, - B, - C - > (f: UnaryFunction, g: UnaryFunction): (value: A) => C; - function compose< - A extends any[], - B, - C - > (f: UnaryFunction, g: (...args: A) => B): (...values: A) => C; - - function partial< - Args extends (any | __)[], - F extends AnyFunction - > (fn: F, args: Args): (...args: any[]) => ReturnType; - - function partialRight< - Args extends (any | __)[], - F extends AnyFunction - > (fn: F, args: Args): (...args: any[]) => ReturnType; - - function reduce< - T, - L extends ArrayLike, - Acc extends ReduceAccumulatorCallback - > (arrayLike: L, accumulator: Acc): T; - function reduce< - R, - L extends ArrayLike, - Acc extends FoldAccumulatorCallback - > (arrayLike: L, accumulator: Acc, initialValue: R): R; - - function reduceWith< - T, - L extends ArrayLike, - Acc extends ReduceAccumulatorCallback - > (accumulator: Acc): (arrayLike: L) => T; - function reduceWith< - R, - L extends ArrayLike, - Acc extends FoldAccumulatorCallback - > (accumulator: Acc, initialValue: R): (list: L) => R; - - function slice (arrayLike: ArrayLike, start: number, end: number): Array; - - function sliceAt (start: number, end: number): (arrayLike: ArrayLike) => Array; - - function type (value: any): string; - - /* ------------------------- * - * ***** FUNCTION ***** * - * ------------------------- */ - - function collect< - T, - Args extends any[], - Fns extends Array<(...args: Args) => T>, - > (functions: Fns): (...args: Args) => T[]; - - function invokeOn< - TG extends Object - > (target: TG): (method: M, ...args: any[]) => M extends keyof TG - ? TG[M] extends AnyFunction - ? ReturnType - : never - : undefined; - - function pipe (functions: []): (...args: Args) => Args["length"] extends 0 ? undefined : typeof args[0]; - function pipe< - Fns extends AnyFunction[], - Args extends Parameters, - R extends PipeArgsLastReturnType> - > (functions: PipeArgs extends Fns ? Fns : PipeArgs): (...args: Args) => R; - - function unary (fn: (a: T, ...args: any[]) => R): UnaryFunction; - - /* ------------------------- * - * ***** LOGIC ***** * - * ------------------------- */ - - function allOf< - T, - P extends (value: T) => boolean - > (predicates: Array

): P; - - function anyOf< - T, - P extends (value: T) => boolean - > (predicates: Array

): P; - - function condition< - T, - U extends T, - TR, - FR, - P extends Predicate - > (predicate: P, trueFn: (value: U) => TR, falseFn: (value: Exclude) => FR): (value: T) => U extends T ? TR : FR; - - function gt (a: Ord, b: Ord): boolean; - - function gte (a: Ord, b: Ord): boolean; - - function lt (a: Ord, b: Ord): boolean; - - function lte (a: Ord, b: Ord): boolean; - - function isGT (b: Ord): (a: Ord) => boolean; - - function isGTE (b: Ord): (a: Ord) => boolean; - - function isLT (b: Ord): (a: Ord) => boolean; - - function isLTE (b: Ord): (a: Ord) => boolean; - - function unless< - R, - T, - U extends T, - P extends Predicate, - F extends UnaryFunction, R> - > (predicate: P, fn: F): (value: T | U) => U extends T ? T : R; - function unless< - R, - T, - P extends UnaryFunction, - F extends UnaryFunction - > (predicate: P, fn: F): (value: T) => ReturnType

extends true ? T : R; - - function when< - R, - T, - U extends T, - P extends Predicate, - F extends UnaryFunction, R> - > (predicate: P, fn: F): (value: T | U) => U extends T ? T : T; - function when< - R, - T, - P extends UnaryFunction, - F extends UnaryFunction - > (predicate: P, fn: F): (value: T) => ReturnType

): P; + + function anyOf boolean>(predicates: Array

): P; + + function condition>( + predicate: P, + trueFn: (value: U) => TR, + falseFn: (value: Exclude) => FR, + ): (value: T) => U extends T ? TR : FR; + + function gt(a: Ord, b: Ord): boolean; + + function gte(a: Ord, b: Ord): boolean; + + function lt(a: Ord, b: Ord): boolean; + + function lte(a: Ord, b: Ord): boolean; + + function isGT(b: Ord): (a: Ord) => boolean; + + function isGTE(b: Ord): (a: Ord) => boolean; + + function isLT(b: Ord): (a: Ord) => boolean; + + function isLTE(b: Ord): (a: Ord) => boolean; + + function unless< + R, + T, + U extends T, + P extends Predicate, + F extends UnaryFunction, R>, + >(predicate: P, fn: F): (value: T | U) => U extends T ? T : R; + function unless< + R, + T, + P extends UnaryFunction, + F extends UnaryFunction, + >(predicate: P, fn: F): (value: T) => ReturnType

extends true ? T : R; + + function when< + R, + T, + U extends T, + P extends Predicate, + F extends UnaryFunction, R>, + >(predicate: P, fn: F): (value: T | U) => U extends T ? T : T; + function when< + R, + T, + P extends UnaryFunction, + F extends UnaryFunction, + >(predicate: P, fn: F): (value: T) => ReturnType

extends true ? R : T; + + /* ------------------------- * + * ***** MATH ***** * + * ------------------------- */ + + function randomInt(min: number, max: number): number; + + /* ------------------------- * + * ***** OBJECT ***** * + * ------------------------- */ + + function enumerables>( + source: S, + ): Array; + + function getKey>( + key: K, + ): (source: S) => K extends keyof S ? S[K] : undefined; + + function getPath>( + path: string, + separator?: string, + ): (source: S) => T | undefined; + + function getPathIn>( + source: S, + path: string, + separator?: string, + ): T | undefined; + + function hasKeyValue>( + key: K, + value: T, + ): (source: S) => boolean; + + function hasPathValue>( + path: string, + value: T, + ): (source: S) => boolean; + + function keys, K extends keyof S>( + source: S, + ): Array; + + function mapValues< + T, + U, + S extends Record, + F extends ObjectIteratorCallback, + >(source: S, fn: F): Record; + + function mapValuesWith< + T, + U, + S extends Record, + F extends ObjectIteratorCallback, + >(fn: F): (source: S) => Record; + + function ownPairs, K extends keyof S & string>( + source: S, + ): Array<[K, S[K]]>; + + function pick, K extends string>( + whitelist: K[], + ): (source: S) => Pick; + + function pickIf< + S extends Record, + P extends ObjectIteratorCallback, + >(predicate: P): (source: S) => Partial; + + function pickIn, K extends string>( + source: S, + whitelist: K[], + ): Pick; + + function rename< + DK extends string, + KM extends Record, + S extends Record, + >( + keyMap: KM, + ): (source: S) => { [K in keyof S as K extends keyof KM ? KM[K] : K]: S[K] }; + + function setKey, T, K extends string>( + key: K, + value: T, + ): (source: S) => S & { [k in K]: T }; + + function skip, K extends string>( + blacklist: K[], + ): (source: S) => Omit; + + function skipIf< + S extends Record, + P extends ObjectIteratorCallback, + >(predicate: P): (source: S) => Partial; + + function skipIn, K extends string>( + source: S, + blacklist: K[], + ): Omit; + + /* ------------------------- * + * ***** PRIVATES ***** * + * ------------------------- */ + + /* ------------------------- * + * ***** STRING ***** * + * ------------------------- */ + + /* ------------------------- * + * ***** TYPE ***** * + * ------------------------- */ + + function isNil(value: any): value is null | undefined; + + function isNull(value: any): value is null; + + function isUndefined(value: any): value is undefined; + + function isType(typeName: string): Predicate; } diff --git a/web-wallet/src/lib/components/AddressPicker/AddressPicker.css b/web-wallet/src/lib/components/AddressPicker/AddressPicker.css index 4d7cc9adef..f543ee82df 100644 --- a/web-wallet/src/lib/components/AddressPicker/AddressPicker.css +++ b/web-wallet/src/lib/components/AddressPicker/AddressPicker.css @@ -1,103 +1,105 @@ .address-picker { - position: relative; - background-color: var(--surface-color); - padding: 1em; - border-radius: 1.25rem; - user-select: none; - z-index: 2; + position: relative; + background-color: var(--surface-color); + padding: 1em; + border-radius: 1.25rem; + user-select: none; + z-index: 2; } .address-picker__current-address { - width: 100%; - text-align: center; - font-family: monospace; + width: 100%; + text-align: center; + font-family: monospace; } .address-picker__copy-address-button-wrapper { - background-color: var(--secondary-color); - border-radius: 50%; + background-color: var(--secondary-color); + border-radius: 50%; } .address-picker__copy-address-button { - aspect-ratio: 1/1; - width: 1.5em; + aspect-ratio: 1/1; + width: 1.5em; } .address-picker__copy-address-button:hover { - cursor: copy; + cursor: copy; } -.address-picker__copy-address-button, .address-picker__copy-address-button:hover { - color: var(--primary-color) !important; +.address-picker__copy-address-button, +.address-picker__copy-address-button:hover { + color: var(--primary-color) !important; } .address-picker__address { - max-width: 100%; - all: unset; + max-width: 100%; + all: unset; } -.address-picker__address:hover, .address-picker__address--selected { - color: var(--secondary-color); +.address-picker__address:hover, +.address-picker__address--selected { + color: var(--secondary-color); } .address-picker__address:hover { - cursor: pointer; + cursor: pointer; } .address-picker__trigger { - display: flex; - justify-content: center; - align-items: center; - gap: var(--default-gap); + display: flex; + justify-content: center; + align-items: center; + gap: var(--default-gap); } .address-picker__drop-down { - display: flex; - position: absolute; - top: 100%; - left: 0; - z-index: 2; + display: flex; + position: absolute; + top: 100%; + left: 0; + z-index: 2; - background-color: var(--surface-color); - padding: 0 1em 1em 1em; - border-bottom-left-radius: 1.25rem; - border-bottom-right-radius: 1.25rem; + background-color: var(--surface-color); + padding: 0 1em 1em 1em; + border-bottom-left-radius: 1.25rem; + border-bottom-right-radius: 1.25rem; - flex-direction: column; - gap: var(--default-gap); - align-items: center; - width: 100%; + flex-direction: column; + gap: var(--default-gap); + align-items: center; + width: 100%; } .address-picker__address-options { - overflow-y: auto; - width: 100%; - max-height: 20svh; + overflow-y: auto; + width: 100%; + max-height: 20svh; } .address-picker__address-option-button { - all: unset; - text-overflow: ellipsis; - overflow: hidden; - width: 100%; - display: block; - text-align: center; - padding: .5em 0; + all: unset; + text-overflow: ellipsis; + overflow: hidden; + width: 100%; + display: block; + text-align: center; + padding: 0.5em 0; } .address-picker__generating-address-wrapper { - display: flex; - flex-direction: row; - align-self: flex-start; - gap: var(--small-gap) + display: flex; + flex-direction: row; + align-self: flex-start; + gap: var(--small-gap); } .address-picker--expanded { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } .address-picker__generate-address-button { - text-align: left; - width: 100% + text-align: left; + width: 100%; } diff --git a/web-wallet/src/lib/components/AddressPicker/AddressPicker.svelte b/web-wallet/src/lib/components/AddressPicker/AddressPicker.svelte index 8322224a93..fa907b8856 100644 --- a/web-wallet/src/lib/components/AddressPicker/AddressPicker.svelte +++ b/web-wallet/src/lib/components/AddressPicker/AddressPicker.svelte @@ -1,4 +1,4 @@ - + {#if expanded} - + {/if}

- +

{middleEllipsis( currentAddress, @@ -116,7 +116,7 @@ {#if expanded}

-
+
{#each addresses as address (address)}
  • {/each}
  • -
    +
    {#if isAddingAddress}
    - +

    Generating Address

    - + {:else}
    {/if} diff --git a/web-wallet/src/lib/components/AppAnchor/AppAnchor.svelte b/web-wallet/src/lib/components/AppAnchor/AppAnchor.svelte index ec34dbd65b..025f0a2aae 100644 --- a/web-wallet/src/lib/components/AppAnchor/AppAnchor.svelte +++ b/web-wallet/src/lib/components/AppAnchor/AppAnchor.svelte @@ -1,4 +1,4 @@ - + {#if step === currentStep} - + {#if showStepper} - + {/if} diff --git a/web-wallet/src/lib/dusk/components/Wizard/createWizardStore.js b/web-wallet/src/lib/dusk/components/Wizard/createWizardStore.js index ce497f9751..4a3b4f8aa4 100644 --- a/web-wallet/src/lib/dusk/components/Wizard/createWizardStore.js +++ b/web-wallet/src/lib/dusk/components/Wizard/createWizardStore.js @@ -1,39 +1,39 @@ import { writable } from "svelte/store"; /** @param {Number} stepsCount */ -function createWizardStore (stepsCount) { - const initialState = { - currentStep: 0, - stepsCount - }; - - const { subscribe, update } = writable(initialState); - - function incrementStep () { - update(state => { - if (state.currentStep < state.stepsCount - 1) { - return { ...state, currentStep: state.currentStep + 1 }; - } - - return state; - }); - } - - function decrementStep () { - update(state => { - if (state.currentStep > 0) { - return { ...state, currentStep: state.currentStep - 1 }; - } - - return state; - }); - } - - return { - decrementStep, - incrementStep, - subscribe - }; +function createWizardStore(stepsCount) { + const initialState = { + currentStep: 0, + stepsCount, + }; + + const { subscribe, update } = writable(initialState); + + function incrementStep() { + update((state) => { + if (state.currentStep < state.stepsCount - 1) { + return { ...state, currentStep: state.currentStep + 1 }; + } + + return state; + }); + } + + function decrementStep() { + update((state) => { + if (state.currentStep > 0) { + return { ...state, currentStep: state.currentStep - 1 }; + } + + return state; + }); + } + + return { + decrementStep, + incrementStep, + subscribe, + }; } export default createWizardStore; diff --git a/web-wallet/src/lib/dusk/components/__mocks__/mockedMnemonicStore.js b/web-wallet/src/lib/dusk/components/__mocks__/mockedMnemonicStore.js index 85f5571ccf..10e424dba6 100644 --- a/web-wallet/src/lib/dusk/components/__mocks__/mockedMnemonicStore.js +++ b/web-wallet/src/lib/dusk/components/__mocks__/mockedMnemonicStore.js @@ -3,23 +3,23 @@ import { mockDerivedStore, mockReadableStore } from "$lib/dusk/test-helpers"; /** @type {Array} */ const enteredSeed = []; const seed = [ - "serendipity", - "quixotic", - "mellifluous", - "resplendent", - "nebulous", - "jubilant", - "capricious", - "pernicious", - "ephemeral", - "ineffable", - "mellifluous", - "effervescent" + "serendipity", + "quixotic", + "mellifluous", + "resplendent", + "nebulous", + "jubilant", + "capricious", + "pernicious", + "ephemeral", + "ineffable", + "mellifluous", + "effervescent", ]; /** @param {Array} initialSeed */ const deriveFn = (initialSeed) => { - return initialSeed; + return initialSeed; }; export const mockedMnemonicPhrase = mockReadableStore(seed); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Agreement.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Agreement.spec.js index 1a7d5029ba..84ee685938 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Agreement.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Agreement.spec.js @@ -1,26 +1,21 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { Agreement } from ".."; describe("Agreement", () => { - const baseProps = { - name: "test", - controlId: "test", - label: "I agree" - }; + const baseProps = { + controlId: "test", + label: "I agree", + name: "test", + }; - afterEach(cleanup); + afterEach(cleanup); - it("renders the Agreement component", () => { - const { container } = render(Agreement, { props: { ...baseProps } }); + it("renders the Agreement component", () => { + const { container } = render(Agreement, { props: { ...baseProps } }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - // Rest of the functionality is covered under the Checkbox component tests + // Rest of the functionality is covered under the Checkbox component tests }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Anchor.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Anchor.spec.js index 746ac97712..a049bb1217 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Anchor.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Anchor.spec.js @@ -1,9 +1,4 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup } from "@testing-library/svelte"; import { renderWithSimpleContent } from "$lib/dusk/test-helpers"; @@ -11,31 +6,34 @@ import { renderWithSimpleContent } from "$lib/dusk/test-helpers"; import { Anchor } from ".."; describe("Anchor", () => { - const baseProps = { - href: "https://example.com" - }; - - const baseOptions = { - props: baseProps - }; - - afterEach(cleanup); - - it("should render the Anchor component", () => { - const { container } = renderWithSimpleContent(Anchor, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should pass additional class names and attributes to the rendered element", () => { - const props = { - ...baseProps, - className: "foo bar", - href: "https://dusk.network", - title: "Some title" - }; - const { container } = renderWithSimpleContent(Anchor, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); + const baseProps = { + href: "https://example.com", + }; + + const baseOptions = { + props: baseProps, + }; + + afterEach(cleanup); + + it("should render the Anchor component", () => { + const { container } = renderWithSimpleContent(Anchor, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should pass additional class names and attributes to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + href: "https://dusk.network", + title: "Some title", + }; + const { container } = renderWithSimpleContent(Anchor, { + ...baseOptions, + props, + }); + + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/AnchorButton.spec.js b/web-wallet/src/lib/dusk/components/__tests__/AnchorButton.spec.js index ad25cd1658..98417aa383 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/AnchorButton.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/AnchorButton.spec.js @@ -1,93 +1,88 @@ // @ts-nocheck -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { mdiFolderOutline } from "@mdi/js"; import { AnchorButton } from ".."; describe("AnchorButton", () => { - const baseProps = { - href: "/some-url", - text: "some text" - }; - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(cleanup); - - it("should render the AnchorButton component", () => { - const { container } = render(AnchorButton, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should add a disabled class if the related property is `true`", () => { - const props = { - ...baseProps, - disabled: true - }; - const { container } = render(AnchorButton, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should pass additional class names and attributes to the rendered element", () => { - const props = { - ...baseProps, - className: "foo bar", - id: "some-id" - }; - const { container } = render(AnchorButton, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should render a AnchorButton without a text", () => { - const props = { - ...baseProps, - text: "" - }; - const { container } = render(AnchorButton, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should be able to render a AnchorButton with an icon and text", () => { - ["after", "before"].forEach(position => { - const props = { - ...baseProps, - icon: { - path: mdiFolderOutline, - position - } - }; - const { container } = render(AnchorButton, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - }); - - it("should be able to render a AnchorButton with an icon only", () => { - ["after", "before"].forEach(position => { - const props = { - ...baseProps, - icon: { - path: mdiFolderOutline, - position - }, - text: "" - }; - const { container } = render(AnchorButton, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - }); + const baseProps = { + href: "/some-url", + text: "some text", + }; + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it("should render the AnchorButton component", () => { + const { container } = render(AnchorButton, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should add a disabled class if the related property is `true`", () => { + const props = { + ...baseProps, + disabled: true, + }; + const { container } = render(AnchorButton, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should pass additional class names and attributes to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + id: "some-id", + }; + const { container } = render(AnchorButton, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should render a AnchorButton without a text", () => { + const props = { + ...baseProps, + text: "", + }; + const { container } = render(AnchorButton, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should be able to render a AnchorButton with an icon and text", () => { + ["after", "before"].forEach((position) => { + const props = { + ...baseProps, + icon: { + path: mdiFolderOutline, + position, + }, + }; + const { container } = render(AnchorButton, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + }); + + it("should be able to render a AnchorButton with an icon only", () => { + ["after", "before"].forEach((position) => { + const props = { + ...baseProps, + icon: { + path: mdiFolderOutline, + position, + }, + text: "", + }; + const { container } = render(AnchorButton, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Badge.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Badge.spec.js index 7a1b045d55..8a7e42ddff 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Badge.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Badge.spec.js @@ -1,41 +1,36 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { Badge } from ".."; describe("Badge", () => { - const baseProps = { - text: "Badge" - }; + const baseProps = { + text: "Badge", + }; - afterEach(cleanup); + afterEach(cleanup); - it("should render the Badge component using the type \"neutral\" as a default", () => { - const { container } = render(Badge, baseProps); + it('should render the Badge component using the type "neutral" as a default', () => { + const { container } = render(Badge, baseProps); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("should render the Badge component using the type \"warning\" variant", () => { - const { container } = render(Badge, { ...baseProps, variant: "warning" }); + it('should render the Badge component using the type "warning" variant', () => { + const { container } = render(Badge, { ...baseProps, variant: "warning" }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("should render the Badge component using the type \"error\" variant", () => { - const { container } = render(Badge, { ...baseProps, variant: "error" }); + it('should render the Badge component using the type "error" variant', () => { + const { container } = render(Badge, { ...baseProps, variant: "error" }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("should render the Badge component using the type \"success\" variant", () => { - const { container } = render(Badge, { ...baseProps, variant: "success" }); + it('should render the Badge component using the type "success" variant', () => { + const { container } = render(Badge, { ...baseProps, variant: "success" }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Button.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Button.spec.js index c5954312c1..36592ccf84 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Button.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Button.spec.js @@ -1,96 +1,91 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { mdiFolderOutline } from "@mdi/js"; import { Button } from ".."; describe("Button", () => { - const baseProps = { - text: "some text" - }; - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(cleanup); - - it("should render the Button component using the type \"button\" as a default", () => { - const { container } = render(Button, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should render a button of the desired type", () => { - ["button", "reset", "submit", "toggle"].forEach(type => { - const props = { ...baseProps, type }; - const { container } = render(Button, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - }); - - it("should accept an active property for the toggle button type", () => { - const props = { ...baseProps, active: true, type: "toggle" }; - const { container } = render(Button, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should pass additional class names and attributes to the rendered element", () => { - const props = { - ...baseProps, - className: "foo bar", - id: "some-id" - }; - const { container } = render(Button, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should render a button without a text", () => { - const props = { - ...baseProps, - text: "" - }; - const { container } = render(Button, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should be able to render a button with an icon and text", () => { - ["after", "before"].forEach(position => { - const props = { - ...baseProps, - icon: { - path: mdiFolderOutline, - position - } - }; - const { container } = render(Button, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - }); - - it("should be able to render a button with an icon only", () => { - ["after", "before"].forEach(position => { - const props = { - ...baseProps, - icon: { - path: mdiFolderOutline, - position - }, - text: "" - }; - const { container } = render(Button, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - }); + const baseProps = { + text: "some text", + }; + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it('should render the Button component using the type "button" as a default', () => { + const { container } = render(Button, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should render a button of the desired type", () => { + ["button", "reset", "submit", "toggle"].forEach((type) => { + const props = { ...baseProps, type }; + const { container } = render(Button, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + }); + + it("should accept an active property for the toggle button type", () => { + const props = { ...baseProps, active: true, type: "toggle" }; + const { container } = render(Button, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should pass additional class names and attributes to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + id: "some-id", + }; + const { container } = render(Button, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should render a button without a text", () => { + const props = { + ...baseProps, + text: "", + }; + const { container } = render(Button, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should be able to render a button with an icon and text", () => { + ["after", "before"].forEach((position) => { + const props = { + ...baseProps, + icon: { + path: mdiFolderOutline, + position, + }, + }; + const { container } = render(Button, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + }); + + it("should be able to render a button with an icon only", () => { + ["after", "before"].forEach((position) => { + const props = { + ...baseProps, + icon: { + path: mdiFolderOutline, + position, + }, + text: "", + }; + const { container } = render(Button, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Card.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Card.spec.js index ee085259fc..e4de4368b7 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Card.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Card.spec.js @@ -1,27 +1,21 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { Card } from ".."; describe("Card", () => { - afterEach(cleanup); + afterEach(cleanup); - it("renders the Card component with a heading", () => { - const { container } = render(Card, { props: { heading: "My Card" } }); + it("renders the Card component with a heading", () => { + const { container } = render(Card, { props: { heading: "My Card" } }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("renders the the Card component with an icon when iconPath is provided", () => { - const { container } = render( - Card, - { props: { heading: "My Card", iconPath: "M3,3H21V21H3V3M5,5V19H19V5H5Z" } } - ); + it("renders the the Card component with an icon when iconPath is provided", () => { + const { container } = render(Card, { + props: { heading: "My Card", iconPath: "M3,3H21V21H3V3M5,5V19H19V5H5Z" }, + }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Checkbox.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Checkbox.spec.js index 9ce285ad9d..ab04740837 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Checkbox.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Checkbox.spec.js @@ -1,50 +1,55 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, fireEvent, render } from "@testing-library/svelte"; import { Checkbox } from ".."; describe("Checkbox", () => { - const baseProps = { - name: "test", - id: "test" - }; - - afterEach(cleanup); - - it("renders the Checkbox component", () => { - const { container } = render(Checkbox, { props: { ...baseProps, checked: false } }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("renders the Checkbox component in a checked state", () => { - const { container } = render(Checkbox, { props: { ...baseProps, checked: true } }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("renders the Checkbox component in a disabled state", () => { - const { container } = render(Checkbox, { props: { ...baseProps, disabled: true } }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("renders the Checkbox component in a disabled, checked state", () => { - const { container } = render(Checkbox, { props: { ...baseProps, disabled: true, checked: true } }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("renders the Checkbox component and can transition to a checked state on click", async () => { - const { getByRole } = render(Checkbox, { props: { ...baseProps, checked: false } }); - const checkbox = getByRole("checkbox"); - - expect(checkbox).not.toBeChecked(); - await fireEvent.click(checkbox); - expect(checkbox).toBeChecked(); - }); + const baseProps = { + id: "test", + name: "test", + }; + + afterEach(cleanup); + + it("renders the Checkbox component", () => { + const { container } = render(Checkbox, { + props: { ...baseProps, checked: false }, + }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("renders the Checkbox component in a checked state", () => { + const { container } = render(Checkbox, { + props: { ...baseProps, checked: true }, + }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("renders the Checkbox component in a disabled state", () => { + const { container } = render(Checkbox, { + props: { ...baseProps, disabled: true }, + }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("renders the Checkbox component in a disabled, checked state", () => { + const { container } = render(Checkbox, { + props: { ...baseProps, checked: true, disabled: true }, + }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("renders the Checkbox component and can transition to a checked state on click", async () => { + const { getByRole } = render(Checkbox, { + props: { ...baseProps, checked: false }, + }); + const checkbox = getByRole("checkbox"); + + expect(checkbox).not.toBeChecked(); + await fireEvent.click(checkbox); + expect(checkbox).toBeChecked(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/ErrorDetails.spec.js b/web-wallet/src/lib/dusk/components/__tests__/ErrorDetails.spec.js index dd143b76b8..55a36db21b 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/ErrorDetails.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/ErrorDetails.spec.js @@ -1,49 +1,44 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { ErrorDetails } from ".."; describe("ErrorDetails", () => { - const baseProps = { - error: new Error("Some error messaage"), - summary: "Some error summary" - }; - - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(cleanup); - - it("should render the `ErrorDetails` component", () => { - const { container } = render(ErrorDetails, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should pass additional class names to the rendered element", () => { - const props = { - ...baseProps, - className: "foo bar" - }; - const { container } = render(ErrorDetails, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should render nothing if the error is `null`", () => { - const props = { - ...baseProps, - error: null - }; - const { container } = render(ErrorDetails, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); + const baseProps = { + error: new Error("Some error messaage"), + summary: "Some error summary", + }; + + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it("should render the `ErrorDetails` component", () => { + const { container } = render(ErrorDetails, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should pass additional class names to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + }; + const { container } = render(ErrorDetails, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should render nothing if the error is `null`", () => { + const props = { + ...baseProps, + error: null, + }; + const { container } = render(ErrorDetails, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Icon.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Icon.spec.js index 1d763fda41..d48ef8f5d6 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Icon.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Icon.spec.js @@ -1,69 +1,64 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { Icon } from ".."; describe("Icon", () => { - const baseProps = { - path: "M3,3H21V21H3V3M5,5V19H19V5H5Z" - }; - const baseOptions = { - props: baseProps, - target: document.body - }; + const baseProps = { + path: "M3,3H21V21H3V3M5,5V19H19V5H5Z", + }; + const baseOptions = { + props: baseProps, + target: document.body, + }; - afterEach(cleanup); + afterEach(cleanup); - it("should render the Icon component", () => { - const { container } = render(Icon, baseOptions); + it("should render the Icon component", () => { + const { container } = render(Icon, baseOptions); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("should accept a custom role for the SVG component", () => { - const props = { - ...baseProps, - role: "presentation" - }; - const { container } = render(Icon, { ...baseOptions, props }); + it("should accept a custom role for the SVG component", () => { + const props = { + ...baseProps, + role: "presentation", + }; + const { container } = render(Icon, { ...baseOptions, props }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("should render the icon inside a `g` element if it's part of a stack", () => { - const props = { - ...baseProps, - isInStack: true - }; - const { container } = render(Icon, { ...baseOptions, props }); + it("should render the icon inside a `g` element if it's part of a stack", () => { + const props = { + ...baseProps, + isInStack: true, + }; + const { container } = render(Icon, { ...baseOptions, props }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("should pass additional class names and attributes to the rendered element", () => { - const props = { - ...baseProps, - "className": "foo bar", - "data-baz": "baz" - }; - const { container, rerender } = render(Icon, { ...baseOptions, props }); - const icon = container.firstChild; + it("should pass additional class names and attributes to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + "data-baz": "baz", + }; + const { container, rerender } = render(Icon, { ...baseOptions, props }); + const icon = container.firstChild; - expect(icon).toHaveClass("foo bar"); - expect(icon).toHaveAttribute("data-baz", "baz"); - expect(icon).toMatchSnapshot(); + expect(icon).toHaveClass("foo bar"); + expect(icon).toHaveAttribute("data-baz", "baz"); + expect(icon).toMatchSnapshot(); - rerender({ ...props, isInStack: true }); + rerender({ ...props, isInStack: true }); - const icon2 = container.firstChild; + const icon2 = container.firstChild; - expect(icon2).toHaveClass("foo bar"); - expect(icon2).toHaveAttribute("data-baz", "baz"); - expect(icon2).toMatchSnapshot(); - }); + expect(icon2).toHaveClass("foo bar"); + expect(icon2).toHaveAttribute("data-baz", "baz"); + expect(icon2).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Mnemonic.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Mnemonic.spec.js index 2a9285e092..5b28bce19f 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Mnemonic.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Mnemonic.spec.js @@ -1,104 +1,107 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; -import { - cleanup, - fireEvent, - render -} from "@testing-library/svelte"; +import { afterEach, describe, expect, it } from "vitest"; +import { cleanup, fireEvent, render } from "@testing-library/svelte"; import { Mnemonic } from ".."; /** @type {string[]} */ const enteredSeed = []; /** @type {string[]} */ -const seed = ["auction", "tribe", "type", "torch", "domain", "auction", - "lyrics", "mouse", "alert", "fabric", "snake", "ticket"]; +const seed = [ + "auction", + "tribe", + "type", + "torch", + "domain", + "auction", + "lyrics", + "mouse", + "alert", + "fabric", + "snake", + "ticket", +]; describe("Mnemonic", () => { - afterEach(cleanup); - - it("should render the \"Mnemonic\" component in the authenticate state", async () => { - const { container } = render(Mnemonic, { - props: { - enteredMnemonicPhrase: enteredSeed, - type: "authenticate" - } - }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should render the \"Mnemonic\" component in the validate state", () => { - const { container } = render(Mnemonic, { - props: { - mnemonicPhrase: seed, - type: "validate" - } - }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should display all the words in the order they have been clicked", async () => { - const { container, getAllByRole } = render(Mnemonic, { - props: { - enteredMnemonicPhrase: enteredSeed, - mnemonicPhrase: seed, - type: "validate" - } - }); - - const buttons = container.querySelectorAll("button[data-value]"); - - for (const word of buttons) { - await fireEvent.click(word); - expect(word).toBeDisabled(); - } - - const enteredPhrase = getAllByRole("listitem"); - - enteredPhrase.forEach((word, index) => { - expect(word.textContent).toBe(buttons[index].textContent); - }); - }); - - it("should revert the most recent word on Undo click", async () => { - const { container, getByText, getAllByRole } = render(Mnemonic, { - props: { - enteredMnemonicPhrase: enteredSeed, - mnemonicPhrase: seed, - type: "validate" - } - }); - - const buttons = container.querySelectorAll("button[data-value]"); - - // Enters the first 5 words - for (let i = 0; i < 5; i++) { - await fireEvent.click(buttons[i]); - expect(buttons[i]).toBeDisabled(); - } - - const undoButton = getByText("Undo"); - - // Presses the "Undo button" - await fireEvent.click(undoButton); - - const enteredPhrase = getAllByRole("listitem"); - - // Verify that the content of each list item matches the corresponding button's text content - // Loop until the 4th item (index 3) - for (let i = 0; i <= 3; i++) { - expect(enteredPhrase[i].textContent).toBe(buttons[i].textContent); - } - - // The 5th item (index 4) and next should be empty - for (let i = 4; i <= 11; i++) { - expect(enteredPhrase[i].textContent).toBe("_____"); - } - }); + afterEach(cleanup); + + it('should render the "Mnemonic" component in the authenticate state', async () => { + const { container } = render(Mnemonic, { + props: { + enteredMnemonicPhrase: enteredSeed, + type: "authenticate", + }, + }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it('should render the "Mnemonic" component in the validate state', () => { + const { container } = render(Mnemonic, { + props: { + mnemonicPhrase: seed, + type: "validate", + }, + }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should display all the words in the order they have been clicked", async () => { + const { container, getAllByRole } = render(Mnemonic, { + props: { + enteredMnemonicPhrase: enteredSeed, + mnemonicPhrase: seed, + type: "validate", + }, + }); + + const buttons = container.querySelectorAll("button[data-value]"); + + for (const word of buttons) { + await fireEvent.click(word); + expect(word).toBeDisabled(); + } + + const enteredPhrase = getAllByRole("listitem"); + + enteredPhrase.forEach((word, index) => { + expect(word.textContent).toBe(buttons[index].textContent); + }); + }); + + it("should revert the most recent word on Undo click", async () => { + const { container, getByText, getAllByRole } = render(Mnemonic, { + props: { + enteredMnemonicPhrase: enteredSeed, + mnemonicPhrase: seed, + type: "validate", + }, + }); + + const buttons = container.querySelectorAll("button[data-value]"); + + // Enters the first 5 words + for (let i = 0; i < 5; i++) { + await fireEvent.click(buttons[i]); + expect(buttons[i]).toBeDisabled(); + } + + const undoButton = getByText("Undo"); + + // Presses the "Undo button" + await fireEvent.click(undoButton); + + const enteredPhrase = getAllByRole("listitem"); + + // Verify that the content of each list item matches the corresponding button's text content + // Loop until the 4th item (index 3) + for (let i = 0; i <= 3; i++) { + expect(enteredPhrase[i].textContent).toBe(buttons[i].textContent); + } + + // The 5th item (index 4) and next should be empty + for (let i = 4; i <= 11; i++) { + expect(enteredPhrase[i].textContent).toBe("_____"); + } + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/ProgressBar.spec.js b/web-wallet/src/lib/dusk/components/__tests__/ProgressBar.spec.js index 6312224bd4..83d3654400 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/ProgressBar.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/ProgressBar.spec.js @@ -1,35 +1,34 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { ProgressBar } from ".."; describe("ProgressBar", () => { - afterEach(cleanup); + afterEach(cleanup); - it("renders the ProgressBar component with no current percentage set", () => { - const { container } = render(ProgressBar); + it("renders the ProgressBar component with no current percentage set", () => { + const { container } = render(ProgressBar); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("renders the Stepper component with current percentage set as zero", () => { - const { container } = render(ProgressBar, { props: { currentPercentage: 0 } }); + it("renders the Stepper component with current percentage set as zero", () => { + const { container } = render(ProgressBar, { + props: { currentPercentage: 0 }, + }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("re-renders the Stepper component when the current percentage property changes", async () => { - const { component, container } = render(ProgressBar, { props: { currentPercentage: 0 } }); + it("re-renders the Stepper component when the current percentage property changes", async () => { + const { component, container } = render(ProgressBar, { + props: { currentPercentage: 0 }, + }); - expect(container.firstChild).toMatchSnapshot(); + expect(container.firstChild).toMatchSnapshot(); - await component.$set({ currentPercentage: 50 }); + await component.$set({ currentPercentage: 50 }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/QrCode.spec.js b/web-wallet/src/lib/dusk/components/__tests__/QrCode.spec.js index 8d3052bf52..26344fc853 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/QrCode.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/QrCode.spec.js @@ -1,29 +1,21 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; -import { - cleanup, - render -} from "@testing-library/svelte"; +import { afterEach, describe, expect, it } from "vitest"; +import { cleanup, render } from "@testing-library/svelte"; import { QrCode } from ".."; describe("QrCode", () => { - const baseProps = { - value: "xyz" - }; - const baseOptions = { - props: baseProps, - target: document.body - }; + const baseProps = { + value: "xyz", + }; + const baseOptions = { + props: baseProps, + target: document.body, + }; - afterEach(cleanup); + afterEach(cleanup); - it("should render the QrCode component", () => { - const { container } = render(QrCode, baseOptions); + it("should render the QrCode component", () => { + const { container } = render(QrCode, baseOptions); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Select.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Select.spec.js index d6bd5389d7..dbea332e41 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Select.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Select.spec.js @@ -1,16 +1,5 @@ -import { - afterEach, - describe, - expect, - it, - vi -} from "vitest"; -import { - cleanup, - fireEvent, - render, - screen -} from "@testing-library/svelte"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { cleanup, fireEvent, render, screen } from "@testing-library/svelte"; import { Select } from ".."; @@ -18,140 +7,140 @@ const stringOptions = ["one", "two", "three", "four"]; /** @type {SelectOption[]} */ const objectOptions = [ - { label: "one", value: "1" }, - { label: "two", value: "2" }, - { disabled: true, label: "three", value: "3" }, - { label: "four", value: "4" } + { label: "one", value: "1" }, + { label: "two", value: "2" }, + { disabled: true, label: "three", value: "3" }, + { label: "four", value: "4" }, ]; /** @type {GroupedSelectOptions} */ const groupedOptions = { - "Group one": [ - { label: "one", value: "1" }, - { label: "two", value: "2" }, - { disabled: true, label: "three", value: "3" } - ], - "Group two": [ - { label: "four", value: "4" }, - { label: "five", value: "5" } - ] + "Group one": [ + { label: "one", value: "1" }, + { label: "two", value: "2" }, + { disabled: true, label: "three", value: "3" }, + ], + "Group two": [ + { label: "four", value: "4" }, + { label: "five", value: "5" }, + ], }; /** @type {GroupedSelectOptions} */ const groupedOptionsStrings = { - "Group one": ["one", "two", "three", "four"], - "Group two": ["five", "six", "seven"] + "Group one": ["one", "two", "three", "four"], + "Group two": ["five", "six", "seven"], }; describe("Select", () => { - const baseProps = { - options: stringOptions - }; - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(cleanup); - - it("should render the Select component", () => { - const { container } = render(Select, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should accept a change event handler", async () => { - const changeHandler = vi.fn(); - const props = { - ...baseProps, - "data-testid": "my-select", - "value": "two" - }; - const { component } = render(Select, { ...baseOptions, props }); - - /** @type {HTMLSelectElement} */ - const select = screen.getByTestId("my-select"); - const target = select.querySelector("option[value='four']"); - - component.$on("change", changeHandler); - - await fireEvent.change(select, { target }); - - expect(changeHandler).toHaveBeenCalledTimes(1); - expect(changeHandler).toHaveBeenCalledWith(expect.any(Event)); - expect(select.value).toBe("four"); - }); - - it("should pass additional class names and attributes to the rendered element", () => { - const props = { - ...baseProps, - className: "foo bar", - id: "some-id" - }; - const { container } = render(Select, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should accept an array of objects as options", () => { - const props = { - ...baseProps, - options: objectOptions - }; - const { container } = render(Select, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should use the value as label if an object is missing it", () => { - const objectOptions2 = objectOptions.concat({ value: "5" }); - const props = { - ...baseProps, - options: objectOptions2 - }; - const { container } = render(Select, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should accept an empty string as label and use it instead of falling back to the value", () => { - const objectOptions2 = objectOptions.concat({ label: "", value: "5" }); - const props = { - ...baseProps, - options: objectOptions2 - }; - const { container } = render(Select, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should accept an array of strings as `options` and use each string as both label and value", () => { - const props = { - ...baseProps, - options: groupedOptionsStrings["Group one"] - }; - const { container } = render(Select, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should accept a grouped object as `options` and create option groups", () => { - const props = { - ...baseProps, - options: groupedOptions - }; - const { container } = render(Select, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should accept an array of string as values of a grouped object", () => { - const props = { - ...baseProps, - options: groupedOptionsStrings - }; - const { container } = render(Select, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); + const baseProps = { + options: stringOptions, + }; + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it("should render the Select component", () => { + const { container } = render(Select, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should accept a change event handler", async () => { + const changeHandler = vi.fn(); + const props = { + ...baseProps, + "data-testid": "my-select", + value: "two", + }; + const { component } = render(Select, { ...baseOptions, props }); + + /** @type {HTMLSelectElement} */ + const select = screen.getByTestId("my-select"); + const target = select.querySelector("option[value='four']"); + + component.$on("change", changeHandler); + + await fireEvent.change(select, { target }); + + expect(changeHandler).toHaveBeenCalledTimes(1); + expect(changeHandler).toHaveBeenCalledWith(expect.any(Event)); + expect(select.value).toBe("four"); + }); + + it("should pass additional class names and attributes to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + id: "some-id", + }; + const { container } = render(Select, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should accept an array of objects as options", () => { + const props = { + ...baseProps, + options: objectOptions, + }; + const { container } = render(Select, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should use the value as label if an object is missing it", () => { + const objectOptions2 = objectOptions.concat({ value: "5" }); + const props = { + ...baseProps, + options: objectOptions2, + }; + const { container } = render(Select, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should accept an empty string as label and use it instead of falling back to the value", () => { + const objectOptions2 = objectOptions.concat({ label: "", value: "5" }); + const props = { + ...baseProps, + options: objectOptions2, + }; + const { container } = render(Select, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should accept an array of strings as `options` and use each string as both label and value", () => { + const props = { + ...baseProps, + options: groupedOptionsStrings["Group one"], + }; + const { container } = render(Select, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should accept a grouped object as `options` and create option groups", () => { + const props = { + ...baseProps, + options: groupedOptions, + }; + const { container } = render(Select, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should accept an array of string as values of a grouped object", () => { + const props = { + ...baseProps, + options: groupedOptionsStrings, + }; + const { container } = render(Select, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Stepper.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Stepper.spec.js index 07aec4f390..9f531ae969 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Stepper.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Stepper.spec.js @@ -1,37 +1,40 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { Stepper } from ".."; describe("Stepper", () => { - afterEach(cleanup); + afterEach(cleanup); - it("renders the Stepper component with two steps", () => { - const { container } = render(Stepper, { props: { steps: 2, activeStep: 0 } }); + it("renders the Stepper component with two steps", () => { + const { container } = render(Stepper, { + props: { activeStep: 0, steps: 2 }, + }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("renders the Stepper component with a completed step", () => { - const { container } = render(Stepper, { props: { steps: 2, activeStep: 1 } }); + it("renders the Stepper component with a completed step", () => { + const { container } = render(Stepper, { + props: { activeStep: 1, steps: 2 }, + }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("renders the Stepper component with five steps", () => { - const { container } = render(Stepper, { props: { steps: 5, activeStep: 0 } }); + it("renders the Stepper component with five steps", () => { + const { container } = render(Stepper, { + props: { activeStep: 0, steps: 5 }, + }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("renders the Stepper component with five steps, with the third one being active, and the first two – completed", () => { - const { container } = render(Stepper, { props: { steps: 5, activeStep: 3 } }); + it("renders the Stepper component with five steps, with the third one being active, and the first two – completed", () => { + const { container } = render(Stepper, { + props: { activeStep: 3, steps: 5 }, + }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Switch.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Switch.spec.js index e9ef128751..1739894cbb 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Switch.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Switch.spec.js @@ -1,133 +1,138 @@ -import { - afterEach, - describe, - expect, - it, - vi -} from "vitest"; -import { - cleanup, - fireEvent, - render -} from "@testing-library/svelte"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { cleanup, fireEvent, render } from "@testing-library/svelte"; import { Switch } from ".."; describe("Switch", () => { - const baseProps = {}; - - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(cleanup); - - it("should render the \"Switch\" component with a default tab index of `0`", () => { - const { container, rerender } = render(Switch, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - - rerender({ ...baseProps, value: true }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should use the received tab index", () => { - const props = { - ...baseProps, - tabindex: 5 - }; - const { container } = render(Switch, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should render the component in a disabled status with a tabindex of `-1`", () => { - const props = { - ...baseProps, - disabled: true, - tabindex: 5 - }; - const { container, rerender } = render(Switch, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - - rerender({ ...props, value: true }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should pass additional class names and attributes to the root element", () => { - const props = { - ...baseProps, - className: "foo bar", - id: "some-id" - }; - const { container } = render(Switch, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - describe("Event handlers", () => { - it("should dispatch a `change` event when the switch is clicked", async () => { - const { component, getByRole } = render(Switch, baseOptions); - const switchElement = getByRole("switch"); - const handler = vi.fn(); - - component.$on("change", handler); - - await fireEvent.click(switchElement); - await fireEvent.click(switchElement); - - expect(handler).toHaveBeenCalledTimes(2); - expect(handler).toHaveBeenNthCalledWith(1, expect.objectContaining({ detail: true })); - expect(handler).toHaveBeenNthCalledWith(2, expect.objectContaining({ detail: false })); - }); - - it("should dispatch a `change` event when the user presses space on the switch", async () => { - const { component, getByRole } = render(Switch, baseOptions); - const switchElement = getByRole("switch"); - const handler = vi.fn(); - - component.$on("change", handler); - - await fireEvent.keyDown(switchElement, { key: " " }); - await fireEvent.keyDown(switchElement, { key: " " }); - - expect(handler).toHaveBeenCalledTimes(2); - expect(handler).toHaveBeenNthCalledWith(1, expect.objectContaining({ detail: true })); - expect(handler).toHaveBeenNthCalledWith(2, expect.objectContaining({ detail: false })); - }); - - it("should not dispatch an event if the user presses another key", async () => { - const { component, getByRole } = render(Switch, baseOptions); - const switchElement = getByRole("switch"); - const handler = vi.fn(); - - component.$on("change", handler); - - await fireEvent.keyDown(switchElement, { key: "Enter" }); - await fireEvent.keyDown(switchElement, { key: "a" }); - - expect(handler).not.toHaveBeenCalled(); - }); - - it("should not dispatch an event if the switch is disabled", async () => { - const props = { - ...baseProps, - disabled: true - }; - const { component, getByRole } = render(Switch, { ...baseOptions, props }); - const switchElement = getByRole("switch"); - const handler = vi.fn(); - - component.$on("change", handler); - - await fireEvent.click(switchElement); - await fireEvent.keyDown(switchElement, { key: " " }); - - expect(handler).not.toHaveBeenCalled(); - }); - }); + const baseProps = {}; + + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it('should render the "Switch" component with a default tab index of `0`', () => { + const { container, rerender } = render(Switch, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + + rerender({ ...baseProps, value: true }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should use the received tab index", () => { + const props = { + ...baseProps, + tabindex: 5, + }; + const { container } = render(Switch, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should render the component in a disabled status with a tabindex of `-1`", () => { + const props = { + ...baseProps, + disabled: true, + tabindex: 5, + }; + const { container, rerender } = render(Switch, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + + rerender({ ...props, value: true }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should pass additional class names and attributes to the root element", () => { + const props = { + ...baseProps, + className: "foo bar", + id: "some-id", + }; + const { container } = render(Switch, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + describe("Event handlers", () => { + it("should dispatch a `change` event when the switch is clicked", async () => { + const { component, getByRole } = render(Switch, baseOptions); + const switchElement = getByRole("switch"); + const handler = vi.fn(); + + component.$on("change", handler); + + await fireEvent.click(switchElement); + await fireEvent.click(switchElement); + + expect(handler).toHaveBeenCalledTimes(2); + expect(handler).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ detail: true }), + ); + expect(handler).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ detail: false }), + ); + }); + + it("should dispatch a `change` event when the user presses space on the switch", async () => { + const { component, getByRole } = render(Switch, baseOptions); + const switchElement = getByRole("switch"); + const handler = vi.fn(); + + component.$on("change", handler); + + await fireEvent.keyDown(switchElement, { key: " " }); + await fireEvent.keyDown(switchElement, { key: " " }); + + expect(handler).toHaveBeenCalledTimes(2); + expect(handler).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ detail: true }), + ); + expect(handler).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ detail: false }), + ); + }); + + it("should not dispatch an event if the user presses another key", async () => { + const { component, getByRole } = render(Switch, baseOptions); + const switchElement = getByRole("switch"); + const handler = vi.fn(); + + component.$on("change", handler); + + await fireEvent.keyDown(switchElement, { key: "Enter" }); + await fireEvent.keyDown(switchElement, { key: "a" }); + + expect(handler).not.toHaveBeenCalled(); + }); + + it("should not dispatch an event if the switch is disabled", async () => { + const props = { + ...baseProps, + disabled: true, + }; + const { component, getByRole } = render(Switch, { + ...baseOptions, + props, + }); + const switchElement = getByRole("switch"); + const handler = vi.fn(); + + component.$on("change", handler); + + await fireEvent.click(switchElement); + await fireEvent.keyDown(switchElement, { key: " " }); + + expect(handler).not.toHaveBeenCalled(); + }); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Tabs.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Tabs.spec.js index e3a120ba90..28560f6bba 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Tabs.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Tabs.spec.js @@ -7,391 +7,380 @@ import { Tabs } from ".."; vi.useFakeTimers(); describe("Tabs", () => { - const rafSpy = vi.spyOn(window, "requestAnimationFrame"); - const cafSpy = vi.spyOn(window, "cancelAnimationFrame"); - const scrollBySpy = vi.spyOn(HTMLUListElement.prototype, "scrollBy"); - const scrollIntoViewSpy = vi.spyOn( - HTMLLIElement.prototype, - "scrollIntoView" - ); - const scrollLeftSpy = vi - .spyOn(HTMLUListElement.prototype, "scrollLeft", "get") - .mockReturnValue(0); - const scrollToSpy = vi.spyOn(HTMLUListElement.prototype, "scrollTo"); - const scrollWidthSpy = vi - .spyOn(HTMLUListElement.prototype, "scrollWidth", "get") - .mockReturnValue(640); - const ulClientWidthSpy = vi - .spyOn(HTMLUListElement.prototype, "clientWidth", "get") - .mockReturnValue(320); - - const items = [ - "Dashboard", - "User Settings", - "User Profile", - "Notifications", - "Direct Messaging", - "Task Manager", - "Event Calendar", - "Analytics", - "Team Management", - "Help" - ].map((v) => ({ id: v.toLowerCase().replace(/ /g, "-"), label: v })); - - /** @type {TabItem[]} */ - const itemsWithTextAndIcon = items.map((item, idx) => ({ - ...item, - icon: { path: mdiHome, position: idx % 2 === 0 ? "before" : "after" } - })); - - /** @type {TabItem[]} */ - const itemsWithIcon = itemsWithTextAndIcon.map(({ id, icon }) => ({ - id, - icon - })); - const itemsWithIdOnly = items.map(({ id }) => ({ id })); - - const baseProps = { - items, - selectedTab: "user-settings" - }; - - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(() => { - cleanup(); - rafSpy.mockClear(); - cafSpy.mockClear(); - scrollBySpy.mockClear(); - scrollIntoViewSpy.mockClear(); - scrollLeftSpy.mockClear(); - scrollToSpy.mockClear(); - scrollWidthSpy.mockClear(); - ulClientWidthSpy.mockClear(); - }); - - afterAll(() => { - rafSpy.mockRestore(); - cafSpy.mockRestore(); - scrollBySpy.mockRestore(); - scrollIntoViewSpy.mockRestore(); - scrollLeftSpy.mockRestore(); - scrollToSpy.mockRestore(); - scrollWidthSpy.mockRestore(); - ulClientWidthSpy.mockRestore(); - }); - - it("should render a \"Tabs\" component and reset its scroll status if no tab is selected", () => { - const props = { - ...baseProps, - selectedTab: undefined - }; - const { container } = render(Tabs, { ...baseOptions, props }); - const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); - - expect(tabsList.scrollTo).toHaveBeenCalledTimes(1); - expect(tabsList.scrollTo).toHaveBeenCalledWith(0, 0); - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should scroll the selected tab into view if there's a selection", async () => { - const { container } = render(Tabs, baseOptions); - const tab = getAsHTMLElement( - container, - `[data-tabid="${baseProps.selectedTab}"]` - ); - - expect(tab.scrollIntoView).toHaveBeenCalledTimes(1); - }); - - it("should be able to render tabs with icon and text", () => { - const props = { - ...baseProps, - items: itemsWithTextAndIcon - }; - const { container } = render(Tabs, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should be able to render tabs with icons only", () => { - const props = { - ...baseProps, - items: itemsWithIcon - }; - const { container } = render(Tabs, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should use the id as label if the tab hasn't one and is without icon", () => { - const props = { - ...baseProps, - items: itemsWithIdOnly - }; - const { container } = render(Tabs, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should observe the tab list resize on mounting and stop observing when unmounting", () => { - const observeSpy = vi.spyOn(ResizeObserver.prototype, "observe"); - const disconnectSpy = vi.spyOn(ResizeObserver.prototype, "disconnect"); - const { container, unmount } = render(Tabs, baseOptions); - const tabsList = container.querySelector(".dusk-tabs-list"); - - expect(observeSpy).toHaveBeenCalledTimes(1); - expect(observeSpy).toHaveBeenCalledWith(tabsList); - - unmount(); - - expect(disconnectSpy).toHaveBeenCalledTimes(1); - - observeSpy.mockRestore(); - disconnectSpy.mockRestore(); - }); - - it("should pass additional class names and attributes to the root element", () => { - const props = { - ...baseProps, - className: "foo bar", - id: "some-id" - }; - const { container } = render(Tabs, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should fire a change event when a tab is selected and it's not the current selection", async () => { - const { component, getAllByRole } = render(Tabs, baseOptions); - const tabs = getAllByRole("tab"); - - let expectedTab = tabs[0]; - - expect.assertions(3); - - component.$on("change", (event) => { - expect(event.detail).toBe(expectedTab.dataset.tabid); - }); - - // does nothing as it's currently selected - await fireEvent.click(tabs[1]); + const rafSpy = vi.spyOn(window, "requestAnimationFrame"); + const cafSpy = vi.spyOn(window, "cancelAnimationFrame"); + const scrollBySpy = vi.spyOn(HTMLUListElement.prototype, "scrollBy"); + const scrollIntoViewSpy = vi.spyOn(HTMLLIElement.prototype, "scrollIntoView"); + const scrollLeftSpy = vi + .spyOn(HTMLUListElement.prototype, "scrollLeft", "get") + .mockReturnValue(0); + const scrollToSpy = vi.spyOn(HTMLUListElement.prototype, "scrollTo"); + const scrollWidthSpy = vi + .spyOn(HTMLUListElement.prototype, "scrollWidth", "get") + .mockReturnValue(640); + const ulClientWidthSpy = vi + .spyOn(HTMLUListElement.prototype, "clientWidth", "get") + .mockReturnValue(320); + + const items = [ + "Dashboard", + "User Settings", + "User Profile", + "Notifications", + "Direct Messaging", + "Task Manager", + "Event Calendar", + "Analytics", + "Team Management", + "Help", + ].map((v) => ({ id: v.toLowerCase().replace(/ /g, "-"), label: v })); + + /** @type {TabItem[]} */ + const itemsWithTextAndIcon = items.map((item, idx) => ({ + ...item, + icon: { path: mdiHome, position: idx % 2 === 0 ? "before" : "after" }, + })); + + /** @type {TabItem[]} */ + const itemsWithIcon = itemsWithTextAndIcon.map(({ id, icon }) => ({ + icon, + id, + })); + const itemsWithIdOnly = items.map(({ id }) => ({ id })); + + const baseProps = { + items, + selectedTab: "user-settings", + }; + + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(() => { + cleanup(); + rafSpy.mockClear(); + cafSpy.mockClear(); + scrollBySpy.mockClear(); + scrollIntoViewSpy.mockClear(); + scrollLeftSpy.mockClear(); + scrollToSpy.mockClear(); + scrollWidthSpy.mockClear(); + ulClientWidthSpy.mockClear(); + }); + + afterAll(() => { + rafSpy.mockRestore(); + cafSpy.mockRestore(); + scrollBySpy.mockRestore(); + scrollIntoViewSpy.mockRestore(); + scrollLeftSpy.mockRestore(); + scrollToSpy.mockRestore(); + scrollWidthSpy.mockRestore(); + ulClientWidthSpy.mockRestore(); + }); + + it('should render a "Tabs" component and reset its scroll status if no tab is selected', () => { + const props = { + ...baseProps, + selectedTab: undefined, + }; + const { container } = render(Tabs, { ...baseOptions, props }); + const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); + + expect(tabsList.scrollTo).toHaveBeenCalledTimes(1); + expect(tabsList.scrollTo).toHaveBeenCalledWith(0, 0); + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should scroll the selected tab into view if there's a selection", async () => { + const { container } = render(Tabs, baseOptions); + const tab = getAsHTMLElement( + container, + `[data-tabid="${baseProps.selectedTab}"]`, + ); + + expect(tab.scrollIntoView).toHaveBeenCalledTimes(1); + }); + + it("should be able to render tabs with icon and text", () => { + const props = { + ...baseProps, + items: itemsWithTextAndIcon, + }; + const { container } = render(Tabs, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should be able to render tabs with icons only", () => { + const props = { + ...baseProps, + items: itemsWithIcon, + }; + const { container } = render(Tabs, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should use the id as label if the tab hasn't one and is without icon", () => { + const props = { + ...baseProps, + items: itemsWithIdOnly, + }; + const { container } = render(Tabs, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should observe the tab list resize on mounting and stop observing when unmounting", () => { + const observeSpy = vi.spyOn(ResizeObserver.prototype, "observe"); + const disconnectSpy = vi.spyOn(ResizeObserver.prototype, "disconnect"); + const { container, unmount } = render(Tabs, baseOptions); + const tabsList = container.querySelector(".dusk-tabs-list"); + + expect(observeSpy).toHaveBeenCalledTimes(1); + expect(observeSpy).toHaveBeenCalledWith(tabsList); + + unmount(); + + expect(disconnectSpy).toHaveBeenCalledTimes(1); + + observeSpy.mockRestore(); + disconnectSpy.mockRestore(); + }); + + it("should pass additional class names and attributes to the root element", () => { + const props = { + ...baseProps, + className: "foo bar", + id: "some-id", + }; + const { container } = render(Tabs, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should fire a change event when a tab is selected and it's not the current selection", async () => { + const { component, getAllByRole } = render(Tabs, baseOptions); + const tabs = getAllByRole("tab"); + + let expectedTab = tabs[0]; + + expect.assertions(3); + + component.$on("change", (event) => { + expect(event.detail).toBe(expectedTab.dataset.tabid); + }); + + // does nothing as it's currently selected + await fireEvent.click(tabs[1]); - await fireEvent.click(expectedTab); + await fireEvent.click(expectedTab); - expectedTab = tabs[1]; + expectedTab = tabs[1]; - await fireEvent.keyDown(expectedTab, { key: "Enter" }); + await fireEvent.keyDown(expectedTab, { key: "Enter" }); - expectedTab = tabs[2]; + expectedTab = tabs[2]; - await fireEvent.keyDown(expectedTab, { key: " " }); + await fireEvent.keyDown(expectedTab, { key: " " }); - // does nothing as neither space or Enter are pressed - await fireEvent.keyDown(tabs[1], { key: "f" }); - }); + // does nothing as neither space or Enter are pressed + await fireEvent.keyDown(tabs[1], { key: "f" }); + }); - it("should scroll a tab into view when it gains focus", async () => { - const { getAllByRole } = render(Tabs, baseOptions); - const tabs = getAllByRole("tab"); + it("should scroll a tab into view when it gains focus", async () => { + const { getAllByRole } = render(Tabs, baseOptions); + const tabs = getAllByRole("tab"); - scrollIntoViewSpy.mockClear(); + scrollIntoViewSpy.mockClear(); - await fireEvent.focusIn(tabs[0]); + await fireEvent.focusIn(tabs[0]); - expect(tabs[0].scrollIntoView).toHaveBeenCalledTimes(1); - }); + expect(tabs[0].scrollIntoView).toHaveBeenCalledTimes(1); + }); - it("should hide and disable the scroll buttons if there is enough horizontal space", () => { - scrollWidthSpy.mockReturnValueOnce(0); + it("should hide and disable the scroll buttons if there is enough horizontal space", () => { + scrollWidthSpy.mockReturnValueOnce(0); - const { container } = render(Tabs, baseOptions); - const leftBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:first-of-type" - ); - const rightBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:last-of-type" - ); + const { container } = render(Tabs, baseOptions); + const leftBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:first-of-type", + ); + const rightBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:last-of-type", + ); - expect(leftBtn.getAttribute("hidden")).toBe("true"); - expect(leftBtn.getAttribute("disabled")).toBe(""); - expect(rightBtn.getAttribute("hidden")).toBe("true"); - expect(rightBtn.getAttribute("disabled")).toBe(""); - }); + expect(leftBtn.getAttribute("hidden")).toBe("true"); + expect(leftBtn.getAttribute("disabled")).toBe(""); + expect(rightBtn.getAttribute("hidden")).toBe("true"); + expect(rightBtn.getAttribute("disabled")).toBe(""); + }); - it("should show the scroll buttons when there isn't enough horizontal space and enable the appropriate ones", async () => { - const { container, rerender } = render(Tabs, baseOptions); - const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); + it("should show the scroll buttons when there isn't enough horizontal space and enable the appropriate ones", async () => { + const { container, rerender } = render(Tabs, baseOptions); + const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); - let leftBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:first-of-type" - ); - let rightBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:last-of-type" - ); + let leftBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:first-of-type", + ); + let rightBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:last-of-type", + ); - expect(leftBtn.getAttribute("hidden")).toBe("false"); - expect(leftBtn.getAttribute("disabled")).toBe(""); - expect(rightBtn.getAttribute("hidden")).toBe("false"); - expect(rightBtn.getAttribute("disabled")).toBeNull(); - - await fireEvent.mouseDown(rightBtn, { buttons: 1 }); - - expect(rafSpy).toHaveBeenCalledTimes(1); - expect(tabsList.scrollBy).toHaveBeenCalledTimes(1); - expect(tabsList.scrollBy).toHaveBeenCalledWith(5, 0); - - // @ts-ignore - tabsList.scrollBy.mockClear(); - rafSpy.mockClear(); - - vi.advanceTimersToNextTimer(); - - expect(rafSpy).toHaveBeenCalledTimes(1); - expect(tabsList.scrollBy).toHaveBeenCalledTimes(1); - expect(tabsList.scrollBy).toHaveBeenCalledWith(5, 0); + expect(leftBtn.getAttribute("hidden")).toBe("false"); + expect(leftBtn.getAttribute("disabled")).toBe(""); + expect(rightBtn.getAttribute("hidden")).toBe("false"); + expect(rightBtn.getAttribute("disabled")).toBeNull(); - await fireEvent.mouseUp(rightBtn); + await fireEvent.mouseDown(rightBtn, { buttons: 1 }); - expect(cafSpy).toHaveBeenCalledTimes(1); + expect(rafSpy).toHaveBeenCalledTimes(1); + expect(tabsList.scrollBy).toHaveBeenCalledTimes(1); + expect(tabsList.scrollBy).toHaveBeenCalledWith(5, 0); - scrollLeftSpy.mockReturnValue(320); + // @ts-ignore + tabsList.scrollBy.mockClear(); + rafSpy.mockClear(); - rerender(baseOptions.props); + vi.advanceTimersToNextTimer(); - leftBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:first-of-type" - ); - rightBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:last-of-type" - ); - - expect(leftBtn.getAttribute("hidden")).toBe("false"); - expect(leftBtn.getAttribute("disabled")).toBeNull(); - expect(rightBtn.getAttribute("hidden")).toBe("false"); - expect(rightBtn.getAttribute("disabled")).toBe(""); - - scrollBySpy.mockClear(); - rafSpy.mockClear(); - - await fireEvent.mouseDown(leftBtn, { buttons: 1 }); - - expect(rafSpy).toHaveBeenCalledTimes(1); - expect(tabsList.scrollBy).toHaveBeenCalledTimes(1); - expect(tabsList.scrollBy).toHaveBeenCalledWith(-5, 0); - }); - - it("should ignore mouse down events if the primary button isn't the only one pressed", async () => { - const { container } = render(Tabs, baseOptions); - const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); - const leftBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:first-of-type" - ); - const rightBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:last-of-type" - ); - - await fireEvent.mouseDown(leftBtn, { buttons: 2 }); - - await fireEvent.mouseDown(leftBtn, { buttons: 3 }); - - await fireEvent.mouseDown(rightBtn, { buttons: 2 }); - - await fireEvent.mouseDown(rightBtn, { buttons: 3 }); - - expect(rafSpy).not.toHaveBeenCalled(); - expect(tabsList.scrollBy).not.toHaveBeenCalled(); - }); - - it("should bring the nearest tab into view on mouse clicks on scroll buttons", async () => { - const { container } = render(Tabs, baseOptions); - const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); - const leftBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:first-of-type" - ); - const rightBtn = getAsHTMLElement( - container, - ".dusk-tab-scroll-button:last-of-type" - ); - const firstTab = getAsHTMLElement( - container, - "[role='tab']:first-of-type" - ); - const lastTab = getAsHTMLElement( - container, - "[role='tab']:last-of-type" - ); - - const tabsListGetRectSpy = vi - .spyOn(tabsList, "getBoundingClientRect") - .mockReturnValue( - DOMRect.fromRect({ x: 0, width: tabsList.clientWidth }) - ); - const firstTabGetRectSpy = vi - .spyOn(firstTab, "getBoundingClientRect") - .mockReturnValue(DOMRect.fromRect({ x: -100, width: 100 })); - const lastTabGetRectSpy = vi - .spyOn(lastTab, "getBoundingClientRect") - .mockReturnValue( - DOMRect.fromRect({ x: tabsList.clientWidth, width: 100 }) - ); - - scrollIntoViewSpy.mockClear(); - - await fireEvent.click(rightBtn); - - expect(lastTab.scrollIntoView).toHaveBeenCalledTimes(1); - - scrollIntoViewSpy.mockClear(); - - await fireEvent.click(leftBtn); - - expect(firstTab.scrollIntoView).toHaveBeenCalledTimes(1); - - tabsListGetRectSpy.mockRestore(); - firstTabGetRectSpy.mockRestore(); - lastTabGetRectSpy.mockRestore(); - }); - - it("should scroll the tabs on a wheel event if there is a deltaX", async () => { - const { container } = render(Tabs, baseOptions); - const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); - const eventInfo1 = { deltaX: 0 }; - const eventInfo2 = { deltaX: 100 }; - - await fireEvent.wheel(tabsList, eventInfo1); - await fireEvent.wheel(tabsList, eventInfo2); - - expect(scrollBySpy).toHaveBeenCalledTimes(2); - expect(scrollBySpy).toHaveBeenNthCalledWith(1, eventInfo1.deltaX, 0); - expect(scrollBySpy).toHaveBeenNthCalledWith(2, eventInfo2.deltaX, 0); - }); - - it("should scroll the tabs on a touch move", async () => { - const { container } = render(Tabs, baseOptions); - const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); - const touchStartInfo = { targetTouches: [{ clientX: 10 }] }; - const touchMoveInfo = { targetTouches: [{ clientX: 100 }] }; - - // "magic number" calculated with the current algorithm - const expectedScrollX = -54; - - await fireEvent.touchStart(tabsList, touchStartInfo); - await fireEvent.touchMove(tabsList, touchMoveInfo); - - expect(scrollBySpy).toHaveBeenCalledTimes(1); - expect(scrollBySpy).toHaveBeenCalledWith(expectedScrollX, 0); - }); + expect(rafSpy).toHaveBeenCalledTimes(1); + expect(tabsList.scrollBy).toHaveBeenCalledTimes(1); + expect(tabsList.scrollBy).toHaveBeenCalledWith(5, 0); + + await fireEvent.mouseUp(rightBtn); + + expect(cafSpy).toHaveBeenCalledTimes(1); + + scrollLeftSpy.mockReturnValue(320); + + rerender(baseOptions.props); + + leftBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:first-of-type", + ); + rightBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:last-of-type", + ); + + expect(leftBtn.getAttribute("hidden")).toBe("false"); + expect(leftBtn.getAttribute("disabled")).toBeNull(); + expect(rightBtn.getAttribute("hidden")).toBe("false"); + expect(rightBtn.getAttribute("disabled")).toBe(""); + + scrollBySpy.mockClear(); + rafSpy.mockClear(); + + await fireEvent.mouseDown(leftBtn, { buttons: 1 }); + + expect(rafSpy).toHaveBeenCalledTimes(1); + expect(tabsList.scrollBy).toHaveBeenCalledTimes(1); + expect(tabsList.scrollBy).toHaveBeenCalledWith(-5, 0); + }); + + it("should ignore mouse down events if the primary button isn't the only one pressed", async () => { + const { container } = render(Tabs, baseOptions); + const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); + const leftBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:first-of-type", + ); + const rightBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:last-of-type", + ); + + await fireEvent.mouseDown(leftBtn, { buttons: 2 }); + + await fireEvent.mouseDown(leftBtn, { buttons: 3 }); + + await fireEvent.mouseDown(rightBtn, { buttons: 2 }); + + await fireEvent.mouseDown(rightBtn, { buttons: 3 }); + + expect(rafSpy).not.toHaveBeenCalled(); + expect(tabsList.scrollBy).not.toHaveBeenCalled(); + }); + + it("should bring the nearest tab into view on mouse clicks on scroll buttons", async () => { + const { container } = render(Tabs, baseOptions); + const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); + const leftBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:first-of-type", + ); + const rightBtn = getAsHTMLElement( + container, + ".dusk-tab-scroll-button:last-of-type", + ); + const firstTab = getAsHTMLElement(container, "[role='tab']:first-of-type"); + const lastTab = getAsHTMLElement(container, "[role='tab']:last-of-type"); + + const tabsListGetRectSpy = vi + .spyOn(tabsList, "getBoundingClientRect") + .mockReturnValue(DOMRect.fromRect({ width: tabsList.clientWidth, x: 0 })); + const firstTabGetRectSpy = vi + .spyOn(firstTab, "getBoundingClientRect") + .mockReturnValue(DOMRect.fromRect({ width: 100, x: -100 })); + const lastTabGetRectSpy = vi + .spyOn(lastTab, "getBoundingClientRect") + .mockReturnValue( + DOMRect.fromRect({ width: 100, x: tabsList.clientWidth }), + ); + + scrollIntoViewSpy.mockClear(); + + await fireEvent.click(rightBtn); + + expect(lastTab.scrollIntoView).toHaveBeenCalledTimes(1); + + scrollIntoViewSpy.mockClear(); + + await fireEvent.click(leftBtn); + + expect(firstTab.scrollIntoView).toHaveBeenCalledTimes(1); + + tabsListGetRectSpy.mockRestore(); + firstTabGetRectSpy.mockRestore(); + lastTabGetRectSpy.mockRestore(); + }); + + it("should scroll the tabs on a wheel event if there is a deltaX", async () => { + const { container } = render(Tabs, baseOptions); + const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); + const eventInfo1 = { deltaX: 0 }; + const eventInfo2 = { deltaX: 100 }; + + await fireEvent.wheel(tabsList, eventInfo1); + await fireEvent.wheel(tabsList, eventInfo2); + + expect(scrollBySpy).toHaveBeenCalledTimes(2); + expect(scrollBySpy).toHaveBeenNthCalledWith(1, eventInfo1.deltaX, 0); + expect(scrollBySpy).toHaveBeenNthCalledWith(2, eventInfo2.deltaX, 0); + }); + + it("should scroll the tabs on a touch move", async () => { + const { container } = render(Tabs, baseOptions); + const tabsList = getAsHTMLElement(container, ".dusk-tabs-list"); + const touchStartInfo = { targetTouches: [{ clientX: 10 }] }; + const touchMoveInfo = { targetTouches: [{ clientX: 100 }] }; + + // "magic number" calculated with the current algorithm + const expectedScrollX = -54; + + await fireEvent.touchStart(tabsList, touchStartInfo); + await fireEvent.touchMove(tabsList, touchMoveInfo); + + expect(scrollBySpy).toHaveBeenCalledTimes(1); + expect(scrollBySpy).toHaveBeenCalledWith(expectedScrollX, 0); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Textbox.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Textbox.spec.js index ede754ee22..e45f2f0e6c 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Textbox.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Textbox.spec.js @@ -1,121 +1,117 @@ -import { - afterEach, - describe, - expect, - it, - vi -} from "vitest"; +import { afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, fireEvent, render } from "@testing-library/svelte"; import { Textbox } from ".."; describe("Textbox", () => { - const baseProps = {}; - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(cleanup); - - it("should render a Textbox of type \"text\" as a default", () => { - const { container } = render(Textbox, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should render a Textbox component of the desired type", () => { - [ - "email", - "hidden", - "multiline", - "number", - "password", - "search", - "tel", - "text", - "url" - ].forEach(type => { - const props = { - ...baseProps, - type - }; - const { container } = render(Textbox, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - - cleanup(); - }); - }); - - it("should pass additional class names and attributes to the rendered element", () => { - const props = { - ...baseProps, - className: "foo bar", - id: "some-id", - value: "some textbox text" - }; - const { container } = render(Textbox, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should change value before forwarding the `input` event", async () => { - const initialValue = "some textbox text"; - const newValue = "new value"; - const props = { - ...baseProps, - className: "foo bar", - id: "some-id", - value: initialValue - }; - - const changeHandler = vi.fn(); - - const { component, getByRole } = render(Textbox, { ...baseOptions, props }); - - const input = getByRole("textbox"); - - expect(input).toHaveValue(initialValue); - - component.$on("input", changeHandler); - - await fireEvent.input(input, { target: { value: newValue } }); - - expect(input).toHaveValue(newValue); - - expect(changeHandler).toHaveBeenCalledTimes(1); - expect(changeHandler).toHaveBeenCalledWith(expect.objectContaining({ - target: expect.objectContaining({ value: newValue }) - })); - }); - - it("should expose a method to give focus to the rendered element", () => { - const { component, getByRole } = render(Textbox, baseOptions); - const input = getByRole("textbox"); - - component.focus(); - - expect(input).toHaveFocus(); - }); - - it("should expose a method to select the element's text", () => { - const props = { - ...baseProps, - value: "some input text" - }; - const { component, getByRole } = render(Textbox, { ...baseOptions, props }); - - // eslint-disable-next-line no-extra-parens - const input = /** @type {HTMLInputElement} */ (getByRole("textbox")); - - component.select(); - - const selectedText = input.value.substring( - Number(input.selectionStart), - Number(input.selectionEnd) - ); - - expect(selectedText).toBe(props.value); - }); + const baseProps = {}; + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it('should render a Textbox of type "text" as a default', () => { + const { container } = render(Textbox, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should render a Textbox component of the desired type", () => { + [ + "email", + "hidden", + "multiline", + "number", + "password", + "search", + "tel", + "text", + "url", + ].forEach((type) => { + const props = { + ...baseProps, + type, + }; + const { container } = render(Textbox, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + + cleanup(); + }); + }); + + it("should pass additional class names and attributes to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + id: "some-id", + value: "some textbox text", + }; + const { container } = render(Textbox, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should change value before forwarding the `input` event", async () => { + const initialValue = "some textbox text"; + const newValue = "new value"; + const props = { + ...baseProps, + className: "foo bar", + id: "some-id", + value: initialValue, + }; + + const changeHandler = vi.fn(); + + const { component, getByRole } = render(Textbox, { ...baseOptions, props }); + + const input = getByRole("textbox"); + + expect(input).toHaveValue(initialValue); + + component.$on("input", changeHandler); + + await fireEvent.input(input, { target: { value: newValue } }); + + expect(input).toHaveValue(newValue); + + expect(changeHandler).toHaveBeenCalledTimes(1); + expect(changeHandler).toHaveBeenCalledWith( + expect.objectContaining({ + target: expect.objectContaining({ value: newValue }), + }), + ); + }); + + it("should expose a method to give focus to the rendered element", () => { + const { component, getByRole } = render(Textbox, baseOptions); + const input = getByRole("textbox"); + + component.focus(); + + expect(input).toHaveFocus(); + }); + + it("should expose a method to select the element's text", () => { + const props = { + ...baseProps, + value: "some input text", + }; + const { component, getByRole } = render(Textbox, { ...baseOptions, props }); + + // eslint-disable-next-line no-extra-parens + const input = /** @type {HTMLInputElement} */ (getByRole("textbox")); + + component.select(); + + const selectedText = input.value.substring( + Number(input.selectionStart), + Number(input.selectionEnd), + ); + + expect(selectedText).toBe(props.value); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Throbber.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Throbber.spec.js index 01a7383a28..5270afb113 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Throbber.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Throbber.spec.js @@ -1,46 +1,41 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; +import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { Throbber } from ".."; describe("Throbber", () => { - const baseProps = {}; - const baseOptions = { - props: baseProps, - target: document.body - }; - - afterEach(cleanup); - - it("should render the Throbber component", () => { - const { container } = render(Throbber, baseOptions); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should pass additional class names to the rendered element", () => { - const props = { - ...baseProps, - className: "foo bar" - }; - const { container } = render(Throbber, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); - - it("should accept a custom duration and size", () => { - const props = { - ...baseProps, - duration: 500, - size: 16 - }; - const { container } = render(Throbber, { ...baseOptions, props }); - - expect(container.firstChild).toMatchSnapshot(); - }); + const baseProps = {}; + const baseOptions = { + props: baseProps, + target: document.body, + }; + + afterEach(cleanup); + + it("should render the Throbber component", () => { + const { container } = render(Throbber, baseOptions); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should pass additional class names to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + }; + const { container } = render(Throbber, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); + + it("should accept a custom duration and size", () => { + const props = { + ...baseProps, + duration: 500, + size: 16, + }; + const { container } = render(Throbber, { ...baseOptions, props }); + + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Toast.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Toast.spec.js index 516987c8f2..ff771acdaf 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Toast.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Toast.spec.js @@ -1,11 +1,4 @@ -import { - afterAll, - afterEach, - describe, - expect, - it, - vi -} from "vitest"; +import { afterAll, afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, render } from "@testing-library/svelte"; import { get } from "svelte/store"; import { fly } from "svelte/transition"; @@ -17,156 +10,168 @@ import { toast, toastList } from "../Toast/store"; vi.mock("svelte/transition"); describe("Toast", () => { - const baseProps = { - flyDuration: 500, - timer: 2000 - }; - - /** @param {HTMLElement} list */ - const getToastItems = list => list.querySelectorAll(".dusk-toast__item"); - - vi.useFakeTimers(); - - afterEach(() => { - vi.mocked(fly).mockClear(); - cleanup(); - }); - - afterAll(() => { - vi.doUnmock("svelte/transition"); - }); - - it("should render and dismiss the Toast component with the correct properties", async () => { - const { getByRole } = render(Toast, baseProps); - const list = getByRole("list"); - - expect(get(toastList).length).toBe(0); - expect(getToastItems(list).length).toBe(0); - expect(fly).not.toHaveBeenCalled(); - - toast("success", "Render Toast 1", mdiAlertOutline); - - await vi.advanceTimersToNextTimerAsync(); - - const items = getToastItems(list); - const toastStoredList = get(toastList); - - expect(toastStoredList.length).toBe(1); - expect(toastStoredList[0]).toStrictEqual({ - icon: mdiAlertOutline, - id: expect.any(String), - message: "Render Toast 1", - type: "success" - }); - expect(items.length).toBe(1); - expect(items[0]).toHaveTextContent("Render Toast 1"); - expect(items[0].querySelector(".dusk-toast__item-icon-wrapper--success")).toBeDefined(); - expect(items[0].querySelector(`path[d="${mdiAlertOutline}"]`)).toBeDefined(); - expect(fly).toHaveBeenCalledTimes(1); - expect(fly).toHaveBeenCalledWith( - items[0], - expect.objectContaining({ duration: baseProps.flyDuration }), - { direction: "in" } - ); - expect(list).toMatchSnapshot(); - - await vi.advanceTimersByTimeAsync(baseProps.timer); - - expect(get(toastList).length).toBe(0); - expect(fly).toHaveBeenCalledTimes(2); - expect(fly).toHaveBeenNthCalledWith( - 2, - items[0], - expect.objectContaining({ duration: baseProps.flyDuration }), - { direction: "out" } - ); - }); - - it("should render the Toast component with the correct custom class and rest props", async () => { - const customProps = { - "flyDuration": 500, - "timer": 2000, - "className": "test-toast", - "id": "toast-container", - "data-baz": "baz" - }; - - const { getByRole } = render(Toast, customProps); - const list = getByRole("list"); - - expect(list).toHaveClass(`${customProps.className}`); - expect(list).toHaveAttribute("id", customProps.id); - expect(list).toHaveAttribute("data-baz", customProps["data-baz"]); - - expect(list).toMatchSnapshot(); - }); - - it("should render and dismiss 2 Toasts", async () => { - const { getByRole } = render(Toast, baseProps); - const list = getByRole("list"); - - expect(get(toastList).length).toBe(0); - expect(getToastItems(list).length).toBe(0); - expect(fly).not.toHaveBeenCalled(); - - toast("success", "Render Toast 1", mdiAlertOutline); - toast("info", "Render Toast 2", mdiAlertOutline); - - await vi.advanceTimersToNextTimerAsync(); - - const items = getToastItems(list); - const toastStoredList = get(toastList); - - expect(toastStoredList.length).toBe(2); - expect(toastStoredList[0]).toStrictEqual({ - icon: mdiAlertOutline, - id: expect.any(String), - message: "Render Toast 1", - type: "success" - }); - expect(toastStoredList[1]).toStrictEqual({ - icon: mdiAlertOutline, - id: expect.any(String), - message: "Render Toast 2", - type: "info" - }); - expect(items.length).toBe(2); - expect(items[0]).toHaveTextContent("Render Toast 1"); - expect(items[0].querySelector(".dusk-toast__item-icon-wrapper--success")).toBeDefined(); - expect(items[0].querySelector(`path[d="${mdiAlertOutline}"]`)).toBeDefined(); - - expect(items[1]).toHaveTextContent("Render Toast 2"); - expect(items[1].querySelector(".dusk-toast__item-icon-wrapper--info")).toBeDefined(); - expect(items[1].querySelector(`path[d="${mdiAlertOutline}"]`)).toBeDefined(); - - expect(fly).toHaveBeenCalledTimes(2); - expect(fly).toHaveBeenCalledWith( - items[0], - expect.objectContaining({ duration: baseProps.flyDuration }), - { direction: "in" } - ); - expect(fly).toHaveBeenCalledWith( - items[1], - expect.objectContaining({ duration: baseProps.flyDuration }), - { direction: "in" } - ); - expect(list).toMatchSnapshot(); - - await vi.advanceTimersByTimeAsync(baseProps.timer); - - expect(get(toastList).length).toBe(0); - expect(fly).toHaveBeenCalledTimes(4); - expect(fly).toHaveBeenNthCalledWith( - 3, - items[0], - expect.objectContaining({ duration: baseProps.flyDuration }), - { direction: "out" } - ); - expect(fly).toHaveBeenNthCalledWith( - 4, - items[1], - expect.objectContaining({ duration: baseProps.flyDuration }), - { direction: "out" } - ); - }); + const baseProps = { + flyDuration: 500, + timer: 2000, + }; + + /** @param {HTMLElement} list */ + const getToastItems = (list) => list.querySelectorAll(".dusk-toast__item"); + + vi.useFakeTimers(); + + afterEach(() => { + vi.mocked(fly).mockClear(); + cleanup(); + }); + + afterAll(() => { + vi.doUnmock("svelte/transition"); + }); + + it("should render and dismiss the Toast component with the correct properties", async () => { + const { getByRole } = render(Toast, baseProps); + const list = getByRole("list"); + + expect(get(toastList).length).toBe(0); + expect(getToastItems(list).length).toBe(0); + expect(fly).not.toHaveBeenCalled(); + + toast("success", "Render Toast 1", mdiAlertOutline); + + await vi.advanceTimersToNextTimerAsync(); + + const items = getToastItems(list); + const toastStoredList = get(toastList); + + expect(toastStoredList.length).toBe(1); + expect(toastStoredList[0]).toStrictEqual({ + icon: mdiAlertOutline, + id: expect.any(String), + message: "Render Toast 1", + type: "success", + }); + expect(items.length).toBe(1); + expect(items[0]).toHaveTextContent("Render Toast 1"); + expect( + items[0].querySelector(".dusk-toast__item-icon-wrapper--success"), + ).toBeDefined(); + expect( + items[0].querySelector(`path[d="${mdiAlertOutline}"]`), + ).toBeDefined(); + expect(fly).toHaveBeenCalledTimes(1); + expect(fly).toHaveBeenCalledWith( + items[0], + expect.objectContaining({ duration: baseProps.flyDuration }), + { direction: "in" }, + ); + expect(list).toMatchSnapshot(); + + await vi.advanceTimersByTimeAsync(baseProps.timer); + + expect(get(toastList).length).toBe(0); + expect(fly).toHaveBeenCalledTimes(2); + expect(fly).toHaveBeenNthCalledWith( + 2, + items[0], + expect.objectContaining({ duration: baseProps.flyDuration }), + { direction: "out" }, + ); + }); + + it("should render the Toast component with the correct custom class and rest props", async () => { + const customProps = { + className: "test-toast", + "data-baz": "baz", + flyDuration: 500, + id: "toast-container", + timer: 2000, + }; + + const { getByRole } = render(Toast, customProps); + const list = getByRole("list"); + + expect(list).toHaveClass(`${customProps.className}`); + expect(list).toHaveAttribute("id", customProps.id); + expect(list).toHaveAttribute("data-baz", customProps["data-baz"]); + + expect(list).toMatchSnapshot(); + }); + + it("should render and dismiss 2 Toasts", async () => { + const { getByRole } = render(Toast, baseProps); + const list = getByRole("list"); + + expect(get(toastList).length).toBe(0); + expect(getToastItems(list).length).toBe(0); + expect(fly).not.toHaveBeenCalled(); + + toast("success", "Render Toast 1", mdiAlertOutline); + toast("info", "Render Toast 2", mdiAlertOutline); + + await vi.advanceTimersToNextTimerAsync(); + + const items = getToastItems(list); + const toastStoredList = get(toastList); + + expect(toastStoredList.length).toBe(2); + expect(toastStoredList[0]).toStrictEqual({ + icon: mdiAlertOutline, + id: expect.any(String), + message: "Render Toast 1", + type: "success", + }); + expect(toastStoredList[1]).toStrictEqual({ + icon: mdiAlertOutline, + id: expect.any(String), + message: "Render Toast 2", + type: "info", + }); + expect(items.length).toBe(2); + expect(items[0]).toHaveTextContent("Render Toast 1"); + expect( + items[0].querySelector(".dusk-toast__item-icon-wrapper--success"), + ).toBeDefined(); + expect( + items[0].querySelector(`path[d="${mdiAlertOutline}"]`), + ).toBeDefined(); + + expect(items[1]).toHaveTextContent("Render Toast 2"); + expect( + items[1].querySelector(".dusk-toast__item-icon-wrapper--info"), + ).toBeDefined(); + expect( + items[1].querySelector(`path[d="${mdiAlertOutline}"]`), + ).toBeDefined(); + + expect(fly).toHaveBeenCalledTimes(2); + expect(fly).toHaveBeenCalledWith( + items[0], + expect.objectContaining({ duration: baseProps.flyDuration }), + { direction: "in" }, + ); + expect(fly).toHaveBeenCalledWith( + items[1], + expect.objectContaining({ duration: baseProps.flyDuration }), + { direction: "in" }, + ); + expect(list).toMatchSnapshot(); + + await vi.advanceTimersByTimeAsync(baseProps.timer); + + expect(get(toastList).length).toBe(0); + expect(fly).toHaveBeenCalledTimes(4); + expect(fly).toHaveBeenNthCalledWith( + 3, + items[0], + expect.objectContaining({ duration: baseProps.flyDuration }), + { direction: "out" }, + ); + expect(fly).toHaveBeenNthCalledWith( + 4, + items[1], + expect.objectContaining({ duration: baseProps.flyDuration }), + { direction: "out" }, + ); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Tooltip.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Tooltip.spec.js index 712ce44d3a..419312a836 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Tooltip.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Tooltip.spec.js @@ -1,11 +1,11 @@ import { - afterAll, - afterEach, - beforeEach, - describe, - expect, - it, - vi + afterAll, + afterEach, + beforeEach, + describe, + expect, + it, + vi, } from "vitest"; import { computePosition, offset as setOffset } from "@floating-ui/dom"; import { cleanup, fireEvent, render } from "@testing-library/svelte"; @@ -17,586 +17,666 @@ vi.mock("@floating-ui/dom"); vi.useFakeTimers(); /** @param {Record} dataset */ -function createEventTarget (dataset) { - const target = document.createElement("div"); +function createEventTarget(dataset) { + const target = document.createElement("div"); - Object.keys(dataset).forEach(key => { - target.dataset[key] = dataset[key]; - }); + Object.keys(dataset).forEach((key) => { + target.dataset[key] = dataset[key]; + }); - return document.body.appendChild(target); + return document.body.appendChild(target); } describe("Tooltip", () => { - /** @type {import("svelte").ComponentProps} */ - const baseProps = { - defaultDelayHide: 300, - defaultDelayShow: 500, - defaultOffset: 12, - defaultPlace: "bottom", - defaultType: "success", - id: "tooltip-id" - }; - const baseOptions = { - props: baseProps, - target: document.body - }; - - /** @type {import("@floating-ui/dom").ComputePositionReturn} */ - const defaultComputedPosition = { - middlewareData: {}, - placement: "left", - strategy: "fixed", - x: 999, - y: 888 - }; - - const clearTimeoutSpy = vi.spyOn(window, "clearTimeout"); - const disconnectSpy = vi.spyOn(IntersectionObserver.prototype, "disconnect"); - const observeSpy = vi.spyOn(IntersectionObserver.prototype, "observe"); - const unobserveSpy = vi.spyOn(IntersectionObserver.prototype, "unobserve"); - - vi.mocked(computePosition).mockResolvedValue(defaultComputedPosition); - - afterEach(() => { - cleanup(); - vi.mocked(computePosition).mockClear(); - vi.mocked(setOffset).mockClear(); - vi.mocked(IntersectionObserver).mockClear(); - clearTimeoutSpy.mockClear(); - disconnectSpy.mockClear(); - observeSpy.mockClear(); - unobserveSpy.mockClear(); - }); - - afterAll(() => { - vi.doUnmock("@floating-ui/dom"); - clearTimeoutSpy.mockRestore(); - disconnectSpy.mockRestore(); - observeSpy.mockRestore(); - unobserveSpy.mockRestore(); - }); - - it("should render the Tooltip component", () => { - const { getByRole } = render(Tooltip, baseOptions); - - expect(getByRole("tooltip", { hidden: true })).toMatchSnapshot(); - }); - - it("should disconnect the Intersection Observer when unmounting", () => { - const { unmount } = render(Tooltip, baseOptions); - - unmount(); - - expect(disconnectSpy).toHaveBeenCalledTimes(1); - }); - - it("should pass additional class names and attributes to the rendered element", () => { - const props = { - ...baseProps, - "className": "foo bar", - "data-baz": "baz" - }; - const { getByRole } = render(Tooltip, { ...baseOptions, props }); - const tooltip = getByRole("tooltip", { hidden: true }); - - expect(tooltip).toHaveClass("foo bar"); - expect(tooltip).toHaveAttribute("data-baz", "baz"); - expect(tooltip).toMatchSnapshot(); - }); - - it("shouldn't allow overwriting the `left` and `top` style rules", () => { - const expectedStyle = "color: red; left: 0px; top: 0px;"; - const props = { - ...baseProps, - className: "foo bar", - style: "color: red; left: 99px; top: 99px" - }; - const { getByRole } = render(Tooltip, { ...baseOptions, props }); - - expect(getByRole("tooltip", { hidden: true }).getAttribute("style")).toBe(expectedStyle); - }); - - it("should add event listeners to the document body when mounting and remove them when unmounting", () => { - const addListenerSpy = vi.spyOn(document.body, "addEventListener"); - const removeListenerSpy = vi.spyOn(document.body, "removeEventListener"); - const { unmount } = render(Tooltip, baseOptions); - const handlers = addListenerSpy.mock.calls.map(call => call[1]); - - expect(addListenerSpy).toHaveBeenCalledTimes(5); - expect(addListenerSpy).toHaveBeenNthCalledWith(1, "focusin", expect.any(Function), true); - expect(addListenerSpy).toHaveBeenNthCalledWith(2, "focusout", expect.any(Function), true); - expect(addListenerSpy).toHaveBeenNthCalledWith(3, "keydown", expect.any(Function), true); - expect(addListenerSpy).toHaveBeenNthCalledWith(4, "mouseenter", expect.any(Function), true); - expect(addListenerSpy).toHaveBeenNthCalledWith(5, "mouseleave", expect.any(Function), true); - - unmount(); - - expect(removeListenerSpy).toHaveBeenCalledTimes(5); - - expect(removeListenerSpy).toHaveBeenNthCalledWith(1, "focusin", handlers[0], true); - expect(removeListenerSpy).toHaveBeenNthCalledWith(2, "focusout", handlers[1], true); - expect(removeListenerSpy).toHaveBeenNthCalledWith(3, "keydown", handlers[2], true); - expect(removeListenerSpy).toHaveBeenNthCalledWith(4, "mouseenter", handlers[3], true); - expect(removeListenerSpy).toHaveBeenNthCalledWith(5, "mouseleave", handlers[4], true); - - addListenerSpy.mockRestore(); - removeListenerSpy.mockRestore(); - }); - - describe("Tooltip show and hide events", () => { - /** @type {HTMLElement} */ - let badTarget; - - /** @type {HTMLElement} */ - let target; - - const prevTooltipElement = document.body.appendChild(document.createElement("span")); - const dataset = { tooltipId: "tooltip-id", tooltipText: "some text" }; - - beforeEach(() => { - badTarget = createEventTarget({ tooltipId: "fake-tooltip-id" }); - prevTooltipElement.setAttribute("aria-described-by", baseProps.id); - target = createEventTarget(dataset); - }); - - describe("Tooltip show events", () => { - it("should ignore mouse enter and focus-in events if the target element doesn't refer to the tooltip", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - - await fireEvent.focusIn(document.body, { target: badTarget }); - await vi.advanceTimersToNextTimerAsync(); - - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(badTarget.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); - - await fireEvent.mouseEnter(badTarget); - await vi.advanceTimersToNextTimerAsync(); - - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(badTarget.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); - expect(clearTimeoutSpy).not.toHaveBeenCalled(); - expect(computePosition).not.toHaveBeenCalled(); - }); - - it("should ignore mouse enter and focus-in events if the target element has the `data-tooltip-disabled` attribute set to `\"true\"`", async () => { - const disabledTarget = createEventTarget({ - ...dataset, - tooltipDisabled: "true" - }); - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - - await fireEvent.focusIn(document.body, { target: disabledTarget }); - await vi.advanceTimersToNextTimerAsync(); - - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(disabledTarget.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); - - await fireEvent.mouseEnter(disabledTarget); - await vi.advanceTimersToNextTimerAsync(); - - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(disabledTarget.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); - expect(clearTimeoutSpy).not.toHaveBeenCalled(); - expect(computePosition).not.toHaveBeenCalled(); - }); - - it("should show the tooltip on a focus-in event if the target element refers to it and start observing target's intersection", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - - await fireEvent.focusIn(target); - - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(observeSpy).toHaveBeenCalledTimes(1); - expect(observeSpy).toHaveBeenCalledWith(target); - expect(computePosition).toHaveBeenCalledTimes(1); - expect(computePosition).toHaveBeenCalledWith( - target, - tooltip, - expect.objectContaining({ placement: baseProps.defaultPlace }) - ); - expect(setOffset).toHaveBeenCalledTimes(1); - expect(setOffset).toHaveBeenCalledWith({ mainAxis: baseProps.defaultOffset }); - - expect(tooltip).toHaveTextContent(dataset.tooltipText); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); - - await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); - - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); - }); - - it("should show the tooltip on a mouse enter event if the target element refers to it and start observing target mutations", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - - await fireEvent.mouseEnter(target); - - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(observeSpy).toHaveBeenCalledTimes(1); - expect(observeSpy).toHaveBeenCalledWith(target); - expect(computePosition).toHaveBeenCalledTimes(1); - expect(computePosition).toHaveBeenCalledWith( - target, - tooltip, - expect.objectContaining({ placement: baseProps.defaultPlace }) - ); - expect(setOffset).toHaveBeenCalledTimes(1); - expect(setOffset).toHaveBeenCalledWith({ mainAxis: baseProps.defaultOffset }); - - expect(tooltip).toHaveTextContent(dataset.tooltipText); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); - - await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); - - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); - }); - - it("should use attributes defined on the target element, if they are present, rather than the defaults", async () => { - target.setAttribute("data-tooltip-delay-show", "700"); - target.setAttribute("data-tooltip-offset", "0"); - target.setAttribute("data-tooltip-place", "top"); - target.setAttribute("data-tooltip-type", "error"); - - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - - await fireEvent.mouseEnter(target); - - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(computePosition).toHaveBeenCalledTimes(1); - expect(computePosition).toHaveBeenCalledWith( - target, - tooltip, - expect.objectContaining({ placement: "top" }) - ); - expect(setOffset).toHaveBeenCalledTimes(1); - expect(setOffset).toHaveBeenCalledWith({ mainAxis: 0 }); + /** @type {import("svelte").ComponentProps} */ + const baseProps = { + defaultDelayHide: 300, + defaultDelayShow: 500, + defaultOffset: 12, + defaultPlace: "bottom", + defaultType: "success", + id: "tooltip-id", + }; + const baseOptions = { + props: baseProps, + target: document.body, + }; + + /** @type {import("@floating-ui/dom").ComputePositionReturn} */ + const defaultComputedPosition = { + middlewareData: {}, + placement: "left", + strategy: "fixed", + x: 999, + y: 888, + }; + + const clearTimeoutSpy = vi.spyOn(window, "clearTimeout"); + const disconnectSpy = vi.spyOn(IntersectionObserver.prototype, "disconnect"); + const observeSpy = vi.spyOn(IntersectionObserver.prototype, "observe"); + const unobserveSpy = vi.spyOn(IntersectionObserver.prototype, "unobserve"); + + vi.mocked(computePosition).mockResolvedValue(defaultComputedPosition); + + afterEach(() => { + cleanup(); + vi.mocked(computePosition).mockClear(); + vi.mocked(setOffset).mockClear(); + vi.mocked(IntersectionObserver).mockClear(); + clearTimeoutSpy.mockClear(); + disconnectSpy.mockClear(); + observeSpy.mockClear(); + unobserveSpy.mockClear(); + }); + + afterAll(() => { + vi.doUnmock("@floating-ui/dom"); + clearTimeoutSpy.mockRestore(); + disconnectSpy.mockRestore(); + observeSpy.mockRestore(); + unobserveSpy.mockRestore(); + }); + + it("should render the Tooltip component", () => { + const { getByRole } = render(Tooltip, baseOptions); + + expect(getByRole("tooltip", { hidden: true })).toMatchSnapshot(); + }); + + it("should disconnect the Intersection Observer when unmounting", () => { + const { unmount } = render(Tooltip, baseOptions); + + unmount(); + + expect(disconnectSpy).toHaveBeenCalledTimes(1); + }); + + it("should pass additional class names and attributes to the rendered element", () => { + const props = { + ...baseProps, + className: "foo bar", + "data-baz": "baz", + }; + const { getByRole } = render(Tooltip, { ...baseOptions, props }); + const tooltip = getByRole("tooltip", { hidden: true }); + + expect(tooltip).toHaveClass("foo bar"); + expect(tooltip).toHaveAttribute("data-baz", "baz"); + expect(tooltip).toMatchSnapshot(); + }); + + it("shouldn't allow overwriting the `left` and `top` style rules", () => { + const expectedStyle = "color: red; left: 0px; top: 0px;"; + const props = { + ...baseProps, + className: "foo bar", + style: "color: red; left: 99px; top: 99px", + }; + const { getByRole } = render(Tooltip, { ...baseOptions, props }); + + expect(getByRole("tooltip", { hidden: true }).getAttribute("style")).toBe( + expectedStyle, + ); + }); + + it("should add event listeners to the document body when mounting and remove them when unmounting", () => { + const addListenerSpy = vi.spyOn(document.body, "addEventListener"); + const removeListenerSpy = vi.spyOn(document.body, "removeEventListener"); + const { unmount } = render(Tooltip, baseOptions); + const handlers = addListenerSpy.mock.calls.map((call) => call[1]); + + expect(addListenerSpy).toHaveBeenCalledTimes(5); + expect(addListenerSpy).toHaveBeenNthCalledWith( + 1, + "focusin", + expect.any(Function), + true, + ); + expect(addListenerSpy).toHaveBeenNthCalledWith( + 2, + "focusout", + expect.any(Function), + true, + ); + expect(addListenerSpy).toHaveBeenNthCalledWith( + 3, + "keydown", + expect.any(Function), + true, + ); + expect(addListenerSpy).toHaveBeenNthCalledWith( + 4, + "mouseenter", + expect.any(Function), + true, + ); + expect(addListenerSpy).toHaveBeenNthCalledWith( + 5, + "mouseleave", + expect.any(Function), + true, + ); + + unmount(); + + expect(removeListenerSpy).toHaveBeenCalledTimes(5); + + expect(removeListenerSpy).toHaveBeenNthCalledWith( + 1, + "focusin", + handlers[0], + true, + ); + expect(removeListenerSpy).toHaveBeenNthCalledWith( + 2, + "focusout", + handlers[1], + true, + ); + expect(removeListenerSpy).toHaveBeenNthCalledWith( + 3, + "keydown", + handlers[2], + true, + ); + expect(removeListenerSpy).toHaveBeenNthCalledWith( + 4, + "mouseenter", + handlers[3], + true, + ); + expect(removeListenerSpy).toHaveBeenNthCalledWith( + 5, + "mouseleave", + handlers[4], + true, + ); + + addListenerSpy.mockRestore(); + removeListenerSpy.mockRestore(); + }); + + describe("Tooltip show and hide events", () => { + /** @type {HTMLElement} */ + let badTarget; + + /** @type {HTMLElement} */ + let target; + + const prevTooltipElement = document.body.appendChild( + document.createElement("span"), + ); + const dataset = { tooltipId: "tooltip-id", tooltipText: "some text" }; + + beforeEach(() => { + badTarget = createEventTarget({ tooltipId: "fake-tooltip-id" }); + prevTooltipElement.setAttribute("aria-described-by", baseProps.id); + target = createEventTarget(dataset); + }); + + describe("Tooltip show events", () => { + it("should ignore mouse enter and focus-in events if the target element doesn't refer to the tooltip", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + + await fireEvent.focusIn(document.body, { target: badTarget }); + await vi.advanceTimersToNextTimerAsync(); + + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(badTarget.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + + await fireEvent.mouseEnter(badTarget); + await vi.advanceTimersToNextTimerAsync(); + + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(badTarget.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + expect(clearTimeoutSpy).not.toHaveBeenCalled(); + expect(computePosition).not.toHaveBeenCalled(); + }); + + it('should ignore mouse enter and focus-in events if the target element has the `data-tooltip-disabled` attribute set to `"true"`', async () => { + const disabledTarget = createEventTarget({ + ...dataset, + tooltipDisabled: "true", + }); + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + + await fireEvent.focusIn(document.body, { target: disabledTarget }); + await vi.advanceTimersToNextTimerAsync(); + + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(disabledTarget.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + + await fireEvent.mouseEnter(disabledTarget); + await vi.advanceTimersToNextTimerAsync(); + + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(disabledTarget.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + expect(clearTimeoutSpy).not.toHaveBeenCalled(); + expect(computePosition).not.toHaveBeenCalled(); + }); + + it("should show the tooltip on a focus-in event if the target element refers to it and start observing target's intersection", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + + await fireEvent.focusIn(target); + + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(observeSpy).toHaveBeenCalledTimes(1); + expect(observeSpy).toHaveBeenCalledWith(target); + expect(computePosition).toHaveBeenCalledTimes(1); + expect(computePosition).toHaveBeenCalledWith( + target, + tooltip, + expect.objectContaining({ placement: baseProps.defaultPlace }), + ); + expect(setOffset).toHaveBeenCalledTimes(1); + expect(setOffset).toHaveBeenCalledWith({ + mainAxis: baseProps.defaultOffset, + }); + + expect(tooltip).toHaveTextContent(dataset.tooltipText); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + + await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); + + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); + }); + + it("should show the tooltip on a mouse enter event if the target element refers to it and start observing target mutations", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + + await fireEvent.mouseEnter(target); + + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(observeSpy).toHaveBeenCalledTimes(1); + expect(observeSpy).toHaveBeenCalledWith(target); + expect(computePosition).toHaveBeenCalledTimes(1); + expect(computePosition).toHaveBeenCalledWith( + target, + tooltip, + expect.objectContaining({ placement: baseProps.defaultPlace }), + ); + expect(setOffset).toHaveBeenCalledTimes(1); + expect(setOffset).toHaveBeenCalledWith({ + mainAxis: baseProps.defaultOffset, + }); + + expect(tooltip).toHaveTextContent(dataset.tooltipText); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + + await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); + + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); + }); + + it("should use attributes defined on the target element, if they are present, rather than the defaults", async () => { + target.setAttribute("data-tooltip-delay-show", "700"); + target.setAttribute("data-tooltip-offset", "0"); + target.setAttribute("data-tooltip-place", "top"); + target.setAttribute("data-tooltip-type", "error"); + + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + + await fireEvent.mouseEnter(target); + + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(computePosition).toHaveBeenCalledTimes(1); + expect(computePosition).toHaveBeenCalledWith( + target, + tooltip, + expect.objectContaining({ placement: "top" }), + ); + expect(setOffset).toHaveBeenCalledTimes(1); + expect(setOffset).toHaveBeenCalledWith({ mainAxis: 0 }); + + expect(tooltip).toHaveTextContent(dataset.tooltipText); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + + await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); + + expect(tooltip).toHaveTextContent(dataset.tooltipText); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBe( + baseProps.id, + ); + + await vi.advanceTimersByTimeAsync( + 700 - Number(baseProps.defaultDelayShow), + ); + + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(tooltip).toHaveClass("dusk-tooltip-error"); + expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); + }); - expect(tooltip).toHaveTextContent(dataset.tooltipText); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); + it("should not wait for a delay before showing if the value is zero", async () => { + target.setAttribute("data-tooltip-delay-show", "0"); - await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - expect(tooltip).toHaveTextContent(dataset.tooltipText); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBe(baseProps.id); + await fireEvent.mouseEnter(target); + await tick(); - await vi.advanceTimersByTimeAsync(700 - Number(baseProps.defaultDelayShow)); + expect(tooltip).toHaveTextContent(dataset.tooltipText); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); + expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); + }); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(tooltip).toHaveClass("dusk-tooltip-error"); - expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); - }); + it("should not show the tooltip after the delay if the target element doesn't exist anymore", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - it("should not wait for a delay before showing if the value is zero", async () => { - target.setAttribute("data-tooltip-delay-show", "0"); + await fireEvent.mouseEnter(target); - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(observeSpy).toHaveBeenCalledTimes(1); + expect(computePosition).toHaveBeenCalledTimes(1); + expect(setOffset).toHaveBeenCalledTimes(1); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - await fireEvent.mouseEnter(target); - await tick(); + target.remove(); - expect(tooltip).toHaveTextContent(dataset.tooltipText); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(target.getAttribute("aria-described-by")).toBe(baseProps.id); - expect(prevTooltipElement.getAttribute("aria-described-by")).toBeNull(); - }); + await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); - it("should not show the tooltip after the delay if the target element doesn't exist anymore", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + }); + }); - await fireEvent.mouseEnter(target); + describe("Tooltip hide events", () => { + it("should ignore mouse leave and focus-out events if the target element doesn't refer to the tooltip", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(observeSpy).toHaveBeenCalledTimes(1); - expect(computePosition).toHaveBeenCalledTimes(1); - expect(setOffset).toHaveBeenCalledTimes(1); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + await fireEvent.mouseEnter(document.body, { target }); + await vi.advanceTimersToNextTimerAsync(); - target.remove(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayShow)); + await fireEvent.focusOut(document.body, { target: badTarget }); + await vi.advanceTimersToNextTimerAsync(); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - }); - }); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - describe("Tooltip hide events", () => { - it("should ignore mouse leave and focus-out events if the target element doesn't refer to the tooltip", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + await fireEvent.mouseLeave(document.body, { target: badTarget }); + await vi.advanceTimersToNextTimerAsync(); - await fireEvent.mouseEnter(document.body, { target }); - await vi.advanceTimersToNextTimerAsync(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(unobserveSpy).not.toHaveBeenCalled(); + }); - await fireEvent.focusOut(document.body, { target: badTarget }); - await vi.advanceTimersToNextTimerAsync(); + it("should hide the tooltip on a focus-out event if the target element refers to it", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - await fireEvent.mouseLeave(document.body, { target: badTarget }); - await vi.advanceTimersToNextTimerAsync(); + clearTimeoutSpy.mockClear(); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(unobserveSpy).not.toHaveBeenCalled(); - }); + await fireEvent.focusOut(target); - it("should hide the tooltip on a focus-out event if the target element refers to it", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledWith(target); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayHide)); - clearTimeoutSpy.mockClear(); + expect(tooltip).toHaveTextContent(""); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + }); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + it("should hide the tooltip on a mouse leave event if the target element refers to it", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - await fireEvent.focusOut(target); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledWith(target); + clearTimeoutSpy.mockClear(); - await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayHide)); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(tooltip).toHaveTextContent(""); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - }); + await fireEvent.mouseLeave(target); - it("should hide the tooltip on a mouse leave event if the target element refers to it", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledWith(target); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayHide)); - clearTimeoutSpy.mockClear(); + expect(tooltip).toHaveTextContent(""); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + }); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + it("should use the hide delay on the target element, if present, rather than the default", async () => { + target.setAttribute("data-tooltip-delay-hide", "700"); - await fireEvent.mouseLeave(target); + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledWith(target); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayHide)); + clearTimeoutSpy.mockClear(); - expect(tooltip).toHaveTextContent(""); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - }); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - it("should use the hide delay on the target element, if present, rather than the default", async () => { - target.setAttribute("data-tooltip-delay-hide", "700"); + await fireEvent.mouseLeave(target); - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledWith(target); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayHide)); - clearTimeoutSpy.mockClear(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + await vi.advanceTimersByTimeAsync( + 700 - Number(baseProps.defaultDelayHide), + ); - await fireEvent.mouseLeave(target); + expect(tooltip).toHaveTextContent(""); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + }); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledWith(target); + it("should not wait for a delay before hiding if the value is zero", async () => { + target.setAttribute("data-tooltip-delay-hide", "0"); - await vi.advanceTimersByTimeAsync(Number(baseProps.defaultDelayHide)); + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - await vi.advanceTimersByTimeAsync(700 - Number(baseProps.defaultDelayHide)); + clearTimeoutSpy.mockClear(); - expect(tooltip).toHaveTextContent(""); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - }); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - it("should not wait for a delay before hiding if the value is zero", async () => { - target.setAttribute("data-tooltip-delay-hide", "0"); + await fireEvent.mouseLeave(target); + await tick(); - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledWith(target); + expect(tooltip).toHaveTextContent(""); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + }); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + it("should hide the tooltip if the user presses the escape key", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); - clearTimeoutSpy.mockClear(); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + clearTimeoutSpy.mockClear(); - await fireEvent.mouseLeave(target); - await tick(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledWith(target); - expect(tooltip).toHaveTextContent(""); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - }); + await fireEvent.keyDown(target, { key: "a" }); + await vi.advanceTimersToNextTimerAsync(); - it("should hide the tooltip if the user presses the escape key", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); + expect(clearTimeoutSpy).not.toHaveBeenCalled(); + expect(unobserveSpy).not.toHaveBeenCalled(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await fireEvent.keyDown(target, { key: "Escape" }); + await vi.advanceTimersToNextTimerAsync(); - clearTimeoutSpy.mockClear(); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledTimes(1); + expect(unobserveSpy).toHaveBeenCalledWith(target); + expect(tooltip).toHaveTextContent(""); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(target.getAttribute("aria-described-by")).toBeNull(); + }); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + it("should hide the tooltip if the target element is detached from the DOM and disconnect the observer", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; - await fireEvent.keyDown(target, { key: "a" }); - await vi.advanceTimersToNextTimerAsync(); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - expect(clearTimeoutSpy).not.toHaveBeenCalled(); - expect(unobserveSpy).not.toHaveBeenCalled(); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + clearTimeoutSpy.mockClear(); - await fireEvent.keyDown(target, { key: "Escape" }); - await vi.advanceTimersToNextTimerAsync(); + expect(target.isConnected).toBe(true); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledTimes(1); - expect(unobserveSpy).toHaveBeenCalledWith(target); - expect(tooltip).toHaveTextContent(""); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(target.getAttribute("aria-described-by")).toBeNull(); - }); + target.remove(); - it("should hide the tooltip if the target element is detached from the DOM and disconnect the observer", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; + // @ts-ignore + callback([{ target }], new IntersectionObserver(() => {})); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await tick(); - clearTimeoutSpy.mockClear(); + expect(target.isConnected).toBe(false); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(disconnectSpy).toHaveBeenCalledTimes(1); + }); - expect(target.isConnected).toBe(true); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + it("shouldn't hide the tooltip if unrelated elements are detached from the DOM", async () => { + const unrelatedElement = document.body.appendChild( + document.createElement("span"), + ); + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; - target.remove(); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - // @ts-ignore - callback([{ target }], new IntersectionObserver(() => {})); + clearTimeoutSpy.mockClear(); - await tick(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(target.isConnected).toBe(false); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(disconnectSpy).toHaveBeenCalledTimes(1); - }); + unrelatedElement.remove(); - it("shouldn't hide the tooltip if unrelated elements are detached from the DOM", async () => { - const unrelatedElement = document.body.appendChild(document.createElement("span")); - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; + // @ts-ignore + callback([{ target }], new IntersectionObserver(() => {})); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await tick(); - clearTimeoutSpy.mockClear(); + expect(clearTimeoutSpy).not.toHaveBeenCalled(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(disconnectSpy).not.toHaveBeenCalled(); + }); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + it("should hide the tooltip if the intersection ratio of the target element is less or equal to zero", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; - unrelatedElement.remove(); + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - // @ts-ignore - callback([{ target }], new IntersectionObserver(() => {})); + clearTimeoutSpy.mockClear(); - await tick(); + expect(target.isConnected).toBe(true); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(clearTimeoutSpy).not.toHaveBeenCalled(); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(disconnectSpy).not.toHaveBeenCalled(); - }); + const entries = [{ intersectionRatio: 0, target }]; - it("should hide the tooltip if the intersection ratio of the target element is less or equal to zero", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; + // @ts-ignore + callback(entries, new IntersectionObserver(() => {})); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await tick(); - clearTimeoutSpy.mockClear(); + expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); + expect(tooltip.getAttribute("aria-hidden")).toBe("true"); + expect(disconnectSpy).toHaveBeenCalledTimes(1); + }); - expect(target.isConnected).toBe(true); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + it("shouldn't hide the tooltip if the intersection ration of the target is greater than zero", async () => { + const { getByRole } = render(Tooltip, baseOptions); + const tooltip = getByRole("tooltip", { hidden: true }); + const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; - const entries = [{ target, intersectionRatio: 0 }]; + await fireEvent.focusIn(target); + await vi.advanceTimersToNextTimerAsync(); - // @ts-ignore - callback(entries, new IntersectionObserver(() => {})); + clearTimeoutSpy.mockClear(); - await tick(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(clearTimeoutSpy).toHaveBeenCalledTimes(1); - expect(tooltip.getAttribute("aria-hidden")).toBe("true"); - expect(disconnectSpy).toHaveBeenCalledTimes(1); - }); + const entries = [{ intersectionRatio: 1, target }]; - it("shouldn't hide the tooltip if the intersection ration of the target is greater than zero", async () => { - const { getByRole } = render(Tooltip, baseOptions); - const tooltip = getByRole("tooltip", { hidden: true }); - const [callback] = vi.mocked(IntersectionObserver).mock.calls[0]; + // @ts-ignore + callback(entries, new IntersectionObserver(() => {})); - await fireEvent.focusIn(target); - await vi.advanceTimersToNextTimerAsync(); + await tick(); - clearTimeoutSpy.mockClear(); - - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - - const entries = [{ target, intersectionRatio: 1 }]; - - // @ts-ignore - callback(entries, new IntersectionObserver(() => {})); - - await tick(); - - expect(clearTimeoutSpy).not.toHaveBeenCalled(); - expect(tooltip.getAttribute("aria-hidden")).toBe("false"); - expect(disconnectSpy).not.toHaveBeenCalled(); - }); - }); - }); + expect(clearTimeoutSpy).not.toHaveBeenCalled(); + expect(tooltip.getAttribute("aria-hidden")).toBe("false"); + expect(disconnectSpy).not.toHaveBeenCalled(); + }); + }); + }); }); diff --git a/web-wallet/src/lib/dusk/components/__tests__/Words.spec.js b/web-wallet/src/lib/dusk/components/__tests__/Words.spec.js index 86ddc6589a..79eb92866a 100644 --- a/web-wallet/src/lib/dusk/components/__tests__/Words.spec.js +++ b/web-wallet/src/lib/dusk/components/__tests__/Words.spec.js @@ -1,28 +1,22 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; -import { - cleanup, - render -} from "@testing-library/svelte"; +import { afterEach, describe, expect, it } from "vitest"; +import { cleanup, render } from "@testing-library/svelte"; import { Words } from ".."; describe("Words", () => { - afterEach(cleanup); + afterEach(cleanup); - it("should render the \"Words\" component with underscores for empty string", () => { - const { container } = render(Words, { props: { words: ["", "", ""] } }); + it('should render the "Words" component with underscores for empty string', () => { + const { container } = render(Words, { props: { words: ["", "", ""] } }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); - it("should render the \"Words\" component with the passed words", () => { - const { container } = render(Words, { props: { words: ["snow", "winter", "christmas"] } }); + it('should render the "Words" component with the passed words', () => { + const { container } = render(Words, { + props: { words: ["snow", "winter", "christmas"] }, + }); - expect(container.firstChild).toMatchSnapshot(); - }); + expect(container.firstChild).toMatchSnapshot(); + }); }); diff --git a/web-wallet/src/lib/dusk/components/dusk.components.d.ts b/web-wallet/src/lib/dusk/components/dusk.components.d.ts index 311b7195e7..51b2572bdd 100644 --- a/web-wallet/src/lib/dusk/components/dusk.components.d.ts +++ b/web-wallet/src/lib/dusk/components/dusk.components.d.ts @@ -1,9 +1,8 @@ - type IconProp = { - path: string, - position?: "after" | "before" - size?: IconSize, -} + path: string; + position?: "after" | "before"; + size?: IconSize; +}; type ButtonSize = "normal" | "small"; @@ -12,40 +11,49 @@ type BadgeVariant = "neutral" | "success" | "warning" | "error"; type ButtonVariant = "primary" | "secondary" | "tertiary" | "quaternary"; type WizardButtonProps = { - isAnchor?: boolean, - href?: string, - disabled?: boolean, - icon?: IconProp | null, - variant?: ButtonVariant, - label?: string, - action?: () => void, -} + isAnchor?: boolean; + href?: string; + disabled?: boolean; + icon?: IconProp | null; + variant?: ButtonVariant; + label?: string; + action?: () => void; +}; type IconSize = "small" | "normal" | "large"; type GroupedSelectOptions = Record; type SelectOption = { - disabled?: boolean, - label?: string, - value: string -} + disabled?: boolean; + label?: string; + value: string; +}; type TabItem = { - icon?: IconProp, - id: string, - label?: string -} - -type TextboxTypes = "email" | "hidden" | "multiline" | "number" | "password" | "search" | "tel" | "text" | "url"; + icon?: IconProp; + id: string; + label?: string; +}; + +type TextboxTypes = + | "email" + | "hidden" + | "multiline" + | "number" + | "password" + | "search" + | "tel" + | "text" + | "url"; type TooltipType = "error" | "info" | "success" | "warning"; type MnemonicType = "authenticate" | "validate"; type ToastItem = { - icon?: string, - id: string, - message: string, - type: TooltipType -} + icon?: string; + id: string; + message: string; + type: TooltipType; +}; diff --git a/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js b/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js index 8af99d4cdb..51a8a549b8 100644 --- a/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js +++ b/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js @@ -1,14 +1,10 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { duskToLux } from ".."; describe("duskToLux", () => { - it("should convert an amount in Dusk to Lux", () => { - expect(duskToLux(1)).toBe(1e9); - expect(duskToLux(3_456_789.012)).toBe(3_456_789_012_000_000); - }); + it("should convert an amount in Dusk to Lux", () => { + expect(duskToLux(1)).toBe(1e9); + expect(duskToLux(3_456_789.012)).toBe(3_456_789_012_000_000); + }); }); diff --git a/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js b/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js index 304860a200..cba7223d8a 100644 --- a/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js +++ b/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js @@ -1,14 +1,10 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { luxToDusk } from ".."; describe("luxToDusk", () => { - it("should convert an amount in Dusk to Lux", () => { - expect(luxToDusk(1e9)).toBe(1); - expect(luxToDusk(123_456_789_012)).toBe(123.456789012); - }); + it("should convert an amount in Dusk to Lux", () => { + expect(luxToDusk(1e9)).toBe(1); + expect(luxToDusk(123_456_789_012)).toBe(123.456789012); + }); }); diff --git a/web-wallet/src/lib/dusk/currency/createCurrencyFormatter.js b/web-wallet/src/lib/dusk/currency/createCurrencyFormatter.js index f8c2f8345c..62f9adf95b 100644 --- a/web-wallet/src/lib/dusk/currency/createCurrencyFormatter.js +++ b/web-wallet/src/lib/dusk/currency/createCurrencyFormatter.js @@ -7,11 +7,15 @@ * @returns {(value: number | bigint) => string} */ const createFormatter = (locale, currency, digits) => { - const formatter = currency.toUpperCase() === "DUSK" - ? new Intl.NumberFormat(locale, { minimumFractionDigits: digits }) - : new Intl.NumberFormat(locale, { currency: currency, style: "currency" }); + const formatter = + currency.toUpperCase() === "DUSK" + ? new Intl.NumberFormat(locale, { minimumFractionDigits: digits }) + : new Intl.NumberFormat(locale, { + currency: currency, + style: "currency", + }); - return value => formatter.format(value); + return (value) => formatter.format(value); }; export default createFormatter; diff --git a/web-wallet/src/lib/dusk/currency/createFeeFormatter.js b/web-wallet/src/lib/dusk/currency/createFeeFormatter.js index a63df1d949..f03da175a4 100644 --- a/web-wallet/src/lib/dusk/currency/createFeeFormatter.js +++ b/web-wallet/src/lib/dusk/currency/createFeeFormatter.js @@ -5,12 +5,12 @@ * @returns {(value: number | bigint) => string} */ const createFormatter = (locale) => { - const formatter = new Intl.NumberFormat(locale, { - maximumFractionDigits: 9, - minimumFractionDigits: 2 - }); + const formatter = new Intl.NumberFormat(locale, { + maximumFractionDigits: 9, + minimumFractionDigits: 2, + }); - return value => formatter.format(value); + return (value) => formatter.format(value); }; export default createFormatter; diff --git a/web-wallet/src/lib/dusk/currency/createTransferFormatter.js b/web-wallet/src/lib/dusk/currency/createTransferFormatter.js index 492cdea78f..b176fb27d9 100644 --- a/web-wallet/src/lib/dusk/currency/createTransferFormatter.js +++ b/web-wallet/src/lib/dusk/currency/createTransferFormatter.js @@ -5,13 +5,13 @@ * @returns {(value: number | bigint) => string} */ const createFormatter = (locale) => { - const formatter = new Intl.NumberFormat(locale, { - maximumFractionDigits: 9, - minimumFractionDigits: 2, - signDisplay: "exceptZero" - }); + const formatter = new Intl.NumberFormat(locale, { + maximumFractionDigits: 9, + minimumFractionDigits: 2, + signDisplay: "exceptZero", + }); - return value => formatter.format(value); + return (value) => formatter.format(value); }; export default createFormatter; diff --git a/web-wallet/src/lib/dusk/currency/currencies.js b/web-wallet/src/lib/dusk/currency/currencies.js index 9484999741..b9e4a6e0cb 100644 --- a/web-wallet/src/lib/dusk/currency/currencies.js +++ b/web-wallet/src/lib/dusk/currency/currencies.js @@ -1,49 +1,49 @@ const currencies = [ - { code: "AED", currency: "United Arab Emirates Dirham" }, - { code: "ARS", currency: "Argentine Peso" }, - { code: "AUD", currency: "Australian Dollar" }, - { code: "BDT", currency: "Bangladeshi Taka" }, - { code: "BHD", currency: "Bahraini Dinar" }, - { code: "BMD", currency: "Bermudian Dollar" }, - { code: "BRL", currency: "Brazilian Real" }, - { code: "CAD", currency: "Canadian Dollar" }, - { code: "CFH", currency: "Swiss Franc" }, - { code: "CLP", currency: "Chilean Peso" }, - { code: "CNY", currency: "Renminbi" }, - { code: "CZK", currency: "Czech Koruna" }, - { code: "DKK", currency: "Danish Krone" }, - { code: "EUR", currency: "Euro" }, - { code: "GBP", currency: "Pound Sterling" }, - { code: "HKD", currency: "Hong Kong Dollar" }, - { code: "HUF", currency: "Hungarian Forint" }, - { code: "IDR", currency: "Indonesian Rupiah" }, - { code: "ILS", currency: "Israeli New Shekel" }, - { code: "INR", currency: "Indian Rupee" }, - { code: "JPY", currency: "Japanese Yen" }, - { code: "KRW", currency: "South Korean Won" }, - { code: "KWD", currency: "Kuwaiti Dinar" }, - { code: "LKR", currency: "Sri Lankan Rupee" }, - { code: "MMK", currency: "Myanmar Kyat" }, - { code: "MXN", currency: "Mexican Peso" }, - { code: "MYR", currency: "Malaysian Ringgit" }, - { code: "NGN", currency: "Nigerian Naira" }, - { code: "NOK", currency: "Norwegian Krone" }, - { code: "NZD", currency: "New Zealand Dollar" }, - { code: "PHP", currency: "Philippine Peso" }, - { code: "PKR", currency: "Pakistani Rupee" }, - { code: "PLN", currency: "Polish Złoty" }, - { code: "RUB", currency: "Russian Ruble" }, - { code: "SAR", currency: "Saudi Riyal" }, - { code: "SEK", currency: "Swedish Krona" }, - { code: "SGD", currency: "Singapore Dollar" }, - { code: "THB", currency: "Thai Baht" }, - { code: "TRY", currency: "Turkish Lira" }, - { code: "TWD", currency: "New Taiwan Dollar" }, - { code: "UAH", currency: "Ukrainian Hryvnia" }, - { code: "USD", currency: "United States Dollar" }, - { code: "VEF", currency: "Venezuelan Bolívar Fuerte" }, - { code: "VND", currency: "Vietnamese Dồng" }, - { code: "ZAR", currency: "South African Rand" } + { code: "AED", currency: "United Arab Emirates Dirham" }, + { code: "ARS", currency: "Argentine Peso" }, + { code: "AUD", currency: "Australian Dollar" }, + { code: "BDT", currency: "Bangladeshi Taka" }, + { code: "BHD", currency: "Bahraini Dinar" }, + { code: "BMD", currency: "Bermudian Dollar" }, + { code: "BRL", currency: "Brazilian Real" }, + { code: "CAD", currency: "Canadian Dollar" }, + { code: "CFH", currency: "Swiss Franc" }, + { code: "CLP", currency: "Chilean Peso" }, + { code: "CNY", currency: "Renminbi" }, + { code: "CZK", currency: "Czech Koruna" }, + { code: "DKK", currency: "Danish Krone" }, + { code: "EUR", currency: "Euro" }, + { code: "GBP", currency: "Pound Sterling" }, + { code: "HKD", currency: "Hong Kong Dollar" }, + { code: "HUF", currency: "Hungarian Forint" }, + { code: "IDR", currency: "Indonesian Rupiah" }, + { code: "ILS", currency: "Israeli New Shekel" }, + { code: "INR", currency: "Indian Rupee" }, + { code: "JPY", currency: "Japanese Yen" }, + { code: "KRW", currency: "South Korean Won" }, + { code: "KWD", currency: "Kuwaiti Dinar" }, + { code: "LKR", currency: "Sri Lankan Rupee" }, + { code: "MMK", currency: "Myanmar Kyat" }, + { code: "MXN", currency: "Mexican Peso" }, + { code: "MYR", currency: "Malaysian Ringgit" }, + { code: "NGN", currency: "Nigerian Naira" }, + { code: "NOK", currency: "Norwegian Krone" }, + { code: "NZD", currency: "New Zealand Dollar" }, + { code: "PHP", currency: "Philippine Peso" }, + { code: "PKR", currency: "Pakistani Rupee" }, + { code: "PLN", currency: "Polish Złoty" }, + { code: "RUB", currency: "Russian Ruble" }, + { code: "SAR", currency: "Saudi Riyal" }, + { code: "SEK", currency: "Swedish Krona" }, + { code: "SGD", currency: "Singapore Dollar" }, + { code: "THB", currency: "Thai Baht" }, + { code: "TRY", currency: "Turkish Lira" }, + { code: "TWD", currency: "New Taiwan Dollar" }, + { code: "UAH", currency: "Ukrainian Hryvnia" }, + { code: "USD", currency: "United States Dollar" }, + { code: "VEF", currency: "Venezuelan Bolívar Fuerte" }, + { code: "VND", currency: "Vietnamese Dồng" }, + { code: "ZAR", currency: "South African Rand" }, ]; export default currencies; diff --git a/web-wallet/src/lib/dusk/currency/duskToLux.js b/web-wallet/src/lib/dusk/currency/duskToLux.js index 77319dd3ea..01457c7ff4 100644 --- a/web-wallet/src/lib/dusk/currency/duskToLux.js +++ b/web-wallet/src/lib/dusk/currency/duskToLux.js @@ -5,6 +5,6 @@ * @param {number} n * @returns {number} */ -const duskToLux = n => n * 1e9; +const duskToLux = (n) => n * 1e9; export default duskToLux; diff --git a/web-wallet/src/lib/dusk/currency/luxToDusk.js b/web-wallet/src/lib/dusk/currency/luxToDusk.js index 429cd82641..155243a1be 100644 --- a/web-wallet/src/lib/dusk/currency/luxToDusk.js +++ b/web-wallet/src/lib/dusk/currency/luxToDusk.js @@ -5,6 +5,6 @@ * @param {number} n * @returns {number} */ -const luxToDusk = n => n * 1e-9; +const luxToDusk = (n) => n * 1e-9; export default luxToDusk; diff --git a/web-wallet/src/lib/dusk/http/__tests__/failureToRejection.spec.js b/web-wallet/src/lib/dusk/http/__tests__/failureToRejection.spec.js index afff2cd791..8de51eb60b 100644 --- a/web-wallet/src/lib/dusk/http/__tests__/failureToRejection.spec.js +++ b/web-wallet/src/lib/dusk/http/__tests__/failureToRejection.spec.js @@ -1,27 +1,23 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { failureToRejection } from ".."; describe("failureToRejection", () => { - it("should return a rejected Promise if the given Response status is not \"ok\"", () => { - const response = new Response("", { status: 404 }); - const result = failureToRejection(response); + it('should return a rejected Promise if the given Response status is not "ok"', () => { + const response = new Response("", { status: 404 }); + const result = failureToRejection(response); - expect(result).rejects.toBeInstanceOf(Error); - expect(result).rejects.toMatchObject({ - cause: response, - message: expect.stringContaining(response.statusText) - }); - }); + expect(result).rejects.toBeInstanceOf(Error); + expect(result).rejects.toMatchObject({ + cause: response, + message: expect.stringContaining(response.statusText), + }); + }); - it("should return a Promise that resolves to the given Response, if its status is \"ok\"", () => { - const response = new Response("", { status: 200 }); - const result = failureToRejection(response); + it('should return a Promise that resolves to the given Response, if its status is "ok"', () => { + const response = new Response("", { status: 200 }); + const result = failureToRejection(response); - expect(result).resolves.toBe(response); - }); + expect(result).resolves.toBe(response); + }); }); diff --git a/web-wallet/src/lib/dusk/http/failureToRejection.js b/web-wallet/src/lib/dusk/http/failureToRejection.js index d1b1364d67..3db3953a26 100644 --- a/web-wallet/src/lib/dusk/http/failureToRejection.js +++ b/web-wallet/src/lib/dusk/http/failureToRejection.js @@ -6,13 +6,13 @@ * @param {Response} response * @returns {Promise} */ -const failureToRejection = response => ( - response.ok - ? Promise.resolve(response) - : Promise.reject(new Error( - `HTTP Request failed - ${response.statusText}`, - { cause: response } - )) -); +const failureToRejection = (response) => + response.ok + ? Promise.resolve(response) + : Promise.reject( + new Error(`HTTP Request failed - ${response.statusText}`, { + cause: response, + }), + ); export default failureToRejection; diff --git a/web-wallet/src/lib/dusk/icons/logo.js b/web-wallet/src/lib/dusk/icons/logo.js index 8a07eb0100..117ec8d0f0 100644 --- a/web-wallet/src/lib/dusk/icons/logo.js +++ b/web-wallet/src/lib/dusk/icons/logo.js @@ -1,4 +1,5 @@ // eslint-disable-next-line max-len -const DUSK_LOGO_PATH = "M12.335 0.005a12.186 12.186 0 0 0 -2.58 0.204C4.2 1.259 0 6.14 0 11.999 0 17.859 4.203 22.74 9.759 23.79c0.726 0.138 1.476 0.21 2.241 0.21 6.789 0 12.261 -5.64 11.991 -12.49C23.741 5.249 18.599 0.173 12.335 0.005Zm0.207 21.58c-0.204 0.012 -0.336 -0.222 -0.21 -0.384 1.974 -2.541 3.153 -5.733 3.153 -9.202 0 -3.468 -1.176 -6.663 -3.153 -9.202 -0.126 -0.162 0.003 -0.396 0.207 -0.384 5.052 0.282 9.06 4.465 9.06 9.586 0 5.121 -4.005 9.304 -9.057 9.586Z"; +const DUSK_LOGO_PATH = + "M12.335 0.005a12.186 12.186 0 0 0 -2.58 0.204C4.2 1.259 0 6.14 0 11.999 0 17.859 4.203 22.74 9.759 23.79c0.726 0.138 1.476 0.21 2.241 0.21 6.789 0 12.261 -5.64 11.991 -12.49C23.741 5.249 18.599 0.173 12.335 0.005Zm0.207 21.58c-0.204 0.012 -0.336 -0.222 -0.21 -0.384 1.974 -2.541 3.153 -5.733 3.153 -9.202 0 -3.468 -1.176 -6.663 -3.153 -9.202 -0.126 -0.162 0.003 -0.396 0.207 -0.384 5.052 0.282 9.06 4.465 9.06 9.586 0 5.121 -4.005 9.304 -9.057 9.586Z"; export default DUSK_LOGO_PATH; diff --git a/web-wallet/src/lib/dusk/math/__tests__/lerp.spec.js b/web-wallet/src/lib/dusk/math/__tests__/lerp.spec.js index 1913446e1e..afc61e4af5 100644 --- a/web-wallet/src/lib/dusk/math/__tests__/lerp.spec.js +++ b/web-wallet/src/lib/dusk/math/__tests__/lerp.spec.js @@ -1,23 +1,19 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { lerp } from ".."; describe("lerp", () => { - it("should perform a linear interpolation between the two given values", () => { - expect(lerp(20, 80, .3)).toBe(38); - expect(lerp(20, 80, .5)).toBe(50); - expect(lerp(20, 80, .7)).toBe(62); - }); + it("should perform a linear interpolation between the two given values", () => { + expect(lerp(20, 80, 0.3)).toBe(38); + expect(lerp(20, 80, 0.5)).toBe(50); + expect(lerp(20, 80, 0.7)).toBe(62); + }); - it("should return `a` with a normal value of `0`", () => { - expect(lerp(20, 80, 0)).toBe(20); - }); + it("should return `a` with a normal value of `0`", () => { + expect(lerp(20, 80, 0)).toBe(20); + }); - it("should return `b` with a normal value of `1`", () => { - expect(lerp(20, 80, 1)).toBe(80); - }); + it("should return `b` with a normal value of `1`", () => { + expect(lerp(20, 80, 1)).toBe(80); + }); }); diff --git a/web-wallet/src/lib/dusk/mocks/IntersectionObserver.js b/web-wallet/src/lib/dusk/mocks/IntersectionObserver.js index 8f141879f7..f2c8d5272b 100644 --- a/web-wallet/src/lib/dusk/mocks/IntersectionObserver.js +++ b/web-wallet/src/lib/dusk/mocks/IntersectionObserver.js @@ -1,15 +1,21 @@ export default class IntersectionObserver { - get root () { return document; } + get root() { + return document; + } - get rootMargin () { return "0px 0px 0px 0px"; } + get rootMargin() { + return "0px 0px 0px 0px"; + } - get thresholds () { return [0]; } + get thresholds() { + return [0]; + } - disconnect () {} + disconnect() {} - observe () {} + observe() {} - takeRecords () {} + takeRecords() {} - unobserve () {} + unobserve() {} } diff --git a/web-wallet/src/lib/dusk/mocks/ResizeObserver.js b/web-wallet/src/lib/dusk/mocks/ResizeObserver.js index 887d10cc34..704709e277 100644 --- a/web-wallet/src/lib/dusk/mocks/ResizeObserver.js +++ b/web-wallet/src/lib/dusk/mocks/ResizeObserver.js @@ -1,16 +1,16 @@ export default class ResizeObserver { - /** @param {Function} callback */ - constructor (callback) { - this.#callback = callback; - } + /** @param {Function} callback */ + constructor(callback) { + this.#callback = callback; + } - #callback; + #callback; - disconnect () {} + disconnect() {} - observe () { - this.#callback(); - } + observe() { + this.#callback(); + } - unobserve () {} + unobserve() {} } diff --git a/web-wallet/src/lib/dusk/polyfill/asyncIterator.js b/web-wallet/src/lib/dusk/polyfill/asyncIterator.js index 4c5989e265..8462b3627a 100644 --- a/web-wallet/src/lib/dusk/polyfill/asyncIterator.js +++ b/web-wallet/src/lib/dusk/polyfill/asyncIterator.js @@ -1,20 +1,20 @@ // @ts-nocheck if (!ReadableStream.prototype[Symbol.asyncIterator]) { - ReadableStream.prototype[Symbol.asyncIterator] = async function* () { - const reader = this.getReader(); + ReadableStream.prototype[Symbol.asyncIterator] = async function* () { + const reader = this.getReader(); - try { - while (true) { - const { done, value } = await reader.read(); + try { + while (true) { + const { done, value } = await reader.read(); - if (done) { - return; - } + if (done) { + return; + } - yield value; - } - } finally { - reader.releaseLock(); - } - }; + yield value; + } + } finally { + reader.releaseLock(); + } + }; } diff --git a/web-wallet/src/lib/dusk/string/__tests__/calculateAdaptiveCharCount.spec.js b/web-wallet/src/lib/dusk/string/__tests__/calculateAdaptiveCharCount.spec.js index cea2a3b5f0..06732211bd 100644 --- a/web-wallet/src/lib/dusk/string/__tests__/calculateAdaptiveCharCount.spec.js +++ b/web-wallet/src/lib/dusk/string/__tests__/calculateAdaptiveCharCount.spec.js @@ -2,23 +2,23 @@ import { describe, expect, it } from "vitest"; import { calculateAdaptiveCharCount } from "../"; describe("calculateAdaptiveCharCount", () => { - it("should return minimum characters for widths less than the minimum width", () => { - expect(calculateAdaptiveCharCount(300)).toBe(5); - }); + it("should return minimum characters for widths less than the minimum width", () => { + expect(calculateAdaptiveCharCount(300)).toBe(5); + }); - it("should return minimum characters for width equal to the minimum width", () => { - expect(calculateAdaptiveCharCount(320, 320, 640, 5, 20)).toBe(5); - }); + it("should return minimum characters for width equal to the minimum width", () => { + expect(calculateAdaptiveCharCount(320, 320, 640, 5, 20)).toBe(5); + }); - it("should return correct characters for a width between the minimum and maximum widths", () => { - expect(calculateAdaptiveCharCount(500, 320, 640, 5, 20)).toBe(13); - }); + it("should return correct characters for a width between the minimum and maximum widths", () => { + expect(calculateAdaptiveCharCount(500, 320, 640, 5, 20)).toBe(13); + }); - it("should return maximum characters for width equal to the maximum width", () => { - expect(calculateAdaptiveCharCount(800, 320, 640, 5, 20)).toBe(20); - }); + it("should return maximum characters for width equal to the maximum width", () => { + expect(calculateAdaptiveCharCount(800, 320, 640, 5, 20)).toBe(20); + }); - it("should return maximum characters for widths greater than the maximum width", () => { - expect(calculateAdaptiveCharCount(900, 320, 640, 5, 20)).toBe(20); - }); + it("should return maximum characters for widths greater than the maximum width", () => { + expect(calculateAdaptiveCharCount(900, 320, 640, 5, 20)).toBe(20); + }); }); diff --git a/web-wallet/src/lib/dusk/string/__tests__/hexStringToBytes.spec.js b/web-wallet/src/lib/dusk/string/__tests__/hexStringToBytes.spec.js index 47d75c2d4e..389af8f441 100644 --- a/web-wallet/src/lib/dusk/string/__tests__/hexStringToBytes.spec.js +++ b/web-wallet/src/lib/dusk/string/__tests__/hexStringToBytes.spec.js @@ -1,24 +1,22 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { hexStringToBytes } from ".."; describe("hexStringToBytes", () => { - it("should convert a hexadecimal string into a `Uint8Array`", () => { - const expected = Uint8Array.of(255, 174, 2, 83); + it("should convert a hexadecimal string into a `Uint8Array`", () => { + const expected = Uint8Array.of(255, 174, 2, 83); - expect(hexStringToBytes("ffae0253")).toStrictEqual(expected); - expect(hexStringToBytes("FFAE0253")).toStrictEqual(expected); - }); + expect(hexStringToBytes("ffae0253")).toStrictEqual(expected); + expect(hexStringToBytes("FFAE0253")).toStrictEqual(expected); + }); - it("should convert invalid hex numbers to zeroes", () => { - expect(hexStringToBytes("ffaeXX")).toStrictEqual(Uint8Array.of(255, 174, 0)); - }); + it("should convert invalid hex numbers to zeroes", () => { + expect(hexStringToBytes("ffaeXX")).toStrictEqual( + Uint8Array.of(255, 174, 0), + ); + }); - it("should return an empty `Uint8Array` if supplied with an empty string", () => { - expect(hexStringToBytes("")).toStrictEqual(new Uint8Array()); - }); + it("should return an empty `Uint8Array` if supplied with an empty string", () => { + expect(hexStringToBytes("")).toStrictEqual(new Uint8Array()); + }); }); diff --git a/web-wallet/src/lib/dusk/string/__tests__/makeClassName.spec.js b/web-wallet/src/lib/dusk/string/__tests__/makeClassName.spec.js index fe83f5d439..f672e20f81 100644 --- a/web-wallet/src/lib/dusk/string/__tests__/makeClassName.spec.js +++ b/web-wallet/src/lib/dusk/string/__tests__/makeClassName.spec.js @@ -3,52 +3,71 @@ import { describe, expect, it } from "vitest"; import { makeClassName } from ".."; describe("makeClassName", () => { - it("should build a class name string from the keys holding \"truthy\" values if given an object as parameter", () => { - const classes = { - a: "", - b: 0, - c: -0, - d: null, - e: void 0, - f: NaN, - g: false, - i: "false", - j: "0", - k: "true", - l: true, - m: "" - }; - - expect(makeClassName(classes)).toBe("i j k l"); - }); - - it("should return an empty string if the object has no keys or all values are \"falsy\"", () => { - const classes = { - a: "", b: 0, c: -0, d: null, e: void 0, f: false, g: NaN - }; - - expect(makeClassName(classes)).toBe(""); - expect(makeClassName({})).toBe(""); - }); - - it("should build a class name string from the unique \"truthy\" values if given an array as parameter", () => { - const classes = ["", 0, -0, null, void 0, false, "false", "foo", "0", 2, "foo", "false"]; - - expect(makeClassName(classes)).toBe("false foo 0 2"); - }); - - it("should return an empty string if the array is empty or all values are \"falsy\"", () => { - const classes = ["", 0, -0, null, void 0, false, NaN]; - - expect(makeClassName(classes)).toBe(""); - expect(makeClassName([])).toBe(""); - }); - - it("should throw an exception if the received parameter is `null` or `undefined`", () => { - // @ts-expect-error - expect(() => makeClassName(null)).toThrow(); - - // @ts-expect-error - expect(() => makeClassName(void 0)).toThrow(); - }); + it('should build a class name string from the keys holding "truthy" values if given an object as parameter', () => { + const classes = { + a: "", + b: 0, + c: -0, + d: null, + e: void 0, + f: NaN, + g: false, + i: "false", + j: "0", + k: "true", + l: true, + m: "", + }; + + expect(makeClassName(classes)).toBe("i j k l"); + }); + + it('should return an empty string if the object has no keys or all values are "falsy"', () => { + const classes = { + a: "", + b: 0, + c: -0, + d: null, + e: void 0, + f: false, + g: NaN, + }; + + expect(makeClassName(classes)).toBe(""); + expect(makeClassName({})).toBe(""); + }); + + it('should build a class name string from the unique "truthy" values if given an array as parameter', () => { + const classes = [ + "", + 0, + -0, + null, + void 0, + false, + "false", + "foo", + "0", + 2, + "foo", + "false", + ]; + + expect(makeClassName(classes)).toBe("false foo 0 2"); + }); + + it('should return an empty string if the array is empty or all values are "falsy"', () => { + const classes = ["", 0, -0, null, void 0, false, NaN]; + + expect(makeClassName(classes)).toBe(""); + expect(makeClassName([])).toBe(""); + }); + + it("should throw an exception if the received parameter is `null` or `undefined`", () => { + // @ts-expect-error + expect(() => makeClassName(null)).toThrow(); + + // @ts-expect-error + expect(() => makeClassName(void 0)).toThrow(); + }); }); diff --git a/web-wallet/src/lib/dusk/string/__tests__/middleEllipsis.spec.js b/web-wallet/src/lib/dusk/string/__tests__/middleEllipsis.spec.js index 65048c9ff2..22cc775649 100644 --- a/web-wallet/src/lib/dusk/string/__tests__/middleEllipsis.spec.js +++ b/web-wallet/src/lib/dusk/string/__tests__/middleEllipsis.spec.js @@ -3,19 +3,19 @@ import { describe, expect, it } from "vitest"; import { middleEllipsis } from ".."; describe("middleEllipsis", () => { - it("should return the original text if text length is less than or equal to twice n", () => { - expect(middleEllipsis("Hello", 5)).toEqual("Hello"); - expect(middleEllipsis("Hi", 2)).toEqual("Hi"); - }); + it("should return the original text if text length is less than or equal to twice n", () => { + expect(middleEllipsis("Hello", 5)).toEqual("Hello"); + expect(middleEllipsis("Hi", 2)).toEqual("Hi"); + }); - it("should return text with ellipsis in the middle for longer texts", () => { - expect(middleEllipsis("HelloWorld", 3)).toEqual("Hel...rld"); - expect(middleEllipsis("abcdef", 2)).toEqual("ab...ef"); - }); + it("should return text with ellipsis in the middle for longer texts", () => { + expect(middleEllipsis("HelloWorld", 3)).toEqual("Hel...rld"); + expect(middleEllipsis("abcdef", 2)).toEqual("ab...ef"); + }); - it("should handle edge cases gracefully", () => { - expect(middleEllipsis("", 2)).toEqual(""); - expect(middleEllipsis("A", 0)).toEqual("..."); - expect(middleEllipsis("HelloWorld", 0)).toEqual("..."); - }); + it("should handle edge cases gracefully", () => { + expect(middleEllipsis("", 2)).toEqual(""); + expect(middleEllipsis("A", 0)).toEqual("..."); + expect(middleEllipsis("HelloWorld", 0)).toEqual("..."); + }); }); diff --git a/web-wallet/src/lib/dusk/string/__tests__/validateAddress.spec.js b/web-wallet/src/lib/dusk/string/__tests__/validateAddress.spec.js index cc8887c474..17d35b3495 100644 --- a/web-wallet/src/lib/dusk/string/__tests__/validateAddress.spec.js +++ b/web-wallet/src/lib/dusk/string/__tests__/validateAddress.spec.js @@ -2,62 +2,62 @@ import { validateAddress } from ".."; import { describe, expect, it } from "vitest"; describe("validateAddress", () => { - const validAddresses = [ - "47jNTgAhzn9KCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", - "4xwKPC9UMvketmoNkDvyaJufcTZWmNn8giB8xWTf3Qk8nFkRW81nTVwSdGPcbomzHThPuoXsdFzrzwiMar6BEfdw", - "5kB6VBePF8eFhFVjLwM1xrEL6yGBm1uDsoWyRjdqDQ2nNz8nECAsRh3MZiM6uEo6WmukqyKzzCK9B5rcPTnjZQgt", - "4LaS4bWzFQtvxZ7frUaXbfm3xsbnHHYwNkGnLqqpmWPYQeSfbAPy7N4Md8gk5gHn9f4wxNSNyFJuyxcnXPSWTRMd", - "gMxrVEH5aW7XuQiXN2Pm2YRLHyCNmokmBb1VzjcmcQg7gzmxstPnozdt7SvvMKLP71BadPsa5jmoWFc2WzWDYPo" - ]; + const validAddresses = [ + "47jNTgAhzn9KCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", + "4xwKPC9UMvketmoNkDvyaJufcTZWmNn8giB8xWTf3Qk8nFkRW81nTVwSdGPcbomzHThPuoXsdFzrzwiMar6BEfdw", + "5kB6VBePF8eFhFVjLwM1xrEL6yGBm1uDsoWyRjdqDQ2nNz8nECAsRh3MZiM6uEo6WmukqyKzzCK9B5rcPTnjZQgt", + "4LaS4bWzFQtvxZ7frUaXbfm3xsbnHHYwNkGnLqqpmWPYQeSfbAPy7N4Md8gk5gHn9f4wxNSNyFJuyxcnXPSWTRMd", + "gMxrVEH5aW7XuQiXN2Pm2YRLHyCNmokmBb1VzjcmcQg7gzmxstPnozdt7SvvMKLP71BadPsa5jmoWFc2WzWDYPo", + ]; - const invalidAddresses = [ - // Invalid Base58 - "InvalidKey12345", + const invalidAddresses = [ + // Invalid Base58 + "InvalidKey12345", - // Too short - "4LaS4bWzFQtvxZ7frUaXbfm3xsbnHHYwNkGnLqqpmWPY", + // Too short + "4LaS4bWzFQtvxZ7frUaXbfm3xsbnHHYwNkGnLqqpmWPY", - // Too long - "5kB6VBePF8eFhFVjLwM1xrEL6yGBm1uDsoWyRjdqDQ2nNz8nECAsRh3MZiM6uEo6WmukqyKzzCK9B5rcPTnjZQgtXXXXXXXX", + // Too long + "5kB6VBePF8eFhFVjLwM1xrEL6yGBm1uDsoWyRjdqDQ2nNz8nECAsRh3MZiM6uEo6WmukqyKzzCK9B5rcPTnjZQgtXXXXXXXX", - // Empty string - "", + // Empty string + "", - // Contains an invalid character (!) - "47jNTgAhzn9KCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnM!", + // Contains an invalid character (!) + "47jNTgAhzn9KCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnM!", - // Contains an invalid character (_) - "47jNTgAhzn9_CKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnM", + // Contains an invalid character (_) + "47jNTgAhzn9_CKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnM", - // Contains an invalid character ( ) - "47jNTgAhzn9 CKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnM", + // Contains an invalid character ( ) + "47jNTgAhzn9 CKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnM", - // Contains an invalid character (0) - "47jNTgAhzn0KCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", + // Contains an invalid character (0) + "47jNTgAhzn0KCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", - // Contains an invalid character (O) - "47jNTgAhznOKCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", + // Contains an invalid character (O) + "47jNTgAhznOKCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", - // Contains an invalid character (l) - "47jNTgAhznlKCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", + // Contains an invalid character (l) + "47jNTgAhznlKCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", - // Contains an invalid character (I) - "47jNTgAhznIKCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM" - ]; + // Contains an invalid character (I) + "47jNTgAhznIKCKF3msCfvKg3k1P1QpPCLZ3HG3AoNp87sQ5WNS3QyjckYHWeuXqW7uvLmbKgejpP8Xkcip89vnMM", + ]; - it("passes when supplied with a valid address", () => { - for (const address of validAddresses) { - const result = validateAddress(address); + it("passes when supplied with a valid address", () => { + for (const address of validAddresses) { + const result = validateAddress(address); - expect(result.isValid).toBe(true); - } - }); + expect(result.isValid).toBe(true); + } + }); - it("fails when supplied with an invalid address", () => { - for (const address of invalidAddresses) { - const result = validateAddress(address); + it("fails when supplied with an invalid address", () => { + for (const address of invalidAddresses) { + const result = validateAddress(address); - expect(result.isValid).toBe(false); - } - }); + expect(result.isValid).toBe(false); + } + }); }); diff --git a/web-wallet/src/lib/dusk/string/calculateAdaptiveCharCount.js b/web-wallet/src/lib/dusk/string/calculateAdaptiveCharCount.js index 429fc89c7d..69ada1b038 100644 --- a/web-wallet/src/lib/dusk/string/calculateAdaptiveCharCount.js +++ b/web-wallet/src/lib/dusk/string/calculateAdaptiveCharCount.js @@ -32,17 +32,21 @@ * returns a calculated value based on custom parameters */ -function calculateAdaptiveCharCount ( - width, - minWidth = 320, - maxWidth = 640, - minCharacters = 5, - maxCharacters = 18 +function calculateAdaptiveCharCount( + width, + minWidth = 320, + maxWidth = 640, + minCharacters = 5, + maxCharacters = 18, ) { - const characters = - minCharacters + (width - minWidth) * (maxCharacters - minCharacters) / (maxWidth - minWidth); + const characters = + minCharacters + + ((width - minWidth) * (maxCharacters - minCharacters)) / + (maxWidth - minWidth); - return Math.round(Math.max(minCharacters, Math.min(characters, maxCharacters))); + return Math.round( + Math.max(minCharacters, Math.min(characters, maxCharacters)), + ); } export default calculateAdaptiveCharCount; diff --git a/web-wallet/src/lib/dusk/string/hexStringToBytes.js b/web-wallet/src/lib/dusk/string/hexStringToBytes.js index eca40407ff..f4b55ac66e 100644 --- a/web-wallet/src/lib/dusk/string/hexStringToBytes.js +++ b/web-wallet/src/lib/dusk/string/hexStringToBytes.js @@ -3,9 +3,7 @@ * @param {String} s * @returns {Uint8Array} */ -const hexStringToBytes = s => Uint8Array.from( - s.match(/.{1,2}/g) ?? [], - hexByte => parseInt(hexByte, 16) -); +const hexStringToBytes = (s) => + Uint8Array.from(s.match(/.{1,2}/g) ?? [], (hexByte) => parseInt(hexByte, 16)); export default hexStringToBytes; diff --git a/web-wallet/src/lib/dusk/string/makeClassName.js b/web-wallet/src/lib/dusk/string/makeClassName.js index 7a94c736bd..daca6d569d 100644 --- a/web-wallet/src/lib/dusk/string/makeClassName.js +++ b/web-wallet/src/lib/dusk/string/makeClassName.js @@ -1,26 +1,22 @@ import { - condition, - filterWith, - joinWith, - keys, - pickIf, - pipe, - uniques + condition, + filterWith, + joinWith, + keys, + pickIf, + pipe, + uniques, } from "lamb"; const joinWithSpace = joinWith(" "); const makeClassNameFromArray = pipe([ - filterWith(Boolean), - uniques, - joinWithSpace + filterWith(Boolean), + uniques, + joinWithSpace, ]); -const makeClassNameFromObject = pipe([ - pickIf(Boolean), - keys, - joinWithSpace -]); +const makeClassNameFromObject = pipe([pickIf(Boolean), keys, joinWithSpace]); /** * Utility function to build a CSS class name string.
    @@ -38,6 +34,10 @@ const makeClassNameFromObject = pipe([ * makeClassName({}) // => "" * makeClassName([]) // => "" */ -const makeClassName = condition(Array.isArray, makeClassNameFromArray, makeClassNameFromObject); +const makeClassName = condition( + Array.isArray, + makeClassNameFromArray, + makeClassNameFromObject, +); export default makeClassName; diff --git a/web-wallet/src/lib/dusk/string/middleEllipsis.js b/web-wallet/src/lib/dusk/string/middleEllipsis.js index a7c9dba2cb..3bc015066e 100644 --- a/web-wallet/src/lib/dusk/string/middleEllipsis.js +++ b/web-wallet/src/lib/dusk/string/middleEllipsis.js @@ -4,15 +4,15 @@ * @param {Number} charactersToDisplay * @returns {String} */ -function middleEllipsis (originalString, charactersToDisplay) { - if (originalString.length <= 2 * charactersToDisplay) { - return originalString; - } +function middleEllipsis(originalString, charactersToDisplay) { + if (originalString.length <= 2 * charactersToDisplay) { + return originalString; + } - return `${originalString.substring( - 0, - charactersToDisplay - ) }...${ originalString.substring(originalString.length - charactersToDisplay)}`; + return `${originalString.substring( + 0, + charactersToDisplay, + )}...${originalString.substring(originalString.length - charactersToDisplay)}`; } export default middleEllipsis; diff --git a/web-wallet/src/lib/dusk/string/validateAddress.js b/web-wallet/src/lib/dusk/string/validateAddress.js index f9415c03ba..5fa70b96f9 100644 --- a/web-wallet/src/lib/dusk/string/validateAddress.js +++ b/web-wallet/src/lib/dusk/string/validateAddress.js @@ -5,16 +5,22 @@ * - `isValid` {Boolean} - true if the address is valid, false if invalid. * - `reason` {String} - describes why the address is invalid or confirms if it is valid. */ -export default function validateAddress (address) { - const regex = /[\W_0OIl]/; +export default function validateAddress(address) { + const regex = /[\W_0OIl]/; - if (address.length < 87 || address.length > 88) { - return { isValid: false, reason: "Invalid length. Addresses must be 87 or 88 characters long." }; - } + if (address.length < 87 || address.length > 88) { + return { + isValid: false, + reason: "Invalid length. Addresses must be 87 or 88 characters long.", + }; + } - if (address.search(regex) !== -1) { - return { isValid: false, reason: "Invalid character set. Address contains forbidden characters." }; - } + if (address.search(regex) !== -1) { + return { + isValid: false, + reason: "Invalid character set. Address contains forbidden characters.", + }; + } - return { isValid: true, reason: "Valid address." }; + return { isValid: true, reason: "Valid address." }; } diff --git a/web-wallet/src/lib/dusk/test-helpers/getAsHTMLElement.js b/web-wallet/src/lib/dusk/test-helpers/getAsHTMLElement.js index dfc6edeaa0..b31ea10ada 100644 --- a/web-wallet/src/lib/dusk/test-helpers/getAsHTMLElement.js +++ b/web-wallet/src/lib/dusk/test-helpers/getAsHTMLElement.js @@ -6,9 +6,9 @@ * @param {String} selector * @returns {HTMLElement} */ -function getAsHTMLElement (container, selector) { - // eslint-disable-next-line no-extra-parens - return /** @type {HTMLElement} */ (container.querySelector(selector)); +function getAsHTMLElement(container, selector) { + // eslint-disable-next-line no-extra-parens + return /** @type {HTMLElement} */ (container.querySelector(selector)); } export default getAsHTMLElement; diff --git a/web-wallet/src/lib/dusk/test-helpers/mockDerivedStore.js b/web-wallet/src/lib/dusk/test-helpers/mockDerivedStore.js index c66a4b3615..48c9ce710c 100644 --- a/web-wallet/src/lib/dusk/test-helpers/mockDerivedStore.js +++ b/web-wallet/src/lib/dusk/test-helpers/mockDerivedStore.js @@ -4,22 +4,22 @@ import { get, writable } from "svelte/store"; * @param {*} initialValue * @param {*} fn */ -function mockDerivedStore (initialValue, fn) { - const store = writable(initialValue); - const { set, subscribe } = store; - const getMockedStoreValue = () => get(store); +function mockDerivedStore(initialValue, fn) { + const store = writable(initialValue); + const { set, subscribe } = store; + const getMockedStoreValue = () => get(store); - /** @param {*} value */ - const setMockedStoreValue = value => set(value); + /** @param {*} value */ + const setMockedStoreValue = (value) => set(value); - const derivedMockedStoreValue = () => fn(initialValue); + const derivedMockedStoreValue = () => fn(initialValue); - return { - derivedMockedStoreValue, - getMockedStoreValue, - setMockedStoreValue, - subscribe - }; + return { + derivedMockedStoreValue, + getMockedStoreValue, + setMockedStoreValue, + subscribe, + }; } export default mockDerivedStore; diff --git a/web-wallet/src/lib/dusk/test-helpers/mockReadableStore.js b/web-wallet/src/lib/dusk/test-helpers/mockReadableStore.js index 50c33b40e5..77a9f0500b 100644 --- a/web-wallet/src/lib/dusk/test-helpers/mockReadableStore.js +++ b/web-wallet/src/lib/dusk/test-helpers/mockReadableStore.js @@ -1,20 +1,20 @@ import { get, writable } from "svelte/store"; /** @param {*} initialValue */ -function mockReadableStore (initialValue) { - const store = writable(initialValue); - const { set, subscribe } = store; - const getMockedStoreValue = () => get(store); +function mockReadableStore(initialValue) { + const store = writable(initialValue); + const { set, subscribe } = store; + const getMockedStoreValue = () => get(store); - /** @param {*} value */ - const setMockedStoreValue = value => set(value); + /** @param {*} value */ + const setMockedStoreValue = (value) => set(value); - return { - getMockedStoreValue, - set, - setMockedStoreValue, - subscribe - }; + return { + getMockedStoreValue, + set, + setMockedStoreValue, + subscribe, + }; } export default mockReadableStore; diff --git a/web-wallet/src/lib/dusk/test-helpers/renderWithSlots.js b/web-wallet/src/lib/dusk/test-helpers/renderWithSlots.js index ecb1576060..8645bf561d 100644 --- a/web-wallet/src/lib/dusk/test-helpers/renderWithSlots.js +++ b/web-wallet/src/lib/dusk/test-helpers/renderWithSlots.js @@ -19,10 +19,18 @@ import SlotContent from "./SlotContent.svelte"; * @param {DefaultSlot} slots * @returns {CreateRenderer} */ -const renderWithSlots = slots => (Component, options, renderOptions) => render( - SlotContent, - { ...options, props: { Component, componentOptions: options?.props, text: slots.default } }, - renderOptions -); +const renderWithSlots = (slots) => (Component, options, renderOptions) => + render( + SlotContent, + { + ...options, + props: { + Component, + componentOptions: options?.props, + text: slots.default, + }, + }, + renderOptions, + ); export default renderWithSlots; diff --git a/web-wallet/src/lib/dusk/ui-helpers/__test__/handlePageClick.spec.js b/web-wallet/src/lib/dusk/ui-helpers/__test__/handlePageClick.spec.js index 32e494da41..16b25f24fd 100644 --- a/web-wallet/src/lib/dusk/ui-helpers/__test__/handlePageClick.spec.js +++ b/web-wallet/src/lib/dusk/ui-helpers/__test__/handlePageClick.spec.js @@ -1,69 +1,67 @@ -import { - describe, expect, it, vi -} from "vitest"; +import { describe, expect, it, vi } from "vitest"; import { handlePageClick } from "../handlePageClick"; describe("handlePageClick", () => { - it("calls callback on click outside the node", () => { - const node = document.createElement("div"); - const callback = vi.fn(); + it("calls callback on click outside the node", () => { + const node = document.createElement("div"); + const callback = vi.fn(); - document.body.appendChild(node); + document.body.appendChild(node); - handlePageClick(node, { callback, enabled: true }); + handlePageClick(node, { callback, enabled: true }); - document.body.click(); - expect(callback).toHaveBeenCalledTimes(1); + document.body.click(); + expect(callback).toHaveBeenCalledTimes(1); - document.body.removeChild(node); - }); + document.body.removeChild(node); + }); - it("does not call callback on click inside the node", () => { - const node = document.createElement("div"); - const callback = vi.fn(); + it("does not call callback on click inside the node", () => { + const node = document.createElement("div"); + const callback = vi.fn(); - document.body.appendChild(node); + document.body.appendChild(node); - handlePageClick(node, { callback, enabled: true }); + handlePageClick(node, { callback, enabled: true }); - node.click(); - expect(callback).toHaveBeenCalledTimes(0); + node.click(); + expect(callback).toHaveBeenCalledTimes(0); - document.body.removeChild(node); - }); + document.body.removeChild(node); + }); - it("toggles listener activation based on enabled property", () => { - const node = document.createElement("div"); - const callback = vi.fn(); + it("toggles listener activation based on enabled property", () => { + const node = document.createElement("div"); + const callback = vi.fn(); - document.body.appendChild(node); + document.body.appendChild(node); - const action = handlePageClick(node, { callback, enabled: false }); + const action = handlePageClick(node, { callback, enabled: false }); - document.body.click(); - expect(callback).toHaveBeenCalledTimes(0); + document.body.click(); + expect(callback).toHaveBeenCalledTimes(0); - action.update({ enabled: true }); + action.update({ enabled: true }); - document.body.click(); - expect(callback).toHaveBeenCalledTimes(1); + document.body.click(); + expect(callback).toHaveBeenCalledTimes(1); - document.body.removeChild(node); - }); + document.body.removeChild(node); + }); - it("removes event listener on destroy", () => { - const node = document.createElement("div"); - const callback = vi.fn(); + it("removes event listener on destroy", () => { + const node = document.createElement("div"); + const callback = vi.fn(); - document.body.appendChild(node); + document.body.appendChild(node); - const action = handlePageClick(node, { callback, enabled: true }); + const action = handlePageClick(node, { callback, enabled: true }); - action.destroy(); + action.destroy(); - document.body.click(); - expect(callback).toHaveBeenCalledTimes(0); + document.body.click(); + expect(callback).toHaveBeenCalledTimes(0); - document.body.removeChild(node); - }); + document.body.removeChild(node); + }); }); diff --git a/web-wallet/src/lib/dusk/ui-helpers/handlePageClick.js b/web-wallet/src/lib/dusk/ui-helpers/handlePageClick.js index a1882e8955..4b931dcdf4 100644 --- a/web-wallet/src/lib/dusk/ui-helpers/handlePageClick.js +++ b/web-wallet/src/lib/dusk/ui-helpers/handlePageClick.js @@ -6,29 +6,29 @@ * @param {boolean} config.enabled - Whether the outside click listener is active. * @param {Function} config.callback - Callback to execute when an outside click is detected. */ -export function handlePageClick (node, { enabled: initialEnabled, callback }) { - // @ts-ignore - const handleClick = event => { - if (node && !node.contains(event.target) && !event.defaultPrevented) { - callback(); - } - }; +export function handlePageClick(node, { enabled: initialEnabled, callback }) { + // @ts-ignore + const handleClick = (event) => { + if (node && !node.contains(event.target) && !event.defaultPrevented) { + callback(); + } + }; - // @ts-ignore - function update ({ enabled }) { - if (enabled) { - window.addEventListener("click", handleClick); - } else { - window.removeEventListener("click", handleClick); - } - } + // @ts-ignore + function update({ enabled }) { + if (enabled) { + window.addEventListener("click", handleClick); + } else { + window.removeEventListener("click", handleClick); + } + } - update({ enabled: initialEnabled }); + update({ enabled: initialEnabled }); - return { - destroy () { - window.removeEventListener("click", handleClick); - }, - update - }; + return { + destroy() { + window.removeEventListener("click", handleClick); + }, + update, + }; } diff --git a/web-wallet/src/lib/mock-data/addresses.js b/web-wallet/src/lib/mock-data/addresses.js index fa58e35480..2b2f8f9258 100644 --- a/web-wallet/src/lib/mock-data/addresses.js +++ b/web-wallet/src/lib/mock-data/addresses.js @@ -1,6 +1,6 @@ export default [ - "2087290d3dc213d43e493f03f5435f99", - "ffbee869aca5ff5ee13c2706e5d9779d", - "06527a34e1c91fc5785ea7764a0c34b1", - "f62d307103ca54516b29fcedd5463d16" + "2087290d3dc213d43e493f03f5435f99", + "ffbee869aca5ff5ee13c2706e5d9779d", + "06527a34e1c91fc5785ea7764a0c34b1", + "f62d307103ca54516b29fcedd5463d16", ]; diff --git a/web-wallet/src/lib/mock-data/stakeInfo.js b/web-wallet/src/lib/mock-data/stakeInfo.js index 54022ad683..f29edd6446 100644 --- a/web-wallet/src/lib/mock-data/stakeInfo.js +++ b/web-wallet/src/lib/mock-data/stakeInfo.js @@ -2,8 +2,8 @@ /** @type {WalletStakeInfo} */ export default { - amount: 1000, - has_key: true, - has_staked: true, - reward: 500 + amount: 1000, + has_key: true, + has_staked: true, + reward: 500, }; diff --git a/web-wallet/src/lib/mock-data/transactions.js b/web-wallet/src/lib/mock-data/transactions.js index f30dd097f4..61ced30423 100644 --- a/web-wallet/src/lib/mock-data/transactions.js +++ b/web-wallet/src/lib/mock-data/transactions.js @@ -1,46 +1,53 @@ /* eslint-disable camelcase */ /** @type {Transaction[]} */ -export default [{ - amount: 25000, - block_height: 33458, - direction: "In", - fee: 1876, - id: "tg874534tddsghdtst54hdfh793h", - tx_type: "TRANSFER" -}, { - amount: -25000, - block_height: 33456, - direction: "In", - fee: 1876, - id: "tg874534tddsghdtst54hdfh791h", - tx_type: "TRANSFER" -}, { - amount: 25000, - block_height: 33455, - direction: "In", - fee: 1876, - id: "tg874534tddsghdtst54hdfh790h", - tx_type: "STAKE" -}, { - amount: -25000, - block_height: 33459, - direction: "In", - fee: 1876, - id: "tg874534tddsghdtst54hdfh794h", - tx_type: "TRANSFER" -}, { - amount: 27000, - block_height: 33460, - direction: "Out", - fee: 1876, - id: "tg874534tddsghdtst54hdfh795h", - tx_type: "STAKE" -}, { - amount: -25000, - block_height: 33457, - direction: "Out", - fee: 1876, - id: "tg874534tddsghdtst54hdfh792h", - tx_type: "TRANSFER" -}]; +export default [ + { + amount: 25000, + block_height: 33458, + direction: "In", + fee: 1876, + id: "tg874534tddsghdtst54hdfh793h", + tx_type: "TRANSFER", + }, + { + amount: -25000, + block_height: 33456, + direction: "In", + fee: 1876, + id: "tg874534tddsghdtst54hdfh791h", + tx_type: "TRANSFER", + }, + { + amount: 25000, + block_height: 33455, + direction: "In", + fee: 1876, + id: "tg874534tddsghdtst54hdfh790h", + tx_type: "STAKE", + }, + { + amount: -25000, + block_height: 33459, + direction: "In", + fee: 1876, + id: "tg874534tddsghdtst54hdfh794h", + tx_type: "TRANSFER", + }, + { + amount: 27000, + block_height: 33460, + direction: "Out", + fee: 1876, + id: "tg874534tddsghdtst54hdfh795h", + tx_type: "STAKE", + }, + { + amount: -25000, + block_height: 33457, + direction: "Out", + fee: 1876, + id: "tg874534tddsghdtst54hdfh792h", + tx_type: "TRANSFER", + }, +]; diff --git a/web-wallet/src/lib/navigation/__tests__/addBasePath.spec.js b/web-wallet/src/lib/navigation/__tests__/addBasePath.spec.js index 79e6f3a2f3..1cccf0107c 100644 --- a/web-wallet/src/lib/navigation/__tests__/addBasePath.spec.js +++ b/web-wallet/src/lib/navigation/__tests__/addBasePath.spec.js @@ -1,26 +1,22 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { base } from "$app/paths"; import { addBasePath } from ".."; describe("addBasePath", () => { - it("should add the base path to the received path if the received one is an absolute path", () => { - expect(addBasePath("/")).toBe(`${base}/`); - expect(addBasePath("/some-path")).toBe(`${base}/some-path`); - }); + it("should add the base path to the received path if the received one is an absolute path", () => { + expect(addBasePath("/")).toBe(`${base}/`); + expect(addBasePath("/some-path")).toBe(`${base}/some-path`); + }); - it("should add nothing if the received path is a relative one or a complete string URL", () => { - expect(addBasePath("foo/bar")).toBe("foo/bar"); - expect(addBasePath("http://example.com/")).toBe("http://example.com/"); - }); + it("should add nothing if the received path is a relative one or a complete string URL", () => { + expect(addBasePath("foo/bar")).toBe("foo/bar"); + expect(addBasePath("http://example.com/")).toBe("http://example.com/"); + }); - it("should add nothing if the received path is a URL object", () => { - const url = new URL("http://www.example.com/"); + it("should add nothing if the received path is a URL object", () => { + const url = new URL("http://www.example.com/"); - expect(addBasePath(url)).toBe(url); - }); + expect(addBasePath(url)).toBe(url); + }); }); diff --git a/web-wallet/src/lib/navigation/__tests__/goto.spec.js b/web-wallet/src/lib/navigation/__tests__/goto.spec.js index 77ad99ebe9..23f706316a 100644 --- a/web-wallet/src/lib/navigation/__tests__/goto.spec.js +++ b/web-wallet/src/lib/navigation/__tests__/goto.spec.js @@ -1,51 +1,44 @@ -import { - afterAll, - afterEach, - describe, - expect, - it, - vi -} from "vitest"; +import { afterAll, afterEach, describe, expect, it, vi } from "vitest"; import * as appNavigation from "$app/navigation"; import { base } from "$app/paths"; import { goto } from ".."; describe("goto", () => { - const gotoSpy = vi.spyOn(appNavigation, "goto"); + const gotoSpy = vi.spyOn(appNavigation, "goto"); - afterEach(() => { - gotoSpy.mockClear(); - }); + afterEach(() => { + gotoSpy.mockClear(); + }); - afterAll(() => { - gotoSpy.mockRestore(); - }); + afterAll(() => { + gotoSpy.mockRestore(); + }); - it("should add the defined base path to Svelte's `goto` calls for absolute paths", async () => { - await goto("/"); - await goto("/foo/path"); + it("should add the defined base path to Svelte's `goto` calls for absolute paths", async () => { + await goto("/"); + await goto("/foo/path"); - expect(gotoSpy).toHaveBeenCalledTimes(2); - expect(gotoSpy).toHaveBeenNthCalledWith(1, `${base}/`); - expect(gotoSpy).toHaveBeenNthCalledWith(2, `${base}/foo/path`); - }); + expect(gotoSpy).toHaveBeenCalledTimes(2); + expect(gotoSpy).toHaveBeenNthCalledWith(1, `${base}/`); + expect(gotoSpy).toHaveBeenNthCalledWith(2, `${base}/foo/path`); + }); - it("should add nothing for relative paths and complete string URLs", async () => { - await goto("foo/bar"); - await goto("http://example.com/"); + it("should add nothing for relative paths and complete string URLs", async () => { + await goto("foo/bar"); + await goto("http://example.com/"); - expect(gotoSpy).toHaveBeenCalledTimes(2); - expect(gotoSpy).toHaveBeenNthCalledWith(1, "foo/bar"); - expect(gotoSpy).toHaveBeenNthCalledWith(2, "http://example.com/"); - }); + expect(gotoSpy).toHaveBeenCalledTimes(2); + expect(gotoSpy).toHaveBeenNthCalledWith(1, "foo/bar"); + expect(gotoSpy).toHaveBeenNthCalledWith(2, "http://example.com/"); + }); - it("should do nothing if the received path is an URL object", async () => { - const url = new URL("http://www.example.com/"); + it("should do nothing if the received path is an URL object", async () => { + const url = new URL("http://www.example.com/"); - await goto(url); + await goto(url); - expect(gotoSpy).toHaveBeenCalledTimes(1); - expect(gotoSpy).toHaveBeenCalledWith(url); - }); + expect(gotoSpy).toHaveBeenCalledTimes(1); + expect(gotoSpy).toHaveBeenCalledWith(url); + }); }); diff --git a/web-wallet/src/lib/navigation/__tests__/logout.spec.js b/web-wallet/src/lib/navigation/__tests__/logout.spec.js index 1d38e76974..1dfc2f01cf 100644 --- a/web-wallet/src/lib/navigation/__tests__/logout.spec.js +++ b/web-wallet/src/lib/navigation/__tests__/logout.spec.js @@ -1,11 +1,4 @@ -import { - afterAll, - afterEach, - describe, - expect, - it, - vi -} from "vitest"; +import { afterAll, afterEach, describe, expect, it, vi } from "vitest"; import { walletStore } from "$lib/stores"; @@ -14,34 +7,34 @@ import * as navigation from ".."; vi.mock("$lib/stores/walletStore"); describe("logout", () => { - const gotoSpy = vi.spyOn(navigation, "goto"); - - afterEach(() => { - gotoSpy.mockClear(); - vi.mocked(walletStore.abortSync).mockClear(); - vi.mocked(walletStore.reset).mockClear(); - }); - - afterAll(() => { - gotoSpy.mockRestore(); - vi.doUnmock("$lib/stores/walletStore"); - }); - - it("should reset the wallet store and redirect the user to the homepage, if the logout is not forced", async () => { - await navigation.logout(false); - - expect(walletStore.abortSync).toHaveBeenCalledTimes(1); - expect(walletStore.reset).toHaveBeenCalledTimes(1); - expect(gotoSpy).toHaveBeenCalledTimes(1); - expect(gotoSpy).toHaveBeenCalledWith("/"); - }); - - it("should redirect to `/forced-logout` if the logout is forced", async () => { - await navigation.logout(true); - - expect(walletStore.abortSync).toHaveBeenCalledTimes(1); - expect(walletStore.reset).toHaveBeenCalledTimes(1); - expect(gotoSpy).toHaveBeenCalledTimes(1); - expect(gotoSpy).toHaveBeenCalledWith("/forced-logout"); - }); + const gotoSpy = vi.spyOn(navigation, "goto"); + + afterEach(() => { + gotoSpy.mockClear(); + vi.mocked(walletStore.abortSync).mockClear(); + vi.mocked(walletStore.reset).mockClear(); + }); + + afterAll(() => { + gotoSpy.mockRestore(); + vi.doUnmock("$lib/stores/walletStore"); + }); + + it("should reset the wallet store and redirect the user to the homepage, if the logout is not forced", async () => { + await navigation.logout(false); + + expect(walletStore.abortSync).toHaveBeenCalledTimes(1); + expect(walletStore.reset).toHaveBeenCalledTimes(1); + expect(gotoSpy).toHaveBeenCalledTimes(1); + expect(gotoSpy).toHaveBeenCalledWith("/"); + }); + + it("should redirect to `/forced-logout` if the logout is forced", async () => { + await navigation.logout(true); + + expect(walletStore.abortSync).toHaveBeenCalledTimes(1); + expect(walletStore.reset).toHaveBeenCalledTimes(1); + expect(gotoSpy).toHaveBeenCalledTimes(1); + expect(gotoSpy).toHaveBeenCalledWith("/forced-logout"); + }); }); diff --git a/web-wallet/src/lib/navigation/__tests__/redirect.spec.js b/web-wallet/src/lib/navigation/__tests__/redirect.spec.js index 86827b7266..348bafb46a 100644 --- a/web-wallet/src/lib/navigation/__tests__/redirect.spec.js +++ b/web-wallet/src/lib/navigation/__tests__/redirect.spec.js @@ -1,51 +1,44 @@ -import { - afterAll, - afterEach, - describe, - expect, - it, - vi -} from "vitest"; +import { afterAll, afterEach, describe, expect, it, vi } from "vitest"; import * as SvelteKit from "@sveltejs/kit"; import { base } from "$app/paths"; import { redirect } from ".."; describe("redirect", () => { - const redirectSpy = vi.spyOn(SvelteKit, "redirect"); + const redirectSpy = vi.spyOn(SvelteKit, "redirect"); - afterEach(() => { - redirectSpy.mockClear(); - }); + afterEach(() => { + redirectSpy.mockClear(); + }); - afterAll(() => { - redirectSpy.mockRestore(); - }); + afterAll(() => { + redirectSpy.mockRestore(); + }); - it("should add the defined base path to SvelteKit's `redirect` calls for absolute paths", () => { - redirect(300, "/"); - redirect(301, "/foo/path"); + it("should add the defined base path to SvelteKit's `redirect` calls for absolute paths", () => { + redirect(300, "/"); + redirect(301, "/foo/path"); - expect(redirectSpy).toHaveBeenCalledTimes(2); - expect(redirectSpy).toHaveBeenNthCalledWith(1, 300, `${base}/`); - expect(redirectSpy).toHaveBeenNthCalledWith(2, 301, `${base}/foo/path`); - }); + expect(redirectSpy).toHaveBeenCalledTimes(2); + expect(redirectSpy).toHaveBeenNthCalledWith(1, 300, `${base}/`); + expect(redirectSpy).toHaveBeenNthCalledWith(2, 301, `${base}/foo/path`); + }); - it("should add nothing for relative paths and complete string URLs", async () => { - redirect(300, "foo/bar"); - redirect(300, "http://example.com/"); + it("should add nothing for relative paths and complete string URLs", async () => { + redirect(300, "foo/bar"); + redirect(300, "http://example.com/"); - expect(redirectSpy).toHaveBeenCalledTimes(2); - expect(redirectSpy).toHaveBeenNthCalledWith(1, 300, "foo/bar"); - expect(redirectSpy).toHaveBeenNthCalledWith(2, 300, "http://example.com/"); - }); + expect(redirectSpy).toHaveBeenCalledTimes(2); + expect(redirectSpy).toHaveBeenNthCalledWith(1, 300, "foo/bar"); + expect(redirectSpy).toHaveBeenNthCalledWith(2, 300, "http://example.com/"); + }); - it("should do nothing if the received path is an URL object", async () => { - const url = new URL("http://www.example.com/"); + it("should do nothing if the received path is an URL object", async () => { + const url = new URL("http://www.example.com/"); - redirect(300, url); + redirect(300, url); - expect(redirectSpy).toHaveBeenCalledTimes(1); - expect(redirectSpy).toHaveBeenCalledWith(300, url); - }); + expect(redirectSpy).toHaveBeenCalledTimes(1); + expect(redirectSpy).toHaveBeenCalledWith(300, url); + }); }); diff --git a/web-wallet/src/lib/navigation/addBasePath.js b/web-wallet/src/lib/navigation/addBasePath.js index 0846da4ce4..39241e24d2 100644 --- a/web-wallet/src/lib/navigation/addBasePath.js +++ b/web-wallet/src/lib/navigation/addBasePath.js @@ -4,10 +4,7 @@ import { base } from "$app/paths"; * @template {string | URL} T * @param {T} path */ -const addBasePath = path => ( - path instanceof URL - ? path - : path.startsWith("/") ? `${base}${path}` : path -); +const addBasePath = (path) => + path instanceof URL ? path : path.startsWith("/") ? `${base}${path}` : path; export default addBasePath; diff --git a/web-wallet/src/lib/navigation/logout.js b/web-wallet/src/lib/navigation/logout.js index 95edf166ef..f18536895b 100644 --- a/web-wallet/src/lib/navigation/logout.js +++ b/web-wallet/src/lib/navigation/logout.js @@ -1,4 +1,3 @@ - import { goto } from "$lib/navigation"; import { walletStore } from "$lib/stores"; @@ -11,11 +10,11 @@ import { walletStore } from "$lib/stores"; * @param {boolean} isForced * @returns {ReturnType} */ -const logout = isForced => { - walletStore.abortSync(); - walletStore.reset(); +const logout = (isForced) => { + walletStore.abortSync(); + walletStore.reset(); - return goto(`/${isForced ? "forced-logout" : ""}`); + return goto(`/${isForced ? "forced-logout" : ""}`); }; export default logout; diff --git a/web-wallet/src/lib/services/loginInfoStorage/__tests__/index.spec.js b/web-wallet/src/lib/services/loginInfoStorage/__tests__/index.spec.js index dc64dd838f..45f0ad6562 100644 --- a/web-wallet/src/lib/services/loginInfoStorage/__tests__/index.spec.js +++ b/web-wallet/src/lib/services/loginInfoStorage/__tests__/index.spec.js @@ -1,65 +1,59 @@ -import { - afterEach, - describe, - expect, - it -} from "vitest"; -import { - isNull, - mapValuesWith, - unless -} from "lamb"; +import { afterEach, describe, expect, it } from "vitest"; +import { isNull, mapValuesWith, unless } from "lamb"; import { bytesToBase64 } from "$lib/dusk/base64"; import loginInfoStorage from ".."; describe("loginInfoStorage", () => { - const storeKey = `${CONFIG.LOCAL_STORAGE_APP_KEY}-login`; - const valuesToArray = unless(isNull, mapValuesWith(v => [...v])); - const valuesToBase64 = mapValuesWith(bytesToBase64); - const loginInfo = { - data: new TextEncoder().encode("some string"), - iv: Uint8Array.of(1, 2, 3, 4), - salt: Uint8Array.of(5, 6, 7, 8) - }; - const storedInfo = JSON.stringify(valuesToBase64(loginInfo)); - - afterEach(() => { - localStorage.clear(); - }); - - it("should expose a method to retrieve the login info from local storage and convert back its values to Uint8Array", () => { - localStorage.setItem(storeKey, storedInfo); - - const result = loginInfoStorage.get(); - - expect(result).toMatchObject({ - data: expect.any(Uint8Array), - iv: expect.any(Uint8Array), - salt: expect.any(Uint8Array) - }); - - // The `toStrictEqual` matcher doesn't play well with typed arrays in this case - expect(valuesToArray(result)).toStrictEqual(valuesToArray(loginInfo)); - }); - - it("should return `null` if there is no login info stored", () => { - expect(loginInfoStorage.get()).toBeNull(); - }); - - it("should expose a method to remove the login info from the local storage", () => { - localStorage.setItem(storeKey, storedInfo); - loginInfoStorage.remove(); - - expect(localStorage.getItem(storeKey)).toBeNull(); - }); - - it("should expose a method to set the login info and convert its values to base64 before serialization", () => { - loginInfoStorage.set(loginInfo); - - const stored = localStorage.getItem(storeKey); - - expect(stored).toBe(storedInfo); - }); + const storeKey = `${CONFIG.LOCAL_STORAGE_APP_KEY}-login`; + const valuesToArray = unless( + isNull, + mapValuesWith((v) => [...v]), + ); + const valuesToBase64 = mapValuesWith(bytesToBase64); + const loginInfo = { + data: new TextEncoder().encode("some string"), + iv: Uint8Array.of(1, 2, 3, 4), + salt: Uint8Array.of(5, 6, 7, 8), + }; + const storedInfo = JSON.stringify(valuesToBase64(loginInfo)); + + afterEach(() => { + localStorage.clear(); + }); + + it("should expose a method to retrieve the login info from local storage and convert back its values to Uint8Array", () => { + localStorage.setItem(storeKey, storedInfo); + + const result = loginInfoStorage.get(); + + expect(result).toMatchObject({ + data: expect.any(Uint8Array), + iv: expect.any(Uint8Array), + salt: expect.any(Uint8Array), + }); + + // The `toStrictEqual` matcher doesn't play well with typed arrays in this case + expect(valuesToArray(result)).toStrictEqual(valuesToArray(loginInfo)); + }); + + it("should return `null` if there is no login info stored", () => { + expect(loginInfoStorage.get()).toBeNull(); + }); + + it("should expose a method to remove the login info from the local storage", () => { + localStorage.setItem(storeKey, storedInfo); + loginInfoStorage.remove(); + + expect(localStorage.getItem(storeKey)).toBeNull(); + }); + + it("should expose a method to set the login info and convert its values to base64 before serialization", () => { + loginInfoStorage.set(loginInfo); + + const stored = localStorage.getItem(storeKey); + + expect(stored).toBe(storedInfo); + }); }); diff --git a/web-wallet/src/lib/services/loginInfoStorage/index.js b/web-wallet/src/lib/services/loginInfoStorage/index.js index 79f7f324cb..a4b4630f13 100644 --- a/web-wallet/src/lib/services/loginInfoStorage/index.js +++ b/web-wallet/src/lib/services/loginInfoStorage/index.js @@ -1,33 +1,28 @@ -import { - compose, - isNull, - mapValuesWith, - unless -} from "lamb"; +import { compose, isNull, mapValuesWith, unless } from "lamb"; -import { base64ToBytes, bytesToBase64 } from "$lib/dusk/base64"; +import { base64ToBytes, bytesToBase64 } from "$lib/dusk/base64"; const storeKey = `${CONFIG.LOCAL_STORAGE_APP_KEY}-login`; const fromStorageString = unless( - isNull, - compose(mapValuesWith(base64ToBytes), JSON.parse) + isNull, + compose(mapValuesWith(base64ToBytes), JSON.parse), ); const toStorageString = compose(JSON.stringify, mapValuesWith(bytesToBase64)); const loginInfoStorage = { - /** @returns {MnemonicEncryptInfo | null} */ - get () { - return fromStorageString(localStorage.getItem(storeKey)); - }, + /** @returns {MnemonicEncryptInfo | null} */ + get() { + return fromStorageString(localStorage.getItem(storeKey)); + }, - remove () { - localStorage.removeItem(storeKey); - }, + remove() { + localStorage.removeItem(storeKey); + }, - /** @param {MnemonicEncryptInfo} info */ - set (info) { - localStorage.setItem(storeKey, toStorageString(info)); - } + /** @param {MnemonicEncryptInfo} info */ + set(info) { + localStorage.setItem(storeKey, toStorageString(info)); + }, }; export default loginInfoStorage; diff --git a/web-wallet/src/lib/services/wallet/__tests__/getWallet.spec.js b/web-wallet/src/lib/services/wallet/__tests__/getWallet.spec.js index acc10e4d77..a220c097ff 100644 --- a/web-wallet/src/lib/services/wallet/__tests__/getWallet.spec.js +++ b/web-wallet/src/lib/services/wallet/__tests__/getWallet.spec.js @@ -1,9 +1,4 @@ -import { - describe, - expect, - it, - vi -} from "vitest"; +import { describe, expect, it, vi } from "vitest"; import { enumerables } from "lamb"; import { generateMnemonic } from "bip39"; @@ -13,16 +8,16 @@ import { getWallet } from ".."; vi.unmock("@dusk-network/dusk-wallet-js"); describe("getWallet", () => { - it("should get a Wallet instance using a seed", () => { - const mnemonic = generateMnemonic(); - const seed = getSeedFromMnemonic(mnemonic); - const wallet = getWallet(seed); - const walletPublicMembers = [ - ...enumerables(wallet), - ...Object.getOwnPropertyNames(Object.getPrototypeOf(wallet)) - ]; + it("should get a Wallet instance using a seed", () => { + const mnemonic = generateMnemonic(); + const seed = getSeedFromMnemonic(mnemonic); + const wallet = getWallet(seed); + const walletPublicMembers = [ + ...enumerables(wallet), + ...Object.getOwnPropertyNames(Object.getPrototypeOf(wallet)), + ]; - expect(walletPublicMembers).toMatchInlineSnapshot(` + expect(walletPublicMembers).toMatchInlineSnapshot(` [ "wasm", "seed", @@ -41,5 +36,5 @@ describe("getWallet", () => { "reset", ] `); - }); + }); }); diff --git a/web-wallet/src/lib/services/wallet/getWallet.js b/web-wallet/src/lib/services/wallet/getWallet.js index 302f988606..49016addef 100644 --- a/web-wallet/src/lib/services/wallet/getWallet.js +++ b/web-wallet/src/lib/services/wallet/getWallet.js @@ -1,4 +1,3 @@ - import { Wallet } from "@dusk-network/dusk-wallet-js"; /** @@ -9,6 +8,7 @@ import { Wallet } from "@dusk-network/dusk-wallet-js"; * @returns {Wallet} */ -const getWallet = (seed, gasLimit, gasPrice) => new Wallet(Array.from(seed), gasLimit, gasPrice); +const getWallet = (seed, gasLimit, gasPrice) => + new Wallet(Array.from(seed), gasLimit, gasPrice); export default getWallet; diff --git a/web-wallet/src/lib/stores/__tests__/walletStore.spec.js b/web-wallet/src/lib/stores/__tests__/walletStore.spec.js index 42b8903451..90620ba648 100644 --- a/web-wallet/src/lib/stores/__tests__/walletStore.spec.js +++ b/web-wallet/src/lib/stores/__tests__/walletStore.spec.js @@ -1,11 +1,11 @@ import { - afterAll, - afterEach, - beforeEach, - describe, - expect, - it, - vi + afterAll, + afterEach, + beforeEach, + describe, + expect, + it, + vi, } from "vitest"; import { get } from "svelte/store"; import { keys } from "lamb"; @@ -18,454 +18,492 @@ import { walletStore } from ".."; vi.useFakeTimers(); describe("walletStore", async () => { - const balance = { maximum: 100, value: 1 }; - const wallet = new Wallet([]); - - const getBalanceSpy = vi.spyOn(Wallet.prototype, "getBalance").mockResolvedValue(balance); - const getPsksSpy = vi.spyOn(Wallet.prototype, "getPsks").mockResolvedValue(addresses); - const historySpy = vi.spyOn(Wallet.prototype, "history").mockResolvedValue(transactions); - const resetSpy = vi.spyOn(Wallet.prototype, "reset").mockResolvedValue(void 0); - const stakeInfoSpy = vi.spyOn(Wallet.prototype, "stakeInfo").mockResolvedValue({}); - const stakeSpy = vi.spyOn(Wallet.prototype, "stake").mockResolvedValue(void 0); - const syncSpy = vi.spyOn(Wallet.prototype, "sync").mockResolvedValue(void 0); - const transferSpy = vi.spyOn(Wallet.prototype, "transfer").mockResolvedValue(void 0); - const unstakeSpy = vi.spyOn(Wallet.prototype, "unstake").mockResolvedValue(void 0); - const withdrawRewardSpy = vi.spyOn(Wallet.prototype, "withdrawReward").mockResolvedValue(void 0); - - const initialState = { - balance: { - maximum: 0, - value: 0 - }, - currentAddress: "", - error: null, - initialized: false, - isSyncing: false, - addresses: [] - }; - const initializedStore = { - ...initialState, - balance, - currentAddress: addresses[0], - initialized: true, - addresses: addresses - }; - const gas = { - price: 1, - limit: 30000000 - }; - - afterEach(() => { - getBalanceSpy.mockClear(); - getPsksSpy.mockClear(); - historySpy.mockClear(); - resetSpy.mockClear(); - stakeInfoSpy.mockClear(); - stakeSpy.mockClear(); - syncSpy.mockClear(); - transferSpy.mockClear(); - unstakeSpy.mockClear(); - withdrawRewardSpy.mockClear(); - }); - - afterAll(() => { - getBalanceSpy.mockRestore(); - getPsksSpy.mockRestore(); - historySpy.mockRestore(); - resetSpy.mockRestore(); - stakeInfoSpy.mockRestore(); - stakeSpy.mockRestore(); - syncSpy.mockRestore(); - transferSpy.mockRestore(); - unstakeSpy.mockRestore(); - withdrawRewardSpy.mockRestore(); - }); - - describe("Initialization and sync", () => { - it("should expose a `reset` method to bring back the store to its initial state", async () => { - await walletStore.init(wallet); - await vi.advanceTimersToNextTimerAsync(); - - expect(get(walletStore)).toStrictEqual(initializedStore); - - walletStore.reset(); - - expect(get(walletStore)).toStrictEqual(initialState); - }); - - it("should expose a method to initialize the store with a Wallet instance", async () => { - await walletStore.init(wallet); - - expect(get(walletStore)).toStrictEqual({ - ...initialState, - currentAddress: addresses[0], - error: null, - initialized: true, - isSyncing: true, - addresses: addresses - }); - - expect(getPsksSpy).toHaveBeenCalledTimes(1); - expect(getBalanceSpy).not.toHaveBeenCalled(); - - await vi.advanceTimersToNextTimerAsync(); - - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); - expect(getBalanceSpy).toHaveBeenCalledTimes(1); - expect(getBalanceSpy).toHaveBeenCalledWith(addresses[0]); - expect(get(walletStore)).toStrictEqual(initializedStore); - }); - - it("should set the sync error in the store if the sync fails", async () => { - walletStore.reset(); - - const storeWhileLoading = { - ...initialState, - currentAddress: addresses[0], - error: null, - initialized: true, - isSyncing: true, - addresses: addresses - }; - const error = new Error("sync failed"); - - syncSpy.mockRejectedValueOnce(error); - - await walletStore.init(wallet); - - expect(get(walletStore)).toStrictEqual(storeWhileLoading); - expect(getPsksSpy).toHaveBeenCalledTimes(1); - expect(getBalanceSpy).not.toHaveBeenCalled(); - - await vi.advanceTimersToNextTimerAsync(); - - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); - expect(getBalanceSpy).not.toHaveBeenCalled(); - expect(get(walletStore)).toStrictEqual({ - ...storeWhileLoading, - error, - isSyncing: false - }); + const balance = { maximum: 100, value: 1 }; + const wallet = new Wallet([]); + + const getBalanceSpy = vi + .spyOn(Wallet.prototype, "getBalance") + .mockResolvedValue(balance); + const getPsksSpy = vi + .spyOn(Wallet.prototype, "getPsks") + .mockResolvedValue(addresses); + const historySpy = vi + .spyOn(Wallet.prototype, "history") + .mockResolvedValue(transactions); + const resetSpy = vi + .spyOn(Wallet.prototype, "reset") + .mockResolvedValue(void 0); + const stakeInfoSpy = vi + .spyOn(Wallet.prototype, "stakeInfo") + .mockResolvedValue({}); + const stakeSpy = vi + .spyOn(Wallet.prototype, "stake") + .mockResolvedValue(void 0); + const syncSpy = vi.spyOn(Wallet.prototype, "sync").mockResolvedValue(void 0); + const transferSpy = vi + .spyOn(Wallet.prototype, "transfer") + .mockResolvedValue(void 0); + const unstakeSpy = vi + .spyOn(Wallet.prototype, "unstake") + .mockResolvedValue(void 0); + const withdrawRewardSpy = vi + .spyOn(Wallet.prototype, "withdrawReward") + .mockResolvedValue(void 0); + + const initialState = { + addresses: [], + balance: { + maximum: 0, + value: 0, + }, + currentAddress: "", + error: null, + initialized: false, + isSyncing: false, + }; + const initializedStore = { + ...initialState, + addresses: addresses, + balance, + currentAddress: addresses[0], + initialized: true, + }; + const gas = { + limit: 30000000, + price: 1, + }; + + afterEach(() => { + getBalanceSpy.mockClear(); + getPsksSpy.mockClear(); + historySpy.mockClear(); + resetSpy.mockClear(); + stakeInfoSpy.mockClear(); + stakeSpy.mockClear(); + syncSpy.mockClear(); + transferSpy.mockClear(); + unstakeSpy.mockClear(); + withdrawRewardSpy.mockClear(); + }); + + afterAll(() => { + getBalanceSpy.mockRestore(); + getPsksSpy.mockRestore(); + historySpy.mockRestore(); + resetSpy.mockRestore(); + stakeInfoSpy.mockRestore(); + stakeSpy.mockRestore(); + syncSpy.mockRestore(); + transferSpy.mockRestore(); + unstakeSpy.mockRestore(); + withdrawRewardSpy.mockRestore(); + }); + + describe("Initialization and sync", () => { + it("should expose a `reset` method to bring back the store to its initial state", async () => { + await walletStore.init(wallet); + await vi.advanceTimersToNextTimerAsync(); + + expect(get(walletStore)).toStrictEqual(initializedStore); + + walletStore.reset(); + + expect(get(walletStore)).toStrictEqual(initialState); + }); + + it("should expose a method to initialize the store with a Wallet instance", async () => { + await walletStore.init(wallet); + + expect(get(walletStore)).toStrictEqual({ + ...initialState, + addresses: addresses, + currentAddress: addresses[0], + error: null, + initialized: true, + isSyncing: true, + }); + + expect(getPsksSpy).toHaveBeenCalledTimes(1); + expect(getBalanceSpy).not.toHaveBeenCalled(); + + await vi.advanceTimersToNextTimerAsync(); + + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); + expect(getBalanceSpy).toHaveBeenCalledTimes(1); + expect(getBalanceSpy).toHaveBeenCalledWith(addresses[0]); + expect(get(walletStore)).toStrictEqual(initializedStore); + }); + + it("should set the sync error in the store if the sync fails", async () => { + walletStore.reset(); + + const storeWhileLoading = { + ...initialState, + addresses: addresses, + currentAddress: addresses[0], + error: null, + initialized: true, + isSyncing: true, + }; + const error = new Error("sync failed"); + + syncSpy.mockRejectedValueOnce(error); + + await walletStore.init(wallet); + + expect(get(walletStore)).toStrictEqual(storeWhileLoading); + expect(getPsksSpy).toHaveBeenCalledTimes(1); + expect(getBalanceSpy).not.toHaveBeenCalled(); + + await vi.advanceTimersToNextTimerAsync(); + + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); + expect(getBalanceSpy).not.toHaveBeenCalled(); + expect(get(walletStore)).toStrictEqual({ + ...storeWhileLoading, + error, + isSyncing: false, + }); - walletStore.reset(); - }); + walletStore.reset(); + }); - it("should throw an error when the synchronization is called without initializing the store first", async () => { - walletStore.reset(); + it("should throw an error when the synchronization is called without initializing the store first", async () => { + walletStore.reset(); - expect(() => walletStore.sync()).toThrow(); - }); + expect(() => walletStore.sync()).toThrow(); + }); - it("should return the pending sync promise if a sync is called while another one is in progress", async () => { - walletStore.reset(); + it("should return the pending sync promise if a sync is called while another one is in progress", async () => { + walletStore.reset(); - await walletStore.init(wallet); - await vi.advanceTimersToNextTimerAsync(); + await walletStore.init(wallet); + await vi.advanceTimersToNextTimerAsync(); - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); - syncSpy.mockClear(); + syncSpy.mockClear(); - const syncPromise1 = walletStore.sync(); - const syncPromise2 = walletStore.sync(); - const syncPromise3 = walletStore.sync(); + const syncPromise1 = walletStore.sync(); + const syncPromise2 = walletStore.sync(); + const syncPromise3 = walletStore.sync(); - expect(syncPromise1).toBe(syncPromise2); - expect(syncPromise1).toBe(syncPromise3); + expect(syncPromise1).toBe(syncPromise2); + expect(syncPromise1).toBe(syncPromise3); - await syncPromise1; + await syncPromise1; - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); - const syncPromise4 = walletStore.sync(); + const syncPromise4 = walletStore.sync(); - expect(syncPromise1).not.toBe(syncPromise4); - expect(syncSpy).toHaveBeenCalledTimes(2); + expect(syncPromise1).not.toBe(syncPromise4); + expect(syncSpy).toHaveBeenCalledTimes(2); - await syncPromise4; + await syncPromise4; - walletStore.reset(); - }); - }); + walletStore.reset(); + }); + }); - describe("Abort sync", () => { - const abortControllerSpy = vi.spyOn(AbortController.prototype, "abort"); + describe("Abort sync", () => { + const abortControllerSpy = vi.spyOn(AbortController.prototype, "abort"); - afterEach(() => { - abortControllerSpy.mockClear(); - }); + afterEach(() => { + abortControllerSpy.mockClear(); + }); - afterAll(() => { - abortControllerSpy.mockRestore(); - }); + afterAll(() => { + abortControllerSpy.mockRestore(); + }); - it("should expose a method to abort a sync that is in progress", async () => { - await walletStore.init(wallet); + it("should expose a method to abort a sync that is in progress", async () => { + await walletStore.init(wallet); - walletStore.abortSync(); + walletStore.abortSync(); - await vi.advanceTimersToNextTimerAsync(); + await vi.advanceTimersToNextTimerAsync(); - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); - expect(abortControllerSpy).toHaveBeenCalledTimes(1); - }); + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); + expect(abortControllerSpy).toHaveBeenCalledTimes(1); + }); - it("should do nothing if there is no sync in progress", async () => { - walletStore.reset(); + it("should do nothing if there is no sync in progress", async () => { + walletStore.reset(); - await walletStore.init(wallet); - await vi.advanceTimersToNextTimerAsync(); + await walletStore.init(wallet); + await vi.advanceTimersToNextTimerAsync(); - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(syncSpy).toHaveBeenCalledWith({ signal: expect.any(AbortSignal) }); - syncSpy.mockClear(); + syncSpy.mockClear(); - walletStore.abortSync(); + walletStore.abortSync(); - expect(abortControllerSpy).not.toHaveBeenCalled(); - }); - }); + expect(abortControllerSpy).not.toHaveBeenCalled(); + }); + }); - describe("Wallet store services", () => { - const currentAddress = addresses[0]; + describe("Wallet store services", () => { + const currentAddress = addresses[0]; - afterEach(() => { - walletStore.reset(); - }); + afterEach(() => { + walletStore.reset(); + }); - beforeEach(async () => { - await walletStore.init(wallet); - await vi.advanceTimersToNextTimerAsync(); + beforeEach(async () => { + await walletStore.init(wallet); + await vi.advanceTimersToNextTimerAsync(); - syncSpy.mockClear(); - }); + syncSpy.mockClear(); + }); - it("should expose a method to clear local data", async () => { - await walletStore.clearLocalData(); + it("should expose a method to clear local data", async () => { + await walletStore.clearLocalData(); - expect(resetSpy).toHaveBeenCalledTimes(1); - }); + expect(resetSpy).toHaveBeenCalledTimes(1); + }); - it("should expose a method to clear local data and then init the wallet", async () => { - getPsksSpy.mockClear(); - getBalanceSpy.mockClear(); - syncSpy.mockClear(); - walletStore.reset(); + it("should expose a method to clear local data and then init the wallet", async () => { + getPsksSpy.mockClear(); + getBalanceSpy.mockClear(); + syncSpy.mockClear(); + walletStore.reset(); - await walletStore.clearLocalDataAndInit(wallet); + await walletStore.clearLocalDataAndInit(wallet); - expect(get(walletStore)).toStrictEqual({ - ...initialState, - currentAddress: addresses[0], - error: null, - initialized: true, - isSyncing: true, - addresses: addresses - }); + expect(get(walletStore)).toStrictEqual({ + ...initialState, + addresses: addresses, + currentAddress: addresses[0], + error: null, + initialized: true, + isSyncing: true, + }); - await vi.advanceTimersToNextTimerAsync(); + await vi.advanceTimersToNextTimerAsync(); - expect(getPsksSpy).toHaveBeenCalledTimes(1); - expect(getBalanceSpy).toHaveBeenCalledTimes(1); - expect(getBalanceSpy).toHaveBeenCalledWith(addresses[0]); - expect(syncSpy).toHaveBeenCalledTimes(1); + expect(getPsksSpy).toHaveBeenCalledTimes(1); + expect(getBalanceSpy).toHaveBeenCalledTimes(1); + expect(getBalanceSpy).toHaveBeenCalledWith(addresses[0]); + expect(syncSpy).toHaveBeenCalledTimes(1); - await vi.advanceTimersToNextTimerAsync(); + await vi.advanceTimersToNextTimerAsync(); - expect(get(walletStore)).toStrictEqual(initializedStore); - }); + expect(get(walletStore)).toStrictEqual(initializedStore); + }); - it("should expose a method to retrieve the stake info", async () => { - await walletStore.getStakeInfo(); + it("should expose a method to retrieve the stake info", async () => { + await walletStore.getStakeInfo(); - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(stakeInfoSpy).toHaveBeenCalledTimes(1); - expect(stakeInfoSpy).toHaveBeenCalledWith(currentAddress); - expect(syncSpy.mock.invocationCallOrder[0]) - .toBeLessThan(stakeInfoSpy.mock.invocationCallOrder[0]); - }); - - it("should fix the returned stake info by adding the amount and the reward if they are missing", async () => { - stakeInfoSpy.mockResolvedValueOnce({ - "has_key": false, - "has_staked": false - }); - - const expected = { - "amount": 0, - "has_key": false, - "has_staked": false, - "reward": 0 - }; - const result = await walletStore.getStakeInfo(); - - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(stakeInfoSpy).toHaveBeenCalledTimes(1); - expect(stakeInfoSpy).toHaveBeenCalledWith(currentAddress); - expect(syncSpy.mock.invocationCallOrder[0]) - .toBeLessThan(stakeInfoSpy.mock.invocationCallOrder[0]); - expect(result).toStrictEqual(expected); - }); - - it("should expose a method to retrieve the transaction history", async () => { - await walletStore.getTransactionsHistory(); - - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(historySpy).toHaveBeenCalledTimes(1); - expect(historySpy).toHaveBeenCalledWith(currentAddress); - expect(syncSpy.mock.invocationCallOrder[0]) - .toBeLessThan(historySpy.mock.invocationCallOrder[0]); - }); - - it("should remove eventual duplicate transactions from the list", async () => { - historySpy.mockResolvedValueOnce(transactions.concat(transactions)); - - const result = await walletStore.getTransactionsHistory(); - - expect(result).toStrictEqual(transactions); - }); - - it("should expose a method to set the current address", async () => { - const setCurrentAddressSpy = vi.spyOn(walletStore, "setCurrentAddress"); - - await walletStore.setCurrentAddress(addresses[1]); - - expect(syncSpy).toHaveBeenCalledTimes(1); - expect(get(walletStore).currentAddress).toBe(addresses[1]); - expect(setCurrentAddressSpy.mock.invocationCallOrder[0]) - .toBeLessThan(syncSpy.mock.invocationCallOrder[0]); - - setCurrentAddressSpy.mockRestore(); - }); - - it("should return a rejected promise if the new address is not in the list", () => { - expect(walletStore.setCurrentAddress("foo bar")).rejects.toThrow(); - - expect(syncSpy).not.toHaveBeenCalled(); - expect(get(walletStore).currentAddress).toBe(currentAddress); - }); - - it("should expose a method to allow to stake an amount of Dusk", async () => { - await walletStore.stake(10, gas.price, gas.limit); - - expect(wallet.gasLimit).toBe(gas.limit); - expect(wallet.gasPrice).toBe(gas.price); - - expect(syncSpy).toHaveBeenCalledTimes(2); - expect(stakeSpy).toHaveBeenCalledTimes(1); - expect(stakeSpy).toHaveBeenCalledWith(currentAddress, 10); - expect(syncSpy.mock.invocationCallOrder[0]) - .toBeLessThan(stakeSpy.mock.invocationCallOrder[0]); - expect(syncSpy.mock.invocationCallOrder[1]) - .toBeGreaterThan(stakeSpy.mock.invocationCallOrder[0]); - }); - - it("should expose a method to allow to transfer an amount of Dusk", async () => { - await walletStore.transfer(addresses[1], 10, gas.price, gas.limit); - - expect(wallet.gasLimit).toBe(gas.limit); - expect(wallet.gasPrice).toBe(gas.price); - - expect(syncSpy).toHaveBeenCalledTimes(2); - expect(transferSpy).toHaveBeenCalledTimes(1); - expect(transferSpy).toHaveBeenCalledWith(currentAddress, addresses[1], 10); - expect(syncSpy.mock.invocationCallOrder[0]) - .toBeLessThan(transferSpy.mock.invocationCallOrder[0]); - expect(syncSpy.mock.invocationCallOrder[1]) - .toBeGreaterThan(transferSpy.mock.invocationCallOrder[0]); - }); - - it("should expose a method to allow to unstake the current address", async () => { - await walletStore.unstake(gas.price, gas.limit); - - expect(wallet.gasLimit).toBe(gas.limit); - expect(wallet.gasPrice).toBe(gas.price); - - expect(syncSpy).toHaveBeenCalledTimes(2); - expect(unstakeSpy).toHaveBeenCalledTimes(1); - expect(unstakeSpy).toHaveBeenCalledWith(currentAddress); - expect(syncSpy.mock.invocationCallOrder[0]) - .toBeLessThan(unstakeSpy.mock.invocationCallOrder[0]); - expect(syncSpy.mock.invocationCallOrder[1]) - .toBeGreaterThan(unstakeSpy.mock.invocationCallOrder[0]); - }); - - it("should expose a method to allow to withdraw a reward", async () => { - await walletStore.withdrawReward(gas.price, gas.limit); - - expect(wallet.gasLimit).toBe(gas.limit); - expect(wallet.gasPrice).toBe(gas.price); - - expect(syncSpy).toHaveBeenCalledTimes(2); - expect(withdrawRewardSpy).toHaveBeenCalledTimes(1); - expect(withdrawRewardSpy).toHaveBeenCalledWith(currentAddress); - expect(syncSpy.mock.invocationCallOrder[0]) - .toBeLessThan(withdrawRewardSpy.mock.invocationCallOrder[0]); - expect(syncSpy.mock.invocationCallOrder[1]) - .toBeGreaterThan(withdrawRewardSpy.mock.invocationCallOrder[0]); - }); - }); - - describe("State changing failures", () => { - /** @typedef {"stake" | "transfer" | "unstake" | "withdrawReward"} Operation */ - /** @type {Record>} */ - const operationsMap = { - stake: stakeSpy, - transfer: transferSpy, - unstake: unstakeSpy, - withdrawReward: withdrawRewardSpy - }; - const fakeFailure = new Error("operation failure"); - const fakeSuccess = {}; - const fakeSyncError = new Error("bad sync"); - - keys(operationsMap).forEach(operation => { - const spy = operationsMap[operation]; - - it("should return a resolved promise with the operation result if an operation succeeds", async () => { - await walletStore.init(wallet); - await vi.advanceTimersToNextTimerAsync(); - - syncSpy - .mockResolvedValueOnce(void 0) - .mockRejectedValueOnce(fakeSyncError); - spy.mockResolvedValueOnce(fakeSuccess); - - expect(get(walletStore).error).toBe(null); - - // @ts-ignore it's a mock and we don't care to pass the correct arguments - expect(await walletStore[operation]()).toBe(fakeSuccess); - expect(get(walletStore).error).toBe(fakeSyncError); - - walletStore.reset(); - }); - - it("should return a rejected promise with the operation error if an operation fails and try a sync afterwards nonetheless", async () => { - await walletStore.init(wallet); - await vi.advanceTimersToNextTimerAsync(); - - syncSpy - .mockResolvedValueOnce(void 0) - .mockRejectedValueOnce(fakeSyncError); - spy.mockRejectedValueOnce(fakeFailure); - - expect(get(walletStore).error).toBe(null); - - // @ts-ignore it's a mock and we don't care to pass the correct arguments - expect(walletStore[operation]()).rejects.toThrowError(fakeFailure); - - await vi.advanceTimersToNextTimerAsync(); - - expect(get(walletStore).error).toBe(fakeSyncError); - - walletStore.reset(); - }); - }); - }); + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(stakeInfoSpy).toHaveBeenCalledTimes(1); + expect(stakeInfoSpy).toHaveBeenCalledWith(currentAddress); + expect(syncSpy.mock.invocationCallOrder[0]).toBeLessThan( + stakeInfoSpy.mock.invocationCallOrder[0], + ); + }); + + it("should fix the returned stake info by adding the amount and the reward if they are missing", async () => { + stakeInfoSpy.mockResolvedValueOnce({ + /* eslint-disable camelcase */ + has_key: false, + has_staked: false, + /* eslint-enable camelcase */ + }); + + const expected = { + /* eslint-disable camelcase */ + amount: 0, + has_key: false, + has_staked: false, + reward: 0, + /* eslint-disable camelcase */ + }; + const result = await walletStore.getStakeInfo(); + + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(stakeInfoSpy).toHaveBeenCalledTimes(1); + expect(stakeInfoSpy).toHaveBeenCalledWith(currentAddress); + expect(syncSpy.mock.invocationCallOrder[0]).toBeLessThan( + stakeInfoSpy.mock.invocationCallOrder[0], + ); + expect(result).toStrictEqual(expected); + }); + + it("should expose a method to retrieve the transaction history", async () => { + await walletStore.getTransactionsHistory(); + + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(historySpy).toHaveBeenCalledTimes(1); + expect(historySpy).toHaveBeenCalledWith(currentAddress); + expect(syncSpy.mock.invocationCallOrder[0]).toBeLessThan( + historySpy.mock.invocationCallOrder[0], + ); + }); + + it("should remove eventual duplicate transactions from the list", async () => { + historySpy.mockResolvedValueOnce(transactions.concat(transactions)); + + const result = await walletStore.getTransactionsHistory(); + + expect(result).toStrictEqual(transactions); + }); + + it("should expose a method to set the current address", async () => { + const setCurrentAddressSpy = vi.spyOn(walletStore, "setCurrentAddress"); + + await walletStore.setCurrentAddress(addresses[1]); + + expect(syncSpy).toHaveBeenCalledTimes(1); + expect(get(walletStore).currentAddress).toBe(addresses[1]); + expect(setCurrentAddressSpy.mock.invocationCallOrder[0]).toBeLessThan( + syncSpy.mock.invocationCallOrder[0], + ); + + setCurrentAddressSpy.mockRestore(); + }); + + it("should return a rejected promise if the new address is not in the list", () => { + expect(walletStore.setCurrentAddress("foo bar")).rejects.toThrow(); + + expect(syncSpy).not.toHaveBeenCalled(); + expect(get(walletStore).currentAddress).toBe(currentAddress); + }); + + it("should expose a method to allow to stake an amount of Dusk", async () => { + await walletStore.stake(10, gas.price, gas.limit); + + expect(wallet.gasLimit).toBe(gas.limit); + expect(wallet.gasPrice).toBe(gas.price); + + expect(syncSpy).toHaveBeenCalledTimes(2); + expect(stakeSpy).toHaveBeenCalledTimes(1); + expect(stakeSpy).toHaveBeenCalledWith(currentAddress, 10); + expect(syncSpy.mock.invocationCallOrder[0]).toBeLessThan( + stakeSpy.mock.invocationCallOrder[0], + ); + expect(syncSpy.mock.invocationCallOrder[1]).toBeGreaterThan( + stakeSpy.mock.invocationCallOrder[0], + ); + }); + + it("should expose a method to allow to transfer an amount of Dusk", async () => { + await walletStore.transfer(addresses[1], 10, gas.price, gas.limit); + + expect(wallet.gasLimit).toBe(gas.limit); + expect(wallet.gasPrice).toBe(gas.price); + + expect(syncSpy).toHaveBeenCalledTimes(2); + expect(transferSpy).toHaveBeenCalledTimes(1); + expect(transferSpy).toHaveBeenCalledWith( + currentAddress, + addresses[1], + 10, + ); + expect(syncSpy.mock.invocationCallOrder[0]).toBeLessThan( + transferSpy.mock.invocationCallOrder[0], + ); + expect(syncSpy.mock.invocationCallOrder[1]).toBeGreaterThan( + transferSpy.mock.invocationCallOrder[0], + ); + }); + + it("should expose a method to allow to unstake the current address", async () => { + await walletStore.unstake(gas.price, gas.limit); + + expect(wallet.gasLimit).toBe(gas.limit); + expect(wallet.gasPrice).toBe(gas.price); + + expect(syncSpy).toHaveBeenCalledTimes(2); + expect(unstakeSpy).toHaveBeenCalledTimes(1); + expect(unstakeSpy).toHaveBeenCalledWith(currentAddress); + expect(syncSpy.mock.invocationCallOrder[0]).toBeLessThan( + unstakeSpy.mock.invocationCallOrder[0], + ); + expect(syncSpy.mock.invocationCallOrder[1]).toBeGreaterThan( + unstakeSpy.mock.invocationCallOrder[0], + ); + }); + + it("should expose a method to allow to withdraw a reward", async () => { + await walletStore.withdrawReward(gas.price, gas.limit); + + expect(wallet.gasLimit).toBe(gas.limit); + expect(wallet.gasPrice).toBe(gas.price); + + expect(syncSpy).toHaveBeenCalledTimes(2); + expect(withdrawRewardSpy).toHaveBeenCalledTimes(1); + expect(withdrawRewardSpy).toHaveBeenCalledWith(currentAddress); + expect(syncSpy.mock.invocationCallOrder[0]).toBeLessThan( + withdrawRewardSpy.mock.invocationCallOrder[0], + ); + expect(syncSpy.mock.invocationCallOrder[1]).toBeGreaterThan( + withdrawRewardSpy.mock.invocationCallOrder[0], + ); + }); + }); + + describe("State changing failures", () => { + /** @typedef {"stake" | "transfer" | "unstake" | "withdrawReward"} Operation */ + /** @type {Record>} */ + const operationsMap = { + stake: stakeSpy, + transfer: transferSpy, + unstake: unstakeSpy, + withdrawReward: withdrawRewardSpy, + }; + const fakeFailure = new Error("operation failure"); + const fakeSuccess = {}; + const fakeSyncError = new Error("bad sync"); + + keys(operationsMap).forEach((operation) => { + const spy = operationsMap[operation]; + + it("should return a resolved promise with the operation result if an operation succeeds", async () => { + await walletStore.init(wallet); + await vi.advanceTimersToNextTimerAsync(); + + syncSpy + .mockResolvedValueOnce(void 0) + .mockRejectedValueOnce(fakeSyncError); + spy.mockResolvedValueOnce(fakeSuccess); + + expect(get(walletStore).error).toBe(null); + + // @ts-ignore it's a mock and we don't care to pass the correct arguments + expect(await walletStore[operation]()).toBe(fakeSuccess); + expect(get(walletStore).error).toBe(fakeSyncError); + + walletStore.reset(); + }); + + it("should return a rejected promise with the operation error if an operation fails and try a sync afterwards nonetheless", async () => { + await walletStore.init(wallet); + await vi.advanceTimersToNextTimerAsync(); + + syncSpy + .mockResolvedValueOnce(void 0) + .mockRejectedValueOnce(fakeSyncError); + spy.mockRejectedValueOnce(fakeFailure); + + expect(get(walletStore).error).toBe(null); + + // @ts-ignore it's a mock and we don't care to pass the correct arguments + expect(walletStore[operation]()).rejects.toThrowError(fakeFailure); + + await vi.advanceTimersToNextTimerAsync(); + + expect(get(walletStore).error).toBe(fakeSyncError); + + walletStore.reset(); + }); + }); + }); }); diff --git a/web-wallet/src/lib/stores/gasStore.js b/web-wallet/src/lib/stores/gasStore.js index 8d25999db7..b280c7e382 100644 --- a/web-wallet/src/lib/stores/gasStore.js +++ b/web-wallet/src/lib/stores/gasStore.js @@ -1,9 +1,9 @@ import { readable } from "svelte/store"; const gasLimits = { - gasLimitLower: parseInt(import.meta.env.VITE_GAS_LIMIT_LOWER, 10), - gasLimitUpper: parseInt(import.meta.env.VITE_GAS_LIMIT_UPPER, 10), - gasPriceLower: parseInt(import.meta.env.VITE_GAS_PRICE_LOWER, 10) + gasLimitLower: parseInt(import.meta.env.VITE_GAS_LIMIT_LOWER, 10), + gasLimitUpper: parseInt(import.meta.env.VITE_GAS_LIMIT_UPPER, 10), + gasPriceLower: parseInt(import.meta.env.VITE_GAS_PRICE_LOWER, 10), }; const gasStore = readable(gasLimits); diff --git a/web-wallet/src/lib/stores/settingsStore.js b/web-wallet/src/lib/stores/settingsStore.js index 893b2cb3b4..9527ef3a55 100644 --- a/web-wallet/src/lib/stores/settingsStore.js +++ b/web-wallet/src/lib/stores/settingsStore.js @@ -2,26 +2,29 @@ import { persisted } from "svelte-persisted-store"; import { browser } from "$app/environment"; const initialState = { - currency: "USD", - darkMode: false, - dashboardTransactionLimit: 5, - gasLimit: parseInt(import.meta.env.VITE_GAS_LIMIT_DEFAULT, 10), - gasPrice: parseInt(import.meta.env.VITE_GAS_PRICE_DEFAULT, 10), - hideStakingNotice: false, - language: browser ? navigator.language : "en", - network: "testnet", - userId: "" + currency: "USD", + darkMode: false, + dashboardTransactionLimit: 5, + gasLimit: parseInt(import.meta.env.VITE_GAS_LIMIT_DEFAULT, 10), + gasPrice: parseInt(import.meta.env.VITE_GAS_PRICE_DEFAULT, 10), + hideStakingNotice: false, + language: browser ? navigator.language : "en", + network: "testnet", + userId: "", }; -const settingsStore = persisted(`${CONFIG.LOCAL_STORAGE_APP_KEY}-preferences`, initialState); +const settingsStore = persisted( + `${CONFIG.LOCAL_STORAGE_APP_KEY}-preferences`, + initialState, +); const { set, subscribe, update } = settingsStore; -function reset () { - set(initialState); +function reset() { + set(initialState); } export default { - reset, - set, - subscribe, - update + reset, + set, + subscribe, + update, }; diff --git a/web-wallet/src/lib/stores/stores.d.ts b/web-wallet/src/lib/stores/stores.d.ts index 7cd87d1ea2..7f2731be01 100644 --- a/web-wallet/src/lib/stores/stores.d.ts +++ b/web-wallet/src/lib/stores/stores.d.ts @@ -6,64 +6,79 @@ type TransactionsStoreContent = { transactions: Transaction[] }; type TransactionsStore = Readable; type WalletStoreContent = { - balance: { - maximum: number; - value: number; - }; - currentAddress: string; - error: Error | null; - initialized: boolean; - addresses: string[]; - isSyncing: boolean; + balance: { + maximum: number; + value: number; + }; + currentAddress: string; + error: Error | null; + initialized: boolean; + addresses: string[]; + isSyncing: boolean; }; type WalletStoreServices = { - abortSync: () => void; + abortSync: () => void; - clearLocalData: () => Promise; + clearLocalData: () => Promise; - clearLocalDataAndInit: (wallet: Wallet) => Promise; + clearLocalDataAndInit: (wallet: Wallet) => Promise; - getStakeInfo: () => Promise & ReturnType; + getStakeInfo: () => Promise & ReturnType; - // The return type apparently is not in a promise here - getTransactionsHistory: () => Promise>; + // The return type apparently is not in a promise here + getTransactionsHistory: () => Promise>; - init: (wallet: Wallet) => Promise; + init: (wallet: Wallet) => Promise; - reset: () => void; + reset: () => void; - setCurrentAddress: (address: string) => Promise; + setCurrentAddress: (address: string) => Promise; - stake: (amount: number, gasPrice: number, gasLimit: number) => Promise & ReturnType; + stake: ( + amount: number, + gasPrice: number, + gasLimit: number, + ) => Promise & ReturnType; - sync: () => Promise; + sync: () => Promise; - transfer: (to: string, amount: number, gasPrice: number, gasLimit: number) => Promise & ReturnType; + transfer: ( + to: string, + amount: number, + gasPrice: number, + gasLimit: number, + ) => Promise & ReturnType; - unstake: (gasPrice: number, gasLimit: number) => Promise & ReturnType; + unstake: ( + gasPrice: number, + gasLimit: number, + ) => Promise & ReturnType; - withdrawReward: (gasPrice: number, gasLimit: number) => Promise & ReturnType; + withdrawReward: ( + gasPrice: number, + gasLimit: number, + ) => Promise & ReturnType; }; type WalletStore = Readable & WalletStoreServices; type SettingsStore = { - currency: string; - darkMode: boolean; - dashboardTransactionLimit: number; - gasLimit: number; - gasPrice: number; - hideStakingNotice: boolean; - language: string; - network: string; - userId: string; + currency: string; + darkMode: boolean; + dashboardTransactionLimit: number; + gasLimit: number; + gasPrice: number; + hideStakingNotice: boolean; + language: string; + network: string; + userId: string; }; type GasStoreContent = { - gasLimitLower: number, - gasLimitUpper: number, - gasPriceLower: number -} + gasLimitLower: number; + gasLimitUpper: number; + gasPriceLower: number; +}; type GasStore = Readable; diff --git a/web-wallet/src/lib/stores/walletStore.js b/web-wallet/src/lib/stores/walletStore.js index 3cae84dfe4..0b62b3ff46 100644 --- a/web-wallet/src/lib/stores/walletStore.js +++ b/web-wallet/src/lib/stores/walletStore.js @@ -22,15 +22,15 @@ const uniquesById = uniquesBy(getKey("id")); /** @type {import("./stores").WalletStoreContent} */ const initialState = { - addresses: [], - balance: { - maximum: 0, - value: 0 - }, - currentAddress: "", - error: null, - initialized: false, - isSyncing: false + addresses: [], + balance: { + maximum: 0, + value: 0, + }, + currentAddress: "", + error: null, + initialized: false, + isSyncing: false, }; const walletStore = writable(initialState); @@ -44,16 +44,16 @@ const { set, subscribe } = walletStore; * @param {WalletStakeInfo} stakeInfo * @returns {WalletStakeInfo} */ -const fixStakeInfo = stakeInfo => ({ - ...stakeInfo, - amount: stakeInfo.amount ?? 0, - reward: stakeInfo.reward ?? 0 +const fixStakeInfo = (stakeInfo) => ({ + ...stakeInfo, + amount: stakeInfo.amount ?? 0, + reward: stakeInfo.reward ?? 0, }); const getCurrentAddress = () => get(walletStore).currentAddress; /** @type {(action: (...args: any[]) => Promise) => Promise} */ -const syncedAction = action => sync().then(action).finally(sync); +const syncedAction = (action) => sync().then(action).finally(sync); const abortSync = () => syncPromise && syncController?.abort(); @@ -61,151 +61,159 @@ const abortSync = () => syncPromise && syncController?.abort(); const clearLocalData = async () => walletInstance?.reset(); /** @type {(wallet: Wallet) => Promise} */ -const clearLocalDataAndInit = wallet => wallet.reset().then(() => init(wallet)); +const clearLocalDataAndInit = (wallet) => + wallet.reset().then(() => init(wallet)); /** @type {import("./stores").WalletStoreServices["getStakeInfo"]} */ -// @ts-expect-error -const getStakeInfo = async () => sync().then(() => walletInstance.stakeInfo(getCurrentAddress())) - .then(fixStakeInfo); +const getStakeInfo = async () => + sync() + // @ts-expect-error + .then(() => walletInstance.stakeInfo(getCurrentAddress())) + .then(fixStakeInfo); /** @type {GetTransactionsHistory} */ -// @ts-expect-error -const getTransactionsHistory = async () => sync().then(() => walletInstance.history(getCurrentAddress())) - .then(uniquesById); +const getTransactionsHistory = async () => + sync() + // @ts-expect-error + .then(() => walletInstance.history(getCurrentAddress())) + .then(uniquesById); -function reset () { - walletInstance = null; - set(initialState); +function reset() { + walletInstance = null; + set(initialState); } -async function updateAfterSync () { - const store = get(walletStore); +async function updateAfterSync() { + const store = get(walletStore); - // @ts-expect-error - const balance = await walletInstance.getBalance(store.currentAddress); + // @ts-expect-error + const balance = await walletInstance.getBalance(store.currentAddress); - set({ - ...store, - balance, - isSyncing: false - }); + set({ + ...store, + balance, + isSyncing: false, + }); } /** @param {Wallet} wallet */ -async function init (wallet) { - walletInstance = wallet; - - const addresses = await walletInstance.getPsks(); - const currentAddress = addresses[0]; - - set({ - ...initialState, - addresses, - currentAddress, - initialized: true - - }); - sync(); +async function init(wallet) { + walletInstance = wallet; + + const addresses = await walletInstance.getPsks(); + const currentAddress = addresses[0]; + + set({ + ...initialState, + addresses, + currentAddress, + initialized: true, + }); + sync(); } /** @type {import("./stores").WalletStoreServices["setCurrentAddress"]} */ -async function setCurrentAddress (address) { - const store = get(walletStore); +async function setCurrentAddress(address) { + const store = get(walletStore); - return store.addresses.includes(address) - ? Promise.resolve(set({ ...store, currentAddress: address })).then(sync) - : Promise.reject(new Error("The received address is not in the list")); + return store.addresses.includes(address) + ? Promise.resolve(set({ ...store, currentAddress: address })).then(sync) + : Promise.reject(new Error("The received address is not in the list")); } /** @type {import("./stores").WalletStoreServices["stake"]} */ -const stake = async (amount, gasPrice, gasLimit) => syncedAction(() => { - // @ts-expect-error - walletInstance.gasLimit = gasLimit; +const stake = async (amount, gasPrice, gasLimit) => + syncedAction(() => { + // @ts-expect-error + walletInstance.gasLimit = gasLimit; - // @ts-expect-error - walletInstance.gasPrice = gasPrice; + // @ts-expect-error + walletInstance.gasPrice = gasPrice; - // @ts-expect-error - return walletInstance.stake(getCurrentAddress(), amount); -}); + // @ts-expect-error + return walletInstance.stake(getCurrentAddress(), amount); + }); /** @type {import("./stores").WalletStoreServices["sync"]} */ -function sync () { - if (!walletInstance) { - throw new Error("No wallet instance to sync"); - } - - if (!syncPromise) { - const store = get(walletStore); - - set({ ...store, error: null, isSyncing: true }); - - syncController = new AbortController(); - syncPromise = walletInstance.sync({ signal: syncController.signal }).then( - updateAfterSync, - error => { set({ ...store, error, isSyncing: false }); } - ).finally(() => { syncPromise = null; }); - } - - return syncPromise; +function sync() { + if (!walletInstance) { + throw new Error("No wallet instance to sync"); + } + + if (!syncPromise) { + const store = get(walletStore); + + set({ ...store, error: null, isSyncing: true }); + + syncController = new AbortController(); + syncPromise = walletInstance + .sync({ signal: syncController.signal }) + .then(updateAfterSync, (error) => { + set({ ...store, error, isSyncing: false }); + }) + .finally(() => { + syncPromise = null; + }); + } + + return syncPromise; } /** @type {import("./stores").WalletStoreServices["transfer"]} */ -const transfer = async (to, amount, gasPrice, gasLimit) => syncedAction(() => { - // @ts-expect-error - walletInstance.gasLimit = gasLimit; - - // @ts-expect-error - walletInstance.gasPrice = gasPrice; - - // @ts-expect-error - return walletInstance.transfer( - getCurrentAddress(), - to, - amount - ); -}); +const transfer = async (to, amount, gasPrice, gasLimit) => + syncedAction(() => { + // @ts-expect-error + walletInstance.gasLimit = gasLimit; + + // @ts-expect-error + walletInstance.gasPrice = gasPrice; + + // @ts-expect-error + return walletInstance.transfer(getCurrentAddress(), to, amount); + }); /** @type {import("./stores").WalletStoreServices["unstake"]} */ -const unstake = async (gasPrice, gasLimit) => syncedAction(() => { - // @ts-expect-error - walletInstance.gasLimit = gasLimit; +const unstake = async (gasPrice, gasLimit) => + syncedAction(() => { + // @ts-expect-error + walletInstance.gasLimit = gasLimit; - // @ts-expect-error - walletInstance.gasPrice = gasPrice; + // @ts-expect-error + walletInstance.gasPrice = gasPrice; - // @ts-expect-error - return walletInstance.unstake(getCurrentAddress()); -}); + // @ts-expect-error + return walletInstance.unstake(getCurrentAddress()); + }); /** @type {import("./stores").WalletStoreServices["withdrawReward"]} */ -const withdrawReward = async (gasPrice, gasLimit) => syncedAction(() => { - // @ts-expect-error - walletInstance.gasLimit = gasLimit; +const withdrawReward = async (gasPrice, gasLimit) => + syncedAction(() => { + // @ts-expect-error + walletInstance.gasLimit = gasLimit; - // @ts-expect-error - walletInstance.gasPrice = gasPrice; + // @ts-expect-error + walletInstance.gasPrice = gasPrice; - // @ts-expect-error - return walletInstance.withdrawReward(getCurrentAddress()); -}); + // @ts-expect-error + return walletInstance.withdrawReward(getCurrentAddress()); + }); /** @type {import("./stores").WalletStore} */ export default { - abortSync, - clearLocalData, - clearLocalDataAndInit, - getStakeInfo, - getTransactionsHistory, - init, - reset, - setCurrentAddress, - stake, - subscribe, - sync, - transfer, - unstake, - withdrawReward + abortSync, + clearLocalData, + clearLocalDataAndInit, + getStakeInfo, + getTransactionsHistory, + init, + reset, + setCurrentAddress, + stake, + subscribe, + sync, + transfer, + unstake, + withdrawReward, }; diff --git a/web-wallet/src/lib/transactions/__tests__/sortByHeightDesc.spec.js b/web-wallet/src/lib/transactions/__tests__/sortByHeightDesc.spec.js index 315901c81c..65aa02403b 100644 --- a/web-wallet/src/lib/transactions/__tests__/sortByHeightDesc.spec.js +++ b/web-wallet/src/lib/transactions/__tests__/sortByHeightDesc.spec.js @@ -1,17 +1,15 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { transactions } from "$lib/mock-data"; import { sortByHeightDesc } from ".."; describe("sortByHeightDesc", () => { - it("should sort the list of transaction by `block_height` desc", () => { - const expected = transactions.slice().sort((a, b) => b.block_height - a.block_height); + it("should sort the list of transaction by `block_height` desc", () => { + const expected = transactions + .slice() + .sort((a, b) => b.block_height - a.block_height); - expect(sortByHeightDesc(transactions)).toStrictEqual(expected); - }); + expect(sortByHeightDesc(transactions)).toStrictEqual(expected); + }); }); diff --git a/web-wallet/src/lib/transactions/getLastTransactionHash.js b/web-wallet/src/lib/transactions/getLastTransactionHash.js index 342e1efc1e..c43e57e95e 100644 --- a/web-wallet/src/lib/transactions/getLastTransactionHash.js +++ b/web-wallet/src/lib/transactions/getLastTransactionHash.js @@ -1,9 +1,4 @@ -import { - always, - compose, - getKey, - head -} from "lamb"; +import { always, compose, getKey, head } from "lamb"; import { walletStore } from "$lib/stores"; @@ -12,9 +7,11 @@ import sortByHeightDesc from "./sortByHeightDesc"; const getFirstHash = compose(getKey("id"), head); /** @type {() => Promise} */ -const getLastTransactionHash = () => walletStore.getTransactionsHistory() - .then(sortByHeightDesc) - .then(getFirstHash) - .catch(always("")); +const getLastTransactionHash = () => + walletStore + .getTransactionsHistory() + .then(sortByHeightDesc) + .then(getFirstHash) + .catch(always("")); export default getLastTransactionHash; diff --git a/web-wallet/src/lib/transactions/transactions.d.ts b/web-wallet/src/lib/transactions/transactions.d.ts index 4e7bb1bd88..86835e95f0 100644 --- a/web-wallet/src/lib/transactions/transactions.d.ts +++ b/web-wallet/src/lib/transactions/transactions.d.ts @@ -1,8 +1,8 @@ type Transaction = { - amount: number, - block_height: number, - direction: string, - fee: number, - id: string, - tx_type: string + amount: number; + block_height: number; + direction: string; + fee: number; + id: string; + tx_type: string; }; diff --git a/web-wallet/src/lib/wallet/__tests__/decryptMnemonic.spec.js b/web-wallet/src/lib/wallet/__tests__/decryptMnemonic.spec.js index 48f433b478..fb4afb565c 100644 --- a/web-wallet/src/lib/wallet/__tests__/decryptMnemonic.spec.js +++ b/web-wallet/src/lib/wallet/__tests__/decryptMnemonic.spec.js @@ -1,20 +1,16 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { generateMnemonic } from "bip39"; import { decryptMnemonic, encryptMnemonic } from ".."; describe("decryptMnemonic", () => { - const mnemonic = generateMnemonic(); - const pwd = "some password"; + const mnemonic = generateMnemonic(); + const pwd = "some password"; - it("should be able to decrypt the mnemonic phrase using the given password", async () => { - const mnemonicEncryptInfo = await encryptMnemonic(mnemonic, pwd); - const decrypted = await decryptMnemonic(mnemonicEncryptInfo, pwd); + it("should be able to decrypt the mnemonic phrase using the given password", async () => { + const mnemonicEncryptInfo = await encryptMnemonic(mnemonic, pwd); + const decrypted = await decryptMnemonic(mnemonicEncryptInfo, pwd); - expect(decrypted).toBe(mnemonic); - }); + expect(decrypted).toBe(mnemonic); + }); }); diff --git a/web-wallet/src/lib/wallet/__tests__/encryptMnemonic.spec.js b/web-wallet/src/lib/wallet/__tests__/encryptMnemonic.spec.js index cf1e8196a2..6a0161738a 100644 --- a/web-wallet/src/lib/wallet/__tests__/encryptMnemonic.spec.js +++ b/web-wallet/src/lib/wallet/__tests__/encryptMnemonic.spec.js @@ -1,25 +1,21 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { generateMnemonic } from "bip39"; import { encryptMnemonic } from ".."; describe("encryptMnemonic", () => { - const mnemonic = generateMnemonic(); - const pwd = "some password"; + const mnemonic = generateMnemonic(); + const pwd = "some password"; - it("should be able to encrypt the mnemonic phrase using the given password", async () => { - const result = await encryptMnemonic(mnemonic, pwd); + it("should be able to encrypt the mnemonic phrase using the given password", async () => { + const result = await encryptMnemonic(mnemonic, pwd); - expect(result).toMatchObject({ - data: expect.any(Uint8Array), - iv: expect.any(Uint8Array), - salt: expect.any(Uint8Array) - }); - expect(result.iv.length).toBe(12); - expect(result.salt.length).toBe(32); - }); + expect(result).toMatchObject({ + data: expect.any(Uint8Array), + iv: expect.any(Uint8Array), + salt: expect.any(Uint8Array), + }); + expect(result.iv.length).toBe(12); + expect(result.salt.length).toBe(32); + }); }); diff --git a/web-wallet/src/lib/wallet/__tests__/getSeedFromMnemonic.spec.js b/web-wallet/src/lib/wallet/__tests__/getSeedFromMnemonic.spec.js index 67d6fb6708..0c128d7e3c 100644 --- a/web-wallet/src/lib/wallet/__tests__/getSeedFromMnemonic.spec.js +++ b/web-wallet/src/lib/wallet/__tests__/getSeedFromMnemonic.spec.js @@ -1,17 +1,13 @@ -import { - describe, - expect, - it -} from "vitest"; +import { describe, expect, it } from "vitest"; import { generateMnemonic } from "bip39"; import { getSeedFromMnemonic } from ".."; describe("getSeedFromMnemonic", () => { - it("should convert a mnemonic phrase into a seed of 64 bytes", () => { - const mnemonic = generateMnemonic(); - const seed = getSeedFromMnemonic(mnemonic); + it("should convert a mnemonic phrase into a seed of 64 bytes", () => { + const mnemonic = generateMnemonic(); + const seed = getSeedFromMnemonic(mnemonic); - expect(seed).toBeInstanceOf(Uint8Array); - expect(seed.byteLength).toBe(64); - }); + expect(seed).toBeInstanceOf(Uint8Array); + expect(seed.byteLength).toBe(64); + }); }); diff --git a/web-wallet/src/lib/wallet/decryptMnemonic.js b/web-wallet/src/lib/wallet/decryptMnemonic.js index 7f65708e71..293ddaaffd 100644 --- a/web-wallet/src/lib/wallet/decryptMnemonic.js +++ b/web-wallet/src/lib/wallet/decryptMnemonic.js @@ -5,12 +5,16 @@ import getDerivedKey from "./getDerivedKey"; * @param {String} pwd * @returns {Promise} */ -async function decryptMnemonic (mnemonicEncryptInfo, pwd) { - const { data, iv, salt } = mnemonicEncryptInfo; - const key = await getDerivedKey(pwd, salt); - const plaintext = await crypto.subtle.decrypt({ iv, name: "AES-GCM" }, key, data); +async function decryptMnemonic(mnemonicEncryptInfo, pwd) { + const { data, iv, salt } = mnemonicEncryptInfo; + const key = await getDerivedKey(pwd, salt); + const plaintext = await crypto.subtle.decrypt( + { iv, name: "AES-GCM" }, + key, + data, + ); - return new TextDecoder().decode(plaintext); + return new TextDecoder().decode(plaintext); } export default decryptMnemonic; diff --git a/web-wallet/src/lib/wallet/encryptMnemonic.js b/web-wallet/src/lib/wallet/encryptMnemonic.js index 8a4d30f470..98240f79fc 100644 --- a/web-wallet/src/lib/wallet/encryptMnemonic.js +++ b/web-wallet/src/lib/wallet/encryptMnemonic.js @@ -5,14 +5,16 @@ import getDerivedKey from "./getDerivedKey"; * @param {String} pwd * @returns {Promise} */ -async function encryptMnemonic (mnemonic, pwd) { - const plaintext = new TextEncoder().encode(mnemonic); - const salt = crypto.getRandomValues(new Uint8Array(32)); - const iv = crypto.getRandomValues(new Uint8Array(12)); - const key = await getDerivedKey(pwd, salt); - const data = new Uint8Array(await crypto.subtle.encrypt({ iv, name: "AES-GCM" }, key, plaintext)); +async function encryptMnemonic(mnemonic, pwd) { + const plaintext = new TextEncoder().encode(mnemonic); + const salt = crypto.getRandomValues(new Uint8Array(32)); + const iv = crypto.getRandomValues(new Uint8Array(12)); + const key = await getDerivedKey(pwd, salt); + const data = new Uint8Array( + await crypto.subtle.encrypt({ iv, name: "AES-GCM" }, key, plaintext), + ); - return { data, iv, salt }; + return { data, iv, salt }; } export default encryptMnemonic; diff --git a/web-wallet/src/lib/wallet/getDerivedKey.js b/web-wallet/src/lib/wallet/getDerivedKey.js index 24c0599626..ec927b02b8 100644 --- a/web-wallet/src/lib/wallet/getDerivedKey.js +++ b/web-wallet/src/lib/wallet/getDerivedKey.js @@ -2,30 +2,32 @@ * @param {String} pwd * @returns {Promise} */ -const getKeyMaterial = pwd => crypto.subtle.importKey( - "raw", - new TextEncoder().encode(pwd), - "PBKDF2", - false, - ["deriveBits", "deriveKey"] -); +const getKeyMaterial = (pwd) => + crypto.subtle.importKey( + "raw", + new TextEncoder().encode(pwd), + "PBKDF2", + false, + ["deriveBits", "deriveKey"], + ); /** * @param {String} pwd * @param {Uint8Array} salt * @returns {Promise} */ -const getDerivedKey = async (pwd, salt) => crypto.subtle.deriveKey( - { - hash: "SHA-256", - iterations: 10000, - name: "PBKDF2", - salt - }, - await getKeyMaterial(pwd), - { length: 256, name: "AES-GCM" }, - true, - ["encrypt", "decrypt"] -); +const getDerivedKey = async (pwd, salt) => + crypto.subtle.deriveKey( + { + hash: "SHA-256", + iterations: 10000, + name: "PBKDF2", + salt, + }, + await getKeyMaterial(pwd), + { length: 256, name: "AES-GCM" }, + true, + ["encrypt", "decrypt"], + ); export default getDerivedKey; diff --git a/web-wallet/src/lib/wallet/getSeedFromMnemonic.js b/web-wallet/src/lib/wallet/getSeedFromMnemonic.js index cdbb254fcf..03ccc72892 100644 --- a/web-wallet/src/lib/wallet/getSeedFromMnemonic.js +++ b/web-wallet/src/lib/wallet/getSeedFromMnemonic.js @@ -4,6 +4,7 @@ import { mnemonicToSeedSync } from "bip39"; * @param {String} mnemonic * @returns {Uint8Array} */ -const getSeedFromMnemonic = mnemonic => Uint8Array.from(mnemonicToSeedSync(mnemonic)); +const getSeedFromMnemonic = (mnemonic) => + Uint8Array.from(mnemonicToSeedSync(mnemonic)); export default getSeedFromMnemonic; diff --git a/web-wallet/src/lib/wallet/initializeWallet.js b/web-wallet/src/lib/wallet/initializeWallet.js index 2fba1df25c..35395e05c0 100644 --- a/web-wallet/src/lib/wallet/initializeWallet.js +++ b/web-wallet/src/lib/wallet/initializeWallet.js @@ -4,17 +4,17 @@ import { getWallet } from "$lib/services/wallet"; import { setKey } from "lamb"; /** @param {string[]} mnemonicPhrase */ -async function initializeWallet (mnemonicPhrase) { - settingsStore.reset(); +async function initializeWallet(mnemonicPhrase) { + settingsStore.reset(); - const mnemonic = mnemonicPhrase.join(" "); - const seed = getSeedFromMnemonic(mnemonic); - const wallet = getWallet(seed); - const defaultAddress = (await wallet.getPsks())[0]; + const mnemonic = mnemonicPhrase.join(" "); + const seed = getSeedFromMnemonic(mnemonic); + const wallet = getWallet(seed); + const defaultAddress = (await wallet.getPsks())[0]; - await walletStore.clearLocalDataAndInit(wallet); + await walletStore.clearLocalDataAndInit(wallet); - settingsStore.update(setKey("userId", defaultAddress)); + settingsStore.update(setKey("userId", defaultAddress)); } export default initializeWallet; diff --git a/web-wallet/src/lib/wallet/refreshLocalStoragePasswordInfo.js b/web-wallet/src/lib/wallet/refreshLocalStoragePasswordInfo.js index a26d4fe5db..bf37e12926 100644 --- a/web-wallet/src/lib/wallet/refreshLocalStoragePasswordInfo.js +++ b/web-wallet/src/lib/wallet/refreshLocalStoragePasswordInfo.js @@ -4,16 +4,16 @@ import { encryptMnemonic } from "$lib/wallet"; /** * @param {string[]} mnemonicPhrase * @param {string} password -*/ -async function refreshLocalStoragePasswordInfo (mnemonicPhrase, password) { - loginInfoStorage.remove(); + */ +async function refreshLocalStoragePasswordInfo(mnemonicPhrase, password) { + loginInfoStorage.remove(); - if (password.length !== 0) { - const mnemonic = mnemonicPhrase.join(" "); - const encryptedData = await encryptMnemonic(mnemonic, password); + if (password.length !== 0) { + const mnemonic = mnemonicPhrase.join(" "); + const encryptedData = await encryptMnemonic(mnemonic, password); - loginInfoStorage.set(encryptedData); - } + loginInfoStorage.set(encryptedData); + } } export default refreshLocalStoragePasswordInfo; diff --git a/web-wallet/src/lib/wallet/wallet.d.ts b/web-wallet/src/lib/wallet/wallet.d.ts index 1001f1a6a5..5be373d72d 100644 --- a/web-wallet/src/lib/wallet/wallet.d.ts +++ b/web-wallet/src/lib/wallet/wallet.d.ts @@ -1,12 +1,12 @@ type MnemonicEncryptInfo = { - data: Uint8Array; - iv: Uint8Array; - salt: Uint8Array; + data: Uint8Array; + iv: Uint8Array; + salt: Uint8Array; }; type WalletStakeInfo = { - amount: number, - reward: number, - has_key: boolean, - has_staked: boolean + amount: number; + reward: number; + has_key: boolean; + has_staked: boolean; }; diff --git a/web-wallet/src/routes/(app)/+layout.js b/web-wallet/src/routes/(app)/+layout.js index c4b073527b..cd3a5adbf1 100644 --- a/web-wallet/src/routes/(app)/+layout.js +++ b/web-wallet/src/routes/(app)/+layout.js @@ -4,8 +4,8 @@ import { get } from "svelte/store"; import walletStore from "$lib/stores/walletStore"; /** @type {import("./$types").LayoutLoad} */ -export async function load () { - if (!get(walletStore).initialized) { - throw redirect(307, "/"); - } +export async function load() { + if (!get(walletStore).initialized) { + throw redirect(307, "/"); + } } diff --git a/web-wallet/src/routes/(app)/+layout.svelte b/web-wallet/src/routes/(app)/+layout.svelte index ac1684f30e..f5c0590438 100644 --- a/web-wallet/src/routes/(app)/+layout.svelte +++ b/web-wallet/src/routes/(app)/+layout.svelte @@ -19,6 +19,6 @@ } - + - + diff --git a/web-wallet/src/routes/(app)/__mocks__/mockedWalletStore.js b/web-wallet/src/routes/(app)/__mocks__/mockedWalletStore.js index 31c2825bbb..1161155c0b 100644 --- a/web-wallet/src/routes/(app)/__mocks__/mockedWalletStore.js +++ b/web-wallet/src/routes/(app)/__mocks__/mockedWalletStore.js @@ -6,12 +6,12 @@ const currentAddress = addresses[0]; /** @type {import("$lib/stores/stores").WalletStoreContent} */ const content = { - addresses, - balance, - currentAddress, - error: null, - initialized: true, - isSyncing: false + addresses, + balance, + currentAddress, + error: null, + initialized: true, + isSyncing: false, }; export default mockReadableStore(content); diff --git a/web-wallet/src/routes/(app)/__tests__/layout.spec.js b/web-wallet/src/routes/(app)/__tests__/layout.spec.js index f3f750ed4b..975877c604 100644 --- a/web-wallet/src/routes/(app)/__tests__/layout.spec.js +++ b/web-wallet/src/routes/(app)/__tests__/layout.spec.js @@ -1,17 +1,13 @@ import { - afterAll, - afterEach, - beforeEach, - describe, - expect, - it, - vi + afterAll, + afterEach, + beforeEach, + describe, + expect, + it, + vi, } from "vitest"; -import { - cleanup, - fireEvent, - render -} from "@testing-library/svelte"; +import { cleanup, fireEvent, render } from "@testing-library/svelte"; import { Wallet } from "@dusk-network/dusk-wallet-js"; import * as navigation from "$lib/navigation"; @@ -22,109 +18,115 @@ import { load } from "../+layout"; import Layout from "../+layout.svelte"; describe("App layout.js", () => { - const getPsksSpy = vi.spyOn(Wallet.prototype, "getPsks").mockResolvedValue(addresses); - const redirectSpy = vi.spyOn(navigation, "redirect"); + const getPsksSpy = vi + .spyOn(Wallet.prototype, "getPsks") + .mockResolvedValue(addresses); + const redirectSpy = vi.spyOn(navigation, "redirect"); - afterEach(() => { - getPsksSpy.mockClear(); - redirectSpy.mockClear(); - }); + afterEach(() => { + getPsksSpy.mockClear(); + redirectSpy.mockClear(); + }); - afterAll(() => { - getPsksSpy.mockRestore(); - redirectSpy.mockRestore(); - }); + afterAll(() => { + getPsksSpy.mockRestore(); + redirectSpy.mockRestore(); + }); - it("should check if a wallet is missing in the `walletStore` and redirect the user to the login page", async () => { - // @ts-ignore - await expect(load()).rejects.toThrow(); + it("should check if a wallet is missing in the `walletStore` and redirect the user to the login page", async () => { + // @ts-ignore + await expect(load()).rejects.toThrow(); - expect(redirectSpy).toHaveBeenCalledTimes(1); - expect(redirectSpy).toHaveBeenCalledWith(307, "/"); - }); + expect(redirectSpy).toHaveBeenCalledTimes(1); + expect(redirectSpy).toHaveBeenCalledWith(307, "/"); + }); - it("should do nothing otherwise", async () => { - await walletStore.init(new Wallet([], 0, 0)); + it("should do nothing otherwise", async () => { + await walletStore.init(new Wallet([], 0, 0)); - // @ts-ignore - await expect(load()).resolves.toBe(void 0); + // @ts-ignore + await expect(load()).resolves.toBe(void 0); - expect(redirectSpy).not.toHaveBeenCalled(); - }); + expect(redirectSpy).not.toHaveBeenCalled(); + }); }); describe("App layout.svelte", () => { - const logoutSpy = vi.spyOn(navigation, "logout"); - const removeListenerSpy = vi.spyOn(window, "removeEventListener"); - const key = `${CONFIG.LOCAL_STORAGE_APP_KEY}-preferences`; - const storage = { - a: 1, - b: { c: "some string" }, - userId: "user-1" - }; - const eventData = { - key, - newValue: JSON.stringify({ ...storage, userId: "user-2" }), - oldValue: JSON.stringify(storage), - storageArea: localStorage - }; - - beforeEach(() => { - removeListenerSpy.mockClear(); - }); - - afterEach(() => { - cleanup(); - logoutSpy.mockClear(); - }); - - afterAll(() => { - logoutSpy.mockRestore(); - removeListenerSpy.mockRestore(); - }); - - it("should react to storage changes and logout the user if the `userId` changed", async () => { - render(Layout); - - await fireEvent(window, new StorageEvent("storage", eventData)); - - expect(removeListenerSpy).toHaveBeenCalledTimes(1); - expect(removeListenerSpy).toHaveBeenNthCalledWith(1, "storage", expect.any(Function)); - expect(logoutSpy).toHaveBeenCalledTimes(1); - expect(logoutSpy).toHaveBeenCalledWith(true); - }); - - it("should do nothing if the `userId` remained the same", async () => { - const data = { - ...eventData, - newValue: JSON.stringify({ - ...storage, - a: 5, - b: "foo" - }) - }; - - render(Layout); - - await fireEvent(window, new StorageEvent("storage", data)); - - expect(removeListenerSpy).not.toHaveBeenCalled(); - expect(logoutSpy).not.toHaveBeenCalled(); - }); - - it("should do nothing if the storage change hasn't happened in the preferences", async () => { - const data = { - ...eventData, - key: "some-key", - newValue: "\"{}\"", - oldValue: null - }; - - render(Layout); - - await fireEvent(window, new StorageEvent("storage", data)); - - expect(removeListenerSpy).not.toHaveBeenCalled(); - expect(logoutSpy).not.toHaveBeenCalled(); - }); + const logoutSpy = vi.spyOn(navigation, "logout"); + const removeListenerSpy = vi.spyOn(window, "removeEventListener"); + const key = `${CONFIG.LOCAL_STORAGE_APP_KEY}-preferences`; + const storage = { + a: 1, + b: { c: "some string" }, + userId: "user-1", + }; + const eventData = { + key, + newValue: JSON.stringify({ ...storage, userId: "user-2" }), + oldValue: JSON.stringify(storage), + storageArea: localStorage, + }; + + beforeEach(() => { + removeListenerSpy.mockClear(); + }); + + afterEach(() => { + cleanup(); + logoutSpy.mockClear(); + }); + + afterAll(() => { + logoutSpy.mockRestore(); + removeListenerSpy.mockRestore(); + }); + + it("should react to storage changes and logout the user if the `userId` changed", async () => { + render(Layout); + + await fireEvent(window, new StorageEvent("storage", eventData)); + + expect(removeListenerSpy).toHaveBeenCalledTimes(1); + expect(removeListenerSpy).toHaveBeenNthCalledWith( + 1, + "storage", + expect.any(Function), + ); + expect(logoutSpy).toHaveBeenCalledTimes(1); + expect(logoutSpy).toHaveBeenCalledWith(true); + }); + + it("should do nothing if the `userId` remained the same", async () => { + const data = { + ...eventData, + newValue: JSON.stringify({ + ...storage, + a: 5, + b: "foo", + }), + }; + + render(Layout); + + await fireEvent(window, new StorageEvent("storage", data)); + + expect(removeListenerSpy).not.toHaveBeenCalled(); + expect(logoutSpy).not.toHaveBeenCalled(); + }); + + it("should do nothing if the storage change hasn't happened in the preferences", async () => { + const data = { + ...eventData, + key: "some-key", + newValue: '"{}"', + oldValue: null, + }; + + render(Layout); + + await fireEvent(window, new StorageEvent("storage", data)); + + expect(removeListenerSpy).not.toHaveBeenCalled(); + expect(logoutSpy).not.toHaveBeenCalled(); + }); }); diff --git a/web-wallet/src/routes/(app)/dashboard/+layout.js b/web-wallet/src/routes/(app)/dashboard/+layout.js index 552db936a2..2299582228 100644 --- a/web-wallet/src/routes/(app)/dashboard/+layout.js +++ b/web-wallet/src/routes/(app)/dashboard/+layout.js @@ -5,13 +5,13 @@ import { failureToRejection } from "$lib/dusk/http"; const createEmptyObject = () => ({}); /** @type {import('./$types').LayoutLoad} */ -export async function load ({ fetch }) { - return { - currentPrice: fetch(import.meta.env.VITE_GET_QUOTE_API_ENDPOINT) - .then(failureToRejection) - .then(res => res.json()) - .then(getPath("market_data.current_price")) - .then(when(isUndefined, createEmptyObject)) - .catch(createEmptyObject) - }; +export async function load({ fetch }) { + return { + currentPrice: fetch(import.meta.env.VITE_GET_QUOTE_API_ENDPOINT) + .then(failureToRejection) + .then((res) => res.json()) + .then(getPath("market_data.current_price")) + .then(when(isUndefined, createEmptyObject)) + .catch(createEmptyObject), + }; } diff --git a/web-wallet/src/routes/(app)/dashboard/+layout.svelte b/web-wallet/src/routes/(app)/dashboard/+layout.svelte index 67d960c572..4120b93a4e 100644 --- a/web-wallet/src/routes/(app)/dashboard/+layout.svelte +++ b/web-wallet/src/routes/(app)/dashboard/+layout.svelte @@ -42,10 +42,10 @@ } - { event.preventDefault(); }}/> + { event.preventDefault(); }} />
    - +

    extends true ? R : T; - - /* ------------------------- * - * ***** MATH ***** * - * ------------------------- */ - - function randomInt(min: number, max: number): number; - - /* ------------------------- * - * ***** OBJECT ***** * - * ------------------------- */ - - function enumerables< - K extends PropertyKey, - S extends Record - > (source: S): Array; - - function getKey< - K extends PropertyKey, - S extends Record - > (key: K): (source: S) => K extends keyof S ? S[K] : undefined; - - function getPath< - T, - S extends Record - > (path: string, separator?: string): (source: S) => T | undefined; - - function getPathIn< - T, - S extends Record - > (source: S, path: string, separator?: string): T | undefined; - - function hasKeyValue< - K extends PropertyKey, - T, - S extends Record - > (key: K, value: T): (source: S) => boolean; - - function hasPathValue< - T, - S extends Record - > (path: string, value: T): (source: S) => boolean; - - function keys, K extends keyof S> (source: S): Array; - - function mapValues< - T, - U, - S extends Record, - F extends ObjectIteratorCallback - > (source: S, fn: F): Record; - - function mapValuesWith< - T, - U, - S extends Record, - F extends ObjectIteratorCallback - > (fn: F): (source: S) => Record; - - function ownPairs< - S extends Record, - K extends keyof S & string - > (source: S): Array<[K, S[K]]>; - - function pick< - S extends Record, - K extends string - > (whitelist: K[]): (source: S) => Pick; - - function pickIf< - S extends Record, - P extends ObjectIteratorCallback - > (predicate: P): (source: S) => Partial; - - function pickIn< - S extends Record, - K extends string - > (source: S, whitelist: K[]): Pick; - - function rename< - DK extends string, - KM extends Record, - S extends Record - > (keyMap: KM): (source: S) => { [K in keyof S as K extends keyof KM ? KM[K] : K]: S[K] }; - - function setKey< - S extends Record, - T, - K extends string - > (key: K, value: T): (source: S) => S & { [k in K]: T }; - - function skip< - S extends Record, - K extends string - > (blacklist: K[]): (source: S) => Omit; - - function skipIf< - S extends Record, - P extends ObjectIteratorCallback - > (predicate: P): (source: S) => Partial; - - function skipIn< - S extends Record, - K extends string - > (source: S, blacklist: K[]): Omit; - - /* ------------------------- * - * ***** PRIVATES ***** * - * ------------------------- */ - - /* ------------------------- * - * ***** STRING ***** * - * ------------------------- */ - - /* ------------------------- * - * ***** TYPE ***** * - * ------------------------- */ - - function isNil (value: any): value is null | undefined; - - function isNull (value: any): value is null; - - function isUndefined (value: any): value is undefined; - - function isType (typeName: string): Predicate; + /* ------------------------- * + * ***** UTILITY TYPES ***** * + * ------------------------- */ + + type AnyFunction = (...args: any) => any; + + type FoldAccumulatorCallback< + L extends ArrayLike, + R, + I extends keyof L & number = any, + > = (result: R, current: L[I], idx: I, list: L) => R; + + type ListIteratorCallback< + L extends ArrayLike, + R, + I extends keyof L & number = any, + > = (element: L[I], idx: I, list: L) => R; + + type ObjectIteratorCallback< + S extends Record, + R, + K extends keyof S & string = any, + > = (value: S[K], key: K, source: S) => R; + + type Ord = Number | number | String | string | Boolean | boolean | Date; + + /** @see https://dev.to/ecyrbe/how-to-use-advanced-typescript-to-define-a-pipe-function-381h */ + type PipeArgs< + Fns extends AnyFunction[], + AccFns extends AnyFunction[] = [], + > = Fns extends [(...args: infer A) => infer B] + ? [...AccFns, (...args: A) => B] + : Fns extends [(...args: infer A) => any, ...infer Tail] + ? Tail extends [(arg: infer B) => any, ...any[]] + ? PipeArgs B]> + : AccFns + : AccFns; + + type PipeArgsLastReturnType< + Fns extends AnyFunction[], + Else = never, + > = Fns extends [...any[], (...args: any) => infer R] ? R : Else; + + type Predicate = (v: T) => v is U; + + type ReduceAccumulatorCallback< + T, + L extends ArrayLike, + I extends keyof L & number = any, + > = (prev: T, current: L[I], idx: I, list: L) => T; + + type Sorter = { + compare: (a: T, b: T) => number; + isDescending: IsDesc; + }; + + type SorterComparer = (a: T, b: T) => number; + + type SorterReader = (value: T) => any; + + type UnaryFunction = (v: A) => B; + + /* ------------------------- * + * ***** ARRAY ***** * + * ------------------------- */ + + function append(value: T): (arrayLike: ArrayLike) => Array; + + function appendTo(arrayLike: ArrayLike, value: T): Array; + + function contains(value: T): (arrayLike: ArrayLike) => boolean; + + function count< + R extends string, + L extends ArrayLike, + F extends ListIteratorCallback, + >(arrayLike: L, iteratee: F): Record; + + function countBy< + R extends string, + L extends ArrayLike, + F extends ListIteratorCallback, + >(iteratee: F): (arrayLike: L) => Record; + + function difference(a: ArrayLike, b: ArrayLike): Array; + + function drop(n: number): (arrayLike: ArrayLike) => Array; + + function dropFrom(arrayLike: ArrayLike, n: number): Array; + + function dropLastWhile< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => Array; + + function dropWhile< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => Array; + + function every< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => boolean; + + function everyIn< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): boolean; + + function filter< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): Array; + + function filterWith< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => Array; + + function find< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): T | undefined; + + function findIndex< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): number; + + function findIndexWhere< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => number; + + function findLast< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): T | undefined; + + function findLastIndex< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): number; + + function findLastIndexWhere< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => number; + + function findLastWhere< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => T | undefined; + + function findWhere< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => T | undefined; + + function flatMap< + T extends any | any[], + R, + A extends Array, + F extends ListIteratorCallback, + >(array: A, iteratee: F): Array; + + function flatMapWith< + T extends any | any[], + R, + A extends Array, + F extends ListIteratorCallback, + >(iteratee: F): (array: A) => Array; + + function flatten>( + array: A, + ): Array; + + function getAt(index: number): (arrayLike: ArrayLike) => T | undefined; + + function getIndex(arrayLike: ArrayLike, index: number): T | undefined; + + function group< + T extends Record, + V extends T[keyof T], + L extends ArrayLike, + F extends ListIteratorCallback, + >(arrayLike: L, iteratee: F): Record>; + + function groupBy< + T extends Record, + V extends T[keyof T], + L extends ArrayLike, + F extends ListIteratorCallback, + >(iteratee: F): (arrayLike: L) => Record>; + + function head>( + arrayLike: L, + ): L["length"] extends 0 ? undefined : L[0]; + + function index< + T extends Record, + V extends T[keyof T], + L extends ArrayLike, + F extends ListIteratorCallback, + >(arrayLike: L, iteratee: F): Record; + + function indexBy< + T extends Record, + V extends T[keyof T], + L extends ArrayLike, + F extends ListIteratorCallback, + >(iteratee: F): (arrayLike: L) => Record; + + function init(arrayLike: ArrayLike): Array; + + function insert( + arrayLike: ArrayLike, + index: number, + element: T, + ): Array; + + function insertAt( + index: number, + element: T, + ): (arrayLike: ArrayLike) => Array; + + function intersection(a: ArrayLike, b: ArrayLike): Array; + + function isIn(arrayLike: ArrayLike, value: T): boolean; + + function join(arrayLike: ArrayLike, separator: string): string; + + function joinWith(separator: string): (arrayLike: ArrayLike) => string; + + function last>( + arrayLike: L, + ): L["length"] extends 0 ? undefined : L[-1]; + + function list(...values: T[]): Array; + + function map, R>( + arrayLike: L, + iteratee: ListIteratorCallback, + ): Array; + + function mapWith, R>( + iteratee: ListIteratorCallback, + ): (arrayLike: L) => Array; + + function partition< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): [Array, Array]; + + function partitionWith< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => [Array, Array]; + + function pluck, K extends keyof U>( + key: K, + ): (arrayLike: ArrayLike) => Array; + + function pluckFrom, K extends keyof U>( + arrayLike: ArrayLike, + key: K, + ): Array; + + function pullFrom, V extends ArrayLike>( + arrayLike: L, + values: V, + ): Array; + + function pull, V extends ArrayLike>( + values: V, + ): (arrayLike: L) => Array; + + function reduceRight< + T, + L extends ArrayLike, + Acc extends ReduceAccumulatorCallback, + >(arrayLike: L, accumulator: Acc): T; + function reduceRight< + R, + L extends ArrayLike, + Acc extends FoldAccumulatorCallback, + >(arrayLike: L, accumulator: Acc, initialValue: R): R; + + function reduceRightWith< + T, + L extends ArrayLike, + Acc extends ReduceAccumulatorCallback, + >(accumulator: Acc): (arrayLike: L) => T; + function reduceRightWith< + R, + L extends ArrayLike, + Acc extends FoldAccumulatorCallback, + >(accumulator: Acc, initialValue: R): (list: L) => R; + + function reverse>(arrayLike: L): Array; + + function rotate>( + arrayLike: L, + amount: number, + ): Array; + + function rotateBy>( + amount: number, + ): (arrayLike: L) => Array; + + function setAt>( + index: number, + value: T, + ): (arrayLike: L) => Array; + + function setIndex>( + arrayLike: L, + index: number, + value: T, + ): Array; + + function shallowFlatten(array: Array): Array; + + function some< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(predicate: P): (arrayLike: L) => boolean; + + function someIn< + T, + L extends ArrayLike, + P extends ListIteratorCallback, + >(arrayLike: L, predicate: P): boolean; + + function sort< + T, + L extends ArrayLike, + S extends Array | SorterReader> = [Sorter], + >(arrayLike: L, sorters?: S): Array; + + function sortedInsert< + T, + L extends ArrayLike, + S extends Array | SorterReader> = [Sorter], + >(arrayLike: L, element: T, sorters?: S): Array; + + function sorter = (value: T) => T>( + reader?: RD, + comparer?: SorterComparer, + ): Sorter; + + function sorterDesc = (value: T) => T>( + reader?: RD, + comparer?: SorterComparer, + ): Sorter; + + function sortWith< + T, + L extends ArrayLike, + S extends Array | SorterReader> = [Sorter], + >(sorters?: S): (arrayLike: L) => Array; + + function take>( + amount: number, + ): (arrayLike: L) => Array; + + function uniques(arrayLike: ArrayLike): Array; + + function uniquesBy< + T, + L extends ArrayLike, + F extends ListIteratorCallback, + >(iteratee: F): (arrayLike: L) => Array; + + /* ------------------------- * + * ***** CORE ***** * + * ------------------------- */ + + type __ = {}; + + function always(value: T): (...args: unknown[]) => T; + + function areSVZ(a: any, b: any): boolean; + + function binary R>( + fn: F, + ): (a: A, b: B) => R; + + function clamp(n: number, min: number, max: number): number; + + function clampWithin(min: number, max: number): (n: number) => number; + + function compose( + f: UnaryFunction, + g: UnaryFunction, + ): (value: A) => C; + function compose( + f: UnaryFunction, + g: (...args: A) => B, + ): (...values: A) => C; + + function partial( + fn: F, + args: Args, + ): (...args: any[]) => ReturnType; + + function partialRight( + fn: F, + args: Args, + ): (...args: any[]) => ReturnType; + + function reduce< + T, + L extends ArrayLike, + Acc extends ReduceAccumulatorCallback, + >(arrayLike: L, accumulator: Acc): T; + function reduce< + R, + L extends ArrayLike, + Acc extends FoldAccumulatorCallback, + >(arrayLike: L, accumulator: Acc, initialValue: R): R; + + function reduceWith< + T, + L extends ArrayLike, + Acc extends ReduceAccumulatorCallback, + >(accumulator: Acc): (arrayLike: L) => T; + function reduceWith< + R, + L extends ArrayLike, + Acc extends FoldAccumulatorCallback, + >(accumulator: Acc, initialValue: R): (list: L) => R; + + function slice( + arrayLike: ArrayLike, + start: number, + end: number, + ): Array; + + function sliceAt( + start: number, + end: number, + ): (arrayLike: ArrayLike) => Array; + + function type(value: any): string; + + /* ------------------------- * + * ***** FUNCTION ***** * + * ------------------------- */ + + function collect< + T, + Args extends any[], + Fns extends Array<(...args: Args) => T>, + >(functions: Fns): (...args: Args) => T[]; + + function invokeOn( + target: TG, + ): ( + method: M, + ...args: any[] + ) => M extends keyof TG + ? TG[M] extends AnyFunction + ? ReturnType + : never + : undefined; + + function pipe( + functions: [], + ): ( + ...args: Args + ) => Args["length"] extends 0 ? undefined : (typeof args)[0]; + function pipe< + Fns extends AnyFunction[], + Args extends Parameters, + R extends PipeArgsLastReturnType>, + >( + functions: PipeArgs extends Fns ? Fns : PipeArgs, + ): (...args: Args) => R; + + function unary(fn: (a: T, ...args: any[]) => R): UnaryFunction; + + /* ------------------------- * + * ***** LOGIC ***** * + * ------------------------- */ + + function allOf boolean>(predicates: Array