diff --git a/biome.json b/biome.json index 6b39fed7f..01724a5b2 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.5/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.8/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -19,13 +19,24 @@ "recommended": true, "suspicious": { "noDuplicateProperties": "off", - "noExplicitAny": "warn" + "noExplicitAny": "info", + "noFocusedTests": "error" }, "complexity": { "noThisInStatic": "off" }, "style": { - "noInferrableTypes": "error" + "noInferrableTypes": "error", + "useConsistentMemberAccessibility": { + "level": "error", + "options": { + "accessibility": "explicit" + } + } + }, + "correctness": { + "noUnusedVariables": "error", + "noUnusedImports": "error" } } }, @@ -38,8 +49,8 @@ "enabled": true, "actions": { "source": { - "organizeImports": "on", - "recommended": true + "recommended": true, + "organizeImports": "on" } } }, @@ -54,6 +65,32 @@ } } } + }, + { + "includes": ["**/*.test.*", "**/*.spec.*", "**/*.e2e.test.*"], + "linter": { + "rules": { + "style": { + "noNonNullAssertion": "off" + } + } + } + }, + { + "includes": ["demo/**/*.html"], + "linter": { + "rules": { + "style": { + "useConsistentMemberAccessibility": "off" + } + } + } + } + ], + "html": { + "experimentalFullSupportEnabled": true, + "formatter": { + "enabled": true } - ] + } } diff --git a/demo/bundles/cloud-image-editor.html b/demo/bundles/cloud-image-editor.html new file mode 100644 index 000000000..ab9239357 --- /dev/null +++ b/demo/bundles/cloud-image-editor.html @@ -0,0 +1,41 @@ + + + + + + Cloud Image Editor - Bundle Demo + + + + + + + + + diff --git a/demo/bundles/iife.html b/demo/bundles/iife.html new file mode 100644 index 000000000..7fd952328 --- /dev/null +++ b/demo/bundles/iife.html @@ -0,0 +1,27 @@ + + + + + + File Uploader - IIFE Bundle Demo + + + + + + + + + + + + diff --git a/demo/bundles/img.html b/demo/bundles/img.html new file mode 100644 index 000000000..f77a70a33 --- /dev/null +++ b/demo/bundles/img.html @@ -0,0 +1,37 @@ + + + + + + Adaptive Image - Bundle Demo + + + + + + + diff --git a/demo/bundles/inline.html b/demo/bundles/inline.html new file mode 100644 index 000000000..c4e5deba3 --- /dev/null +++ b/demo/bundles/inline.html @@ -0,0 +1,33 @@ + + + + + + File Uploader Inline - Bundle Demo + + + + + + + + + diff --git a/demo/bundles/minimal.html b/demo/bundles/minimal.html new file mode 100644 index 000000000..b51feb449 --- /dev/null +++ b/demo/bundles/minimal.html @@ -0,0 +1,33 @@ + + + + + + File Uploader Minimal - Bundle Demo + + + + + + + + + diff --git a/demo/bundles/regular.html b/demo/bundles/regular.html new file mode 100644 index 000000000..bb674eb6d --- /dev/null +++ b/demo/bundles/regular.html @@ -0,0 +1,26 @@ + + + + + + File Uploader Regular - Bundle Demo + + + + + + + + + + diff --git a/demo/cloud-image-editor.html b/demo/cloud-image-editor.html deleted file mode 100644 index e940af5ea..000000000 --- a/demo/cloud-image-editor.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - diff --git a/demo/custom-icons.html b/demo/custom-icons.html deleted file mode 100644 index f589cf550..000000000 --- a/demo/custom-icons.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - diff --git a/demo/external-sources/preview-proxy/secure-delivery-proxy-url-resolver.html b/demo/external-sources/preview-proxy/secure-delivery-proxy-url-resolver.html new file mode 100644 index 000000000..6888d0473 --- /dev/null +++ b/demo/external-sources/preview-proxy/secure-delivery-proxy-url-resolver.html @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/demo/preview-proxy/secure-delivery-proxy-url-template.html b/demo/external-sources/preview-proxy/secure-delivery-proxy-url-template.html similarity index 71% rename from demo/preview-proxy/secure-delivery-proxy-url-template.html rename to demo/external-sources/preview-proxy/secure-delivery-proxy-url-template.html index b33993474..7f1a3a903 100644 --- a/demo/preview-proxy/secure-delivery-proxy-url-template.html +++ b/demo/external-sources/preview-proxy/secure-delivery-proxy-url-template.html @@ -1,12 +1,11 @@ - - + @@ -15,5 +14,8 @@ ctx-name="my-uploader" pubkey="demopublickey" secure-delivery-proxy="http://localhost:3000/preview?url={{previewUrl}}" + debug + quality-insights="false" + test-mode > diff --git a/demo/preview-proxy/secure-delivery-proxy.js b/demo/external-sources/preview-proxy/secure-delivery-proxy.js similarity index 100% rename from demo/preview-proxy/secure-delivery-proxy.js rename to demo/external-sources/preview-proxy/secure-delivery-proxy.js diff --git a/demo/external-sources/secure-uploads.html b/demo/external-sources/secure-uploads.html new file mode 100644 index 000000000..c65e978dc --- /dev/null +++ b/demo/external-sources/secure-uploads.html @@ -0,0 +1,48 @@ + + + + + + + + + diff --git a/demo/external-sources/social-sources.html b/demo/external-sources/social-sources.html new file mode 100644 index 000000000..39bf33040 --- /dev/null +++ b/demo/external-sources/social-sources.html @@ -0,0 +1,69 @@ + + + + + + + + + + + +
+ Options + + + +
diff --git a/demo/features/config-playground.html b/demo/features/config-playground.html new file mode 100644 index 000000000..70117ab0b --- /dev/null +++ b/demo/features/config-playground.html @@ -0,0 +1,881 @@ + + + + + + + File Uploader config playground + + + + + + + + diff --git a/demo/features/custom-icons.html b/demo/features/custom-icons.html new file mode 100644 index 000000000..e32afce07 --- /dev/null +++ b/demo/features/custom-icons.html @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/demo/form.html b/demo/features/form-integration.html similarity index 55% rename from demo/form.html rename to demo/features/form-integration.html index 6f18b3a42..a51d4747d 100644 --- a/demo/form.html +++ b/demo/features/form-integration.html @@ -1,24 +1,23 @@ - - + @@ -29,16 +28,19 @@

Form Data

multiple-max="10" img-only group-output + debug + quality-insights="false" + test-mode >
-
-
+
+
-
-
+
+
diff --git a/demo/features/locales.html b/demo/features/locales.html new file mode 100644 index 000000000..02bed9056 --- /dev/null +++ b/demo/features/locales.html @@ -0,0 +1,338 @@ + + + + + + + File Uploader locales + + + + + + + + diff --git a/demo/features/upload-api.html b/demo/features/upload-api.html new file mode 100644 index 000000000..b362f7334 --- /dev/null +++ b/demo/features/upload-api.html @@ -0,0 +1,59 @@ + + + + + + + + + + +
+ Please select behaviour: +
+ + + + + +
+
diff --git a/demo/features/validators.html b/demo/features/validators.html new file mode 100644 index 000000000..b4511ab0b --- /dev/null +++ b/demo/features/validators.html @@ -0,0 +1,47 @@ + + + + + + + + + + + diff --git a/demo/index.html b/demo/index.html index 3aa879f82..49ba10cb0 100644 --- a/demo/index.html +++ b/demo/index.html @@ -1,26 +1,393 @@ - + + + + + + Blocks Demo + + + + + + + diff --git a/demo/locales.html b/demo/locales.html deleted file mode 100644 index 408bc7bc3..000000000 --- a/demo/locales.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - File Uploader locales - - - - - - - -
-
-
- - diff --git a/demo/new-social-sources-test.html b/demo/new-social-sources-test.html deleted file mode 100644 index 5742fb267..000000000 --- a/demo/new-social-sources-test.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - -
- Options - - - -
diff --git a/demo/preview-proxy/secure-delivery-proxy-url-resolver.html b/demo/preview-proxy/secure-delivery-proxy-url-resolver.html deleted file mode 100644 index 9f1ff8284..000000000 --- a/demo/preview-proxy/secure-delivery-proxy-url-resolver.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - diff --git a/demo/raw-minimal.html b/demo/raw-minimal.html deleted file mode 100644 index 533579cd0..000000000 --- a/demo/raw-minimal.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - diff --git a/demo/raw-regular.html b/demo/raw-regular.html deleted file mode 100644 index 0607ea5a0..000000000 --- a/demo/raw-regular.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - diff --git a/demo/secure-uploads.html b/demo/secure-uploads.html deleted file mode 100644 index 2df1c48b2..000000000 --- a/demo/secure-uploads.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - diff --git a/demo/solutions/cloud-image-editor.html b/demo/solutions/cloud-image-editor.html new file mode 100644 index 000000000..7c8f621d3 --- /dev/null +++ b/demo/solutions/cloud-image-editor.html @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/demo/solutions/img.html b/demo/solutions/img.html new file mode 100644 index 000000000..255e5f117 --- /dev/null +++ b/demo/solutions/img.html @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/demo/raw-inline.html b/demo/solutions/inline.html similarity index 60% rename from demo/raw-inline.html rename to demo/solutions/inline.html index fd95dac80..add9713e8 100644 --- a/demo/raw-inline.html +++ b/demo/solutions/inline.html @@ -1,19 +1,18 @@ - - + @@ -24,4 +23,7 @@ crop-preset="1:1" cloudImageEditorTabs="crop" cloud-image-editor-tabs="crop" + debug + quality-insights="false" + test-mode > diff --git a/demo/solutions/minimal.html b/demo/solutions/minimal.html new file mode 100644 index 000000000..040cb150e --- /dev/null +++ b/demo/solutions/minimal.html @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/demo/solutions/regular.html b/demo/solutions/regular.html new file mode 100644 index 000000000..289c842a1 --- /dev/null +++ b/demo/solutions/regular.html @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/demo/upload-api.html b/demo/upload-api.html deleted file mode 100644 index e10ca3019..000000000 --- a/demo/upload-api.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - -
- Please select behaviour: -
- - - - - -
-
diff --git a/demo/validators.html b/demo/validators.html deleted file mode 100644 index 3b2bb0f49..000000000 --- a/demo/validators.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/index.html b/index.html index 19490326e..01d408ee5 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ - + diff --git a/package-lock.json b/package-lock.json index 3b73475a8..3d522a44c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "@uploadcare/file-uploader", "version": "1.24.5", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,65 +9,56 @@ "version": "1.24.5", "license": "MIT", "dependencies": { - "@symbiotejs/symbiote": "^1.11.7", + "@lit/context": "^1.1.6", "@uploadcare/cname-prefix": "^6.18.2", "@uploadcare/image-shrink": "^6.18.2", "@uploadcare/quality-insights": "^6.18.2", "@uploadcare/upload-client": "^6.18.2", - "keyux": "^0.7.1" + "keyux": "^0.7.1", + "lit": "^3.3.1", + "nanostores": "^1.1.0" }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.2.5", - "@biomejs/js-api": "^3.0.0", - "@biomejs/wasm-nodejs": "^2.2.5", + "@biomejs/biome": "2.3.8", + "@biomejs/js-api": "^4.0.0", + "@biomejs/wasm-nodejs": "^2.3.8", "@csstools/postcss-cascade-layers": "^5.0.2", - "@happy-dom/global-registrator": "^16.8.1", + "@happy-dom/global-registrator": "^20.0.10", "@size-limit/esbuild-why": "^11.2.0", "@size-limit/preset-small-lib": "^11.2.0", "@total-typescript/ts-reset": "^0.6.1", - "@types/node": "^22", - "@types/react": "^18.2.34", + "@types/node": "^24", + "@types/react": "^18.0.0", "@types/svg-sprite": "^0.0.39", - "@vitest/browser": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", - "esbuild": "^0.25.10", - "husky": "^8.0.3", - "lint-staged": "^13.2.1", - "node-watch": "^0.7.3", + "@vitest/browser": "^4.0.15", + "@vitest/browser-playwright": "^4.0.15", + "@vitest/coverage-v8": "^4.0.15", + "esbuild": "^0.25.12", + "esbuild-minify-templates": "^0.13.1", + "husky": "^9.1.7", + "lint-staged": "^16.2.6", + "node-watch": "^0.7.4", "npm-run-all": "^4.1.5", - "playwright": "^1.55.0", + "playwright": "^1.56.1", "postcss": "^8.5.6", - "publint": "^0.3.14", + "publint": "^0.3.15", "render-jsx": "^0.2.4", - "rimraf": "^5.0.0", + "rimraf": "^6.1.0", "shipjs": "^0.27.0", "size-limit": "^11.2.0", - "stylelint": "^15.4.0", - "stylelint-config-standard": "^32.0.0", - "stylelint-declaration-block-no-ignored-properties": "^2.7.0", - "stylelint-order": "^6.0.3", + "stylelint": "^16.25.0", + "stylelint-config-standard": "^39.0.1", + "stylelint-declaration-block-no-ignored-properties": "^2.8.0", + "stylelint-order": "^7.0.0", "svg-sprite": "^2.0.4", - "tsd": "^0.32.0", + "tsd": "^0.33.0", "tsup": "^8.5.0", "tsx": "^4.20.6", "typescript": "^5.9.3", - "vite": "npm:rolldown-vite@latest", - "vitest": "^3.2.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "vite": "8.0.0-beta.0", + "vitest": "^4.0.15", + "vitest-browser-lit": "^1.0.1" } }, "node_modules/@andrewbranch/untar.js": { @@ -98,29 +89,6 @@ "node": ">=20" } }, - "node_modules/@arethetypeswrong/cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@arethetypeswrong/cli/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@arethetypeswrong/core": { "version": "0.18.2", "resolved": "https://registry.npmjs.org/@arethetypeswrong/core/-/core-0.18.2.tgz", @@ -141,29 +109,6 @@ "node": ">=20" } }, - "node_modules/@arethetypeswrong/core/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@arethetypeswrong/core/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@arethetypeswrong/core/node_modules/typescript": { "version": "5.6.1-rc", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.1-rc.tgz", @@ -193,6 +138,13 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -204,9 +156,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -214,13 +166,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -230,9 +182,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "dev": true, "license": "MIT", "engines": { @@ -240,14 +192,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -264,9 +216,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.5.tgz", - "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.8.tgz", + "integrity": "sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -280,20 +232,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.2.5", - "@biomejs/cli-darwin-x64": "2.2.5", - "@biomejs/cli-linux-arm64": "2.2.5", - "@biomejs/cli-linux-arm64-musl": "2.2.5", - "@biomejs/cli-linux-x64": "2.2.5", - "@biomejs/cli-linux-x64-musl": "2.2.5", - "@biomejs/cli-win32-arm64": "2.2.5", - "@biomejs/cli-win32-x64": "2.2.5" + "@biomejs/cli-darwin-arm64": "2.3.8", + "@biomejs/cli-darwin-x64": "2.3.8", + "@biomejs/cli-linux-arm64": "2.3.8", + "@biomejs/cli-linux-arm64-musl": "2.3.8", + "@biomejs/cli-linux-x64": "2.3.8", + "@biomejs/cli-linux-x64-musl": "2.3.8", + "@biomejs/cli-win32-arm64": "2.3.8", + "@biomejs/cli-win32-x64": "2.3.8" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.5.tgz", - "integrity": "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.8.tgz", + "integrity": "sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==", "cpu": [ "arm64" ], @@ -308,9 +260,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.5.tgz", - "integrity": "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.8.tgz", + "integrity": "sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==", "cpu": [ "x64" ], @@ -325,9 +277,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.5.tgz", - "integrity": "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.8.tgz", + "integrity": "sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==", "cpu": [ "arm64" ], @@ -342,9 +294,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.5.tgz", - "integrity": "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.8.tgz", + "integrity": "sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==", "cpu": [ "arm64" ], @@ -359,9 +311,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz", - "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.8.tgz", + "integrity": "sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==", "cpu": [ "x64" ], @@ -376,9 +328,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz", - "integrity": "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.8.tgz", + "integrity": "sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==", "cpu": [ "x64" ], @@ -393,9 +345,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz", - "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.8.tgz", + "integrity": "sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==", "cpu": [ "arm64" ], @@ -410,9 +362,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.5.tgz", - "integrity": "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.8.tgz", + "integrity": "sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==", "cpu": [ "x64" ], @@ -427,15 +379,15 @@ } }, "node_modules/@biomejs/js-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/js-api/-/js-api-3.0.0.tgz", - "integrity": "sha512-5QcGJFj9IO+yXl76ICjvkdE38uxRcTDsBzcCZHEZ+ma+Te/nbvJg4A3KtAds9HCrEF0JKLWiyjMhAbqazuJvYA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@biomejs/js-api/-/js-api-4.0.0.tgz", + "integrity": "sha512-EOArR/6drRzM1/hwOIz1pZw90FL31Ud4Y7hEHGWVtMNmAwS9SrwZ8hMENGlLVXCeGW/kL46p8kX7eO6x9Nmezg==", "dev": true, "license": "MIT OR Apache-2.0", "peerDependencies": { - "@biomejs/wasm-bundler": "^2.2.0", - "@biomejs/wasm-nodejs": "^2.2.0", - "@biomejs/wasm-web": "^2.2.0" + "@biomejs/wasm-bundler": "^2.3.0", + "@biomejs/wasm-nodejs": "^2.3.0", + "@biomejs/wasm-web": "^2.3.0" }, "peerDependenciesMeta": { "@biomejs/wasm-bundler": { @@ -450,9 +402,9 @@ } }, "node_modules/@biomejs/wasm-nodejs": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/wasm-nodejs/-/wasm-nodejs-2.2.5.tgz", - "integrity": "sha512-p9BhDKyjyemt9aBOaqINrsTJSWiCYZu1asM5AxfMFxF9Fi3L3ZcIbzxe5OYa294oNllmmqJ+68GlZG/2fqF0dQ==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@biomejs/wasm-nodejs/-/wasm-nodejs-2.3.8.tgz", + "integrity": "sha512-c5tuzrW34cRipmrChxX9hboJIkOurjrK7o1GF4pOOuNEQ5UExSpmnEek2FH0mbdp6+TikUcT0XAquQnbFNQ9Eg==", "dev": true, "license": "MIT OR Apache-2.0" }, @@ -463,20 +415,45 @@ "dev": true, "license": "ISC" }, + "node_modules/@cacheable/memory": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.6.tgz", + "integrity": "sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.3.2", + "@keyv/bigmap": "^1.3.0", + "hookified": "^1.13.0", + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.2.tgz", + "integrity": "sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.2.0", + "keyv": "^5.5.4" + } + }, "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.1.90" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", - "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, "funding": [ { @@ -490,16 +467,36 @@ ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.4.1" + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.20.tgz", + "integrity": "sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", - "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true, "funding": [ { @@ -513,13 +510,13 @@ ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", - "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -533,11 +530,11 @@ ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/postcss-cascade-layers": { @@ -567,7 +564,7 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "node_modules/@csstools/selector-specificity": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", @@ -590,59 +587,91 @@ "postcss-selector-parser": "^7.0.0" } }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/@csstools/selector-specificity": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", - "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.13" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/JounQin" } }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "node_modules/@emnapi/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", + "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, + "node_modules/@emnapi/wasi-threads/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -657,9 +686,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -674,9 +703,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -691,9 +720,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -708,9 +737,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -725,9 +754,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -742,9 +771,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -759,9 +788,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -776,9 +805,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -793,9 +822,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -810,9 +839,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -827,9 +856,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -844,9 +873,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -861,9 +890,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -878,9 +907,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -895,9 +924,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -912,9 +941,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -929,9 +958,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -946,9 +975,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -963,9 +992,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -980,9 +1009,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -997,9 +1026,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], @@ -1014,9 +1043,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -1031,9 +1060,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -1048,9 +1077,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -1065,9 +1094,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -1082,18 +1111,36 @@ } }, "node_modules/@happy-dom/global-registrator": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@happy-dom/global-registrator/-/global-registrator-16.8.1.tgz", - "integrity": "sha512-EzV55rpNs5AXwFRb2tGrU6STr2Rgwtoi9awvh6vDglGZypXCFsJYYJpskZ2rhWaLL6Zbw5/+uJj+mocRPZuEUg==", + "version": "20.0.11", + "resolved": "https://registry.npmjs.org/@happy-dom/global-registrator/-/global-registrator-20.0.11.tgz", + "integrity": "sha512-GqNqiShBT/lzkHTMC/slKBrvN0DsD4Di8ssBk4aDaVgEn+2WMzE6DXxq701ndSXj7/0cJ8mNT71pM7Bnrr6JRw==", "dev": true, "license": "MIT", "dependencies": { - "happy-dom": "^16.8.1" + "@types/node": "^20.0.0", + "happy-dom": "^20.0.11" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@happy-dom/global-registrator/node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" } }, + "node_modules/@happy-dom/global-registrator/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", @@ -1110,8 +1157,6 @@ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": "20 || >=22" } @@ -1122,8 +1167,6 @@ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@isaacs/balanced-match": "^4.0.1" }, @@ -1131,63 +1174,6 @@ "node": "20 || >=22" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -1212,6 +1198,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1240,192 +1237,77 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@loaderkit/resolve": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.4.tgz", - "integrity": "sha512-rJzYKVcV4dxJv+vW6jlvagF8zvGxHJ2+HTr1e2qOejfmGhAApgJHl8Aog4mMszxceTRiKTTbnpgmTO1bEZHV/A==", + "node_modules/@keyv/bigmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz", + "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@braidai/lang": "^1.0.0" + "hashery": "^1.2.0", + "hookified": "^1.13.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.5.4" } }, - "node_modules/@microsoft/api-extractor": { - "version": "7.53.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.53.1.tgz", - "integrity": "sha512-bul5eTNxijLdDBqLye74u9494sRmf+9QULtec9Od0uHnifahGeNt8CC4/xCdn7mVyEBrXIQyQ5+sc4Uc0QfBSA==", + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@microsoft/api-extractor-model": "7.31.1", - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.17.0", - "@rushstack/rig-package": "0.6.0", - "@rushstack/terminal": "0.19.1", - "@rushstack/ts-command-line": "5.1.1", - "lodash": "~4.17.15", - "minimatch": "10.0.3", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.8.2" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.31.1.tgz", - "integrity": "sha512-Dhnip5OFKbl85rq/ICHBFGhV4RA5UQSl8AC/P/zoGvs+CBudPkatt5kIhMGiYgVPnUWmfR6fcp38+1AFLYNtUw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.17.0" - } + "license": "MIT" }, - "node_modules/@microsoft/api-extractor/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, - "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", + "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==", + "license": "BSD-3-Clause" }, - "node_modules/@microsoft/api-extractor/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, + "node_modules/@lit/context": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz", + "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==", + "license": "BSD-3-Clause", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@lit/reactive-element": "^1.6.2 || ^2.1.0" } }, - "node_modules/@microsoft/api-extractor/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, - "optional": true, - "peer": true, + "node_modules/@lit/reactive-element": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.1.tgz", + "integrity": "sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==", + "license": "BSD-3-Clause", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@microsoft/api-extractor/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, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "@lit-labs/ssr-dom-shim": "^1.4.0" } }, - "node_modules/@microsoft/api-extractor/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, - "optional": true, - "peer": true - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", - "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", + "node_modules/@loaderkit/resolve": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.4.tgz", + "integrity": "sha512-rJzYKVcV4dxJv+vW6jlvagF8zvGxHJ2+HTr1e2qOejfmGhAApgJHl8Aog4mMszxceTRiKTTbnpgmTO1bEZHV/A==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, + "license": "ISC", "dependencies": { - "@microsoft/tsdoc": "0.15.1", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" + "@braidai/lang": "^1.0.0" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz", + "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==", "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1465,71 +1347,71 @@ } }, "node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, "license": "MIT", "peer": true, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^14.0.0", + "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", "dev": true, "license": "MIT", "peer": true @@ -1596,35 +1478,35 @@ } }, "node_modules/@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^14.0.0" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@octokit/rest": { @@ -1822,25 +1704,34 @@ } }, "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@octokit/openapi-types": "^25.0.0" + "@octokit/openapi-types": "^27.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@oxc-project/runtime": { + "version": "0.101.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.101.0.tgz", + "integrity": "sha512-t3qpfVZIqSiLQ5Kqt/MC4Ge/WCOGrrcagAdzTcDaggupjiGxUx4nJF2v6wUCXWSzWHn5Ns7XLv13fCJEwCOERQ==", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=14" + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.101.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.101.0.tgz", + "integrity": "sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/@polka/url": { @@ -2091,24 +1982,10 @@ "node": ">= 10" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.53.tgz", + "integrity": "sha512-Ok9V8o7o6YfSdTTYA/uHH30r3YtOxLD6G3wih/U9DO0ucBBFq8WPt/DslU53OgfteLRHITZny9N/qCUxMf9kjQ==", "cpu": [ "arm64" ], @@ -2117,12 +1994,15 @@ "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.53.tgz", + "integrity": "sha512-yIsKqMz0CtRnVa6x3Pa+mzTihr4Ty+Z6HfPbZ7RVbk1Uxnco4+CUn7Qbm/5SBol1JD/7nvY8rphAgyAi7Lj6Vg==", "cpu": [ "arm64" ], @@ -2131,12 +2011,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.53.tgz", + "integrity": "sha512-GTXe+mxsCGUnJOFMhfGWmefP7Q9TpYUseHvhAhr21nCTgdS8jPsvirb0tJwM3lN0/u/cg7bpFNa16fQrjKrCjQ==", "cpu": [ "x64" ], @@ -2145,26 +2028,15 @@ "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.53.tgz", + "integrity": "sha512-9Tmp7bBvKqyDkMcL4e089pH3RsjD3SUungjmqWtyhNOxoQMh0fSmINTyYV8KXtE+JkxYMPWvnEt+/mfpVCkk8w==", "cpu": [ "x64" ], @@ -2173,12 +2045,15 @@ "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.53.tgz", + "integrity": "sha512-a1y5fiB0iovuzdbjUxa7+Zcvgv+mTmlGGC4XydVIsyl48eoxgaYkA3l9079hyTyhECsPq+mbr0gVQsFU11OJAQ==", "cpu": [ "arm" ], @@ -2187,26 +2062,32 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.53.tgz", + "integrity": "sha512-bpIGX+ov9PhJYV+wHNXl9rzq4F0QvILiURn0y0oepbQx+7stmQsKA0DhPGwmhfvF856wq+gbM8L92SAa/CBcLg==", "cpu": [ - "arm" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.53.tgz", + "integrity": "sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==", "cpu": [ "arm64" ], @@ -2215,124 +2096,152 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.53.tgz", + "integrity": "sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.53.tgz", + "integrity": "sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==", "cpu": [ - "loong64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.53.tgz", + "integrity": "sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.53.tgz", + "integrity": "sha512-BUjAEgpABEJXilGq/BPh7jeU3WAJ5o15c1ZEgHaDWSz3LB881LQZnbNJHmUiM4d1JQWMYYyR1Y490IBHi2FPJg==", "cpu": [ - "riscv64" + "wasm32" ], "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.53.tgz", + "integrity": "sha512-s27uU7tpCWSjHBnxyVXHt3rMrQdJq5MHNv3BzsewCIroIw3DJFjMH1dzCPPMUFxnh1r52Nf9IJ/eWp6LDoyGcw==", "cpu": [ - "riscv64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.53.tgz", + "integrity": "sha512-cjWL/USPJ1g0en2htb4ssMjIycc36RvdQAx1WlXnS6DpULswiUTVXPDesTifSKYSyvx24E0YqQkEm0K/M2Z/AA==", "cpu": [ - "s390x" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "android" ] }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "android" ] }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", "cpu": [ "arm64" ], @@ -2340,41 +2249,41 @@ "license": "MIT", "optional": true, "os": [ - "openharmony" + "darwin" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ] }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", "cpu": [ "x64" ], @@ -2382,242 +2291,232 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ] }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@rushstack/node-core-library": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.17.0.tgz", - "integrity": "sha512-24vt1GbHN6kyIglRMTVpyEiNRRRJK8uZHc1XoGAhmnTDKnrWet8OmOpImMswJIe6gM78eV8cMg1HXwuUHkSSgg==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "ajv": "~8.13.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } + "os": [ + "linux" + ] }, - "node_modules/@rushstack/node-core-library/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } + "os": [ + "linux" + ] }, - "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } + "os": [ + "linux" + ] }, - "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true + "os": [ + "linux" + ] }, - "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "ISC", + "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "os": [ + "linux" + ] }, - "node_modules/@rushstack/node-core-library/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==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "ISC", + "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "os": [ + "linux" + ] }, - "node_modules/@rushstack/node-core-library/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "ISC", + "license": "MIT", "optional": true, - "peer": true + "os": [ + "linux" + ] }, - "node_modules/@rushstack/problem-matcher": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", - "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } + "os": [ + "linux" + ] }, - "node_modules/@rushstack/rig-package": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", - "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } + "os": [ + "linux" + ] }, - "node_modules/@rushstack/terminal": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.1.tgz", - "integrity": "sha512-jsBuSad67IDVMO2yp0hDfs0OdE4z3mDIjIL2pclDT3aEJboeZXE85e1HjuD0F6JoW3XgHvDwoX+WOV+AVTDQeA==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "@rushstack/node-core-library": "5.17.0", - "@rushstack/problem-matcher": "0.1.1", - "supports-color": "~8.1.1" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@rushstack/terminal/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } + "os": [ + "win32" + ] }, - "node_modules/@rushstack/ts-command-line": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.1.tgz", - "integrity": "sha512-HPzFsUcr+wZ3oQI08Ec/E6cuiAVHKzrXZGHhwiwIGygAFiqN5QzX+ff30n70NU2WyE26CykgMwBZZSSyHCJrzA==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "@rushstack/terminal": "0.19.1", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - } + "os": [ + "win32" + ] }, - "node_modules/@rushstack/ts-command-line/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "os": [ + "win32" + ] }, - "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "optional": true, - "peer": true + "os": [ + "win32" + ] }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -2673,29 +2572,10 @@ "size-limit": "11.2.0" } }, - "node_modules/@size-limit/esbuild/node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@size-limit/file": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@size-limit/file/-/file-11.2.0.tgz", - "integrity": "sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==", + "node_modules/@size-limit/file": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@size-limit/file/-/file-11.2.0.tgz", + "integrity": "sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==", "dev": true, "license": "MIT", "engines": { @@ -2747,45 +2627,23 @@ "npm": ">= 5.5.1" } }, - "node_modules/@symbiotejs/symbiote": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/@symbiotejs/symbiote/-/symbiote-1.11.7.tgz", - "integrity": "sha512-fUOJwzuldeApJ533YeTdrfnpp4nsA+ss1eiNBodX7RHf4LnhPB2Z9HP4fF3m2YhKYnxK0whjXaKA+wrxTRP5qA==", - "license": "MIT" - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" + "color": "^5.0.2", + "text-hex": "1.0.x" } }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } + "license": "MIT" }, "node_modules/@total-typescript/ts-reset": { "version": "0.6.1", @@ -2805,41 +2663,43 @@ } }, "node_modules/@tsd/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-oKarNCN1QUhG148M88mtZdOlBZWWGcInquef+U8QL7gwJkRuNo5WS45Fjsd+3hM9cDJWGpqSZ4Oo097KDx4IWA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-JSSdNiS0wgd8GHhBwnMAI18Y8XPhLVN+dNelPfZCXFhy9Lb3NbnFyp9JKxxr54jSUkEJPk3cidvCoHducSaRMQ==", "dev": true, "license": "MIT", "engines": { "node": ">=14.17" } }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, - "peer": true + "dependencies": { + "tslib": "^2.4.0" + } }, - "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==", + "node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT" + "license": "0BSD", + "optional": true }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@types/ms": "*" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, "node_modules/@types/deep-eql": { @@ -2861,9 +2721,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", "dev": true, "license": "MIT" }, @@ -2906,23 +2766,14 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@types/node": { - "version": "22.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", - "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/normalize-package-data": { @@ -2933,21 +2784,21 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/svg-sprite": { @@ -2969,6 +2820,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, "node_modules/@types/vinyl": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", @@ -2980,6 +2837,13 @@ "@types/node": "*" } }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, "node_modules/@uploadcare/cname-prefix": { "version": "6.18.2", "resolved": "https://registry.npmjs.org/@uploadcare/cname-prefix/-/cname-prefix-6.18.2.tgz", @@ -3012,119 +2876,69 @@ } }, "node_modules/@vitest/browser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.2.4.tgz", - "integrity": "sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.15.tgz", + "integrity": "sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==", "dev": true, "license": "MIT", "dependencies": { - "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.6.1", - "@vitest/mocker": "3.2.4", - "@vitest/utils": "3.2.4", - "magic-string": "^0.30.17", - "sirv": "^3.0.1", - "tinyrainbow": "^2.0.0", - "ws": "^8.18.2" + "@vitest/mocker": "4.0.15", + "@vitest/utils": "4.0.15", + "magic-string": "^0.30.21", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "playwright": "*", - "vitest": "3.2.4", - "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } + "vitest": "4.0.15" } }, - "node_modules/@vitest/coverage-v8": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", - "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "node_modules/@vitest/browser-playwright": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.15.tgz", + "integrity": "sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^1.0.2", - "ast-v8-to-istanbul": "^0.3.3", - "debug": "^4.4.1", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.9.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" + "@vitest/browser": "4.0.15", + "@vitest/mocker": "4.0.15", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.2.4", - "vitest": "3.2.4" + "playwright": "*", + "vitest": "4.0.15" }, "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true + "playwright": { + "optional": false } } }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", + "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", + "@vitest/spy": "4.0.15", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -3135,135 +2949,371 @@ } } }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "node_modules/@vitest/browser-playwright/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "node_modules/@vitest/browser-playwright/node_modules/vite": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", + "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" + "bin": { + "vite": "bin/vite.js" }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" + "engines": { + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "node_modules/@vitest/browser/node_modules/@vitest/mocker": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", + "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.0.15", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/@vitest/browser/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=0.4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@vitest/browser/node_modules/vite": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", + "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", "dev": true, "license": "MIT", "optional": true, "peer": true, "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.15.tgz", + "integrity": "sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.0.15", + "ast-v8-to-istanbul": "^0.3.8", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.1", + "obug": "^2.1.1", + "std-env": "^3.10.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.0.15", + "vitest": "4.0.15" + }, "peerDependenciesMeta": { - "ajv": { + "@vitest/browser": { "optional": true } } }, - "node_modules/ajv-formats/node_modules/ajv": { + "node_modules/@vitest/expect": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz", + "integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz", + "integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz", + "integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.15", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz", + "integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.15", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", + "integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz", + "integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.15", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3275,39 +3325,33 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "environment": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3347,16 +3391,6 @@ "dev": true, "license": "Python-2.0" }, - "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==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", @@ -3434,24 +3468,17 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", - "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", + "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.30", + "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3462,6 +3489,19 @@ "node": ">=8" } }, + "node_modules/astray": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/astray/-/astray-1.1.1.tgz", + "integrity": "sha512-LizvbENqdc8tdvrms/YyYoTtlr43INJni4YZSFr8nNdfOgafi82Hcrfhjm0MdwLhRFBrDhRwtH/0fnntlESxsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "@types/estree": "^0.0.45" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -3519,9 +3559,9 @@ "license": "MIT" }, "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "dev": true, "license": "Apache-2.0", "peer": true @@ -3534,9 +3574,9 @@ "license": "ISC" }, "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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -3609,6 +3649,20 @@ "node": ">=8" } }, + "node_modules/cacheable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.0.tgz", + "integrity": "sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.0.6", + "@cacheable/utils": "^2.3.2", + "hookified": "^1.13.0", + "keyv": "^5.5.4", + "qified": "^0.5.2" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -3679,17 +3733,21 @@ "tslib": "^2.0.3" } }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/camelcase-keys": { @@ -3710,16 +3768,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", @@ -3732,19 +3780,19 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/capital-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -3787,13 +3835,6 @@ "tslib": "^1.10.0" } }, - "node_modules/change-case/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -3811,16 +3852,6 @@ "dev": true, "license": "MIT" }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -3845,16 +3876,19 @@ "license": "MIT" }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-highlight": { @@ -3879,6 +3913,16 @@ "npm": ">=5.0.0" } }, + "node_modules/cli-highlight/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-highlight/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3891,40 +3935,14 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cli-highlight/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-highlight/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cli-highlight/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -3983,61 +4001,35 @@ "@colors/colors": "1.5.0" } }, - "node_modules/cli-table3/node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4065,33 +4057,24 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/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==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -4195,14 +4178,17 @@ } }, "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" } }, "node_modules/color-convert": { @@ -4226,32 +4212,50 @@ "license": "MIT" }, "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" } }, "node_modules/color/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==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" } }, "node_modules/color/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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12.20" + } }, "node_modules/colord": { "version": "2.9.3", @@ -4267,17 +4271,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4291,13 +4284,13 @@ } }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=14" } }, "node_modules/compare-func": { @@ -4318,6 +4311,13 @@ "dev": true, "license": "MIT" }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, "node_modules/consola": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", @@ -4340,6 +4340,13 @@ "upper-case": "^2.0.2" } }, + "node_modules/constant-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/conventional-changelog-angular": { "version": "5.0.13", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", @@ -4422,26 +4429,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-core/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/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, - "license": "ISC" - }, "node_modules/conventional-changelog-preset-loader": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", @@ -4476,6 +4463,16 @@ "node": ">=10" } }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/conventional-commits-filter": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", @@ -4519,16 +4516,16 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -4565,18 +4562,30 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">= 8" + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, "node_modules/css-functions-list": { @@ -4614,13 +4623,13 @@ "license": "MIT" }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -4628,9 +4637,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4687,16 +4696,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/csso/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -4705,9 +4704,9 @@ "license": "MIT" }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, "license": "MIT" }, @@ -4840,16 +4839,6 @@ "node": ">=0.10.0" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -4861,9 +4850,9 @@ } }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "dev": true, "license": "MIT", "dependencies": { @@ -4878,9 +4867,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "engines": { @@ -4955,24 +4944,12 @@ "dev": true, "license": "ISC" }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", - "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -5000,12 +4977,15 @@ "node": ">=8" } }, - "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==", + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/dom-serializer": { "version": "1.4.1", @@ -5077,6 +5057,13 @@ "tslib": "^2.0.3" } }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5114,13 +5101,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -5138,9 +5118,9 @@ } }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, @@ -5159,9 +5139,9 @@ "license": "MIT" }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, "license": "MIT", "dependencies": { @@ -5178,6 +5158,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -5192,9 +5182,9 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5202,9 +5192,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { @@ -5212,18 +5202,18 @@ "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -5235,21 +5225,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -5258,7 +5251,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -5338,9 +5331,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5351,32 +5344,51 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esbuild-minify-templates": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/esbuild-minify-templates/-/esbuild-minify-templates-0.13.1.tgz", + "integrity": "sha512-x6+dQMxYq7Hu54gpcyGBl2ad3SCcbpalA4WxRDiSMGKtZJwArPNg8Kxrd2WNbv2y0OMDAaIubxaspfudb7Hw3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "astray": "^1.1.1", + "magic-string": "^0.30.17", + "meriyah": "^6.1.4" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "esbuild": ">=0.13.0 <1.0.0" } }, "node_modules/esbuild-visualizer": { @@ -5407,6 +5419,35 @@ "node": ">=8" } }, + "node_modules/esbuild-visualizer/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esbuild-visualizer/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/esbuild-visualizer/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -5425,19 +5466,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-visualizer/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -5448,6 +5476,16 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/eslint-formatter-pretty": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", @@ -5471,36 +5509,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-formatter-pretty/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-formatter-pretty/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-formatter-pretty/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/eslint-formatter-pretty/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "type-fest": "^0.21.3" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-formatter-pretty/node_modules/supports-hyperlinks": { @@ -5517,6 +5539,19 @@ "node": ">=8" } }, + "node_modules/eslint-formatter-pretty/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-rule-docs": { "version": "1.1.235", "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", @@ -5534,6 +5569,13 @@ "@types/estree": "^1.0.0" } }, + "node_modules/estree-walker/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -5541,10 +5583,46 @@ "dev": true, "license": "MIT" }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5567,9 +5645,9 @@ } }, "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", "dev": true, "funding": [ { @@ -5608,23 +5686,10 @@ "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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -5658,6 +5723,24 @@ "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -5688,14 +5771,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/file-entry-cache": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz", + "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.0" + "dependencies": { + "flat-cache": "^6.1.19" } }, "node_modules/filelist": { @@ -5709,9 +5792,9 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5745,20 +5828,16 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/fix-dts-default-cjs-exports": { @@ -5774,65 +5853,23 @@ } }, "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==", + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz", + "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "cacheable": "^2.2.0", + "flatted": "^3.3.3", + "hookified": "^1.13.0" } }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, - "license": "ISC", - "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/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" + "license": "ISC" }, "node_modules/fn.name": { "version": "1.1.0", @@ -5842,9 +5879,9 @@ "license": "MIT" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "dev": true, "funding": [ { @@ -5878,68 +5915,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6002,6 +5993,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -6012,6 +6013,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -6055,6 +6069,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-pkg-repo/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/get-pkg-repo/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -6067,13 +6091,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/get-pkg-repo/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, "node_modules/get-pkg-repo/node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -6087,16 +6104,6 @@ "node": ">=10" } }, - "node_modules/get-pkg-repo/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/get-pkg-repo/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6150,16 +6157,14 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/get-pkg-repo/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/get-pkg-repo/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -6194,13 +6199,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/get-pkg-repo/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, - "license": "ISC" - }, "node_modules/get-pkg-repo/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -6234,16 +6232,16 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "pump": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, "node_modules/get-symbol-description": { @@ -6265,9 +6263,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", - "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6338,6 +6336,16 @@ "node": ">=10" } }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", @@ -6349,47 +6357,47 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6423,19 +6431,6 @@ "node": ">=6" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -6454,24 +6449,45 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, "license": "MIT", "dependencies": { + "@types/glob": "^7.1.1", "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", "slash": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globjoin": { @@ -6522,30 +6538,38 @@ "uglify-js": "^3.1.4" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/happy-dom": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-16.8.1.tgz", - "integrity": "sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw==", + "version": "20.0.11", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.11.tgz", + "integrity": "sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==", "dev": true, "license": "MIT", "dependencies": { - "webidl-conversions": "^7.0.0", + "@types/node": "^20.0.0", + "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/happy-dom/node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" } }, + "node_modules/happy-dom/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -6635,6 +6659,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hashery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.3.0.tgz", + "integrity": "sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -6658,6 +6695,13 @@ "tslib": "^2.0.3" } }, + "node_modules/header-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -6668,6 +6712,13 @@ "node": "*" } }, + "node_modules/hookified": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", + "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", + "dev": true, + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -6696,16 +6747,16 @@ } }, "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { - "husky": "lib/bin.js" + "husky": "bin.js" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/typicode" @@ -6751,14 +6802,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { + "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/imurmurhash": { @@ -6832,52 +6883,122 @@ "node": ">=6.0.0" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "type-fest": "^0.21.3" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/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/inquirer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "node_modules/inquirer/node_modules/chalk": { "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==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=8" } }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, + "node_modules/inquirer/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -7056,16 +7177,16 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7098,27 +7219,31 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -7161,26 +7286,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-map": { + "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -7432,16 +7554,19 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { @@ -7499,9 +7624,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7512,33 +7637,16 @@ "node": ">=8" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", + "async": "^3.2.6", "filelist": "^1.0.4", - "minimatch": "^3.1.2" + "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" @@ -7563,41 +7671,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/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, - "license": "MIT", - "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/jest-diff/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -7618,15 +7691,6 @@ "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -7638,16 +7702,16 @@ } }, "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==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -7657,13 +7721,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -7678,6 +7735,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -7685,21 +7749,6 @@ "dev": true, "license": "ISC" }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -7743,13 +7792,13 @@ } }, "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==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.5.tgz", + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/kind-of": { @@ -7763,9 +7812,9 @@ } }, "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==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", "dev": true, "license": "MIT" }, @@ -7782,8 +7831,6 @@ "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", "dev": true, "license": "MPL-2.0", - "optional": true, - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -7821,7 +7868,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7843,7 +7889,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7865,7 +7910,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7887,7 +7931,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7909,7 +7952,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7931,7 +7973,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7953,7 +7994,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7975,7 +8015,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7997,7 +8036,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -8019,7 +8057,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -8041,7 +8078,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -8051,13 +8087,16 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -8068,348 +8107,87 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", - "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "5.3.0", - "commander": "11.0.0", - "debug": "4.3.4", - "execa": "7.2.0", - "lilconfig": "2.1.0", - "listr2": "6.6.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.1" + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=20.17" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "dev": true, "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=20" } }, - "node_modules/lint-staged/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/lint-staged/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/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, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/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, - "license": "MIT" - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20.0.0" } }, - "node_modules/listr2/node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dev": true, - "license": "MIT", + "node_modules/lit": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz", + "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", + "license": "BSD-3-Clause", "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" } }, - "node_modules/listr2/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "license": "MIT", + "node_modules/lit-element": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.1.tgz", + "integrity": "sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==", + "license": "BSD-3-Clause", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@lit-labs/ssr-dom-shim": "^1.4.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" } }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", + "node_modules/lit-html": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", + "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", + "license": "BSD-3-Clause", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/trusted-types": "^2.0.2" } }, "node_modules/load-json-file": { @@ -8439,19 +8217,17 @@ } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/lodash": { @@ -8482,13 +8258,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -8513,6 +8282,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/logform": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", @@ -8531,12 +8320,15 @@ "node": ">= 12.0.0" } }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } }, "node_modules/lower-case": { "version": "2.0.2", @@ -8548,14 +8340,21 @@ "tslib": "^2.0.3" } }, - "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==", + "node_modules/lower-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" + "license": "0BSD" + }, + "node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, "node_modules/macos-release": { @@ -8572,9 +8371,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8582,15 +8381,15 @@ } }, "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" } }, "node_modules/make-dir": { @@ -8609,23 +8408,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, "license": "MIT", "engines": { @@ -8670,35 +8456,6 @@ "marked": ">=1 <16" } }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked-terminal/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/marked-terminal/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -8733,9 +8490,9 @@ } }, "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==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true, "license": "CC0-1.0" }, @@ -8872,6 +8629,16 @@ "node": ">=8" } }, + "node_modules/meow/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/meow/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -8891,6 +8658,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/meow/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/meow/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -8975,46 +8752,6 @@ "node": ">=8" } }, - "node_modules/meow/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/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, - "license": "ISC" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9025,6 +8762,16 @@ "node": ">= 8" } }, + "node_modules/meriyah": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-6.1.4.tgz", + "integrity": "sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9039,6 +8786,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -9070,6 +8830,19 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -9142,32 +8915,16 @@ } }, "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dev": true, - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, + "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" } }, "node_modules/modify-values": { @@ -9236,10 +8993,23 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", "dev": true, "funding": [ { @@ -9249,10 +9019,10 @@ ], "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" } }, "node_modules/nanospinner": { @@ -9265,6 +9035,21 @@ "picocolors": "^1.1.1" } }, + "node_modules/nanostores": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-1.1.0.tgz", + "integrity": "sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -9290,6 +9075,13 @@ "tslib": "^2.0.3" } }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/node-emoji": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", @@ -9327,31 +9119,6 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-watch": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.4.tgz", @@ -9466,33 +9233,6 @@ "dev": true, "license": "MIT" }, - "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/npm-run-all/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/npm-run-all/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -9503,16 +9243,6 @@ "node": ">=4" } }, - "node_modules/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-all/node_modules/pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", @@ -9526,39 +9256,6 @@ "node": ">=0.10" } }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-all/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -9572,17 +9269,17 @@ "node": ">=4" } }, - "node_modules/npm-run-all/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "path-key": "^2.0.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=4" } }, "node_modules/nth-check": { @@ -9652,6 +9349,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -9673,16 +9381,16 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9760,45 +9468,39 @@ } }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/package-json-from-dist": { @@ -9809,9 +9511,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/package-manager-detector": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.4.0.tgz", - "integrity": "sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", "dev": true, "license": "MIT" }, @@ -9826,6 +9528,13 @@ "tslib": "^2.0.3" } }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -9867,9 +9576,9 @@ } }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true, "license": "MIT" }, @@ -9883,6 +9592,13 @@ "parse5": "^6.0.1" } }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -9894,6 +9610,13 @@ "tslib": "^2.0.3" } }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", @@ -9905,14 +9628,21 @@ "tslib": "^2.0.3" } }, + "node_modules/path-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/path-is-absolute": { @@ -9926,13 +9656,13 @@ } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/path-parse": { @@ -9943,37 +9673,33 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/pathe": { @@ -9983,16 +9709,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -10001,13 +9717,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -10046,14 +9762,39 @@ "node": ">= 6" } }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -10066,9 +9807,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10094,6 +9835,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -10133,6 +9884,49 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", @@ -10141,26 +9935,36 @@ "license": "MIT" }, "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=18.0" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.31" } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -10172,9 +9976,9 @@ } }, "node_modules/postcss-sorting": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", - "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-9.1.0.tgz", + "integrity": "sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10188,19 +9992,54 @@ "dev": true, "license": "MIT" }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "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==", + "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, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "react-is": "^18.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -10230,9 +10069,9 @@ "license": "MIT" }, "node_modules/publint": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.14.tgz", - "integrity": "sha512-14/VNBvWsrBeqWNDw8c/DK5ERcZBUwL1rnkVx18cQnF3zadr3GfoYtvD8mxi1dhkWpaPHp8kfi92MDbjMeW3qw==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.15.tgz", + "integrity": "sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==", "dev": true, "license": "MIT", "dependencies": { @@ -10252,9 +10091,9 @@ } }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "dev": true, "license": "MIT", "dependencies": { @@ -10262,16 +10101,6 @@ "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -10284,6 +10113,19 @@ "teleport": ">=0.2.0" } }, + "node_modules/qified": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.3.tgz", + "integrity": "sha512-kXuQdQTB6oN3KhI6V4acnBSZx8D2I4xzZvn9+wFLLFCoBNQY/sFnCW6c43OL7pOQ2HvGV4lnWIXNmgfp7cTWhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10326,9 +10168,9 @@ } }, "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==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, @@ -10361,92 +10203,6 @@ "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -10591,13 +10347,13 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -10612,13 +10368,13 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/resolve-pkg-maps": { @@ -10632,17 +10388,20 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/reusify": { @@ -10664,25 +10423,61 @@ "license": "MIT" }, "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^10.3.7" + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rolldown": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.53.tgz", + "integrity": "sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.101.0", + "@rolldown/pluginutils": "1.0.0-beta.53" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.53", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.53", + "@rolldown/binding-darwin-x64": "1.0.0-beta.53", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.53", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.53", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.53", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.53", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.53", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.53", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.53", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.53", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.53", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.53" + } + }, "node_modules/rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "dev": true, "license": "MIT", "dependencies": { @@ -10696,31 +10491,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -10781,13 +10583,6 @@ "npm": ">=2.0.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -10895,13 +10690,16 @@ "license": "MIT" }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/sentence-case": { @@ -10916,6 +10714,13 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/sentence-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/serialize-javascript": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", @@ -10976,32 +10781,32 @@ } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -11129,43 +10934,30 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/shipjs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/shipjs/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "license": "MIT", + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": "*" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shipjs/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "node_modules/shipjs/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "is-docker": "^2.0.0" }, "engines": { "node": ">=8" @@ -11188,22 +10980,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shipjs/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -11288,33 +11064,22 @@ "license": "ISC" }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true, - "license": "MIT" - }, "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, "license": "MIT", "dependencies": { @@ -11348,27 +11113,14 @@ "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/size-limit/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" }, "engines": { "node": ">=8" @@ -11385,26 +11137,26 @@ } }, "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -11425,6 +11177,23 @@ "tslib": "^2.0.3" } }, + "node_modules/snake-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -11465,9 +11234,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "dev": true, "license": "CC0-1.0" }, @@ -11520,12 +11289,26 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -11547,25 +11330,6 @@ } }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -11580,50 +11344,37 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/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==", + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/string.prototype.padend": { @@ -11705,30 +11456,19 @@ } }, "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==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=12" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-bom": { @@ -11764,128 +11504,117 @@ "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true, - "license": "ISC" - }, "node_modules/stylelint": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", - "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", + "version": "16.26.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz", + "integrity": "sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/media-query-list-parser": "^2.1.4", - "@csstools/selector-specificity": "^3.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-syntax-patches-for-csstree": "^1.0.19", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.2.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^8.2.0", - "css-functions-list": "^3.2.1", - "css-tree": "^2.3.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.1", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.3", + "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^7.0.0", + "file-entry-cache": "^11.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.2.4", - "import-lazy": "^4.0.0", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.29.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", - "meow": "^10.1.5", - "micromatch": "^4.0.5", + "meow": "^13.2.0", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.28", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.13", + "picocolors": "^1.1.1", + "postcss": "^8.5.6", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^3.0.0", + "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", + "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" + "node": ">=18.12.0" } }, "node_modules/stylelint-config-recommended": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-11.0.0.tgz", - "integrity": "sha512-SoGIHNI748OCZn6BxFYT83ytWoYETCINVHV3LKScVAWQQauWdvmdDqJC5YXWjpBbxg2E761Tg5aUGKLFOVhEkA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz", + "integrity": "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, "peerDependencies": { - "stylelint": "^15.3.0" + "stylelint": "^16.23.0" } }, "node_modules/stylelint-config-standard": { - "version": "32.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-32.0.0.tgz", - "integrity": "sha512-UnGJxYDyYFrIE9CjDMZRkrNh2o4lOtO+MVZ9qG5b8yARfsWho0GMx4YvhHfsv8zKKgHeWX2wfeyxmuoqcaYZ4w==", + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-39.0.1.tgz", + "integrity": "sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "license": "MIT", "dependencies": { - "stylelint-config-recommended": "^11.0.0" + "stylelint-config-recommended": "^17.0.0" + }, + "engines": { + "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^15.4.0" + "stylelint": "^16.23.0" } }, "node_modules/stylelint-declaration-block-no-ignored-properties": { @@ -11902,17 +11631,20 @@ } }, "node_modules/stylelint-order": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", - "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-7.0.0.tgz", + "integrity": "sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==", "dev": true, "license": "MIT", "dependencies": { - "postcss": "^8.4.32", - "postcss-sorting": "^8.0.2" + "postcss": "^8.5.3", + "postcss-sorting": "^9.1.0" + }, + "engines": { + "node": ">=20.19.0" }, "peerDependencies": { - "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + "stylelint": "^16.18.0" } }, "node_modules/stylelint/node_modules/balanced-match": { @@ -11922,365 +11654,102 @@ "dev": true, "license": "MIT" }, - "node_modules/stylelint/node_modules/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "node_modules/stylelint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "node_modules/stylelint/node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/stylelint/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/stylelint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", - "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", + "node_modules/stylelint/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "license": "MIT", - "dependencies": { - "flat-cache": "^3.2.0" - }, "engines": { - "node": ">=12.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/stylelint/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/stylelint/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==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/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, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/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, - "license": "ISC" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=8" } @@ -12428,16 +11897,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/table": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", @@ -12455,30 +11914,16 @@ "node": ">=10.0.0" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, "node_modules/table/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", @@ -12489,13 +11934,6 @@ "node": ">=8" } }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -12514,16 +11952,14 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -12572,6 +12008,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/temp-write/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/tempfile": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-3.0.0.tgz", @@ -12596,47 +12042,6 @@ "node": ">=8" } }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -12725,61 +12130,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -12822,6 +12176,13 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -12860,13 +12221,13 @@ "license": "Apache-2.0" }, "node_modules/tsd": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.32.0.tgz", - "integrity": "sha512-R5lBZCbxGBowOcW0gpQaiIjGYrG5NmU+PfFDKcc3zbtzWjML1o/zAwzdDnS2ZheSlPu9GW51azpFqEPUBq9DoQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.33.0.tgz", + "integrity": "sha512-/PQtykJFVw90QICG7zyPDMIyueOXKL7jOJVoX5pILnb3Ux+7QqynOxfVvarE+K+yi7BZyOSY4r+OZNWSWRiEwQ==", "dev": true, "license": "MIT", "dependencies": { - "@tsd/typescript": "~5.8.3", + "@tsd/typescript": "^5.9.2", "eslint-formatter-pretty": "^4.1.0", "globby": "^11.0.1", "jest-diff": "^29.0.3", @@ -12895,6 +12256,27 @@ "node": ">=8" } }, + "node_modules/tsd/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tsd/node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -13006,6 +12388,16 @@ "node": ">=8" } }, + "node_modules/tsd/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/tsd/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -13025,6 +12417,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tsd/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/tsd/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -13109,50 +12511,17 @@ "node": ">=8" } }, - "node_modules/tsd/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tsd/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tsd/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, - "license": "ISC" - }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tsup": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz", - "integrity": "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", + "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", "dev": true, "license": "MIT", "dependencies": { @@ -13161,14 +12530,14 @@ "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", - "source-map": "0.8.0-beta.0", + "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", @@ -13202,10372 +12571,1658 @@ } } }, - "node_modules/tsup/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/tsup/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "node": ">=18" } }, - "node_modules/tsup/node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/tsup/node_modules/@esbuild/android-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "cpu": [ + "arm" ], + "dev": true, "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "node": ">=18" } }, - "node_modules/tsup/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/tsup/node_modules/@esbuild/android-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/tsup/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "deprecated": "The work that was done in this beta branch won't be included in future versions", + "node_modules/tsup/node_modules/@esbuild/android-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/tsup/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tsup/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/tsup/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/tsup/node_modules/@esbuild/darwin-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=18" } }, - "node_modules/tsx/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "cpu": [ + "x64" + ], "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "freebsd" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/tsup/node_modules/@esbuild/linux-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "node_modules/tsup/node_modules/@esbuild/linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "node_modules/tsup/node_modules/@esbuild/linux-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "node_modules/tsup/node_modules/@esbuild/linux-loong64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.17" + "node": ">=18" } }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "node_modules/tsup/node_modules/@esbuild/linux-s390x": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "node_modules/tsup/node_modules/@esbuild/linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/tsup/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 10.0.0" + "node": ">=18" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "node_modules/tsup/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/tsup/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/tsup/node_modules/@esbuild/sunos-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "bin": { - "uuid": "bin/uuid" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/tsup/node_modules/@esbuild/win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "node_modules/tsup/node_modules/@esbuild/win32-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "node_modules/tsup/node_modules/@esbuild/win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.10" + "node": ">=18" } }, - "node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "node_modules/tsup/node_modules/esbuild": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, "bin": { - "vite": "bin/vite.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" + "node": ">=18" }, "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "node_modules/tsup/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" }, "bin": { - "vite-node": "vite-node.mjs" + "tsx": "dist/cli.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": ">=18.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "node": ">=18" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "cpu": [ + "arm" + ], "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=18" } }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } + "node": ">=18" } }, - "node_modules/vitest/node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=18" } }, - "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==", + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=12" + "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==", + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "execa": "^1.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4.8" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "node_modules/windows-release/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/windows-release/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12.0.0" + "node": ">=18" } }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 12.0.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "node_modules/tsx/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, - "license": "MIT" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14.17" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "is-inside-container": "^1.0.0" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" }, "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xpath": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", - "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0" - } + "license": "MIT" }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4" + "node": ">=4" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "dev": true, "license": "ISC", - "engines": { - "node": ">=10" - } + "peer": true }, - "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" + "tslib": "^2.0.3" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/upper-case-first/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } + "license": "0BSD" }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/upper-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT" + "license": "0BSD" }, - "node_modules/yargs/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==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", "engines": { - "node": ">=12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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==", + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "engines": { + "node": ">= 0.10" } }, - "@andrewbranch/untar.js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz", - "integrity": "sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==", - "dev": true - }, - "@arethetypeswrong/cli": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@arethetypeswrong/cli/-/cli-0.18.2.tgz", - "integrity": "sha512-PcFM20JNlevEDKBg4Re29Rtv2xvjvQZzg7ENnrWFSS0PHgdP2njibVFw+dRUhNkPgNfac9iUqO0ohAXqQL4hbw==", + "node_modules/vite": { + "version": "8.0.0-beta.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0-beta.0.tgz", + "integrity": "sha512-bXHWmtg5hUxn/MB5zJ8qhBLphnsNmO1EYOFmBO/fVCBJekTdWDuqJ/GmUMLgrC0QUCCrxhw3JLgteWdiyqaVSQ==", "dev": true, - "requires": { - "@arethetypeswrong/core": "0.18.2", - "chalk": "^4.1.2", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "marked": "^9.1.2", - "marked-terminal": "^7.1.0", - "semver": "^7.5.4" - }, + "license": "MIT", "dependencies": { - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - }, - "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true - } - } - }, - "@arethetypeswrong/core": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@arethetypeswrong/core/-/core-0.18.2.tgz", - "integrity": "sha512-GiwTmBFOU1/+UVNqqCGzFJYfBXEytUkiI+iRZ6Qx7KmUVtLm00sYySkfe203C9QtPG11yOz1ZaMek8dT/xnlgg==", - "dev": true, - "requires": { - "@andrewbranch/untar.js": "^1.0.3", - "@loaderkit/resolve": "^1.0.2", - "cjs-module-lexer": "^1.2.3", - "fflate": "^0.8.2", - "lru-cache": "^11.0.1", - "semver": "^7.5.4", - "typescript": "5.6.1-rc", - "validate-npm-package-name": "^5.0.0" + "@oxc-project/runtime": "0.101.0", + "fdir": "^6.5.0", + "lightningcss": "^1.30.2", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rolldown": "1.0.0-beta.53", + "tinyglobby": "^0.2.15" }, - "dependencies": { - "lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "dev": true + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "esbuild": "^0.25.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true }, - "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true + "esbuild": { + "optional": true }, - "typescript": { - "version": "5.6.1-rc", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.1-rc.tgz", - "integrity": "sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==", - "dev": true - } - } - }, - "@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - } - }, - "@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true - }, - "@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", - "dev": true, - "requires": { - "@babel/types": "^7.28.4" - } - }, - "@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", - "dev": true - }, - "@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - } - }, - "@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true - }, - "@biomejs/biome": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.5.tgz", - "integrity": "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==", - "dev": true, - "requires": { - "@biomejs/cli-darwin-arm64": "2.2.5", - "@biomejs/cli-darwin-x64": "2.2.5", - "@biomejs/cli-linux-arm64": "2.2.5", - "@biomejs/cli-linux-arm64-musl": "2.2.5", - "@biomejs/cli-linux-x64": "2.2.5", - "@biomejs/cli-linux-x64-musl": "2.2.5", - "@biomejs/cli-win32-arm64": "2.2.5", - "@biomejs/cli-win32-x64": "2.2.5" - } - }, - "@biomejs/cli-darwin-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.5.tgz", - "integrity": "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==", - "dev": true, - "optional": true - }, - "@biomejs/cli-darwin-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.5.tgz", - "integrity": "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.5.tgz", - "integrity": "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-arm64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.5.tgz", - "integrity": "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz", - "integrity": "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-x64-musl": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz", - "integrity": "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==", - "dev": true, - "optional": true - }, - "@biomejs/cli-win32-arm64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz", - "integrity": "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==", - "dev": true, - "optional": true - }, - "@biomejs/cli-win32-x64": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.5.tgz", - "integrity": "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==", - "dev": true, - "optional": true - }, - "@biomejs/js-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/js-api/-/js-api-3.0.0.tgz", - "integrity": "sha512-5QcGJFj9IO+yXl76ICjvkdE38uxRcTDsBzcCZHEZ+ma+Te/nbvJg4A3KtAds9HCrEF0JKLWiyjMhAbqazuJvYA==", - "dev": true, - "requires": {} - }, - "@biomejs/wasm-nodejs": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@biomejs/wasm-nodejs/-/wasm-nodejs-2.2.5.tgz", - "integrity": "sha512-p9BhDKyjyemt9aBOaqINrsTJSWiCYZu1asM5AxfMFxF9Fi3L3ZcIbzxe5OYa294oNllmmqJ+68GlZG/2fqF0dQ==", - "dev": true - }, - "@braidai/lang": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@braidai/lang/-/lang-1.1.2.tgz", - "integrity": "sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==", - "dev": true - }, - "@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "dev": true - }, - "@csstools/css-parser-algorithms": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", - "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", - "dev": true, - "requires": {} - }, - "@csstools/css-tokenizer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", - "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", - "dev": true - }, - "@csstools/media-query-list-parser": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz", - "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==", - "dev": true, - "requires": {} - }, - "@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "dependencies": { - "@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "requires": {} + "jiti": { + "optional": true }, - "postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - } - } - }, - "@csstools/selector-specificity": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", - "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", - "dev": true, - "requires": {} - }, - "@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dev": true, - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", - "dev": true, - "optional": true - }, - "@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", - "dev": true, - "optional": true - }, - "@happy-dom/global-registrator": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@happy-dom/global-registrator/-/global-registrator-16.8.1.tgz", - "integrity": "sha512-EzV55rpNs5AXwFRb2tGrU6STr2Rgwtoi9awvh6vDglGZypXCFsJYYJpskZ2rhWaLL6Zbw5/+uJj+mocRPZuEUg==", - "dev": true, - "requires": { - "happy-dom": "^16.8.1" - } - }, - "@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true - }, - "@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "optional": true, - "peer": true - }, - "@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@isaacs/balanced-match": "^4.0.1" - } - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "@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 - }, - "@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, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@loaderkit/resolve": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.4.tgz", - "integrity": "sha512-rJzYKVcV4dxJv+vW6jlvagF8zvGxHJ2+HTr1e2qOejfmGhAApgJHl8Aog4mMszxceTRiKTTbnpgmTO1bEZHV/A==", - "dev": true, - "requires": { - "@braidai/lang": "^1.0.0" - } - }, - "@microsoft/api-extractor": { - "version": "7.53.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.53.1.tgz", - "integrity": "sha512-bul5eTNxijLdDBqLye74u9494sRmf+9QULtec9Od0uHnifahGeNt8CC4/xCdn7mVyEBrXIQyQ5+sc4Uc0QfBSA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@microsoft/api-extractor-model": "7.31.1", - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.17.0", - "@rushstack/rig-package": "0.6.0", - "@rushstack/terminal": "0.19.1", - "@rushstack/ts-command-line": "5.1.1", - "lodash": "~4.17.15", - "minimatch": "10.0.3", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.8.2" - }, - "dependencies": { - "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, - "optional": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@isaacs/brace-expansion": "^5.0.0" - } - }, - "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, - "optional": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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, - "optional": true, - "peer": true - }, - "typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "optional": true, - "peer": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@microsoft/api-extractor-model": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.31.1.tgz", - "integrity": "sha512-Dhnip5OFKbl85rq/ICHBFGhV4RA5UQSl8AC/P/zoGvs+CBudPkatt5kIhMGiYgVPnUWmfR6fcp38+1AFLYNtUw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.17.0" - } - }, - "@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", - "dev": true, - "optional": true, - "peer": true - }, - "@microsoft/tsdoc-config": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", - "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@microsoft/tsdoc": "0.15.1", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@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, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@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 - }, - "@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, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", - "dev": true, - "peer": true - }, - "@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "dev": true, - "peer": true, - "requires": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.2.2", - "@octokit/request": "^9.2.3", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - } - }, - "@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "dev": true, - "peer": true, - "requires": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - } - }, - "@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "dev": true, - "peer": true, - "requires": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - } - }, - "@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "dev": true, - "peer": true - }, - "@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "requires": { - "@octokit/types": "^6.40.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - } - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz", - "integrity": "sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg==", - "dev": true, - "requires": { - "@octokit/types": "^4.1.6", - "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/types": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", - "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/request": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz", - "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==", - "dev": true, - "peer": true, - "requires": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - } - }, - "@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "dev": true, - "peer": true, - "requires": { - "@octokit/types": "^14.0.0" - } - }, - "@octokit/rest": { - "version": "17.11.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", - "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==", - "dev": true, - "requires": { - "@octokit/core": "^2.4.3", - "@octokit/plugin-paginate-rest": "^2.2.0", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "3.17.0" - }, - "dependencies": { - "@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3" - }, - "dependencies": { - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - } - } - }, - "@octokit/core": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", - "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.4.0", - "@octokit/types": "^5.0.0", - "before-after-hook": "^2.1.0", - "universal-user-agent": "^5.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - } - } - }, - "@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "requires": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - } - } - }, - "@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - } - } - }, - "@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "dependencies": { - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - } - } - }, - "@octokit/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", - "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - }, - "before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } - } - } - }, - "@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "dev": true, - "peer": true, - "requires": { - "@octokit/openapi-types": "^25.0.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true - }, - "@publint/pack": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.2.tgz", - "integrity": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==", - "dev": true - }, - "@resvg/resvg-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", - "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", - "dev": true, - "requires": { - "@resvg/resvg-js-android-arm-eabi": "2.6.2", - "@resvg/resvg-js-android-arm64": "2.6.2", - "@resvg/resvg-js-darwin-arm64": "2.6.2", - "@resvg/resvg-js-darwin-x64": "2.6.2", - "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", - "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", - "@resvg/resvg-js-linux-arm64-musl": "2.6.2", - "@resvg/resvg-js-linux-x64-gnu": "2.6.2", - "@resvg/resvg-js-linux-x64-musl": "2.6.2", - "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", - "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", - "@resvg/resvg-js-win32-x64-msvc": "2.6.2" - } - }, - "@resvg/resvg-js-android-arm-eabi": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz", - "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-android-arm64": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz", - "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-darwin-arm64": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz", - "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-darwin-x64": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz", - "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-linux-arm-gnueabihf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz", - "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-linux-arm64-gnu": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz", - "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-linux-arm64-musl": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz", - "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-linux-x64-gnu": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", - "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-linux-x64-musl": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", - "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-win32-arm64-msvc": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz", - "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-win32-ia32-msvc": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz", - "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==", - "dev": true, - "optional": true - }, - "@resvg/resvg-js-win32-x64-msvc": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz", - "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", - "dev": true, - "optional": true - }, - "@rushstack/node-core-library": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.17.0.tgz", - "integrity": "sha512-24vt1GbHN6kyIglRMTVpyEiNRRRJK8uZHc1XoGAhmnTDKnrWet8OmOpImMswJIe6gM78eV8cMg1HXwuUHkSSgg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "ajv": "~8.13.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4" - }, - "dependencies": { - "ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - } - }, - "ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true, - "optional": true, - "peer": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true, - "peer": true - }, - "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, - "optional": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "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, - "optional": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@rushstack/problem-matcher": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", - "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", - "dev": true, - "optional": true, - "peer": true, - "requires": {} - }, - "@rushstack/rig-package": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", - "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "@rushstack/terminal": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.1.tgz", - "integrity": "sha512-jsBuSad67IDVMO2yp0hDfs0OdE4z3mDIjIL2pclDT3aEJboeZXE85e1HjuD0F6JoW3XgHvDwoX+WOV+AVTDQeA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@rushstack/node-core-library": "5.17.0", - "@rushstack/problem-matcher": "0.1.1", - "supports-color": "~8.1.1" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@rushstack/ts-command-line": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.1.tgz", - "integrity": "sha512-HPzFsUcr+wZ3oQI08Ec/E6cuiAVHKzrXZGHhwiwIGygAFiqN5QzX+ff30n70NU2WyE26CykgMwBZZSSyHCJrzA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@rushstack/terminal": "0.19.1", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "@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 - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@size-limit/esbuild": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@size-limit/esbuild/-/esbuild-11.2.0.tgz", - "integrity": "sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==", - "dev": true, - "requires": { - "esbuild": "^0.25.0", - "nanoid": "^5.1.0" - }, - "dependencies": { - "nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "dev": true - } - } - }, - "@size-limit/esbuild-why": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@size-limit/esbuild-why/-/esbuild-why-11.2.0.tgz", - "integrity": "sha512-VtoQbbkvFbF314LWEaEp1+IjG0DH+9w6nP//D6Gd48SEAPLoBgqk287mjYTF9WYxg9N5lo8KjpXxEFk4gOXNpw==", - "dev": true, - "requires": { - "esbuild-visualizer": "^0.7.0", - "open": "^10.1.0" - } - }, - "@size-limit/file": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@size-limit/file/-/file-11.2.0.tgz", - "integrity": "sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==", - "dev": true, - "requires": {} - }, - "@size-limit/preset-small-lib": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@size-limit/preset-small-lib/-/preset-small-lib-11.2.0.tgz", - "integrity": "sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==", - "dev": true, - "requires": { - "@size-limit/esbuild": "11.2.0", - "@size-limit/file": "11.2.0", - "size-limit": "11.2.0" - } - }, - "@slack/types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", - "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==", - "dev": true - }, - "@slack/webhook": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-5.0.4.tgz", - "integrity": "sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA==", - "dev": true, - "requires": { - "@slack/types": "^1.2.1", - "@types/node": ">=8.9.0", - "axios": "^0.21.1" - } - }, - "@symbiotejs/symbiote": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/@symbiotejs/symbiote/-/symbiote-1.11.7.tgz", - "integrity": "sha512-fUOJwzuldeApJ533YeTdrfnpp4nsA+ss1eiNBodX7RHf4LnhPB2Z9HP4fF3m2YhKYnxK0whjXaKA+wrxTRP5qA==" - }, - "@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - } - }, - "@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "requires": {} - }, - "@total-typescript/ts-reset": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@total-typescript/ts-reset/-/ts-reset-0.6.1.tgz", - "integrity": "sha512-cka47fVSo6lfQDIATYqb/vO1nvFfbPw7uWLayIXIhGETj0wcOOlrlkobOMDNQOFr9QOafegUPq13V2+6vtD7yg==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@tsd/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-oKarNCN1QUhG148M88mtZdOlBZWWGcInquef+U8QL7gwJkRuNo5WS45Fjsd+3hM9cDJWGpqSZ4Oo097KDx4IWA==", - "dev": true - }, - "@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true, - "optional": true, - "peer": true - }, - "@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 - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true - }, - "@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "@types/expect": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", - "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", - "dev": true - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "optional": true, - "peer": true - }, - "@types/node": { - "version": "22.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.9.tgz", - "integrity": "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==", - "dev": true, - "requires": { - "undici-types": "~6.21.0" - } - }, - "@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "dev": true - }, - "@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "@types/svg-sprite": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/svg-sprite/-/svg-sprite-0.0.39.tgz", - "integrity": "sha512-6zpek4v8Ch8iZ9HnXlla8Zqt9bPi9MQZt3IAI6Xqn1Ts3xOUo2nX2qRGu/tfxCeNoQ925PMI+t6z6eiJh/RNzQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/vinyl": "*", - "winston": "^3.0.0" - } - }, - "@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "dev": true - }, - "@types/vinyl": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", - "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", - "dev": true, - "requires": { - "@types/expect": "^1.20.4", - "@types/node": "*" - } - }, - "@uploadcare/cname-prefix": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/@uploadcare/cname-prefix/-/cname-prefix-6.18.2.tgz", - "integrity": "sha512-5KS7Nt8VRtXa/gHCTcB8+VHcICesXznhjl6cE94D5JkI+Ty1jEK8JlHizE5FcL0f05NVpN8mps/olRSjQv7Pjw==" - }, - "@uploadcare/image-shrink": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/@uploadcare/image-shrink/-/image-shrink-6.18.2.tgz", - "integrity": "sha512-F6rW3AxgAkHbw48UrLVC/G/pDrMr2LU5QQOj9W1jk1W9NqLSmkD3LyqgpD/1cRrhPBLzH1XFWcY9iqSoJiEb/w==" - }, - "@uploadcare/quality-insights": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/@uploadcare/quality-insights/-/quality-insights-6.18.2.tgz", - "integrity": "sha512-Xs+Uaob/MW6QYT+21XM2SoFyum1qWXJr0t91WpESK7hCO9W7AydsLyzQqheb0NlV7+wV0g/g8zVU8Udu+lYw1w==" - }, - "@uploadcare/upload-client": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/@uploadcare/upload-client/-/upload-client-6.18.2.tgz", - "integrity": "sha512-jfphlkJmcliGbk/pWyArMgluPR1VZmkz0p/DlkeQ2lpEn7rvmN3KQUjI+1lnaPb3TCWh0m6VbQmLPf2hUOfs9Q==", - "requires": { - "form-data": "^4.0.0", - "ws": "^8.2.3" - } - }, - "@vitest/browser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.2.4.tgz", - "integrity": "sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==", - "dev": true, - "requires": { - "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.6.1", - "@vitest/mocker": "3.2.4", - "@vitest/utils": "3.2.4", - "magic-string": "^0.30.17", - "sirv": "^3.0.1", - "tinyrainbow": "^2.0.0", - "ws": "^8.18.2" - } - }, - "@vitest/coverage-v8": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", - "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^1.0.2", - "ast-v8-to-istanbul": "^0.3.3", - "debug": "^4.4.1", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.9.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" - } - }, - "@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "requires": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "dependencies": { - "@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "requires": { - "@types/deep-eql": "*" - } - } - } - }, - "@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "requires": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - } - }, - "@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "requires": { - "tinyrainbow": "^2.0.0" - } - }, - "@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, - "requires": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - } - }, - "@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "requires": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - } - }, - "@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "requires": { - "tinyspy": "^4.0.3" - } - }, - "@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "requires": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - } - }, - "@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true - }, - "acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true - }, - "add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } - }, - "array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - } - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true - }, - "ast-v8-to-istanbul": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", - "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.30", - "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" - }, - "dependencies": { - "js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true - } - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "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 - }, - "before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "dev": true, - "peer": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "requires": { - "run-applescript": "^7.0.0" - } - }, - "bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dev": true, - "requires": { - "load-tsconfig": "^0.2.3" - } - }, - "bytes-iec": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes-iec/-/bytes-iec-3.1.1.tgz", - "integrity": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==", - "dev": true - }, - "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 - }, - "call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - } - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, - "requires": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "change-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.1.tgz", - "integrity": "sha512-qRlUWn/hXnX1R1LBDF/RelJLiqNjKjUqlmuBVSEIyye8kq49CXqkZWKmi8XeUAdDXWFOcGLUMZ+aHn3Q5lzUXw==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "capital-case": "^1.0.3", - "constant-case": "^3.0.3", - "dot-case": "^3.0.3", - "header-case": "^2.0.3", - "no-case": "^3.0.3", - "param-case": "^3.0.3", - "pascal-case": "^3.1.1", - "path-case": "^3.0.3", - "sentence-case": "^3.0.3", - "snake-case": "^3.0.3", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true - }, - "chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "requires": { - "readdirp": "^4.0.1" - } - }, - "cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - }, - "dependencies": { - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dev": true, - "requires": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true - }, - "constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "requires": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - } - } - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", - "dev": true - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-selector-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", - "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "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 - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "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 - } - } - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - } - }, - "data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - } - }, - "data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true - }, - "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 - }, - "default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "requires": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - } - }, - "default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, - "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, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "optional": true, - "peer": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "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 - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "dev": true - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - } - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "requires": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "requires": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - } - }, - "esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" - } - }, - "esbuild-visualizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/esbuild-visualizer/-/esbuild-visualizer-0.7.0.tgz", - "integrity": "sha512-Vz22k+G2WT7GuCo7rbhaQwGbZ26lEhwzsctkEdQlu2SVrshoM4hzQeRpu/3DP596a9+9K2JyYsinuC6AC896Og==", - "dev": true, - "requires": { - "open": "^8.4.0", - "picomatch": "^4.0.0", - "yargs": "^17.6.2" - }, - "dependencies": { - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - } - } - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true - }, - "eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", - "dev": true, - "requires": { - "@types/eslint": "^7.2.13", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.5", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - } - } - }, - "eslint-rule-docs": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true - }, - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - }, - "eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "dev": true, - "peer": true - }, - "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 - }, - "fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "dev": true - }, - "fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "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 - } - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "fix-dts-default-cjs-exports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", - "dev": true, - "requires": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" - } - }, - "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, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "dev": true - }, - "for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "requires": { - "is-callable": "^1.2.7" - } - }, - "foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "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 - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - } - }, - "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 - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "requires": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - } - }, - "get-tsconfig": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", - "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", - "dev": true, - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - } - } - }, - "git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "requires": { - "meow": "^8.0.0", - "semver": "^6.0.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, - "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 - }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "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 - } - } - }, - "happy-dom": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-16.8.1.tgz", - "integrity": "sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0", - "whatwg-mimetype": "^3.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true - }, - "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 - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "requires": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "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 - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true - }, - "husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true - }, - "import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "irregular-plurals": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", - "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", - "dev": true - }, - "is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "requires": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - } - }, - "is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "requires": { - "has-bigints": "^1.0.2" - } - }, - "is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "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 - }, - "is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - } - }, - "is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - } - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - }, - "dependencies": { - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - } - } - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true - }, - "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 - }, - "is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.16" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true - }, - "is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - } - }, - "istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - } - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true - }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true, - "optional": true, - "peer": true - }, - "joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "keyux": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/keyux/-/keyux-0.7.2.tgz", - "integrity": "sha512-Z8ULf9BhSx1hI2rKG2uNjcvMgQmza97ZW2w43phS5VaT4wiTka7tOL4i/GJSc79k65tbvpoTVNCZwam0pqoH6A==" - }, - "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, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "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 - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true - }, - "lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "detect-libc": "^2.0.3", - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "dev": true, - "optional": true, - "peer": true - }, - "lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "dev": true, - "optional": true, - "peer": true - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lint-staged": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", - "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", - "dev": true, - "requires": { - "chalk": "5.3.0", - "commander": "11.0.0", - "debug": "4.3.4", - "execa": "7.2.0", - "lilconfig": "2.1.0", - "listr2": "6.6.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.1" - }, - "dependencies": { - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "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 - }, - "npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, - "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true - } - } - }, - "listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", - "dev": true, - "requires": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "requires": { - "type-fest": "^1.0.2" - } - }, - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dev": true, - "requires": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - } - }, - "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true - }, - "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, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "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 - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "dev": true, - "requires": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "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 - }, - "macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "dev": true - }, - "magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "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, - "requires": { - "semver": "^7.5.3" - }, - "dependencies": { - "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true - } - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "marked": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", - "dev": true - }, - "marked-terminal": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", - "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", - "dev": true, - "requires": { - "ansi-escapes": "^7.0.0", - "ansi-regex": "^6.1.0", - "chalk": "^5.4.1", - "cli-highlight": "^2.1.11", - "cli-table3": "^0.6.5", - "node-emoji": "^2.2.0", - "supports-hyperlinks": "^3.1.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", - "dev": true, - "requires": { - "environment": "^1.0.0" - } - }, - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true - }, - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true - } - } - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true - }, - "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==", - "dev": true - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "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==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dev": true, - "requires": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - }, - "dependencies": { - "confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true - }, - "pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "requires": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true - }, - "nanospinner": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/nanospinner/-/nanospinner-1.2.2.tgz", - "integrity": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==", - "dev": true, - "requires": { - "picocolors": "^1.1.1" - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - } - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-watch": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.4.tgz", - "integrity": "sha512-RinNxoz4W1cep1b928fuFhvAQ5ag/+1UlMDV7rbyGthBIgsiEouS4kvRayvvboxii4m8eolKOIBo3OjDqbc+uQ==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "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 - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "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 - }, - "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 - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true - }, - "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 - }, - "object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - } - }, - "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, - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dev": true, - "requires": { - "fn.name": "1.x.x" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, - "requires": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "package-manager-detector": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.4.0.tgz", - "integrity": "sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw==", - "dev": true - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - } - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true - }, - "playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", - "dev": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.55.0" - } - }, - "playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", - "dev": true - }, - "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "requires": { - "irregular-plurals": "^3.2.0" - } - }, - "possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true - }, - "postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "requires": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - }, - "postcss-resolve-nested-selector": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", - "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", - "dev": true - }, - "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, - "requires": {} - }, - "postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-sorting": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", - "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", - "dev": true, - "requires": {} - }, - "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 - }, - "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, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "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 - } - } - }, - "prettysize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-2.0.0.tgz", - "integrity": "sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "publint": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.14.tgz", - "integrity": "sha512-14/VNBvWsrBeqWNDw8c/DK5ERcZBUwL1rnkVx18cQnF3zadr3GfoYtvD8mxi1dhkWpaPHp8kfi92MDbjMeW3qw==", - "dev": true, - "requires": { - "@publint/pack": "^0.1.2", - "package-manager-detector": "^1.3.0", - "picocolors": "^1.1.1", - "sade": "^1.8.1" - } - }, - "pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, - "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 - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "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 - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "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, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "render-jsx": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/render-jsx/-/render-jsx-0.2.4.tgz", - "integrity": "sha512-N44hyd4CVnden0AyfKNUIdXvjqWIqe5qDlJJKQZSvI1AojS3CkSyeA2YqWa3y1+HhMzPZ/OHUEvZLTRm96eV/Q==", - "dev": true - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "requires": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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 - }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true - }, - "rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "requires": { - "glob": "^10.3.7" - } - }, - "rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", - "@types/estree": "1.0.8", - "fsevents": "~2.3.2" - } - }, - "run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "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, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "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, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - } - }, - "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 - }, - "safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - } - }, - "safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - } - }, - "safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - } - }, - "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, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "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 - }, - "shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - } - } - }, - "shipjs": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/shipjs/-/shipjs-0.27.0.tgz", - "integrity": "sha512-4lbARswZR6ZaSvHsKfJcHpSZTHAum08lWx29aYvt48ytl3jIP2a3mu6m3QrH1N9wwiFrUgtM9eI8B14Cc0GSzA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3", - "@octokit/rest": "^17.11.0", - "@slack/webhook": "^5.0.1", - "add-stream": "^1.0.0", - "arg": "4.1.3", - "chalk": "4.0.0", - "change-case": "4.1.1", - "conventional-changelog-angular": "^5.0.6", - "conventional-changelog-core": "^4.1.4", - "conventional-changelog-preset-loader": "^2.3.0", - "deepmerge": "^4.2.2", - "dotenv": "^8.2.0", - "ejs": "^3.0.0", - "globby": "^10.0.1", - "inquirer": "7.1.0", - "mkdirp": "^1.0.0", - "open": "^7.0.0", - "prettier": "^2.0.0", - "serialize-javascript": "^3.0.0", - "shell-quote": "^1.7.2", - "shipjs-lib": "0.27.0", - "temp-write": "4.0.0", - "tempfile": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - } - } - }, - "shipjs-lib": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/shipjs-lib/-/shipjs-lib-0.27.0.tgz", - "integrity": "sha512-BLqiL4CqTTk6yj2hFOcIRzlGHLpSshPof9ldEx2HierdzeueDm/4Rd+RXdeL53EGYqT+HuqVIC5DYMLARPPJEQ==", - "dev": true, - "requires": { - "deepmerge": "^4.2.2", - "parse-github-url": "1.0.2", - "semver": "6.3.0", - "shelljs": "0.8.5" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - } - }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, - "sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - } - }, - "size-limit": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-11.2.0.tgz", - "integrity": "sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==", - "dev": true, - "requires": { - "bytes-iec": "^3.1.1", - "chokidar": "^4.0.3", - "jiti": "^2.4.2", - "lilconfig": "^3.1.3", - "nanospinner": "^1.2.2", - "picocolors": "^1.1.1", - "tinyglobby": "^0.2.11" - }, - "dependencies": { - "lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true - } - } - }, - "skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, - "requires": { - "unicode-emoji-modifier-base": "^1.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - } - } - }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true - }, - "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 - }, - "std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true - }, - "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, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, - "string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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 - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true - }, - "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, - "requires": { - "min-indent": "^1.0.0" - } - }, - "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, - "optional": true, - "peer": true - }, - "strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "requires": { - "js-tokens": "^9.0.1" - }, - "dependencies": { - "js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true - } - } - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, - "stylelint": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", - "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", - "dev": true, - "requires": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/media-query-list-parser": "^2.1.4", - "@csstools/selector-specificity": "^3.0.0", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^8.2.0", - "css-functions-list": "^3.2.1", - "css-tree": "^2.3.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.1", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^7.0.0", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.3.1", - "ignore": "^5.2.4", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.29.0", - "mathml-tag-names": "^2.1.3", - "meow": "^10.1.5", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.28", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.13", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^3.0.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "write-file-atomic": "^5.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "requires": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - } - }, - "decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "file-entry-cache": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", - "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", - "dev": true, - "requires": { - "flat-cache": "^3.2.0" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - } - }, - "read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - } - }, - "redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "requires": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "requires": { - "min-indent": "^1.0.1" - } - }, - "trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "stylelint-config-recommended": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-11.0.0.tgz", - "integrity": "sha512-SoGIHNI748OCZn6BxFYT83ytWoYETCINVHV3LKScVAWQQauWdvmdDqJC5YXWjpBbxg2E761Tg5aUGKLFOVhEkA==", - "dev": true, - "requires": {} - }, - "stylelint-config-standard": { - "version": "32.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-32.0.0.tgz", - "integrity": "sha512-UnGJxYDyYFrIE9CjDMZRkrNh2o4lOtO+MVZ9qG5b8yARfsWho0GMx4YvhHfsv8zKKgHeWX2wfeyxmuoqcaYZ4w==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^11.0.0" - } - }, - "stylelint-declaration-block-no-ignored-properties": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stylelint-declaration-block-no-ignored-properties/-/stylelint-declaration-block-no-ignored-properties-2.8.0.tgz", - "integrity": "sha512-Ws8Cav7Y+SPN0JsV407LrnNXWOrqGjxShf+37GBtnU/C58Syve9c0+I/xpLcFOosST3ternykn3Lp77f3ITnFw==", - "dev": true, - "requires": {} - }, - "stylelint-order": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", - "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", - "dev": true, - "requires": { - "postcss": "^8.4.32", - "postcss-sorting": "^8.0.2" - } - }, - "sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "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 - }, - "svg-sprite": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-sprite/-/svg-sprite-2.0.4.tgz", - "integrity": "sha512-kjDoATgr4k6tdtfQczpkbuFW6RE7tPUPe/rbRd1n2NV92kdwaXEZMIxJqAZfMGOMfU/Kp1u89SUYsfHCbAvVHg==", - "dev": true, - "requires": { - "@resvg/resvg-js": "^2.6.0", - "@xmldom/xmldom": "^0.8.10", - "async": "^3.2.5", - "css-selector-parser": "^1.4.1", - "csso": "^4.2.0", - "cssom": "^0.5.0", - "glob": "^7.2.3", - "js-yaml": "^4.1.0", - "lodash.escape": "^4.0.1", - "lodash.merge": "^4.6.2", - "mustache": "^4.2.0", - "prettysize": "^2.0.0", - "svgo": "^2.8.0", - "vinyl": "^2.2.1", - "winston": "^3.11.0", - "xpath": "^0.0.34", - "yargs": "^17.7.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - } - } - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "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 - } - } - }, - "table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true - }, - "temp-write": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz", - "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "is-stream": "^2.0.0", - "make-dir": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "tempfile": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-3.0.0.tgz", - "integrity": "sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==", - "dev": true, - "requires": { - "temp-dir": "^2.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - } - } - }, - "test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true - }, - "tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "requires": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - } - } - }, - "tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true - }, - "tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true - }, - "tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "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, - "requires": { - "is-number": "^7.0.0" - } - }, - "totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "dev": true - }, - "ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "tsd": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.32.0.tgz", - "integrity": "sha512-R5lBZCbxGBowOcW0gpQaiIjGYrG5NmU+PfFDKcc3zbtzWjML1o/zAwzdDnS2ZheSlPu9GW51azpFqEPUBq9DoQ==", - "dev": true, - "requires": { - "@tsd/typescript": "~5.8.3", - "eslint-formatter-pretty": "^4.1.0", - "globby": "^11.0.1", - "jest-diff": "^29.0.3", - "meow": "^9.0.0", - "path-exists": "^4.0.0", - "read-pkg-up": "^7.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, - "tsup": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz", - "integrity": "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==", - "dev": true, - "requires": { - "bundle-require": "^5.1.0", - "cac": "^6.7.14", - "chokidar": "^4.0.3", - "consola": "^3.4.0", - "debug": "^4.4.0", - "esbuild": "^0.25.0", - "fix-dts-default-cjs-exports": "^1.0.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.34.8", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.11", - "tree-kill": "^1.2.2" - }, - "dependencies": { - "lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true - }, - "postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "requires": { - "lilconfig": "^3.1.1" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "requires": { - "whatwg-url": "^7.0.0" - } + "less": { + "optional": true }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } + "sass": { + "optional": true }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "sass-embedded": { + "optional": true }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", - "dev": true, - "requires": { - "esbuild": "~0.25.0", - "fsevents": "~2.3.3", - "get-tsconfig": "^4.7.5" - }, - "dependencies": { - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, + "stylus": { "optional": true - } - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - } - }, - "typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - } - }, - "typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - } - }, - "typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - } - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - }, - "ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true - }, - "uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true - }, - "unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "dev": true - }, - "universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "dev": true, - "peer": true - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", "optional": true, - "peer": true + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "node_modules/vitest": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", + "integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==", "dev": true, - "requires": { - "tslib": "^2.0.3" + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.15", + "@vitest/mocker": "4.0.15", + "@vitest/pretty-format": "4.0.15", + "@vitest/runner": "4.0.15", + "@vitest/snapshot": "4.0.15", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.15", + "@vitest/browser-preview": "4.0.15", + "@vitest/browser-webdriverio": "4.0.15", + "@vitest/ui": "4.0.15", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "node_modules/vitest-browser-lit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vitest-browser-lit/-/vitest-browser-lit-1.0.1.tgz", + "integrity": "sha512-gwstjT/pwWqk1TIk6KgcZCEPyDp69mxOPFXtyZs0wuGt7FPkLh+ihMrlvYKyT6o8S21ee6BpZsONwPAcC2ImQg==", "dev": true, - "requires": { - "tslib": "^2.0.3" + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "lit": ">3.0.0", + "vitest": ">=4.0.0" } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", + "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", "dev": true, - "optional": true, - "peer": true, - "requires": { - "punycode": "^2.1.0" + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.15", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "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 - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/vitest/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, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true - }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "node_modules/vitest/node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=18" } }, - "vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "node_modules/vitest/node_modules/vite": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", + "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", - "fsevents": "~2.3.3", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, - "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, + "jiti": { "optional": true }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "requires": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" } }, - "vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "requires": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "dependencies": { - "@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "requires": { - "@types/deep-eql": "*" - } - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - } + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "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 - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "which-boxed-primitive": { + "node_modules/which-boxed-primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "which-builtin-type": { + "node_modules/which-builtin-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", @@ -23581,26 +14236,40 @@ "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "which-collection": { + "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "which-typed-array": { + "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -23608,125 +14277,56 @@ "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "why-is-node-running": { + "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" } }, - "windows-release": { + "node_modules/windows-release": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "execa": "^1.0.0" }, - "dependencies": { - "cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "node_modules/winston": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", + "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", + "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", @@ -23736,177 +14336,217 @@ "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" } }, - "winston-transport": { + "node_modules/winston-transport": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" } }, - "wordwrap": { + "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, + "license": "MIT", "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "license": "MIT", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "wrappy": { + "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 + "dev": true, + "license": "ISC" }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "requires": {} + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "wsl-utils": { + "node_modules/wsl-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "is-wsl": "^3.1.0" }, - "dependencies": { - "is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "requires": { - "is-inside-container": "^1.0.0" - } - } + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "xpath": { + "node_modules/xpath": { "version": "0.0.34", "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0" + } }, - "xtend": { + "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } }, - "yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "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, - "optional": true, - "peer": true + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } }, - "yargs": { + "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -23915,49 +14555,29 @@ "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } + "engines": { + "node": ">=12" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } }, - "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 + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } } } } diff --git a/package.json b/package.json index 7e3e51543..e738e3c20 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ }, "homepage": "https://uploadcare.com/", "files": [ - "{dist,web,types}/**/*.{js,css,d.ts,d.ts.map}", + "{dist,web,types}/**/*.{js,css,d.ts,d.ts.map,txt}", "README.md", "LICENSE" ], @@ -110,52 +110,57 @@ }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.2.5", - "@biomejs/js-api": "^3.0.0", - "@biomejs/wasm-nodejs": "^2.2.5", + "@biomejs/biome": "2.3.8", + "@biomejs/js-api": "^4.0.0", + "@biomejs/wasm-nodejs": "^2.3.8", "@csstools/postcss-cascade-layers": "^5.0.2", - "@happy-dom/global-registrator": "^16.8.1", + "@happy-dom/global-registrator": "^20.0.10", "@size-limit/esbuild-why": "^11.2.0", "@size-limit/preset-small-lib": "^11.2.0", "@total-typescript/ts-reset": "^0.6.1", - "@types/node": "^22", - "@types/react": "^18.2.34", + "@types/node": "^24", + "@types/react": "^18.0.0", "@types/svg-sprite": "^0.0.39", - "@vitest/browser": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", - "esbuild": "^0.25.10", - "husky": "^8.0.3", - "lint-staged": "^13.2.1", - "node-watch": "^0.7.3", + "@vitest/browser": "^4.0.15", + "@vitest/browser-playwright": "^4.0.15", + "@vitest/coverage-v8": "^4.0.15", + "esbuild": "^0.25.12", + "esbuild-minify-templates": "^0.13.1", + "husky": "^9.1.7", + "lint-staged": "^16.2.6", + "node-watch": "^0.7.4", "npm-run-all": "^4.1.5", - "playwright": "^1.55.0", + "playwright": "^1.56.1", "postcss": "^8.5.6", - "publint": "^0.3.14", + "publint": "^0.3.15", "render-jsx": "^0.2.4", - "rimraf": "^5.0.0", + "rimraf": "^6.1.0", "shipjs": "^0.27.0", "size-limit": "^11.2.0", - "stylelint": "^15.4.0", - "stylelint-config-standard": "^32.0.0", - "stylelint-declaration-block-no-ignored-properties": "^2.7.0", - "stylelint-order": "^6.0.3", + "stylelint": "^16.25.0", + "stylelint-config-standard": "^39.0.1", + "stylelint-declaration-block-no-ignored-properties": "^2.8.0", + "stylelint-order": "^7.0.0", "svg-sprite": "^2.0.4", - "tsd": "^0.32.0", + "tsd": "^0.33.0", "tsup": "^8.5.0", "tsx": "^4.20.6", "typescript": "^5.9.3", - "vite": "npm:rolldown-vite@latest", - "vitest": "^3.2.4" + "vite": "8.0.0-beta.0", + "vitest": "^4.0.15", + "vitest-browser-lit": "^1.0.1" }, "author": "Uploadcare Inc.", "license": "MIT", "dependencies": { - "@symbiotejs/symbiote": "^1.11.7", + "@lit/context": "^1.1.6", "@uploadcare/cname-prefix": "^6.18.2", "@uploadcare/image-shrink": "^6.18.2", "@uploadcare/quality-insights": "^6.18.2", "@uploadcare/upload-client": "^6.18.2", - "keyux": "^0.7.1" + "keyux": "^0.7.1", + "lit": "^3.3.1", + "nanostores": "^1.1.0" }, "size-limit": [ { diff --git a/scripts/build-items.ts b/scripts/build-items.ts index d1dc4180d..5a0702dab 100644 --- a/scripts/build-items.ts +++ b/scripts/build-items.ts @@ -28,12 +28,11 @@ export const buildItems: BuildItem[] = [ srcPath('./index.ts'), srcPath('./abstract/loadFileUploaderFrom.ts'), srcPath('./env.ts'), - srcPath('./types/jsx.ts'), ...localeFiles.map((f) => srcPath(`./locales/file-uploader/${f}`)), ], outDir: outPath('./dist/'), format: 'esm', - minify: false, + minify: true, bundleExternalDependencies: false, }, // uc-blocks diff --git a/scripts/build-ssr-stubs.ts b/scripts/build-ssr-stubs.ts index 1b5cad516..2fd14dcc1 100644 --- a/scripts/build-ssr-stubs.ts +++ b/scripts/build-ssr-stubs.ts @@ -10,7 +10,6 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const DIST_PATH = resolve(__dirname, '../dist'); -// biome-ignore lint/suspicious/noExplicitAny: Type is used to represent any class type AnyClass = new (...args: any[]) => any; const isClass = (value: unknown): value is AnyClass => { @@ -19,7 +18,6 @@ const isClass = (value: unknown): value is AnyClass => { const getClassStaticProperties = (klass: AnyClass) => { const extractedProperties: Record = {}; - // biome-ignore lint/suspicious/noExplicitAny: Type is used to represent any class const extract = (proto: any) => { if (proto === null) return; if (proto === HTMLElement || proto === HTMLElement.prototype) { diff --git a/scripts/build.ts b/scripts/build.ts index 6d562c684..2bc299b72 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -2,54 +2,33 @@ import fs from 'node:fs'; import path, { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import postcssCascadeLayers from '@csstools/postcss-cascade-layers'; +import { minifyTemplates, writeFiles } from 'esbuild-minify-templates'; import postcss from 'postcss'; import { build as tsupBuild } from 'tsup'; -import { dependencies } from '../package.json'; +import pkgJson from '../package.json'; import { type BuildItem, buildItems } from './build-items'; const __dirname = dirname(fileURLToPath(import.meta.url)); const ROOT_DIR = path.resolve(__dirname, '..'); -const LICENSE_PATH = path.resolve(ROOT_DIR, 'LICENSE'); const TSCONFIG_PATH = path.resolve(ROOT_DIR, 'tsconfig.app.json'); -function jsBanner() { - const license = fs.readFileSync(LICENSE_PATH).toString(); - return ( - '/**\n' + - ' * @license\n' + - license - .split('\n') - .map((line) => ` * ${line}`) - .join('\n') + - '\n */' - ); -} - -function minifyHtmlTemplates(js: string): string { - const checkIfHtml = (str: string) => { - return str.includes('<') && (str.includes('')); - }; - const processChunk = (ch: string) => { - if (checkIfHtml(ch)) { - let htmlMin = ch.split('\n').join(' '); - while (htmlMin.includes(' ')) { - htmlMin = htmlMin.split(' ').join(' '); - } - htmlMin = htmlMin.split('> <').join('><'); - return htmlMin.trim(); - } - return ch; - }; - const result = js - .split('`') - .map((chunk) => processChunk(chunk)) - .join('`') - .split(`'`) - .map((chunk) => processChunk(chunk)) - .join(`'`); +function banner() { + const repositoryUrl = pkgJson.repository.url; + const licenseUrl = new URL('blob/main/LICENSE', repositoryUrl).toString(); + const licenseName = pkgJson.license; + const pkgName = pkgJson.name; + const version = pkgJson.version; + const buildTime = new Date().toISOString(); - return result; + return [ + '/**', + ' * @license', + ` * Package: ${pkgName}@${version} (${licenseName})`, + ` * License: ${licenseUrl}`, + ` * Built: ${buildTime}`, + ' */', + ].join('\n'); } async function build(buildItem: BuildItem) { @@ -61,8 +40,8 @@ async function build(buildItem: BuildItem) { target: 'esnext', minify: buildItem.minify, banner: { - js: jsBanner(), - css: jsBanner(), + js: banner(), + css: banner(), }, format: buildItem.format, skipNodeModulesBundle: true, @@ -70,23 +49,21 @@ async function build(buildItem: BuildItem) { options.conditions = ['browser']; options.mainFields = ['exports']; options.platform = 'browser'; + options.legalComments = 'linked'; + options.mangleProps = /^_/; }, - noExternal: buildItem.bundleExternalDependencies ? Object.keys(dependencies) : undefined, + esbuildPlugins: buildItem.minify ? [minifyTemplates(), writeFiles()] : [], + noExternal: buildItem.bundleExternalDependencies ? [/.*/] : undefined, globalName: buildItem.format === 'iife' ? 'UC' : undefined, keepNames: buildItem.format === 'iife' ? true : undefined, splitting: false, + treeshake: true, shims: false, dts: true, + env: { + NODE_ENV: 'production', + }, plugins: [ - { - name: 'minify-html-templates', - renderChunk(code) { - return { - code: buildItem.minify ? minifyHtmlTemplates(code) : code, - map: null, - }; - }, - }, { name: 'rename-output', async buildEnd(ctx) { diff --git a/scripts/test-locales.ts b/scripts/test-locales.ts index df3c68d6b..2bb4ddba0 100644 --- a/scripts/test-locales.ts +++ b/scripts/test-locales.ts @@ -17,7 +17,7 @@ const localesPerGroup: LocalesPerGroup = {}; for (const group of localeGroups) { const locales = (await fs.readdir(path.join(LOCALES_PATH, group))).filter((filename: string) => - filename.endsWith('.js'), + filename.endsWith('.ts'), ); localesPerGroup[group] = {}; @@ -25,7 +25,7 @@ for (const group of localeGroups) { const module = (await import(path.join(LOCALES_PATH, group, locale))) as { default: LocaleDefinition; }; - localesPerGroup[group][locale.replace('.js', '')] = module.default; + localesPerGroup[group][locale.replace('.ts', '')] = module.default; } } diff --git a/specs/npm/npm.test.ts b/specs/npm/npm.test.ts index 81a86e61f..a60eb33c4 100644 --- a/specs/npm/npm.test.ts +++ b/specs/npm/npm.test.ts @@ -48,7 +48,17 @@ describe('NPM package', () => { ]; for (const bundle of webBundles) { - const m = await import(`@uploadcare/file-uploader/web/${bundle}`); + let m: unknown; + try { + m = await import(`@uploadcare/file-uploader/web/${bundle}`); + } catch (error) { + // Vite@4 can't dynamically import css files + // Here we're just want to ensure that the css file exists and is importable + // In that case we receive specific error which we can safely ignore + if (error instanceof Error && 'code' in error && error.code === 'ERR_UNKNOWN_FILE_EXTENSION') { + m = { default: '' }; + } + } expect(stickyPackageVersion(m)).toMatchSnapshot(`web/${bundle}`); } }); diff --git a/src/abstract/Block.ts b/src/abstract/Block.ts deleted file mode 100644 index 58897ea5f..000000000 --- a/src/abstract/Block.ts +++ /dev/null @@ -1,342 +0,0 @@ -import { BaseComponent, Data } from '@symbiotejs/symbiote'; -import { initialConfig } from '../blocks/Config/initialConfig'; -import { EventEmitter } from '../blocks/UploadCtxProvider/EventEmitter'; -import type { ConfigType } from '../types'; -import { extractCdnUrlModifiers, extractFilename, extractUuid } from '../utils/cdn-utils'; -import { getLocaleDirection } from '../utils/getLocaleDirection'; -import { getPluralForm } from '../utils/getPluralForm'; -import { applyTemplateData, getPluralObjects } from '../utils/template-utils'; -import { WindowHeightTracker } from '../utils/WindowHeightTracker'; -import { waitForAttribute } from '../utils/waitForAttribute'; -import type { ActivityType } from './ActivityBlock'; -import { blockCtx } from './CTX'; -import { l10nProcessor } from './l10nProcessor'; -import { A11y } from './managers/a11y'; -import { LocaleManager, localeStateKey } from './managers/LocaleManager'; -import { ModalManager } from './managers/ModalManager'; -import { TelemetryManager } from './managers/TelemetryManager'; -import { sharedConfigKey } from './sharedConfigKey'; -import { testModeProcessor } from './testModeProcessor'; - -const TAG_PREFIX = 'uc-'; - -export class Block extends BaseComponent { - private __cfgProxy?: any; - protected l10nProcessorSubs: Map void }>> = new Map(); - static StateConsumerScope: string | null = null; - - static styleAttrs: string[] = []; - - protected requireCtxName = false; - - activityType: ActivityType = null; - - override init$ = blockCtx(); - - l10n(str: string, variables: Record = {}): string { - if (!str) { - return ''; - } - const template = this.$[localeStateKey(str)] || str; - const pluralObjects = getPluralObjects(template); - for (const pluralObject of pluralObjects) { - variables[pluralObject.variable] = this.pluralize( - pluralObject.pluralKey, - Number(variables[pluralObject.countVariable]), - ); - } - const result = applyTemplateData(template, variables); - return result; - } - - private pluralize(key: string, count: number): string { - const locale = this.l10n('locale-id') || 'en'; - const pluralForm = getPluralForm(locale, count); - return this.l10n(`${key}__${pluralForm}`); - } - - protected bindL10n(key: string, resolver: () => void): void { - this.localeManager?.bindL10n(this, key, resolver); - } - - constructor() { - super(); - this.addTemplateProcessor( - l10nProcessor as (fr: DocumentFragment | BaseComponent, fnCtx: BaseComponent) => void, - ); - this.addTemplateProcessor( - testModeProcessor as (fr: DocumentFragment | BaseComponent, fnCtx: BaseComponent) => void, - ); - } - - emit( - type: Parameters[0], - payload?: Parameters[1], - options?: Parameters[2], - ): void { - const eventEmitter = this.has('*eventEmitter') ? this.$['*eventEmitter'] : undefined; - if (!eventEmitter) { - return; - } - - eventEmitter.emit(type, payload, options); - - this.telemetryManager.sendEvent({ - eventType: type, - payload: typeof payload === 'function' ? payload() : (payload as any), - }); - } - - hasBlockInCtx(callback: (block: Block) => boolean): boolean { - for (const block of this.blocksRegistry) { - if (callback(block)) { - return true; - } - } - return false; - } - - setOrAddState(prop: string, newVal: any): void { - this.add$( - { - [prop]: newVal, - }, - true, - ); - } - - override connectedCallback(): void { - const styleAttrs = (this.constructor as any).styleAttrs as string[]; - styleAttrs.forEach((attr: string) => { - this.setAttribute(attr, ''); - }); - - if (this.hasAttribute('retpl')) { - // @ts-expect-error TODO: fix this - this.constructor['template'] = null; - this.processInnerHtml = true; - } - if (this.requireCtxName) { - waitForAttribute({ - element: this as unknown as HTMLElement, - attribute: 'ctx-name', - onSuccess: () => { - // async wait for ctx-name attribute to be set, needed for Angular because it sets attributes after mount - // TODO: should be moved to the symbiote core - super.connectedCallback(); - }, - onTimeout: () => { - console.error('Attribute `ctx-name` is required and it is not set.'); - }, - }); - } else { - super.connectedCallback(); - } - - WindowHeightTracker.registerClient(this); - } - - override disconnectedCallback(): void { - super.disconnectedCallback(); - WindowHeightTracker.unregisterClient(this); - } - - override initCallback(): void { - if (!this.has('*blocksRegistry')) { - this.add('*blocksRegistry', new Set()); - } - - const blocksRegistry = this.$['*blocksRegistry']; - blocksRegistry.add(this); - - if (!this.has('*eventEmitter')) { - this.add('*eventEmitter', new EventEmitter(this.debugPrint.bind(this))); - } - if (!this.has('*localeManager')) { - this.add('*localeManager', new LocaleManager(this)); - } - - if (this.cfg.qualityInsights && !this.has('*telemetryManager')) { - this.add('*telemetryManager', new TelemetryManager(this)); - } - - if (!this.has('*a11y')) { - this.add('*a11y', new A11y()); - } - - if (!this.has('*modalManager')) { - this.add('*modalManager', new ModalManager(this)); - } - - this.sub(localeStateKey('locale-id'), (localeId: string) => { - const direction = getLocaleDirection(localeId); - this.style.direction = direction === 'ltr' ? '' : direction; - }); - - this.subConfigValue('testMode', (testMode) => { - if (!testMode || !this.testId) { - this.removeAttribute('data-testid'); - return; - } - this.setAttribute('data-testid', this.testId); - }); - } - - get testId(): string { - const testId = window.customElements.getName(this.constructor as CustomElementConstructor) as string; - return testId; - } - - get modalManager(): ModalManager | undefined { - return this.has('*modalManager') ? (this.$['*modalManager'] as ModalManager) : undefined; - } - - get telemetryManager(): - | TelemetryManager - | { sendEvent: () => void; sendEventCloudImageEditor: () => void; sendEventError: () => void } { - if (!this.cfg.qualityInsights) { - return { - sendEvent: () => {}, - sendEventCloudImageEditor: () => {}, - sendEventError: () => {}, - }; - } - - return (this.has('*telemetryManager') && this.$['*telemetryManager']) as TelemetryManager; - } - - protected get localeManager(): LocaleManager | null { - return this.has('*localeManager') ? (this.$['*localeManager'] as LocaleManager) : null; - } - - protected get a11y(): A11y | null { - return this.has('*a11y') ? (this.$['*a11y'] as A11y) : null; - } - - protected get blocksRegistry(): Set { - return this.$['*blocksRegistry'] as Set; - } - - override destroyCallback(): void { - super.destroyCallback(); - - const blocksRegistry = this.blocksRegistry; - blocksRegistry?.delete(this); - - this.localeManager?.destroyL10nBindings(this); - this.l10nProcessorSubs = new Map(); - - // Destroy local context - // TODO: this should be done inside symbiote - Data.deleteCtx(this); - - if (blocksRegistry?.size === 0) { - setTimeout(() => { - // Destroy global context after all blocks are destroyed and all callbacks are run - this.destroyCtxCallback(); - }, 0); - } - } - - /** - * Called when the last block is removed from the context. Note that inheritors must run their callback before that. - */ - protected destroyCtxCallback(): void { - Data.deleteCtx(this.ctxName); - - this.localeManager?.destroy(); - - this.modalManager?.destroy(); - } - - protected async proxyUrl(url: string): Promise { - if (this.cfg.secureDeliveryProxy && this.cfg.secureDeliveryProxyUrlResolver) { - console.warn( - 'Both secureDeliveryProxy and secureDeliveryProxyUrlResolver are set. The secureDeliveryProxyUrlResolver will be used.', - ); - } - if (this.cfg.secureDeliveryProxyUrlResolver) { - try { - return await this.cfg.secureDeliveryProxyUrlResolver(url, { - uuid: extractUuid(url), - cdnUrlModifiers: extractCdnUrlModifiers(url), - fileName: extractFilename(url), - }); - } catch (err) { - console.error('Failed to resolve secure delivery proxy URL. Falling back to the default URL.', err); - this.telemetryManager.sendEventError( - err, - 'secureDeliveryProxyUrlResolver. Failed to resolve secure delivery proxy URL. Falling back to the default URL.', - ); - return url; - } - } - if (this.cfg.secureDeliveryProxy) { - return applyTemplateData( - this.cfg.secureDeliveryProxy, - { previewUrl: url }, - { transform: (value) => window.encodeURIComponent(value) }, - ); - } - return url; - } - - get cfg(): ConfigType { - if (!this.__cfgProxy) { - const o = Object.create(null); - this.__cfgProxy = new Proxy(o, { - set: (obj: any, key: string | symbol, value: any) => { - if (typeof key !== 'string') { - return false; - } - const sharedKey = sharedConfigKey(key as keyof ConfigType); - if (!this.has(sharedKey)) { - this.add(sharedKey, (initialConfig as any)[key as keyof typeof initialConfig]); - } - (this.$ as any)[sharedKey] = value; - return true; - }, - get: (_obj: never, key: keyof ConfigType) => { - const sharedKey = sharedConfigKey(key); - if (!this.has(sharedKey)) { - this.add(sharedKey, initialConfig[key]); - } - return (this.$ as any)[sharedConfigKey(key)]; - }, - }); - } - return this.__cfgProxy; - } - - subConfigValue(key: T, callback: (value: ConfigType[T]) => void): void { - const sharedKey = sharedConfigKey(key); - if (!this.has(sharedKey)) { - this.add(sharedKey, initialConfig[key]); - } - this.sub(sharedKey, callback); - } - - debugPrint(...args: unknown[]): void { - if (!this.cfg.debug) { - return; - } - let consoleArgs = args; - if (typeof args?.[0] === 'function') { - const resolver = args[0] as () => unknown[]; - consoleArgs = resolver(); - } - console.log(`[${this.ctxName}]`, ...consoleArgs); - } - - static override reg(name?: string): void { - if (!name) { - super.reg(); - return; - } - if (name.startsWith(TAG_PREFIX)) { - super.reg(name); - } - } -} - -export { BaseComponent }; diff --git a/src/abstract/CTX.ts b/src/abstract/CTX.ts index 91bbdd4ec..7bbf6b752 100644 --- a/src/abstract/CTX.ts +++ b/src/abstract/CTX.ts @@ -1,12 +1,12 @@ import type { UploadcareGroup } from '@uploadcare/upload-client'; import { Queue } from '@uploadcare/upload-client'; +import type { LitBlock } from '../lit/LitBlock'; import type { OutputCollectionState, OutputErrorCollection } from '../types/index'; -import type { Block } from './Block'; import type { SecureUploadsManager } from './managers/SecureUploadsManager'; export const blockCtx = () => ({}); -export const activityBlockCtx = (fnCtx: Block) => ({ +export const activityBlockCtx = (fnCtx: LitBlock) => ({ ...blockCtx(), '*currentActivity': null, '*currentActivityParams': {}, @@ -16,13 +16,11 @@ export const activityBlockCtx = (fnCtx: Block) => ({ '*closeModal': () => { fnCtx.modalManager?.close(fnCtx.$['*currentActivity']); - fnCtx.set$({ - '*currentActivity': null, - }); + fnCtx.pub('*currentActivity', null); }, }); -export const uploaderBlockCtx = (fnCtx: Block) => ({ +export const uploaderBlockCtx = (fnCtx: LitBlock) => ({ ...activityBlockCtx(fnCtx), '*commonProgress': 0, '*uploadList': [], @@ -34,7 +32,7 @@ export const uploaderBlockCtx = (fnCtx: Block) => ({ '*secureUploadsManager': null as SecureUploadsManager | null, }); -export const solutionBlockCtx = (fnCtx: Block) => ({ +export const solutionBlockCtx = (fnCtx: LitBlock) => ({ ...uploaderBlockCtx(fnCtx), '*solution': null as string | null, }); diff --git a/src/abstract/SolutionBlock.ts b/src/abstract/SolutionBlock.ts deleted file mode 100644 index 753aa923c..000000000 --- a/src/abstract/SolutionBlock.ts +++ /dev/null @@ -1,23 +0,0 @@ -import svgIconsSprite from '../blocks/themes/uc-basic/svg-sprite'; -import { Block } from './Block'; -import { solutionBlockCtx } from './CTX'; - -export class SolutionBlock extends Block { - static override styleAttrs = ['uc-wgt-common']; - protected override requireCtxName = true; - override init$ = solutionBlockCtx(this); - private static _template = ''; - - override initCallback(): void { - super.initCallback(); - this.a11y?.registerBlock(this); - } - - static override set template(value: string) { - this._template = /* html */ `${svgIconsSprite + value}`; - } - - static override get template(): string { - return this._template; - } -} diff --git a/src/abstract/TypedCollection.ts b/src/abstract/TypedCollection.ts index a2c694943..537592607 100644 --- a/src/abstract/TypedCollection.ts +++ b/src/abstract/TypedCollection.ts @@ -1,60 +1,62 @@ -import { Data, UID } from '@symbiotejs/symbiote'; -import type { ExtractDataFromSchema, ExtractKeysFromSchema, TypedSchema } from './TypedData'; +import { PubSub } from '../lit/PubSubCompat'; +import type { Uid } from '../lit/Uid'; +import { UID } from '../utils/UID'; import { TypedData } from './TypedData'; -type ChangeMap = Record>; -type Unsubscriber = ReturnType['subscribe']>; -type TypedCollectionPropertyObserver = (changeMap: ChangeMap) => void; +type ChangeMap> = Record>; +type Unsubscriber> = ReturnType['subscribe']>; +type TypedCollectionPropertyObserver> = (changeMap: ChangeMap) => void; -export type TypedCollectionObserverHandler = ( - list: string[], +export type TypedCollectionObserverHandler> = ( + list: Uid[], added: Set>, removed: Set>, ) => void; -type TypedCollectionOptions = { - typedSchema: T; - watchList?: ExtractKeysFromSchema[]; +type TypedCollectionOptions> = { + initialValue: T; + watchList?: (keyof T)[]; handler?: TypedCollectionObserverHandler; - ctxName?: string; }; -export class TypedCollection { - private __typedSchema: T; - private __ctxId: string; - private __data: ReturnType; - private __watchList: ExtractKeysFromSchema[]; - private __subsMap: Record[]> = Object.create(null) as Record[]>; - private __propertyObservers = new Set>(); - private __collectionObservers = new Set>(); - private __items = new Set(); - private __removed = new Set>(); - private __added = new Set>(); - private __observeTimeout?: number; - private __notifyTimeout?: number; - private __notifyObservers: (propName: string, ctxId: string) => void; - - constructor(options: TypedCollectionOptions) { - this.__typedSchema = options.typedSchema; - this.__ctxId = options.ctxName || UID.generate(); - this.__data = Data.registerCtx({}, this.__ctxId); - this.__watchList = options.watchList || []; +type TypedDataMap> = Record | undefined>; + +export class TypedCollection> { + private _ctxId: Uid; + private _data: PubSub>; + private _watchList: (keyof T)[]; + private _subsMap: Record[]> = Object.create(null) as Record[]>; + private _propertyObservers = new Set>(); + private _collectionObservers = new Set>(); + private _items = new Set(); + private _removed = new Set>(); + private _added = new Set>(); + private _observeTimeout?: number; + private _notifyTimeout?: number; + private _notifyObservers: (propName: keyof T, ctxId: Uid) => void; + private _initialValue: T; + + public constructor(options: TypedCollectionOptions) { + this._initialValue = options.initialValue; + this._ctxId = UID.generate(); + this._data = PubSub.registerCtx>({}, this._ctxId); + this._watchList = options.watchList || []; let changeMap = Object.create(null) as ChangeMap; - this.__notifyObservers = (propName: keyof T, ctxId: string) => { - if (this.__observeTimeout) { - window.clearTimeout(this.__observeTimeout); + this._notifyObservers = (propName: keyof T, ctxId: Uid) => { + if (this._observeTimeout) { + window.clearTimeout(this._observeTimeout); } if (!changeMap[propName]) { changeMap[propName] = new Set(); } changeMap[propName].add(ctxId); - this.__observeTimeout = window.setTimeout(() => { + this._observeTimeout = window.setTimeout(() => { if (Object.keys(changeMap).length === 0) { return; } - this.__propertyObservers.forEach((handler) => { + this._propertyObservers.forEach((handler) => { handler({ ...changeMap }); }); changeMap = Object.create(null) as ChangeMap; @@ -66,26 +68,26 @@ export class TypedCollection { } } - notify(): void { - if (this.__notifyTimeout) { - window.clearTimeout(this.__notifyTimeout); + private _notify(): void { + if (this._notifyTimeout) { + window.clearTimeout(this._notifyTimeout); } - this.__notifyTimeout = window.setTimeout(() => { - const added = new Set(this.__added); - const removed = new Set(this.__removed); - this.__added.clear(); - this.__removed.clear(); - for (const handler of this.__collectionObservers) { - handler?.([...this.__items], added, removed); + this._notifyTimeout = window.setTimeout(() => { + const added = new Set(this._added); + const removed = new Set(this._removed); + this._added.clear(); + this._removed.clear(); + for (const handler of this._collectionObservers) { + handler?.([...this._items], added, removed); } }); } - observeCollection(handler: TypedCollectionObserverHandler): () => void { - this.__collectionObservers.add(handler); + public observeCollection(handler: TypedCollectionObserverHandler): () => void { + this._collectionObservers.add(handler); - if (this.__items.size > 0) { - this.notify(); + if (this._items.size > 0) { + this._notify(); } return () => { @@ -93,92 +95,85 @@ export class TypedCollection { }; } - unobserveCollection(handler: TypedCollectionObserverHandler): void { - this.__collectionObservers.delete(handler); + public unobserveCollection(handler: TypedCollectionObserverHandler): void { + this._collectionObservers.delete(handler); } - add(init: Partial>): string { - const item = new TypedData(this.__typedSchema); - for (const [prop, value] of Object.entries(init) as [ - ExtractKeysFromSchema, - ExtractDataFromSchema[ExtractKeysFromSchema], - ][]) { - if (value !== undefined) { - item.setValue(prop, value); - } + public add(init: Partial): string { + const item = new TypedData(this._initialValue); + for (const [prop, value] of Object.entries(init)) { + item.setValue(prop, value); } - this.__items.add(item.uid); - this.notify(); - - this.__data.add(item.uid, item); - this.__added.add(item); - this.__watchList.forEach((propName) => { - if (!this.__subsMap[item.uid]) { - this.__subsMap[item.uid] = []; + this._items.add(item.uid); + this._notify(); + + this._data.add(item.uid, item); + this._added.add(item); + this._watchList.forEach((propName) => { + if (!this._subsMap[item.uid]) { + this._subsMap[item.uid] = []; } - this.__subsMap[item.uid]?.push( + this._subsMap[item.uid]?.push( item.subscribe(propName, () => { - this.__notifyObservers(propName, item.uid); + this._notifyObservers(propName, item.uid); }), ); }); return item.uid; } - read(id: string): TypedData | null { - return this.__data.read(id); + public read(id: Uid): TypedData | null { + return this._data.read(id) as TypedData | null; } - readProp>(id: string, propName: K): ExtractDataFromSchema[K] | null { + public readProp(id: Uid, propName: K): T[K] { const item = this.read(id); if (!item) { - console.warn(`Item with id ${id} not found`); - return null; + throw new Error(`TypedCollection#readProp: Item with id ${id} not found`); } return item.getValue(propName); } - publishProp>(id: string, propName: K, value: ExtractDataFromSchema[K]): void { + public publishProp(id: Uid, propName: K, value: T[K]): void { const item = this.read(id); if (!item) { - console.warn(`Item with id ${id} not found`); - return; + throw new Error(`TypedCollection#publishProp: Item with id ${id} not found`); } item.setValue(propName, value); } - remove(id: string): void { + public remove(id: Uid): void { const item = this.read(id); if (item) { - this.__removed.add(item); + this._removed.add(item); } - this.__items.delete(id); - this.notify(); - this.__data.pub(id, null); - delete this.__subsMap[id]; + this._items.delete(id); + this._notify(); + this._data.pub(id, undefined); + delete this._subsMap[id]; } - clearAll(): void { - this.__items.forEach((id) => { + public clearAll(): void { + this._items.forEach((id) => { this.remove(id); }); } - observeProperties(handler: TypedCollectionPropertyObserver): () => void { - this.__propertyObservers.add(handler); + public observeProperties(handler: TypedCollectionPropertyObserver): () => void { + this._propertyObservers.add(handler); return () => { this.unobserveProperties(handler); }; } - unobserveProperties(handler: TypedCollectionPropertyObserver): void { - this.__propertyObservers.delete(handler); + public unobserveProperties(handler: TypedCollectionPropertyObserver): void { + this._propertyObservers.delete(handler); } - findItems(checkFn: (item: TypedData) => boolean): string[] { - const result: string[] = []; - this.__items.forEach((id) => { + public findItems(checkFn: (item: TypedData) => boolean): Uid[] { + const result: Uid[] = []; + this._items.forEach((id) => { const item = this.read(id); if (item && checkFn(item)) { result.push(id); @@ -187,23 +182,23 @@ export class TypedCollection { return result; } - items(): string[] { - return [...this.__items]; + public items(): Uid[] { + return [...this._items]; } - get size(): number { - return this.__items.size; + public get size(): number { + return this._items.size; } - destroy(): void { - Data.deleteCtx(this.__ctxId); - this.__propertyObservers = new Set(); - this.__collectionObservers = new Set(); - for (const id in this.__subsMap) { - this.__subsMap[id]?.forEach((sub) => { + public destroy(): void { + PubSub.deleteCtx(this._ctxId); + this._propertyObservers = new Set(); + this._collectionObservers = new Set(); + for (const id of Object.keys(this._subsMap) as Uid[]) { + this._subsMap[id]?.forEach((sub) => { sub.remove(); }); - delete this.__subsMap[id]; + delete this._subsMap[id]; } } } diff --git a/src/abstract/TypedData.ts b/src/abstract/TypedData.ts index d858e7b2f..627f54f1f 100644 --- a/src/abstract/TypedData.ts +++ b/src/abstract/TypedData.ts @@ -1,92 +1,52 @@ -import { Data, UID } from '@symbiotejs/symbiote'; +import { PubSub } from '../lit/PubSubCompat'; +import type { Uid } from '../lit/Uid'; +import { UID } from '../utils/UID'; const MSG_NAME = '[Typed State] Wrong property name: '; -const MSG_TYPE = '[Typed State] Wrong property type: '; -export type TypedSchema = Record; +export class TypedData> { + private _ctxId: Uid; + private _data: PubSub; -export type Constructor = new (...args: any[]) => T; - -export type ExtractType = T extends StringConstructor - ? string - : T extends BooleanConstructor - ? boolean - : T extends NumberConstructor - ? number - : T extends ArrayConstructor - ? V - : T extends Constructor - ? InstanceType - : T; - -export type ExtractDataFromSchema = { - [K in keyof T]: ExtractType | (T[K]['nullable'] extends true ? null : never); -}; - -export type ExtractKeysFromSchema = Extract; - -export class TypedData { - private __typedSchema: T; - private __ctxId: string; - private __schema: ExtractDataFromSchema; - private __data: Data; - - constructor(typedSchema: T, ctxName?: string) { - this.__typedSchema = typedSchema; - this.__ctxId = ctxName || UID.generate(); - - this.__schema = Object.keys(typedSchema).reduce( - (acc, key) => { - if (typedSchema[key]) { - (acc as Record)[key] = typedSchema[key].value; - } - return acc; - }, - {} as ExtractDataFromSchema, - ); - this.__data = Data.registerCtx(this.__schema, this.__ctxId); + public constructor(initialValue: T) { + this._ctxId = UID.generate(); + this._data = PubSub.registerCtx(initialValue, this._ctxId); } - get uid(): string { - return this.__ctxId; + public get uid(): Uid { + return this._ctxId; } - setValue>(prop: K, value: ExtractDataFromSchema[K]): void { - if (!Object.hasOwn(this.__typedSchema, prop) || !this.__typedSchema[prop]) { - console.warn(MSG_NAME + prop); + public setValue(prop: K, value: T[K]): void { + if (!this._data.has(prop)) { + console.warn(`${MSG_NAME}${String(prop)}`); return; } - const pDesc = this.__typedSchema[prop]; - const isMatchConstructorType = value?.constructor === pDesc.type; - const isMatchInstanceType = (value as object) instanceof (pDesc.type as Constructor); - const isMatchNullable = pDesc.nullable && value === null; - - if (isMatchConstructorType || isMatchInstanceType || isMatchNullable) { - this.__data.pub(prop, value); - return; + const isChanged = this._data.read(prop) !== value; + if (isChanged) { + this._data.pub(prop, value); } - console.warn(MSG_TYPE + prop); } - setMultipleValues(updObj: Partial>): void { + public setMultipleValues(updObj: Partial): void { for (const [prop, value] of Object.entries(updObj)) { - this.setValue(prop as ExtractKeysFromSchema, value); + this.setValue(prop as keyof T, value as T[keyof T]); } } - getValue>(prop: K): ExtractDataFromSchema[K] { - if (!Object.hasOwn(this.__typedSchema, prop)) { - console.warn(MSG_NAME + prop); + public getValue(prop: K): T[K] { + if (!this._data.has(prop)) { + console.warn(`${MSG_NAME}${String(prop)}`); } - return this.__data.read(prop); + return this._data.read(prop); } - subscribe>(prop: K, handler: (newVal: ExtractDataFromSchema[K]) => void) { - return this.__data.sub(prop, handler); + public subscribe(prop: K, handler: (newVal: T[K]) => void) { + return this._data.sub(prop, handler); } - remove(): void { - Data.deleteCtx(this.__ctxId); + public remove(): void { + PubSub.deleteCtx(this._ctxId); } } diff --git a/src/abstract/UploaderPublicApi.ts b/src/abstract/UploaderPublicApi.ts index 9deb97ace..72c046e6b 100644 --- a/src/abstract/UploaderPublicApi.ts +++ b/src/abstract/UploaderPublicApi.ts @@ -1,10 +1,19 @@ // @ts-check -import { applyStyles, Data } from '@symbiotejs/symbiote'; import { calcCameraModes } from '../blocks/CameraSource/calcCameraModes'; import { CameraSourceTypes, type ModeCameraType } from '../blocks/CameraSource/constants'; import type { SourceBtn } from '../blocks/SourceBtn/SourceBtn'; import { EventType } from '../blocks/UploadCtxProvider/EventEmitter'; +import { + type ActivityParamsMap, + type ActivityType, + LitActivityBlock, + type RegisteredActivityType, +} from '../lit/LitActivityBlock'; +import type { LitBlock } from '../lit/LitBlock'; +import type { LitUploaderBlock } from '../lit/LitUploaderBlock'; +import { PubSub } from '../lit/PubSubCompat'; +import type { Uid } from '../lit/Uid'; import type { OutputCollectionState, OutputCollectionStatus, @@ -12,6 +21,7 @@ import type { OutputFileStatus, UploadcareFile, } from '../types/index'; +import { applyStyles } from '../utils/applyStyles'; import { browserFeatures } from '../utils/browser-info'; import { serializeCsv } from '../utils/comma-separated'; import { @@ -24,12 +34,8 @@ import { import { parseCdnUrl } from '../utils/parseCdnUrl'; import { stringToArray } from '../utils/stringToArray'; import { UploadSource } from '../utils/UploadSource'; -import { ActivityBlock, type ActivityParamsMap, type ActivityType, type RegisteredActivityType } from './ActivityBlock'; -import type { Block } from './Block'; import { buildOutputCollectionState } from './buildOutputCollectionState'; -import type { UploaderBlock } from './UploaderBlock'; import type { UploadEntryData } from './uploadEntrySchema'; - export type ApiAddFileCommonOptions = { silent?: boolean; fileName?: string; @@ -37,9 +43,9 @@ export type ApiAddFileCommonOptions = { }; export class UploaderPublicApi { - private _ctx: UploaderBlock; + private _ctx: LitUploaderBlock; - constructor(ctx: UploaderBlock) { + public constructor(ctx: LitUploaderBlock) { this._ctx = ctx; } @@ -47,18 +53,18 @@ export class UploaderPublicApi { return this._ctx.uploadCollection; } - get cfg() { + public get cfg() { return this._ctx.cfg; } - get l10n() { + public get l10n() { return this._ctx.l10n.bind(this._ctx); } /** * TODO: Probably we should not allow user to override `source` property */ - addFileFromUrl = ( + public addFileFromUrl = ( url: string, { silent, fileName, source }: ApiAddFileCommonOptions = {}, ): OutputFileEntry<'idle'> => { @@ -71,7 +77,7 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - addFileFromUuid = ( + public addFileFromUuid = ( uuid: string, { silent, fileName, source }: ApiAddFileCommonOptions = {}, ): OutputFileEntry<'idle'> => { @@ -84,7 +90,7 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - addFileFromCdnUrl = ( + public addFileFromCdnUrl = ( cdnUrl: string, { silent, fileName, source }: ApiAddFileCommonOptions = {}, ): OutputFileEntry<'idle'> => { @@ -106,7 +112,7 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - addFileFromObject = ( + public addFileFromObject = ( file: File, { silent, @@ -130,18 +136,18 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - removeFileByInternalId = (internalId: string): void => { - if (!this._uploadCollection.read(internalId)) { + public removeFileByInternalId = (internalId: string): void => { + if (!this._uploadCollection.read(internalId as Uid)) { throw new Error(`File with internalId ${internalId} not found`); } - this._uploadCollection.remove(internalId); + this._uploadCollection.remove(internalId as Uid); }; - removeAllFiles(): void { + public removeAllFiles(): void { this._uploadCollection.clearAll(); } - uploadAll = (): void => { + public uploadAll = (): void => { const itemsToUpload = this._uploadCollection.items().filter((id) => { const entry = this._uploadCollection.read(id); if (!entry) return false; @@ -166,7 +172,7 @@ export class UploaderPublicApi { ); }; - openSystemDialog = (options: { captureCamera?: boolean; modeCamera?: ModeCameraType } = {}): void => { + public openSystemDialog = (options: { captureCamera?: boolean; modeCamera?: ModeCameraType } = {}): void => { const accept = serializeCsv( mergeFileTypes([this.cfg.accept ?? '', ...(this.cfg.imgOnly ? IMAGE_ACCEPT_LIST : [])]), ); @@ -212,8 +218,8 @@ export class UploaderPublicApi { }); }); // To call uploadTrigger UploadList should draw file items first: - this._ctx.modalManager?.open(ActivityBlock.activities.UPLOAD_LIST); - this._ctx.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; + this._ctx.modalManager?.open(LitActivityBlock.activities.UPLOAD_LIST); + this._ctx.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; fileInput.remove(); }, { @@ -233,9 +239,12 @@ export class UploaderPublicApi { fileInput.dispatchEvent(new MouseEvent('click')); }; - getOutputItem(entryId: string): OutputFileEntry { - const uploadEntryData = Data.getCtx(entryId).store as UploadEntryData; - + public getOutputItem(entryId: string): OutputFileEntry { + const ctx = PubSub.getCtx(entryId); + if (!ctx) { + throw new Error(`UploaderPublicApi#getOutputItem: Entry with ID "${entryId}" not found in the upload collection`); + } + const uploadEntryData = ctx.store; const fileInfo = uploadEntryData.fileInfo as UploadcareFile | null; const status: OutputFileEntry['status'] = uploadEntryData.isRemoved @@ -276,23 +285,21 @@ export class UploaderPublicApi { return outputItem as OutputFileEntry; } - getOutputCollectionState() { + public getOutputCollectionState() { return buildOutputCollectionState(this._ctx) as ReturnType>; } - initFlow = (force = false): void => { + public initFlow = (force = false): void => { if (this._uploadCollection.size > 0 && !force) { - this._ctx.modalManager?.open(ActivityBlock.activities.UPLOAD_LIST); - this._ctx.set$({ - '*currentActivity': ActivityBlock.activities.UPLOAD_LIST, - }); + this._ctx.modalManager?.open(LitActivityBlock.activities.UPLOAD_LIST); + this._ctx.pub('*currentActivity', LitActivityBlock.activities.UPLOAD_LIST); } else { if (this._sourceList?.length === 1) { const srcKey = this._sourceList[0]; // TODO: We should refactor those handlers if (srcKey === 'local') { - this._ctx.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; + this._ctx.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; this.openSystemDialog(); return; } @@ -301,9 +308,7 @@ export class UploaderPublicApi { const { isPhotoEnabled, isVideoRecordingEnabled } = calcCameraModes(this.cfg); if (isPhotoEnabled && isVideoRecordingEnabled) { - this._ctx.set$({ - '*currentActivity': ActivityBlock.activities.START_FROM, - }); + this._ctx.pub('*currentActivity', LitActivityBlock.activities.START_FROM); return; } else if (isPhotoEnabled || isVideoRecordingEnabled) { this.openSystemDialog({ @@ -319,8 +324,8 @@ export class UploaderPublicApi { } } - const blocksRegistry = this._ctx.$['*blocksRegistry'] as Set; - const isSourceBtn = (block: Block): block is SourceBtn => + const blocksRegistry = this._ctx.blocksRegistry; + const isSourceBtn = (block: LitBlock): block is SourceBtn => 'type' in (block as any) && (block as any).type === srcKey; const sourceBtnBlock = [...blocksRegistry].find(isSourceBtn); // TODO: This is weird that we have this logic inside UI component, we should consider to move it somewhere else @@ -331,15 +336,13 @@ export class UploaderPublicApi { } } else { // Multiple sources case: - this._ctx.modalManager?.open(ActivityBlock.activities.START_FROM); - this._ctx.set$({ - '*currentActivity': ActivityBlock.activities.START_FROM, - }); + this._ctx.modalManager?.open(LitActivityBlock.activities.START_FROM); + this._ctx.pub('*currentActivity', LitActivityBlock.activities.START_FROM); } } }; - doneFlow = (): void => { + public doneFlow = (): void => { this._ctx.set$({ '*currentActivity': this._ctx.doneActivity, '*history': this._ctx.doneActivity ? [this._ctx.doneActivity] : [], @@ -349,17 +352,17 @@ export class UploaderPublicApi { } }; - setCurrentActivity = ( + public setCurrentActivity = ( activityType: T, ...params: T extends keyof ActivityParamsMap ? [ActivityParamsMap[T]] : T extends RegisteredActivityType ? [undefined?] - : [any?] + : [never] ) => { if (this._ctx.hasBlockInCtx((b) => b.activityType === activityType)) { this._ctx.set$({ - '*currentActivityParams': params ?? {}, + '*currentActivityParams': params[0] ?? {}, '*currentActivity': activityType, }); return; @@ -367,11 +370,11 @@ export class UploaderPublicApi { console.warn(`Activity type "${activityType}" not found in the context`); }; - getCurrentActivity = (): ActivityType => { + public getCurrentActivity = (): ActivityType => { return this._ctx.$['*currentActivity']; }; - setModalState = (opened: boolean): void => { + public setModalState = (opened: boolean): void => { if (opened && !this._ctx.$['*currentActivity']) { console.warn(`Can't open modal without current activity. Please use "setCurrentActivity" method first.`); return; diff --git a/src/abstract/buildOutputCollectionState.ts b/src/abstract/buildOutputCollectionState.ts index 0f7ae0352..334ed2812 100644 --- a/src/abstract/buildOutputCollectionState.ts +++ b/src/abstract/buildOutputCollectionState.ts @@ -1,14 +1,14 @@ +import type { LitUploaderBlock } from '../lit/LitUploaderBlock'; import type { GroupFlag, OutputCollectionState, OutputCollectionStatus, - OutputErrorFile, + OutputErrorCollection, OutputFileEntry, UploadcareGroup, } from '../types/index'; import { memoize } from '../utils/memoize'; import { warnOnce } from '../utils/warnOnce'; -import type { UploaderBlock } from './UploaderBlock'; function createAsyncAssertWrapper(warning: string) { let isAsync = false; @@ -31,14 +31,14 @@ function createAsyncAssertWrapper(warning: string) { export function buildOutputCollectionState< TCollectionStatus extends OutputCollectionStatus, TGroupFlag extends GroupFlag = 'maybe-has-group', ->(uploaderBlock: UploaderBlock): OutputCollectionState { +>(uploaderBlock: LitUploaderBlock): OutputCollectionState { const state = {} as OutputCollectionState; const getters = { progress: (): number => { return uploaderBlock.$['*commonProgress']; }, - errors: (): OutputErrorFile[] => { + errors: (): OutputErrorCollection[] => { return uploaderBlock.$['*collectionErrors']; }, diff --git a/src/abstract/defineComponents.ts b/src/abstract/defineComponents.ts index 115ca6b9e..c022db315 100644 --- a/src/abstract/defineComponents.ts +++ b/src/abstract/defineComponents.ts @@ -1,6 +1,10 @@ -// biome-ignore lint/suspicious/noExplicitAny: Type is used to represent any class +const EXCLUDE_COMPONENTS = ['UploaderBlock', 'ActivityBlock', 'Block', 'SolutionBlock']; + export function defineComponents(blockExports: Record) { for (const blockName in blockExports) { + if (EXCLUDE_COMPONENTS.includes(blockName)) { + continue; + } let tagName = [...blockName].reduce((name, char) => { if (char.toUpperCase() === char) { char = `-${char.toLowerCase()}`; diff --git a/src/abstract/l10nProcessor.ts b/src/abstract/l10nProcessor.ts deleted file mode 100644 index 5f53a54e7..000000000 --- a/src/abstract/l10nProcessor.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { Block } from './Block'; -import { localeStateKey } from './managers/LocaleManager'; - -export function l10nProcessor(fr: DocumentFragment, fnCtx: T): void { - [...fr.querySelectorAll('[l10n]')].forEach((el: Element) => { - const key = el.getAttribute('l10n'); - if (!key) { - return; - } - const list: string[] = key.split(';'); - - for (const item of list) { - if (item) locale(el, item, fnCtx as any); - } - }); -} - -const locale = (el: Element, key: string, fnCtx: any): void => { - let elProp = 'textContent'; - let useAttribute = false; - if (key.includes(':')) { - const arr = key.split(':'); - if (arr.length !== 2) { - console.warn(`l10n attribute value should be in format "property:key" or "key". Found: ${key}`); - return; - } - const tuple = arr as [string, string]; - elProp = tuple[0]; - key = tuple[1]; - if (elProp.startsWith('@')) { - elProp = elProp.slice(1); - useAttribute = true; - } - } - - // Check if the key is present in the local context - const localCtxKey = key; - if (fnCtx.has(localCtxKey)) { - fnCtx.sub(localCtxKey, (mappedKey: string) => { - if (!mappedKey) { - return; - } - // Store the subscription in a temporary map to be able to unsubscribe later - if (!fnCtx.l10nProcessorSubs.has(localCtxKey)) { - fnCtx.l10nProcessorSubs.set(localCtxKey, new Set()); - } - const keySubs = fnCtx.l10nProcessorSubs.get(localCtxKey); - keySubs?.forEach((sub: { remove: () => void }) => { - sub.remove(); - keySubs.delete(sub); - fnCtx.allSubs.delete(sub); - }); - // We don't need the leading * in the key because we use the key as a local context key relative to the global state - const nodeStateKey = localeStateKey(mappedKey).replace('*', ''); - // If the key is not present in the node context, add it - if (!fnCtx.nodeCtx.has(nodeStateKey)) { - fnCtx.nodeCtx.add(nodeStateKey, mappedKey); - } - // Subscribe on the global l10n key change - const sub = fnCtx.nodeCtx.sub(nodeStateKey, () => { - (el as any)[elProp as 'textContent'] = fnCtx.l10n(mappedKey); - }); - keySubs?.add(sub); - // Store the subscription in the global context to make able Symbiote to unsubscribe it on destroy - fnCtx.allSubs.add(sub); - el.removeAttribute('l10n'); - }); - } - - // Otherwise, assume the key is in the global context - const stateKey = localeStateKey(key); - if (!fnCtx.has(stateKey)) { - fnCtx.add(stateKey, ''); - } - fnCtx.sub(stateKey, () => { - if (useAttribute) { - el.setAttribute(elProp, fnCtx.l10n(key)); - } else { - (el as any)[elProp as 'textContent'] = fnCtx.l10n(key); - } - }); - el.removeAttribute('l10n'); -}; diff --git a/src/abstract/localeRegistry.ts b/src/abstract/localeRegistry.ts index a7cc13906..65e77d343 100644 --- a/src/abstract/localeRegistry.ts +++ b/src/abstract/localeRegistry.ts @@ -6,12 +6,15 @@ export type LocaleDefinitionResolver = () => Promise; const localeRegistry: Map = new Map(); const localeResolvers: Map = new Map(); -const defineLocaleSync = (localeName: string, definition: LocaleDefinition): void => { +const defineLocaleSync = (localeName: string, definition: LocaleDefinition): LocaleDefinition => { if (localeRegistry.has(localeName)) { console.log(`Locale ${localeName} is already defined. Overwriting...`); } - localeRegistry.set(localeName, { ...(en as unknown as LocaleDefinition), ...definition }); + const locale: LocaleDefinition = { ...(en as unknown as LocaleDefinition), ...definition }; + localeRegistry.set(localeName, locale); + + return locale; }; const defineLocaleAsync = (localeName: string, definitionResolver: LocaleDefinitionResolver): void => { @@ -30,17 +33,19 @@ export const defineLocale = ( }; export const resolveLocaleDefinition = async (localeName: string): Promise => { - if (!localeRegistry.has(localeName)) { - if (!localeResolvers.has(localeName)) { + let localeDefinition = localeRegistry.get(localeName); + + if (!localeDefinition) { + const definitionResolver = localeResolvers.get(localeName); + if (!definitionResolver) { throw new Error(`Locale ${localeName} is not defined`); } - const definitionResolver = localeResolvers.get(localeName)!; const definition = await definitionResolver(); - defineLocaleSync(localeName, definition); + localeDefinition = defineLocaleSync(localeName, definition); } - return localeRegistry.get(localeName)!; + return localeDefinition; }; defineLocale('en', en); diff --git a/src/abstract/managers/LocaleManager.ts b/src/abstract/managers/LocaleManager.ts index 7c0bee448..9af5f8ad9 100644 --- a/src/abstract/managers/LocaleManager.ts +++ b/src/abstract/managers/LocaleManager.ts @@ -1,20 +1,15 @@ +import type { LitBlock } from '../../lit/LitBlock'; import { default as en } from '../../locales/file-uploader/en'; -import { debounce } from '../../utils/debounce'; -import type { Block } from '../Block'; import { resolveLocaleDefinition } from '../localeRegistry'; -type LocaleChangeCallback = () => void; - -export const localeStateKey = (key: string): string => `*l10n/${key}`; +export const localeStateKey = (key: T): `*l10n/${T}` => `*l10n/${key}`; export const DEFAULT_LOCALE = 'en'; export class LocaleManager { - private _blockInstance: Block | null = null; + private _blockInstance: LitBlock | null = null; private _localeName = ''; - private _callbacks: Set = new Set(); - private _boundBlocks: Map void>> = new Map(); - constructor(blockInstance: Block) { + public constructor(blockInstance: LitBlock) { this._blockInstance = blockInstance; for (const [key, value] of Object.entries(en)) { @@ -39,9 +34,6 @@ export class LocaleManager { for (const [key, value] of Object.entries(definition)) { const overriddenValue = overrides?.[key]; this._blockInstance.add(localeStateKey(key), overriddenValue ?? value, true); - for (const callback of this._callbacks) { - callback(); - } } }); @@ -55,50 +47,8 @@ export class LocaleManager { } for (const [key, value] of Object.entries(definition)) { this._blockInstance?.add(localeStateKey(key), value, true); - for (const callback of this._callbacks) { - callback(); - } } }); }); } - - onLocaleChange(callback: LocaleChangeCallback): () => void { - const debouncedCb = debounce(callback, 0); - this._callbacks.add(debouncedCb); - return () => { - this._callbacks.delete(debouncedCb); - }; - } - - bindL10n(block: Block, key: string, resolver: LocaleChangeCallback): void { - block.$[key] = resolver(); - - if (!this._boundBlocks.has(block)) { - this._boundBlocks.set(block, new Map()); - } - - this._boundBlocks.get(block)?.get(key)?.(); - - const destroyCallback = this.onLocaleChange(() => { - block.$[key] = resolver(); - }); - - this._boundBlocks.get(block)?.set(key, destroyCallback); - } - - destroyL10nBindings(block: Block): void { - const callbacks = this._boundBlocks.get(block); - if (!callbacks) { - return; - } - for (const callback of callbacks.values()) { - callback(); - } - this._boundBlocks.delete(block); - } - - destroy(): void { - this._callbacks.clear(); - } } diff --git a/src/abstract/managers/ModalManager.ts b/src/abstract/managers/ModalManager.ts index f52986349..e4bfbac35 100644 --- a/src/abstract/managers/ModalManager.ts +++ b/src/abstract/managers/ModalManager.ts @@ -1,6 +1,6 @@ import type { Modal as ModalNode } from '../../blocks/Modal/Modal'; -import type { ActivityType } from '../ActivityBlock'; -import type { Block } from '../Block'; +import type { ActivityType } from '../../lit/LitActivityBlock'; +import type { LitBlock } from '../../lit/LitBlock'; export const ModalEvents = Object.freeze({ ADD: 'modal:add', @@ -19,9 +19,9 @@ export class ModalManager { private _modals: Map = new Map(); private _activeModals: Set = new Set(); private _subscribers: Map> = new Map(); - private _block: Block; + private _block: LitBlock; - constructor(block: Block) { + public constructor(block: LitBlock) { this._block = block; } @@ -34,16 +34,16 @@ export class ModalManager { * @param id Unique identifier for the modal * @param modal Modal component instance */ - registerModal(id: ModalId, modal: ModalNode): void { + public registerModal(id: ModalId, modal: ModalNode): void { this._modals.set(id, modal); this._notify(ModalEvents.ADD, { id, modal }); } /** Remove a modal by ID. */ - deleteModal(id: ModalId): boolean { - if (!this._modals.has(id)) return false; + public deleteModal(id: ModalId): boolean { + const modal = this._modals.get(id); + if (!modal) return false; - const modal = this._modals.get(id)!; this._modals.delete(id); this._activeModals.delete(id); this._notify(ModalEvents.DELETE, { id, modal }); @@ -51,28 +51,26 @@ export class ModalManager { } /** Open a modal by its ID. */ - open(id: ModalId): boolean { - if (!this._modals.has(id)) { + public open(id: ModalId): boolean { + const modal = this._modals.get(id); + if (!modal) { this._debugPrint(`Modal with ID "${id}" not found`); return false; } - const modal = this._modals.get(id)!; - this._activeModals.add(id); this._notify(ModalEvents.OPEN, { modal, id }); return true; } /** Close a specific modal by ID. */ - close(id: ModalId): boolean { - if (!this._modals.has(id) || !this._activeModals.has(id)) { + public close(id: ModalId): boolean { + const modal = this._modals.get(id); + if (!modal || !this._activeModals.has(id)) { this._debugPrint(`Modal with ID "${id}" not found or not active`); return false; } - const modal = this._modals.get(id)!; - this._activeModals.delete(id); this._notify(ModalEvents.CLOSE, { id, modal }); @@ -82,7 +80,7 @@ export class ModalManager { } /** Toggle a modal - open if closed, close if open. */ - toggle(id: ModalId): boolean { + public toggle(id: ModalId): boolean { if (!this._modals.has(id)) { this._debugPrint(`Modal with ID "${id}" not found`); return false; @@ -96,12 +94,12 @@ export class ModalManager { } /** True if there are any active modals. */ - get hasActiveModals(): boolean { + public get hasActiveModals(): boolean { return this._activeModals.size > 0; } /** Close the most recently opened modal and return to the previous one. */ - back(): boolean { + public back(): boolean { if (this._activeModals.size === 0) { this._debugPrint('No active modals to go back from'); return false; @@ -113,7 +111,7 @@ export class ModalManager { } /** Close all open modals. */ - closeAll(): number { + public closeAll(): number { const count = this._activeModals.size; this._activeModals.clear(); @@ -125,7 +123,7 @@ export class ModalManager { * Subscribe to modal events * @returns Unsubscribe function */ - subscribe(event: ModalEventType, callback: ModalCb): () => void { + public subscribe(event: ModalEventType, callback: ModalCb): () => void { if (!this._subscribers.has(event)) { this._subscribers.set(event, new Set()); } @@ -135,7 +133,7 @@ export class ModalManager { } /** Unsubscribe from modal events */ - unsubscribe(event: ModalEventType, callback: ModalCb | undefined): void { + public unsubscribe(event: ModalEventType, callback: ModalCb | undefined): void { if (this._subscribers.has(event)) { this._subscribers.get(event)?.delete(callback as ModalCb); } @@ -164,7 +162,7 @@ export class ModalManager { } /** Destroy the modal manager, clean up resources */ - destroy(): void { + public destroy(): void { this.closeAll(); this._modals.clear(); this._subscribers.clear(); diff --git a/src/abstract/managers/SecureUploadsManager.ts b/src/abstract/managers/SecureUploadsManager.ts index 6f32a9690..5c8e5a2be 100644 --- a/src/abstract/managers/SecureUploadsManager.ts +++ b/src/abstract/managers/SecureUploadsManager.ts @@ -1,12 +1,12 @@ +import type { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import type { SecureUploadsSignatureAndExpire } from '../../types/index'; import { isSecureTokenExpired } from '../../utils/isSecureTokenExpired'; -import type { UploaderBlock } from '../UploaderBlock'; export class SecureUploadsManager { - private readonly _block: UploaderBlock; + private readonly _block: LitUploaderBlock; private _secureToken: SecureUploadsSignatureAndExpire | null = null; - constructor(block: UploaderBlock) { + public constructor(block: LitUploaderBlock) { this._block = block; } @@ -14,7 +14,7 @@ export class SecureUploadsManager { this._block.debugPrint('[secure-uploads]', ...args); } - async getSecureToken(): Promise { + public async getSecureToken(): Promise { const { secureSignature, secureExpire, secureUploadsSignatureResolver } = this._block.cfg; if ((secureSignature || secureExpire) && secureUploadsSignatureResolver) { diff --git a/src/abstract/managers/TelemetryManager.ts b/src/abstract/managers/TelemetryManager.ts index fe338c7ba..1c64aa7d0 100644 --- a/src/abstract/managers/TelemetryManager.ts +++ b/src/abstract/managers/TelemetryManager.ts @@ -5,8 +5,8 @@ import { initialConfig } from '../../blocks/Config/initialConfig'; import type { EventKey, InternalEventKey } from '../../blocks/UploadCtxProvider/EventEmitter'; import { EventType, InternalEventType } from '../../blocks/UploadCtxProvider/EventEmitter'; import { PACKAGE_NAME, PACKAGE_VERSION } from '../../env'; +import type { LitBlock } from '../../lit/LitBlock'; import type { ConfigType } from '../../types/index'; -import type { Block } from '../Block'; type CommonEventType = InternalEventKey | EventKey; @@ -19,16 +19,22 @@ type TelemetryEventBody = Partial> & eventType?: CommonEventType; }; -export class TelemetryManager { +export interface ITelemetryManager { + sendEvent(body: TelemetryEventBody): void; + sendEventError(error: unknown, context?: string): void; + sendEventCloudImageEditor(e: MouseEvent, tabId: string, options?: Record): void; +} + +export class TelemetryManager implements ITelemetryManager { private readonly _sessionId: string = crypto.randomUUID(); private readonly _telemetryInstance: TelemetryAPIService; - private readonly _block: Block; + private readonly _block: LitBlock; private _config: ConfigType = structuredClone(initialConfig); private _initialized = false; private _lastPayload: TelemetryState | null = null; private readonly _queue: Queue; - constructor(block: Block) { + public constructor(block: LitBlock) { this._block = block; this._telemetryInstance = new TelemetryAPIService(); this._queue = new Queue(10); @@ -111,7 +117,7 @@ export class TelemetryManager { return false; } - sendEvent(body: TelemetryEventBody): void { + public sendEvent(body: TelemetryEventBody): void { const payload = this._formattingPayload({ eventType: body.eventType, payload: body.payload, @@ -136,7 +142,7 @@ export class TelemetryManager { }); } - sendEventError(error: unknown, context = 'unknown'): void { + public sendEventError(error: unknown, context = 'unknown'): void { this.sendEvent({ eventType: InternalEventType.ERROR_EVENT, payload: { @@ -152,7 +158,7 @@ export class TelemetryManager { /** * Method to send telemetry event for Cloud Image Editor. */ - sendEventCloudImageEditor(e: MouseEvent, tabId: string, options: Record = {}): void { + public sendEventCloudImageEditor(e: MouseEvent, tabId: string, options: Record = {}): void { this.sendEvent({ eventType: InternalEventType.ACTION_EVENT, payload: { diff --git a/src/abstract/managers/ValidationManager.ts b/src/abstract/managers/ValidationManager.ts index 4c522cfee..917e2b3f9 100644 --- a/src/abstract/managers/ValidationManager.ts +++ b/src/abstract/managers/ValidationManager.ts @@ -1,5 +1,7 @@ import { Queue } from '@uploadcare/upload-client'; import { EventType } from '../../blocks/UploadCtxProvider/EventEmitter'; +import type { LitUploaderBlock } from '../../lit/LitUploaderBlock'; +import type { Uid } from '../../lit/Uid'; import type { OutputCollectionErrorType, OutputCollectionState, @@ -19,12 +21,10 @@ import { validateMaxSizeLimit, validateUploadError, } from '../../utils/validators/file/index'; -import { withResolvers } from '../../utils/withResolvers'; import type { buildOutputCollectionState } from '../buildOutputCollectionState'; import type { TypedCollection } from '../TypedCollection'; import type { TypedData } from '../TypedData'; -import type { UploaderBlock } from '../UploaderBlock'; -import type { uploadEntrySchema } from '../uploadEntrySchema'; +import type { UploadEntryData } from '../uploadEntrySchema'; export type FuncFileValidator = ( outputEntry: OutputFileEntry, @@ -59,9 +59,9 @@ const getValidatorDescriptor = (validator: FileValidator): FileValidatorDescript }; export class ValidationManager { - private _blockInstance: UploaderBlock; + private _blockInstance: LitUploaderBlock; - private _uploadCollection: TypedCollection; + private _uploadCollection: TypedCollection; private _commonFileValidators: FuncFileValidator[] = [ validateIsImage, @@ -74,6 +74,7 @@ export class ValidationManager { private _queue = new Queue(20); private _runQueueDebounced: () => void = debounce(() => { + if (!this._blockInstance.isConnected) return; this._queue.run(); }, 500); @@ -87,15 +88,16 @@ export class ValidationManager { } > = new Map(); - constructor(blockInstance: UploaderBlock) { + public constructor(blockInstance: LitUploaderBlock) { this._blockInstance = blockInstance; this._uploadCollection = this._blockInstance.uploadCollection; - const runAllValidators = () => { + const runAllValidators = debounce(() => { + if (!this._blockInstance.isConnected) return; this.runFileValidators('change'); this.runCollectionValidators(); - }; + }, 0); this._blockInstance.subConfigValue('maxLocalFileSizeBytes', runAllValidators); this._blockInstance.subConfigValue('multipleMin', runAllValidators); @@ -109,7 +111,7 @@ export class ValidationManager { }); } - runFileValidators(runOn: FileValidatorDescriptor['runOn'], entryIds?: string[]): void { + public runFileValidators(runOn: FileValidatorDescriptor['runOn'], entryIds?: Uid[]): void { const ids = entryIds ?? this._uploadCollection.items(); for (const id of ids) { const entry = this._uploadCollection.read(id); @@ -119,7 +121,7 @@ export class ValidationManager { } } - runCollectionValidators(): void { + public runCollectionValidators(): void { const collection = this._blockInstance.api.getOutputCollectionState(); const errors: Array = []; @@ -152,7 +154,7 @@ export class ValidationManager { } } - cleanupValidationForEntry(entry: TypedData): void { + public cleanupValidationForEntry(entry: TypedData): void { const state = this._entryValidationState.get(entry.uid); if (state) { state.abortController?.abort(); @@ -161,112 +163,122 @@ export class ValidationManager { } private async _runFileValidatorsForEntry( - entry: TypedData, + entry: TypedData, runOn: FileValidatorDescriptor['runOn'], ): Promise { - const entryDescriptors = this._getValidatorDescriptorsForEntry(entry, runOn); - if (entryDescriptors.length === 0) { - return; - } - entry.setMultipleValues({ - isQueuedForValidation: true, - isValidationPending: true, - }); - const outputEntry = this._blockInstance.api.getOutputItem(entry.uid); const state = this._getEntryValidationState(entry); - if (state.promise) { - await state.promise; - } - - const { promise, resolve } = withResolvers(); - state.promise = promise; - const abortController = new AbortController(); - state.abortController = abortController; - - const timeoutMs = this._blockInstance.cfg.validationTimeout; - const allDescriptors = this._getValidatorDescriptors(); - - const entryValidatorSet = new Set(entryDescriptors.map((d) => d.validator)); - const errors: OutputErrorFile[] = []; - for (const descriptor of allDescriptors) { - if (!entryValidatorSet.has(descriptor.validator)) { - const error = state.lastErrorThrownByValidator.get(descriptor.validator); - if (error) errors.push(error); + const previousPromise = state.promise ?? Promise.resolve(); + const runPromise = (async () => { + await previousPromise; + if (!this._blockInstance.isConnected) { + return; } - } - const tasks = entryDescriptors.map((validatorDescriptor) => async () => { - if (!this._blockInstance.isConnected) { + const entryDescriptors = this._getValidatorDescriptorsForEntry(entry, runOn); + if (entryDescriptors.length === 0) { return; } - const timeoutId = setTimeout(() => { - state.skippedValidators.add(validatorDescriptor.validator); - abortController.abort(); - console.warn(LOG_TEXT.FILE_VALIDATION_TIMEOUT); - }, timeoutMs); + entry.setMultipleValues({ + isQueuedForValidation: true, + isValidationPending: true, + }); + const outputEntry = this._blockInstance.api.getOutputItem(entry.uid); - try { - const error = await validatorDescriptor.validator(outputEntry, this._blockInstance.api, { - signal: abortController.signal, - }); - if (!error || abortController.signal.aborted) { - state.lastErrorThrownByValidator.set(validatorDescriptor.validator, undefined); - return; - } - const normalizedError = this._addCustomTypeToValidationError(error); - state.lastErrorThrownByValidator.set(validatorDescriptor.validator, normalizedError); - errors.push(normalizedError); + const abortController = new AbortController(); + state.abortController = abortController; - if (!error.message) { - console.warn(LOG_TEXT.MISSING_ERROR_MESSAGE); + const timeoutMs = this._blockInstance.cfg.validationTimeout; + const allDescriptors = this._getValidatorDescriptors(); + + const entryValidatorSet = new Set(entryDescriptors.map((d) => d.validator)); + const errors: OutputErrorFile[] = []; + for (const descriptor of allDescriptors) { + if (!entryValidatorSet.has(descriptor.validator)) { + const error = state.lastErrorThrownByValidator.get(descriptor.validator); + if (error) errors.push(error); } - } catch (error) { - if (!abortController.signal.aborted) { - state.skippedValidators.add(validatorDescriptor.validator); + } - console.warn(LOG_TEXT.FILE_VALIDATION_FAILED, error); - this._blockInstance.telemetryManager.sendEventError( - error, - `file validator. ${LOG_TEXT.FILE_VALIDATION_FAILED}`, - ); + const tasks = entryDescriptors.map((validatorDescriptor) => async () => { + if (!this._blockInstance.isConnected) { + return; } - } finally { - clearTimeout(timeoutId); - if (validatorDescriptor.runOn !== 'change') { + const timeoutId = setTimeout(() => { state.skippedValidators.add(validatorDescriptor.validator); + abortController.abort(); + console.warn(LOG_TEXT.FILE_VALIDATION_TIMEOUT); + }, timeoutMs); + + try { + const error = await validatorDescriptor.validator(outputEntry, this._blockInstance.api, { + signal: abortController.signal, + }); + if (!error || abortController.signal.aborted) { + state.lastErrorThrownByValidator.set(validatorDescriptor.validator, undefined); + return; + } + const normalizedError = this._addCustomTypeToValidationError(error); + state.lastErrorThrownByValidator.set(validatorDescriptor.validator, normalizedError); + errors.push(normalizedError); + + if (!error.message) { + console.warn(LOG_TEXT.MISSING_ERROR_MESSAGE); + } + } catch (error) { + if (!abortController.signal.aborted) { + state.skippedValidators.add(validatorDescriptor.validator); + + console.warn(LOG_TEXT.FILE_VALIDATION_FAILED, error); + this._blockInstance.telemetryManager.sendEventError( + error, + `file validator. ${LOG_TEXT.FILE_VALIDATION_FAILED}`, + ); + } + } finally { + clearTimeout(timeoutId); + if (validatorDescriptor.runOn !== 'change') { + state.skippedValidators.add(validatorDescriptor.validator); + } } - } - }); + }); - this._runQueueDebounced(); + this._runQueueDebounced(); - await this._queue.add( - async () => { - entry.setValue('isQueuedForValidation', false); - await Promise.all(tasks.map((task) => task())).catch(() => {}); - }, - { - autoRun: false, - }, - ); + await this._queue.add( + async () => { + entry.setValue('isQueuedForValidation', false); + await Promise.all(tasks.map((task) => task())).catch(() => {}); + }, + { + autoRun: false, + }, + ); + + if (abortController.signal.aborted) { + entry.setMultipleValues({ + isQueuedForValidation: false, + isValidationPending: false, + }); + return; + } - if (abortController.signal.aborted) { entry.setMultipleValues({ - isQueuedForValidation: false, isValidationPending: false, + isQueuedForValidation: false, + errors, }); - resolve(); - return; - } + })(); - entry.setMultipleValues({ - isValidationPending: false, - isQueuedForValidation: false, - errors, - }); + state.promise = runPromise; - resolve(); + try { + await runPromise; + } finally { + if (state.promise === runPromise) { + state.promise = undefined; + } + } } private _addCustomTypeToValidationError>( @@ -277,7 +289,7 @@ export class ValidationManager { type: (error as any).type ?? 'CUSTOM_ERROR', } as T; } - private _getEntryValidationState(entry: TypedData): { + private _getEntryValidationState(entry: TypedData): { abortController?: AbortController; skippedValidators: WeakSet; promise?: Promise; @@ -301,7 +313,7 @@ export class ValidationManager { return [...this._commonFileValidators, ...this._blockInstance.cfg.fileValidators].map(getValidatorDescriptor); } private _getValidatorDescriptorsForEntry( - entry: TypedData, + entry: TypedData, runOn: FileValidatorDescriptor['runOn'], ): FileValidatorDescriptor[] { const state = this._getEntryValidationState(entry); diff --git a/src/abstract/managers/a11y.ts b/src/abstract/managers/a11y.ts index b19a740d4..e4202b526 100644 --- a/src/abstract/managers/a11y.ts +++ b/src/abstract/managers/a11y.ts @@ -1,5 +1,5 @@ import { focusGroupKeyUX, hiddenKeyUX, jumpKeyUX, pressKeyUX, startKeyUX } from 'keyux'; -import type { Block } from '../Block'; +import type { LitBlock } from '../../lit/LitBlock'; /** * MinimalWindow interface is not exported by keyux, so we import it here using tricky way. @@ -16,7 +16,7 @@ class ScopedMinimalWindow implements MinimalWindow { private readonly _listeners = new Map(); private _scope: Node[] = []; - addEventListener(type: 'keydown' | 'keyup', listener: KeyEventListener): void { + public addEventListener(type: 'keydown' | 'keyup', listener: KeyEventListener): void { const wrappedListener: KeyEventListener = (event) => { const target = event.target; if (!(target instanceof Node)) { @@ -30,7 +30,7 @@ class ScopedMinimalWindow implements MinimalWindow { window.addEventListener(type, wrappedListener); } - removeEventListener(type: 'keydown' | 'keyup', listener: KeyEventListener): void { + public removeEventListener(type: 'keydown' | 'keyup', listener: KeyEventListener): void { const wrappedListener = this._listeners.get(listener); if (wrappedListener) { window.removeEventListener(type, wrappedListener); @@ -38,23 +38,23 @@ class ScopedMinimalWindow implements MinimalWindow { this._listeners.delete(listener); } - get CustomEvent(): typeof CustomEvent { + public get CustomEvent(): typeof CustomEvent { return window.CustomEvent; } - get document(): Document { + public get document(): Document { return window.document; } - get navigator(): Navigator { + public get navigator(): Navigator { return window.navigator; } - registerScope(scope: Node): void { + public registerScope(scope: Node): void { this._scope.push(scope); } - destroy(): void { + public destroy(): void { this._scope = []; for (const wrappedListener of this._listeners.values()) { window.removeEventListener('keydown', wrappedListener); @@ -68,7 +68,7 @@ export class A11y { private _destroyKeyUX: ReturnType | undefined; private readonly _scopedWindow: ScopedMinimalWindow; - constructor() { + public constructor() { this._scopedWindow = new ScopedMinimalWindow(); this._destroyKeyUX = startKeyUX(this._scopedWindow, [ focusGroupKeyUX(), @@ -78,11 +78,11 @@ export class A11y { ]); } - registerBlock(scope: Block): void { + public registerBlock(scope: LitBlock): void { this._scopedWindow.registerScope(scope); } - destroy(): void { + public destroy(): void { this._destroyKeyUX?.(); this._scopedWindow.destroy(); } diff --git a/src/abstract/testModeProcessor.ts b/src/abstract/testModeProcessor.ts deleted file mode 100644 index 5df02bc5d..000000000 --- a/src/abstract/testModeProcessor.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { Block } from './Block'; - -export function testModeProcessor(fr: DocumentFragment, fnCtx: T): void { - const elementsWithTestId = fr.querySelectorAll('[data-testid]'); - if (elementsWithTestId.length === 0) { - return; - } - const valuesPerElement = new WeakMap(); - - for (const el of elementsWithTestId) { - const testIdValue = el.getAttribute('data-testid'); - if (testIdValue) { - valuesPerElement.set(el, testIdValue); - } - } - - fnCtx.subConfigValue('testMode', (testMode) => { - if (!testMode) { - for (const el of elementsWithTestId) { - el.removeAttribute('data-testid'); - } - return; - } - - const testIdPrefix = fnCtx.testId; - for (const el of elementsWithTestId) { - const testIdValue = valuesPerElement.get(el); - if (!testIdValue) { - continue; - } - el.setAttribute(`data-testid`, `${testIdPrefix}--${testIdValue}`); - } - }); -} diff --git a/src/abstract/uploadEntrySchema.ts b/src/abstract/uploadEntrySchema.ts index bef890185..1d4a744c3 100644 --- a/src/abstract/uploadEntrySchema.ts +++ b/src/abstract/uploadEntrySchema.ts @@ -1,132 +1,65 @@ -import { UploadcareFile } from '@uploadcare/upload-client'; +import type { Metadata, UploadcareFile } from '@uploadcare/upload-client'; import type { OutputErrorFile } from '../types/index'; -import type { ExtractDataFromSchema, ExtractKeysFromSchema, TypedData } from './TypedData'; +import type { TypedData } from './TypedData'; -export const uploadEntrySchema = Object.freeze({ - file: Object.freeze({ - type: File, - value: null, - nullable: true, - }), - externalUrl: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - fileName: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - fileSize: Object.freeze({ - type: Number, - value: null, - nullable: true, - }), - lastModified: Object.freeze({ - type: Number, - value: Date.now(), - }), - uploadProgress: Object.freeze({ - type: Number, - value: 0, - }), - uuid: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - isImage: Object.freeze({ - type: Boolean, - value: false, - }), - mimeType: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - ctxName: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - cdnUrl: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - cdnUrlModifiers: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - fileInfo: Object.freeze({ - type: UploadcareFile, - value: null, - nullable: true, - }), - isUploading: Object.freeze({ - type: Boolean, - value: false, - }), - abortController: Object.freeze({ - type: AbortController, - value: null, - nullable: true, - }), - thumbUrl: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - silent: Object.freeze({ - type: Boolean, - value: false, - }), - source: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - fullPath: Object.freeze({ - type: String, - value: null, - nullable: true, - }), - metadata: Object.freeze({ - type: Object, - value: null, - nullable: true, - }), - errors: Object.freeze({ - type: Array, - value: [] as OutputErrorFile[], - }), - uploadError: Object.freeze({ - type: Error, - value: null, - nullable: true, - }), - isRemoved: Object.freeze({ - type: Boolean, - value: false, - }), - isQueuedForUploading: Object.freeze({ - type: Boolean, - value: false, - }), - isValidationPending: Object.freeze({ - type: Boolean, - value: false, - }), - isQueuedForValidation: Object.freeze({ - type: Boolean, - value: false, - }), -}); +export interface UploadEntryData extends Record { + file: File | null; + externalUrl: string | null; + fileName: string | null; + fileSize: number | null; + lastModified: number; + uploadProgress: number; + uuid: string | null; + isImage: boolean; + mimeType: string | null; + ctxName: string | null; + cdnUrl: string | null; + cdnUrlModifiers: string | null; + fileInfo: UploadcareFile | null; + isUploading: boolean; + abortController: AbortController | null; + thumbUrl: string | null; + silent: boolean; + source: string | null; + fullPath: string | null; + metadata: Metadata | null; + errors: OutputErrorFile[]; + uploadError: Error | null; + isRemoved: boolean; + isQueuedForUploading: boolean; + isValidationPending: boolean; + isQueuedForValidation: boolean; +} -export type UploadEntryData = ExtractDataFromSchema; +export const initialUploadEntryData: UploadEntryData = { + file: null, + externalUrl: null, + fileName: null, + fileSize: null, + lastModified: Date.now(), + uploadProgress: 0, + uuid: null, + isImage: false, + mimeType: null, + ctxName: null, + cdnUrl: null, + cdnUrlModifiers: null, + fileInfo: null, + isUploading: false, + abortController: null, + thumbUrl: null, + silent: false, + source: null, + fullPath: null, + metadata: null, + errors: [], + uploadError: null, + isRemoved: false, + isQueuedForUploading: false, + isValidationPending: false, + isQueuedForValidation: false, +}; -export type UploadEntryTypedData = TypedData; +export type UploadEntryTypedData = TypedData; -export type UploadEntryKeys = ExtractKeysFromSchema; +export type UploadEntryKeys = keyof UploadEntryData; diff --git a/src/blocks/ActivityHeader/ActivityHeader.ts b/src/blocks/ActivityHeader/ActivityHeader.ts index d2abb9661..79c598d0f 100644 --- a/src/blocks/ActivityHeader/ActivityHeader.ts +++ b/src/blocks/ActivityHeader/ActivityHeader.ts @@ -1,4 +1,4 @@ -import { ActivityBlock } from '../../abstract/ActivityBlock'; +import { LitActivityBlock } from '../../lit/LitActivityBlock'; import './activity-header.css'; -export class ActivityHeader extends ActivityBlock {} +export class ActivityHeader extends LitActivityBlock {} diff --git a/src/blocks/CameraSource/CameraSource.ts b/src/blocks/CameraSource/CameraSource.ts index 758855a69..576b27f5a 100644 --- a/src/blocks/CameraSource/CameraSource.ts +++ b/src/blocks/CameraSource/CameraSource.ts @@ -1,5 +1,7 @@ -import { ActivityBlock } from '../../abstract/ActivityBlock'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { html, type PropertyValues } from 'lit'; +import { state } from 'lit/decorators.js'; +import { LitActivityBlock } from '../../lit/LitActivityBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import { canUsePermissionsApi } from '../../utils/abilities'; import { deserializeCsv } from '../../utils/comma-separated'; import { debounce } from '../../utils/debounce'; @@ -7,54 +9,13 @@ import { stringToArray } from '../../utils/stringToArray'; import { UploadSource } from '../../utils/UploadSource'; import { InternalEventType } from '../UploadCtxProvider/EventEmitter'; import './camera-source.css'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { styleMap } from 'lit/directives/style-map.js'; import { CameraSourceEvents, CameraSourceTypes } from './constants'; type CameraDeviceOption = { text: string; value: string }; type AudioDeviceOption = { text: string; value: string }; -type CameraSourceInitState = InstanceType['init$'] & { - video: MediaStream | null; - videoTransformCss: string | null; - videoHidden: boolean; - messageHidden: boolean; - requestBtnHidden: boolean; - cameraSelectOptions: CameraDeviceOption[] | null; - cameraSelectHidden: boolean; - l10nMessage: string; - switcher: HTMLElement | null; - panels: HTMLElement | null; - timer: HTMLElement | null; - timerHidden: boolean; - cameraHidden: boolean; - cameraActionsHidden: boolean; - audioSelectOptions: AudioDeviceOption[] | null; - audioSelectHidden: boolean; - audioSelectDisabled: boolean; - audioToggleMicrophoneHidden: boolean; - tabCameraHidden: boolean; - tabVideoHidden: boolean; - currentIcon: string; - currentTimelineIcon: string; - toggleMicrophoneIcon: string; - _startTime: number; - _elapsedTime: number; - _animationFrameId: number | null; - mutableClassButton: string; - onCameraSelectChange: (event: Event) => void; - onAudioSelectChange: (event: Event) => void; - onCancel: () => void; - onShot: () => void; - onRequestPermissions: () => void; - onStartCamera: () => void; - onStartRecording: () => void; - onStopRecording: () => void; - onToggleRecording: () => void; - onToggleAudio: () => void; - onRetake: () => void; - onAccept: () => void; - onClickTab: (event: MouseEvent) => void; -}; - const DEFAULT_VIDEO_CONFIG = { width: { ideal: 1920, @@ -85,9 +46,9 @@ const DEFAULT_VIDEO_FORMAT = 'video/webm'; export type CameraMode = 'photo' | 'video'; export type CameraStatus = 'shot' | 'retake' | 'accept' | 'play' | 'stop' | 'pause' | 'resume'; -export class CameraSource extends UploaderBlock { - override couldBeCtxOwner = true; - override activityType = ActivityBlock.activities.CAMERA; +export class CameraSource extends LitUploaderBlock { + public override couldBeCtxOwner = true; + public override activityType = LitActivityBlock.activities.CAMERA; private _unsubPermissions: (() => void) | null = null; @@ -110,149 +71,98 @@ export class CameraSource extends UploaderBlock { private _cameraDevices: CameraDeviceOption[] = []; private _audioDevices: AudioDeviceOption[] = []; private _permissionResponses: Partial> = {}; + private _permissionCleanupFns: Array<() => void> = []; + private _currentVideoSource: MediaStream | null = null; - constructor() { - super(); + private readonly _handlePreviewPlay = (): void => { + this._startTimeline(); + this._currentTimelineIcon = 'pause'; + }; - this.init$ = { - ...this.init$, - video: null, - videoTransformCss: null, + private readonly _handlePreviewPause = (): void => { + this._currentTimelineIcon = 'play'; + this._stopTimeline(); + }; - videoHidden: true, - messageHidden: true, - requestBtnHidden: canUsePermissionsApi(), - cameraSelectOptions: null, - cameraSelectHidden: true, - l10nMessage: '', + private _timerRef = createRef(); + private _lineRef = createRef(); + private _videoRef = createRef(); + private _switcherRef = createRef(); + private _startTime = 0; + private _elapsedTime = 0; - // This is refs - switcher: null, - panels: null, - timer: null, + @state() + private _videoTransformCss: string | null = null; - timerHidden: true, - cameraHidden: true, - cameraActionsHidden: true, + @state() + private _videoHidden = true; - audioSelectOptions: null, - audioSelectHidden: true, - audioSelectDisabled: true, - audioToggleMicrophoneHidden: true, + @state() + private _messageHidden = true; - tabCameraHidden: true, - tabVideoHidden: true, + @state() + private _requestBtnHidden = canUsePermissionsApi(); - currentIcon: 'camera-full', - currentTimelineIcon: 'play', - toggleMicrophoneIcon: 'microphone', + @state() + private _cameraSelectOptions: CameraDeviceOption[] = []; - _startTime: 0, - _elapsedTime: 0, - _animationFrameId: null, + @state() + private _cameraSelectHidden = true; - mutableClassButton: 'uc-shot-btn uc-camera-action', + @state() + private _l10nMessage = ''; - onCameraSelectChange: (event: Event) => { - const target = event.target as HTMLSelectElement | null; - if (!target) { - return; - } - this._selectedCameraId = target.value; - this._capture(); - }, + @state() + private _timerHidden = true; - onAudioSelectChange: (event: Event) => { - const target = event.target as HTMLSelectElement | null; - if (!target) { - return; - } - this._selectedAudioId = target.value; - this._capture(); - }, + @state() + private _cameraHidden = true; - onCancel: () => { - this.historyBack(); - }, + @state() + private _cameraActionsHidden = true; - onShot: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'shot-camera', - node: this.tagName, - tabId: this._activeTab, - }, - }, - }); - this._shot(); - }, + @state() + private _audioSelectOptions: AudioDeviceOption[] = []; - onRequestPermissions: () => this._capture(), - - /** General method for photo and video capture */ - onStartCamera: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'start-camera', - node: this.tagName, - tabId: this._activeTab, - }, - }, - }); - this._chooseActionWithCamera(); - }, + @state() + private _audioSelectHidden = true; - onStartRecording: () => this._startRecording(), + @state() + private _audioSelectDisabled = true; - onStopRecording: () => this._stopRecording(), + @state() + private _audioToggleMicrophoneHidden = true; - onToggleRecording: () => this._toggleRecording(), + @state() + private _tabCameraHidden = true; - onToggleAudio: () => this._toggleEnableAudio(), + @state() + private _tabVideoHidden = true; - onRetake: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'retake-camera', - node: this.tagName, - tabId: this._activeTab, - }, - }, - }); - this._retake(); - }, + @state() + private _currentIcon = 'camera-full'; - onAccept: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'accept-camera', - node: this.tagName, - tabId: this._activeTab, - }, - }, - }); - this._accept(); - }, + @state() + private _currentTimelineIcon = 'play'; - onClickTab: (event: MouseEvent) => { - const target = event.currentTarget as HTMLElement | null; - const id = target?.getAttribute('data-id'); - if (id) { - this._handleActiveTab(id as CameraMode); - } + @state() + private _toggleMicrophoneIcon = 'microphone'; + + @state() + private _mutableClassButton = 'uc-shot-btn uc-camera-action'; + + private _chooseActionWithCamera = () => { + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'start-camera', + node: this.tagName, + tabId: this._activeTab, + }, }, - } as CameraSourceInitState; - } + }); - _chooseActionWithCamera = () => { if (this._activeTab === CameraSourceTypes.PHOTO) { this._shot(); } @@ -267,14 +177,94 @@ export class CameraSource extends UploaderBlock { } }; - _updateTimer = (): void => { - const currentTime = Math.floor((performance.now() - this.$._startTime + this.$._elapsedTime) / 1000); + private _handleCameraSelectChange = (event: Event): void => { + const target = event.target as HTMLSelectElement | null; + if (!target) { + return; + } + this._selectedCameraId = target.value; + void this._capture(); + }; + + private _handleAudioSelectChange = (event: Event): void => { + const target = event.target as HTMLSelectElement | null; + if (!target) { + return; + } + this._selectedAudioId = target.value; + void this._capture(); + }; + + private _handleRequestPermissions = (): void => { + void this._capture(); + }; + + private _handleStartCamera = (): void => { + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'shot-camera', + node: this.tagName, + tabId: this._activeTab, + }, + }, + }); + this._chooseActionWithCamera(); + }; + + private _handleToggleRecording = (): void => { + this._toggleRecording(); + }; + + private _handleToggleAudio = (): void => { + this._toggleEnableAudio(); + }; + + private _handleRetake = (): void => { + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'retake-camera', + node: this.tagName, + tabId: this._activeTab, + }, + }, + }); + this._retake(); + }; + + private _handleAccept = (): void => { + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'accept-camera', + node: this.tagName, + tabId: this._activeTab, + }, + }, + }); + this._accept(); + }; + + private _handleClickTab = (event: MouseEvent): void => { + const target = event.currentTarget as HTMLElement | null; + const id = target?.getAttribute('data-id'); + if (id) { + this._handleActiveTab(id as CameraMode); + } + }; + + private _updateTimer = (): void => { + const currentTime = Math.floor((performance.now() - this._startTime + this._elapsedTime) / 1000); if (typeof this.cfg.maxVideoRecordingDuration === 'number' && this.cfg.maxVideoRecordingDuration > 0) { const remainingTime = this.cfg.maxVideoRecordingDuration - currentTime; if (remainingTime <= 0) { - const timer = this.ref.timer as HTMLElement | undefined; + const timer = this._timerRef.value as HTMLElement | undefined; if (timer) { timer.textContent = formatTime(remainingTime); } @@ -282,12 +272,12 @@ export class CameraSource extends UploaderBlock { return; } - const timer = this.ref.timer as HTMLElement | undefined; + const timer = this._timerRef.value as HTMLElement | undefined; if (timer) { timer.textContent = formatTime(remainingTime); } } else { - const timer = this.ref.timer as HTMLElement | undefined; + const timer = this._timerRef.value as HTMLElement | undefined; if (timer) { timer.textContent = formatTime(currentTime); } @@ -296,43 +286,43 @@ export class CameraSource extends UploaderBlock { this._animationFrameId = requestAnimationFrame(this._updateTimer); }; - _startTimer = (): void => { - this.$._startTime = performance.now(); - this.$._elapsedTime = 0; + private _startTimer = (): void => { + this._startTime = performance.now(); + this._elapsedTime = 0; this._updateTimer(); }; - _stopTimer = (): void => { + private _stopTimer = (): void => { if (this._animationFrameId) cancelAnimationFrame(this._animationFrameId); }; - _startTimeline = (): void => { - const video = this.ref.video as HTMLVideoElement | undefined; + private _startTimeline = (): void => { + const video = this._videoRef.value as HTMLVideoElement | undefined; if (!video) { return; } const currentTime = video.currentTime; const duration = video.duration || 1; - const line = this.ref.line as HTMLElement | undefined; + const line = this._lineRef.value as HTMLElement | undefined; if (line) { line.style.transform = `scaleX(${currentTime / duration})`; } - const timer = this.ref.timer as HTMLElement | undefined; + const timer = this._timerRef.value as HTMLElement | undefined; if (timer) { timer.textContent = formatTime(currentTime); } this._animationFrameId = requestAnimationFrame(this._startTimeline); }; - _stopTimeline = (): void => { + private _stopTimeline = (): void => { if (this._animationFrameId) cancelAnimationFrame(this._animationFrameId); }; - _animationFrameId: number | null = null; + private _animationFrameId: number | null = null; - _startRecording = (): void => { + private _startRecording = (): void => { try { this._chunks = []; this._options = { @@ -393,22 +383,24 @@ export class CameraSource extends UploaderBlock { }; /** This method is used to toggle recording pause/resume */ - _toggleRecording = (): void => { + private _toggleRecording = (): void => { if (this._mediaRecorder?.state === 'recording') return; - if (!this.ref.video.paused && !this.ref.video.ended && this.ref.video.readyState > 2) { - this.ref.video.pause(); - } else if (this.ref.video.paused) { - this.ref.video.play(); + const videoEl = this._videoRef.value; + if (!videoEl) return; + if (!videoEl.paused && !videoEl.ended && videoEl.readyState > 2) { + videoEl.pause(); + } else if (videoEl.paused) { + videoEl.play(); } }; - _toggleEnableAudio = (): void => { + private _toggleEnableAudio = (): void => { this._stream?.getAudioTracks().forEach((track) => { track.enabled = !track.enabled; - this.$.toggleMicrophoneIcon = !track.enabled ? 'microphone-mute' : 'microphone'; - this.$.audioSelectDisabled = !track.enabled; + this._toggleMicrophoneIcon = track.enabled ? 'microphone' : 'microphone-mute'; + this._audioSelectDisabled = !track.enabled; }); }; @@ -423,51 +415,73 @@ export class CameraSource extends UploaderBlock { const videoURL = URL.createObjectURL(blob); - const videoElement = this.ref.video as HTMLVideoElement | undefined; + const videoElement = this._videoRef.value as HTMLVideoElement | undefined; if (!videoElement) { return; } videoElement.muted = false; videoElement.volume = 1; - this.$.video = null; + this._setVideoSource(null); videoElement.src = videoURL; - videoElement.addEventListener('play', () => { - this._startTimeline(); - this.set$({ - currentTimelineIcon: 'pause', - }); - }); - - videoElement.addEventListener('pause', () => { - this.set$({ - currentTimelineIcon: 'play', - }); - this._stopTimeline(); - }); + this._attachPreviewListeners(videoElement); } catch (error) { console.error('Failed to preview video', error); this.telemetryManager.sendEventError(error, 'camera previewing. Failed to preview video'); } }; - _retake = (): void => { + private _attachPreviewListeners(videoElement: HTMLVideoElement): void { + this._detachPreviewListeners(videoElement); + videoElement.addEventListener('play', this._handlePreviewPlay); + videoElement.addEventListener('pause', this._handlePreviewPause); + } + + private _detachPreviewListeners(videoElement?: HTMLVideoElement | null): void { + videoElement?.removeEventListener('play', this._handlePreviewPlay); + videoElement?.removeEventListener('pause', this._handlePreviewPause); + } + + private _setVideoSource(stream: MediaStream | null): void { + if (this._currentVideoSource === stream) { + return; + } + this._currentVideoSource = stream; + this._applyVideoSource(); + } + + /** + * Do not bind srcObject directly in the template, because it stops video pausing on shot. + * I really don'y know why but that's how it is. Assigning srcObject manually fixes the issue. + */ + private _applyVideoSource(): void { + const videoElement = this._videoRef.value; + if (!videoElement) { + return; + } + const nextSource = this._currentVideoSource ?? null; + if (videoElement.srcObject !== nextSource) { + videoElement.srcObject = nextSource; + } + } + + private _retake = (): void => { this._setCameraState(CameraSourceEvents.RETAKE); /** Reset video */ if (this._activeTab === CameraSourceTypes.VIDEO) { - this.$.video = this._stream; - const videoElement = this.ref.video as HTMLVideoElement | undefined; + this._setVideoSource(this._stream); + const videoElement = this._videoRef.value as HTMLVideoElement | undefined; if (videoElement) { videoElement.muted = true; } } - void this.ref.video?.play?.(); + void this._videoRef.value?.play?.(); }; - _accept = (): void => { + private _accept = (): void => { this._setCameraState(CameraSourceEvents.ACCEPT); if (this._activeTab === CameraSourceTypes.PHOTO) { @@ -492,66 +506,53 @@ export class CameraSource extends UploaderBlock { this._chunks = []; }; - _handlePhoto = (status: CameraStatus): void => { + private _handlePhoto = (status: CameraStatus): void => { if (status === CameraSourceEvents.SHOT) { - this.set$({ - tabVideoHidden: true, - cameraHidden: true, - tabCameraHidden: true, - cameraActionsHidden: false, - cameraSelectHidden: true, - }); + this._tabVideoHidden = true; + this._cameraHidden = true; + this._tabCameraHidden = true; + this._cameraActionsHidden = false; + this._cameraSelectHidden = true; } if (status === CameraSourceEvents.RETAKE || status === CameraSourceEvents.ACCEPT) { - this.set$({ - tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO), - tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO), - cameraHidden: false, - cameraActionsHidden: true, - cameraSelectHidden: this._cameraDevices.length <= 1, - }); + this._tabVideoHidden = !this._cameraModes.includes(CameraSourceTypes.VIDEO); + this._tabCameraHidden = !this._cameraModes.includes(CameraSourceTypes.PHOTO); + this._cameraHidden = false; + this._cameraActionsHidden = true; + this._cameraSelectHidden = this._cameraDevices.length <= 1; } }; - _handleVideo = (status: CameraStatus): void => { + private _handleVideo = (status: CameraStatus): void => { if (status === CameraSourceEvents.PLAY) { - this.set$({ - timerHidden: false, - tabCameraHidden: true, - - cameraSelectHidden: true, - audioSelectHidden: true, - - currentTimelineIcon: 'pause', - currentIcon: 'square', - mutableClassButton: 'uc-shot-btn uc-camera-action uc-stop-record', - }); + this._timerHidden = false; + this._tabCameraHidden = true; + this._cameraSelectHidden = true; + this._audioSelectHidden = true; + this._currentTimelineIcon = 'pause'; + this._currentIcon = 'square'; + this._mutableClassButton = 'uc-shot-btn uc-camera-action uc-stop-record'; } if (status === CameraSourceEvents.STOP) { - this.set$({ - timerHidden: false, - cameraHidden: true, - audioToggleMicrophoneHidden: true, - cameraActionsHidden: false, - }); + this._timerHidden = false; + this._cameraHidden = true; + this._audioToggleMicrophoneHidden = true; + this._cameraActionsHidden = false; } if (status === CameraSourceEvents.RETAKE || status === CameraSourceEvents.ACCEPT) { - this.set$({ - timerHidden: true, - tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO), - tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO), - cameraHidden: false, - cameraActionsHidden: true, - audioToggleMicrophoneHidden: !this.cfg.enableAudioRecording, - currentIcon: 'video-camera-full', - mutableClassButton: 'uc-shot-btn uc-camera-action', - - audioSelectHidden: !this.cfg.enableAudioRecording || this._audioDevices.length <= 1, - cameraSelectHidden: this._cameraDevices.length <= 1, - }); + this._timerHidden = true; + this._tabVideoHidden = !this._cameraModes.includes(CameraSourceTypes.VIDEO); + this._tabCameraHidden = !this._cameraModes.includes(CameraSourceTypes.PHOTO); + this._cameraHidden = false; + this._cameraActionsHidden = true; + this._audioToggleMicrophoneHidden = !this.cfg.enableAudioRecording; + this._currentIcon = 'video-camera-full'; + this._mutableClassButton = 'uc-shot-btn uc-camera-action'; + this._audioSelectHidden = !this.cfg.enableAudioRecording || this._audioDevices.length <= 1; + this._cameraSelectHidden = this._cameraDevices.length <= 1; } }; @@ -585,41 +586,40 @@ export class CameraSource extends UploaderBlock { if (!this._ctx) { throw new Error('Failed to get canvas context'); } - - this._canvas.height = this.ref.video.videoHeight; - this._canvas.width = this.ref.video.videoWidth; + const videoEl = this._videoRef.value; + if (!videoEl) { + throw new Error('Video element not found'); + } + this._canvas.height = videoEl.videoHeight; + this._canvas.width = videoEl.videoWidth; if (this.cfg.cameraMirror) { this._ctx.translate(this._canvas.width, 0); this._ctx.scale(-1, 1); } - this._ctx.drawImage(this.ref.video, 0, 0); - this.ref.video.pause(); + this._ctx.drawImage(videoEl, 0, 0); + // TODO: There are troubles with this, image isn't freezed after shot due to rendering in progress + videoEl.pause(); } private _handleActiveTab = (tabId: CameraMode): void => { - const switcher = this.ref.switcher as HTMLElement | undefined; + const switcher = this._switcherRef.value as HTMLElement | undefined; switcher?.querySelectorAll('button').forEach((btn) => { btn.classList.toggle('uc-active', btn.getAttribute('data-id') === tabId); }); if (tabId === CameraSourceTypes.PHOTO) { - this.set$({ - currentIcon: 'camera-full', - audioSelectHidden: true, - audioToggleMicrophoneHidden: true, - }); + this._currentIcon = 'camera-full'; + this._audioSelectHidden = true; + this._audioToggleMicrophoneHidden = true; } if (tabId === CameraSourceTypes.VIDEO) { - this.set$({ - currentTimelineIcon: 'play', - currentIcon: 'video-camera-full', - - audioSelectHidden: !this.cfg.enableAudioRecording || this._audioDevices.length <= 1, - audioToggleMicrophoneHidden: !this.cfg.enableAudioRecording, - }); + this._currentTimelineIcon = 'play'; + this._currentIcon = 'video-camera-full'; + this._audioSelectHidden = !this.cfg.enableAudioRecording || this._audioDevices.length <= 1; + this._audioToggleMicrophoneHidden = !this.cfg.enableAudioRecording; } this.telemetryManager.sendEvent({ @@ -648,7 +648,7 @@ export class CameraSource extends UploaderBlock { return file; }; - _guessExtensionByMime(mime: string | undefined): string { + private _guessExtensionByMime(mime: string | undefined): string { const knownContainers = { mp4: 'mp4', ogg: 'ogg', @@ -684,12 +684,12 @@ export class CameraSource extends UploaderBlock { /** * The send file to the server */ - _toSend = (file: File): void => { + private _toSend = (file: File): void => { this.api.addFileFromObject(file, { source: UploadSource.CAMERA }); this.set$({ - '*currentActivity': ActivityBlock.activities.UPLOAD_LIST, + '*currentActivity': LitActivityBlock.activities.UPLOAD_LIST, }); - this.modalManager?.open(ActivityBlock.activities.UPLOAD_LIST); + this.modalManager?.open(LitActivityBlock.activities.UPLOAD_LIST); }; private get _cameraModes(): CameraMode[] { @@ -705,49 +705,37 @@ export class CameraSource extends UploaderBlock { const currentIcon = this._activeTab === CameraSourceTypes.PHOTO ? 'camera-full' : 'video-camera-full'; if (state === 'granted') { - this.set$({ - videoHidden: false, - cameraHidden: false, - tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO), - tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO), - messageHidden: true, - timerHidden: true, - - currentIcon, - audioToggleMicrophoneHidden: !visibleAudio, - audioSelectHidden: !visibleAudio, - }); + this._videoHidden = false; + this._cameraHidden = false; + this._tabCameraHidden = !this._cameraModes.includes(CameraSourceTypes.PHOTO); + this._tabVideoHidden = !this._cameraModes.includes(CameraSourceTypes.VIDEO); + this._messageHidden = true; + this._timerHidden = true; + this._currentIcon = currentIcon; + this._audioToggleMicrophoneHidden = !visibleAudio; + this._audioSelectHidden = !visibleAudio; } else if (state === 'prompt') { - this.$.l10nMessage = 'camera-permissions-prompt'; - - this.set$({ - videoHidden: true, - cameraHidden: true, - tabCameraHidden: true, - messageHidden: false, - }); + this._l10nMessage = 'camera-permissions-prompt'; + this._videoHidden = true; + this._cameraHidden = true; + this._tabCameraHidden = true; + this._messageHidden = false; this._stopCapture(); } else { - this.$.l10nMessage = 'camera-permissions-denied'; - - this.set$({ - videoHidden: true, - messageHidden: false, - - tabCameraHidden: !this._cameraModes.includes(CameraSourceTypes.PHOTO), - tabVideoHidden: !this._cameraModes.includes(CameraSourceTypes.VIDEO), - - cameraActionsHidden: true, - - mutableClassButton: 'uc-shot-btn uc-camera-action', - }); + this._l10nMessage = 'camera-permissions-denied'; + this._videoHidden = true; + this._messageHidden = false; + this._tabCameraHidden = !this._cameraModes.includes(CameraSourceTypes.PHOTO); + this._tabVideoHidden = !this._cameraModes.includes(CameraSourceTypes.VIDEO); + this._cameraActionsHidden = true; + this._mutableClassButton = 'uc-shot-btn uc-camera-action'; this._stopCapture(); } }, 300); - _makeStreamInactive = (): boolean => { + private _makeStreamInactive = (): boolean => { if (!this._stream) return false; const audioTracks = this._stream?.getAudioTracks(); @@ -763,12 +751,15 @@ export class CameraSource extends UploaderBlock { return true; }; - _stopCapture = (): void => { + private _stopCapture = (): void => { if (this._capturing) { - this.ref.video.volume = 0; - const tracks = this.$.video?.getTracks?.(); + if (this._videoRef.value) { + this._videoRef.value.volume = 0; + } + const tracks = this._currentVideoSource?.getTracks?.(); tracks?.[0]?.stop(); - this.$.video = null; + this._detachPreviewListeners(this._videoRef.value); + this._setVideoSource(null); this._makeStreamInactive(); this._stopTimer(); @@ -777,7 +768,7 @@ export class CameraSource extends UploaderBlock { } }; - _capture = async (): Promise => { + private _capture = async (): Promise => { const constraints: MediaStreamConstraints = { video: { ...DEFAULT_VIDEO_CONFIG }, audio: this.cfg.enableAudioRecording ? ({} as MediaTrackConstraints) : false, @@ -800,8 +791,8 @@ export class CameraSource extends UploaderBlock { } // Mute the video to prevent feedback for Firefox - if (this.ref.video) { - this.ref.video.volume = 0; + if (this._videoRef.value) { + this._videoRef.value.volume = 0; } try { @@ -812,7 +803,7 @@ export class CameraSource extends UploaderBlock { this._setPermissionsState('denied'); }); - this.$.video = this._stream; + this._setVideoSource(this._stream); this._capturing = true; this._setPermissionsState('granted'); } catch (error) { @@ -822,12 +813,13 @@ export class CameraSource extends UploaderBlock { } }; - _handlePermissionsChange = (): void => { + private _handlePermissionsChange = (): void => { this._capture(); }; - _permissionAccess = async (): Promise => { + private _permissionAccess = async (): Promise => { try { + this._teardownPermissionListeners(); for (const permission of DEFAULT_PERMISSIONS) { const response = await navigator.permissions.query({ name: permission as PermissionName, @@ -835,17 +827,33 @@ export class CameraSource extends UploaderBlock { this._permissionResponses[permission] = response; response.addEventListener('change', this._handlePermissionsChange); + this._permissionCleanupFns.push(() => { + response.removeEventListener('change', this._handlePermissionsChange); + }); } + this._unsubPermissions = () => { + this._teardownPermissionListeners(); + }; } catch (error) { + this._teardownPermissionListeners(); console.log('Failed to use permissions API. Fallback to manual request mode.', error); this.telemetryManager.sendEventError(error, 'camera permissions. Failed to use permissions API'); this._capture(); } }; - _getPermission = (): void => {}; + private _teardownPermissionListeners(): void { + if (this._permissionCleanupFns.length === 0) { + return; + } + for (const cleanup of this._permissionCleanupFns) { + cleanup(); + } + this._permissionCleanupFns = []; + this._unsubPermissions = null; + } - _requestDeviceAccess = async (): Promise => { + private _requestDeviceAccess = async (): Promise => { try { await navigator.mediaDevices.getUserMedia({ video: true, @@ -860,7 +868,7 @@ export class CameraSource extends UploaderBlock { } }; - _getDevices = async (): Promise => { + private _getDevices = async (): Promise => { try { const devices = await navigator.mediaDevices.enumerateDevices(); @@ -880,20 +888,12 @@ export class CameraSource extends UploaderBlock { })) : []; - if (this._cameraDevices.length > 1) { - this.set$({ - cameraSelectOptions: this._cameraDevices, - cameraSelectHidden: false, - }); - } + this._cameraSelectOptions = this._cameraDevices; + this._cameraSelectHidden = this._cameraDevices.length <= 1; this._selectedCameraId = this._cameraDevices[0]?.value ?? null; - if (this._audioDevices.length > 1) { - this.set$({ - audioSelectOptions: this._audioDevices, - audioSelectHidden: false, - }); - } + this._audioSelectOptions = this._audioDevices; + this._audioSelectHidden = !this.cfg.enableAudioRecording || this._audioDevices.length <= 1; this._selectedAudioId = this._audioDevices[0]?.value ?? null; } catch (error) { this.telemetryManager.sendEventError(error, 'camera devices. Failed to get devices'); @@ -901,7 +901,7 @@ export class CameraSource extends UploaderBlock { } }; - _onActivate = async (): Promise => { + private _onActivate = async (): Promise => { await this._permissionAccess(); await this._requestDeviceAccess(); await this._capture(); @@ -909,7 +909,7 @@ export class CameraSource extends UploaderBlock { this._handleCameraModes(this._cameraModes); }; - _onDeactivate = async (): Promise => { + private _onDeactivate = async (): Promise => { if (this._unsubPermissions) { this._unsubPermissions(); } @@ -923,9 +923,9 @@ export class CameraSource extends UploaderBlock { this._stopCapture(); }; - _handleCameraModes = (cameraModes: CameraMode[]): void => { - this.$.tabVideoHidden = !cameraModes.includes(CameraSourceTypes.VIDEO); - this.$.tabCameraHidden = !cameraModes.includes(CameraSourceTypes.PHOTO); + private _handleCameraModes = (cameraModes: CameraMode[]): void => { + this._tabVideoHidden = !cameraModes.includes(CameraSourceTypes.VIDEO); + this._tabCameraHidden = !cameraModes.includes(CameraSourceTypes.PHOTO); const defaultTab = cameraModes[0]; if (defaultTab && (!this._activeTab || !cameraModes.includes(this._activeTab))) { @@ -933,20 +933,21 @@ export class CameraSource extends UploaderBlock { } }; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); + this.registerActivity(this.activityType, { onActivate: this._onActivate, onDeactivate: this._onDeactivate, }); this.subConfigValue('cameraMirror', (val) => { - this.$.videoTransformCss = val ? 'scaleX(-1)' : null; + this._videoTransformCss = val ? 'scaleX(-1)' : null; }); this.subConfigValue('enableAudioRecording', (val) => { - this.$.audioToggleMicrophoneHidden = !val; - this.$.audioSelectDisabled = !val; + this._audioToggleMicrophoneHidden = !val; + this._audioSelectDisabled = !val; }); this.subConfigValue('cameraModes', (val) => { @@ -960,45 +961,57 @@ export class CameraSource extends UploaderBlock { }); } - _destroy(): void { - for (const permission of DEFAULT_PERMISSIONS) { - this._permissionResponses[permission]?.removeEventListener('change', this._handlePermissionsChange); - } + public override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this._applyVideoSource(); + } + + public override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + this._applyVideoSource(); + } + private _destroy(): void { + this._teardownPermissionListeners(); navigator.mediaDevices?.removeEventListener('devicechange', this._getDevices); + this._detachPreviewListeners(this._videoRef.value); + this._setVideoSource(null); } - override async destroyCallback(): Promise { - super.destroyCallback(); + public override disconnectedCallback(): void { + super.disconnectedCallback(); this._destroy(); } -} -CameraSource.template = /* HTML */ ` + public override render() { + return html` -
+
- + ${this.l10n('caption-camera')}
@@ -1008,26 +1021,30 @@ CameraSource.template = /* HTML */ ` muted autoplay playsinline - set="srcObject: video; style.transform: videoTransformCss; @hidden: videoHidden" - ref="video" + style=${styleMap({ + transform: this._videoTransformCss, + })} + ?hidden=${this._videoHidden} + ${ref(this._videoRef)} > -
- +
+ ${this.l10n(this._l10nMessage)} + @click=${this._handleRequestPermissions} + ?hidden=${this._requestBtnHidden} + >${this.l10n('camera-permissions-request')}
-
+
@@ -1035,7 +1052,8 @@ CameraSource.template = /* HTML */ ` data-id="video" type="button" class="uc-switch uc-mini-btn" - set="onclick: onClickTab; @hidden: tabVideoHidden" + @click=${this._handleClickTab} + ?hidden=${this._tabVideoHidden} > @@ -1043,24 +1061,25 @@ CameraSource.template = /* HTML */ `
-
`; + } +} diff --git a/src/blocks/CameraSource/camera-source.css b/src/blocks/CameraSource/camera-source.css index f70837ea8..a73712f2b 100644 --- a/src/blocks/CameraSource/camera-source.css +++ b/src/blocks/CameraSource/camera-source.css @@ -16,10 +16,6 @@ height: 100%; } - uc-camera-source:not(.uc-initialized) .uc-controls { - display: none; - } - uc-camera-source video { display: block; width: 100%; @@ -54,7 +50,7 @@ uc-camera-source .uc-message-box { display: flex; flex-direction: column; - grid-gap: 40px; + gap: 40px; align-items: center; justify-content: center; padding: 40px 40px 0; @@ -108,6 +104,10 @@ min-height: 74px; } + uc-camera-source:not(.uc-initialized) .uc-controls { + display: none; + } + uc-camera-source .uc-switcher { display: flex; gap: calc(var(--uc-padding) / 2); diff --git a/src/blocks/CloudImageEditor/src/CloudImageEditorBlock.ts b/src/blocks/CloudImageEditor/src/CloudImageEditorBlock.ts index a2fb02baa..ef20383af 100644 --- a/src/blocks/CloudImageEditor/src/CloudImageEditorBlock.ts +++ b/src/blocks/CloudImageEditor/src/CloudImageEditorBlock.ts @@ -1,4 +1,9 @@ -import { Block } from '../../../abstract/Block'; +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { unsafeSVG } from 'lit/directives/unsafe-svg.js'; +import { when } from 'lit/directives/when.js'; +import { LitBlock } from '../../../lit/LitBlock'; import { createCdnUrl, createCdnUrlModifiers, @@ -6,6 +11,7 @@ import { extractOperations, extractUuid, } from '../../../utils/cdn-utils'; +import { serializeCsv } from '../../../utils/comma-separated'; import { debounce } from '../../../utils/debounce.js'; import { TRANSPARENT_PIXEL_SRC } from '../../../utils/transparentPixelSrc'; import type { EditorImageCropper } from './EditorImageCropper'; @@ -15,31 +21,150 @@ import { getClosestAspectRatio, parseCropPreset } from './lib/parseCropPreset.js import { parseTabs } from './lib/parseTabs.js'; import { operationsToTransformations, transformationsToOperations } from './lib/transformationUtils.js'; import { initState } from './state.js'; -import { TEMPLATE } from './template.js'; -import { TabId } from './toolbar-constants.js'; +import svgIconsSprite from './svg-sprite'; +import { ALL_TABS, TabId } from './toolbar-constants.js'; import type { ApplyResult, CropPresetList, ImageSize, Transformations } from './types'; type TabIdValue = (typeof TabId)[keyof typeof TabId]; -interface CloudImageEditorBlockState extends ReturnType {} +const DEFAULT_TABS = serializeCsv([...ALL_TABS]); -export class CloudImageEditorBlock extends Block { - override ctxOwner = true; - static override styleAttrs = ['uc-cloud-image-editor']; +export class CloudImageEditorBlock extends LitBlock { + public declare attributesMeta: ({ uuid: string } | { 'cdn-url': string }) & + Partial<{ tabs: string; 'crop-preset': string }> & { + 'ctx-name': string; + }; - private _debouncedShowLoader = debounce(this._showLoader.bind(this), 300); + public override ctxOwner = true; + public static override styleAttrs = ['uc-cloud-image-editor']; - constructor() { - super(); + @state() + private _statusMessage = ''; - this.init$ = { - ...this.init$, - ...initState(this), - } as CloudImageEditorBlockState; + @state() + private _imageSrc = TRANSPARENT_PIXEL_SRC; + + @state() + private _fileType = ''; + + @state() + private _showLoader = false; + + @property({ type: String, reflect: true }) + public uuid: string | null = null; + + @property({ type: String, attribute: 'cdn-url', reflect: true }) + public cdnUrl: string | null = null; + + @property({ type: String, attribute: 'crop-preset', reflect: true }) + public cropPreset = ''; + + @property({ type: String, reflect: true }) + public tabs: string | null = DEFAULT_TABS; + + @state() + private _hasNetworkProblems = false; + + @state() + private _isInitialized = false; + + private _pendingInitUpdate: Promise | null = null; + + private readonly _debouncedShowLoader = debounce((show: boolean) => { + this._showLoader = show; + }, 300); + + private readonly _imgRef = createRef(); + private readonly _cropperRef = createRef(); + private readonly _faderRef = createRef(); + private readonly _imgContainerRef = createRef(); + + private readonly _handleImageLoad = (): void => { + this._debouncedShowLoader(false); + + if (this._imageSrc !== TRANSPARENT_PIXEL_SRC) { + this.$['*networkProblems'] = false; + } + }; + + private readonly _handleImageError = (): void => { + this._debouncedShowLoader(false); + this.$['*networkProblems'] = true; + }; + + private readonly _handleRetryNetwork = (): void => { + const retry = this.$['*on.retryNetwork'] as (() => void) | undefined; + retry?.(); + }; + + private _scheduleInitialization(): void { + if (this._isInitialized || this._pendingInitUpdate) { + return; + } + this._pendingInitUpdate = this.updateComplete.then(() => { + this._pendingInitUpdate = null; + this._isInitialized = true; + }); } - private _showLoader(show: boolean): void { - this.$.showLoader = show; + public override init$ = { + ...this.init$, + ...initState(this), + } as ReturnType; + + public override initCallback(): void { + super.initCallback(); + + this._syncTabListFromProp(); + this._syncCropPresetState(); + } + + private _assignSharedElements(): void { + const faderEl = this._faderRef.value; + if (faderEl) { + this.$['*faderEl'] = faderEl; + } + + const cropperEl = this._cropperRef.value; + if (cropperEl) { + this.$['*cropperEl'] = cropperEl; + } + + const imgContainerEl = this._imgContainerRef.value; + if (imgContainerEl) { + this.$['*imgContainerEl'] = imgContainerEl; + } + + const imgEl = this._imgRef.value; + if (imgEl) { + this.$['*imgEl'] = imgEl; + } + } + + private _attachImageListeners(): void { + const imgEl = this._imgRef.value; + if (!imgEl) { + return; + } + imgEl.addEventListener('load', this._handleImageLoad); + imgEl.addEventListener('error', this._handleImageError); + } + + private _detachImageListeners(): void { + const imgEl = this._imgRef.value; + if (!imgEl) { + return; + } + imgEl.removeEventListener('load', this._handleImageLoad); + imgEl.removeEventListener('error', this._handleImageError); + } + + private get _imageClassName(): string { + const tabId = this.$['*tabId'] as TabIdValue; + return classNames('uc-image', { + 'uc-image_hidden_to_cropper': tabId === TabId.CROP, + 'uc-image_hidden_effects': tabId !== TabId.CROP, + }); } /** @@ -66,24 +191,117 @@ export class CloudImageEditorBlock extends Block { }); } - override initCallback(): void { - super.initCallback(); + public override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this._assignSharedElements(); + this._attachImageListeners(); + void this.initEditor(); - this.$['*faderEl'] = this.ref['fader-el']; - this.$['*cropperEl'] = this.ref['cropper-el']; - this.$['*imgContainerEl'] = this.ref['img-container-el']; + const hasInitialSource = Boolean(this.uuid || this.cdnUrl); + const alreadyRequested = changedProperties.has('uuid') || changedProperties.has('cdnUrl'); + if (hasInitialSource && !alreadyRequested) { + void this.updateImage(); + } + } - this.initEditor(); + public override disconnectedCallback(): void { + this._detachImageListeners(); + super.disconnectedCallback(); } - async updateImage(): Promise { + public override render() { + const fileType = this._fileType ?? ''; + const message = this._statusMessage ?? ''; + const src = this._imageSrc || TRANSPARENT_PIXEL_SRC; + const showLoader = this._showLoader; + const showNetworkProblems = this._hasNetworkProblems; + + return html` + ${unsafeSVG(svgIconsSprite)} +
+ +
+
+ +
+
Network error
+
+ +
+
+
+
${fileType}
+
+
+ + ${when(this._isInitialized, () => html``)} + +
+
${message}
+
+
+ +
+ ${when(this._isInitialized, () => html``)} +
+
+
+ `; + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + + if (changedProperties.has('uuid') && this.uuid) { + void this.updateImage(); + } + + if (changedProperties.has('cdnUrl') && this.cdnUrl) { + void this.updateImage(); + } + + if (changedProperties.has('tabs')) { + this._syncTabListFromProp(); + } + + if (changedProperties.has('cropPreset') || changedProperties.has('cdnUrl')) { + this._syncCropPresetState(); + } + } + + private _syncTabListFromProp(): void { + const tabsValue = this.tabs || DEFAULT_TABS; + this.$['*tabList'] = parseTabs(tabsValue); + } + + private _syncCropPresetState(): void { + const list = parseCropPreset(this.cropPreset ?? '') as CropPresetList; + let closest: CropPresetList[number] | null = null; + + if (this.cdnUrl) { + const operations = extractOperations(this.cdnUrl); + const transformations = operationsToTransformations(operations) as Transformations; + + if (Array.isArray(transformations?.crop?.dimensions)) { + const [w, h] = transformations.crop.dimensions; + closest = getClosestAspectRatio(w, h, list, 0.1); + } + } + + this.$['*cropPresetList'] = list; + this.$['*currentAspectRatio'] = closest ?? list?.[0] ?? null; + } + + public async updateImage(): Promise { if (!this.isConnected) { return; } await this._waitForSize(); - if (this.$.cdnUrl) { - const cdnUrlValue = this.$.cdnUrl as string; + if (this.cdnUrl) { + const cdnUrlValue = this.cdnUrl as string; const uuid = extractUuid(cdnUrlValue); const originalUrl = createOriginalUrl(cdnUrlValue, uuid); if (originalUrl === this.$['*originalUrl']) { @@ -93,8 +311,8 @@ export class CloudImageEditorBlock extends Block { const operations = extractOperations(cdnUrlValue); const transformations = operationsToTransformations(operations) as Transformations; this.$['*editorTransformations'] = transformations; - } else if (this.$.uuid) { - const originalUrl = createOriginalUrl(this.cfg.cdnCname, this.$.uuid as string); + } else if (this.uuid) { + const originalUrl = createOriginalUrl(this.cfg.cdnCname, this.uuid as string); if (originalUrl === this.$['*originalUrl']) { return; } @@ -129,9 +347,11 @@ export class CloudImageEditorBlock extends Block { console.error('Failed to load image info', err); } } + + this._scheduleInitialization(); } - async initEditor(): Promise { + public async initEditor(): Promise { try { await this._waitForSize(); } catch (err) { @@ -142,43 +362,11 @@ export class CloudImageEditorBlock extends Block { return; } - this.ref['img-el'].addEventListener('load', () => { - this._debouncedShowLoader(false); - - if (this.$.src !== TRANSPARENT_PIXEL_SRC) { - this.$['*networkProblems'] = false; - } - }); - - this.ref['img-el'].addEventListener('error', () => { - this._debouncedShowLoader(false); - - this.$['*networkProblems'] = true; - }); - - this.sub('src', (src) => { - const el = this.ref['img-el']; - if (el.src !== src) { - el.src = src || TRANSPARENT_PIXEL_SRC; - } - }); - - this.sub('tabs', (val: string) => { - this.$['*tabList'] = parseTabs(val); - }); - - this.sub('*tabId', (tabId: TabIdValue) => { - (this.ref['img-el'] as HTMLImageElement).className = classNames('uc-image', { - 'uc-image_hidden_to_cropper': tabId === TabId.CROP, - 'uc-image_hidden_effects': tabId !== TabId.CROP, - }); - }); - this.classList.add('uc-editor_ON'); this.sub('*networkProblems', (networkProblems) => { - this.$['presence.networkProblems'] = networkProblems; - this.$['presence.modalCaption'] = !networkProblems; + const hasIssues = Boolean(networkProblems); + this._hasNetworkProblems = hasIssues; }); this.sub( @@ -207,34 +395,5 @@ export class CloudImageEditorBlock extends Block { }, false, ); - - this.sub('uuid', (val: string | null) => val && this.updateImage()); - this.sub('cdnUrl', (val: string | null) => val && this.updateImage()); - - this.sub('cropPreset', (val: string) => { - const list = parseCropPreset(val) as CropPresetList; - let closest: CropPresetList[number] | null = null; - - if (this.$.cdnUrl) { - const operations = extractOperations(this.$.cdnUrl as string); - const transformations = operationsToTransformations(operations) as Transformations; - - if (Array.isArray(transformations?.crop?.dimensions)) { - const [w, h] = transformations.crop.dimensions; - closest = getClosestAspectRatio(w, h, list, 0.1); - } - } - - this.$['*cropPresetList'] = list; - this.$['*currentAspectRatio'] = closest ?? list?.[0] ?? null; - }); } } - -CloudImageEditorBlock.template = TEMPLATE; -CloudImageEditorBlock.bindAttributes({ - uuid: 'uuid', - 'cdn-url': 'cdnUrl', - 'crop-preset': 'cropPreset', - tabs: 'tabs', -}); diff --git a/src/blocks/CloudImageEditor/src/CropFrame.ts b/src/blocks/CloudImageEditor/src/CropFrame.ts index 7c6b1d333..15aac8788 100644 --- a/src/blocks/CloudImageEditor/src/CropFrame.ts +++ b/src/blocks/CloudImageEditor/src/CropFrame.ts @@ -1,5 +1,8 @@ -import { UID } from '@symbiotejs/symbiote'; -import { Block } from '../../../abstract/Block'; +import type { PropertyValues, TemplateResult } from 'lit'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { LitBlock } from '../../../lit/LitBlock'; import { clamp, constraintRect, @@ -30,11 +33,7 @@ type FrameThumb = NonNullable; type Delta = [number, number]; -export class CropFrame extends Block { - private readonly _handlePointerUp: (e: PointerEvent) => void; - private readonly _handlePointerMove: (e: PointerEvent) => void; - private readonly _handleSvgPointerMove: (e: PointerEvent) => void; - private readonly _backdropMaskId = `backdrop-mask-${UID.generate()}`; +export class CropFrame extends LitBlock { private _backdropMask?: SVGMaskElement; private _backdropMaskInner?: SVGRectElement; private _frameThumbs?: FrameThumbs; @@ -45,20 +44,40 @@ export class CropFrame extends Block { private _dragStartCrop?: Rectangle; private _frameImage?: SVGImageElement; private _guidesHidden = false; + @state() + private _draggingValue = false; + private readonly _svgRef = createRef(); + private _svgReady = false; + private _pendingMaskHref: string | null = null; + + private get _svgElement(): SVGSVGElement | null { + return this._svgRef.value ?? null; + } - constructor() { - super(); - - this.init$ = { - ...this.init$, - dragging: false, - }; - - this._handlePointerUp = this._handlePointerUp_.bind(this); + private get _dragging(): boolean { + return this._draggingValue; + } - this._handlePointerMove = this._handlePointerMove_.bind(this); + private set _dragging(value: boolean) { + if (this._draggingValue === value) { + return; + } + this._draggingValue = value; + this._applyGuidesDragState(); + } - this._handleSvgPointerMove = this._handleSvgPointerMove_.bind(this); + private _applyGuidesDragState(): void { + if (!this._frameGuides) { + return; + } + this._frameGuides.setAttribute( + 'class', + classNames({ + 'uc-guides--hidden': this._guidesHidden, + 'uc-guides--visible': !this._guidesHidden && this._draggingValue, + 'uc-guides--semi-hidden': !this._guidesHidden && !this._draggingValue, + }), + ); } private _shouldThumbBeDisabled(direction: Direction): boolean { @@ -82,9 +101,12 @@ export class CropFrame extends Block { return; } const { x, y, width, height } = cropBox; - const svg = this.ref['svg-el'] as SVGSVGElement; + const svg = this._svgElement; + if (!svg) { + return; + } - const mask = createSvgNode('mask', { id: this._backdropMaskId }) as SVGMaskElement; + const mask = createSvgNode('mask', { id: 'backdrop-mask' }) as SVGMaskElement; const maskRectOuter = createSvgNode('rect', { x: 0, y: 0, @@ -109,7 +131,7 @@ export class CropFrame extends Block { height: '100%', fill: 'var(--color-image-background)', 'fill-opacity': 0.85, - mask: `url(#${this._backdropMaskId})`, + mask: 'url(#backdrop-mask)', }); svg.appendChild(backdropRect); svg.appendChild(mask); @@ -305,7 +327,10 @@ export class CropFrame extends Block { } private _createFrame(): void { - const svg = this.ref['svg-el'] as SVGSVGElement; + const svg = this._svgElement; + if (!svg) { + return; + } const fr = document.createDocumentFragment(); const frameGuides = this._createGuides(); @@ -319,6 +344,7 @@ export class CropFrame extends Block { svg.appendChild(fr); this._frameThumbs = frameThumbs; this._frameGuides = frameGuides; + this._applyGuidesDragState(); } private _handlePointerDown(direction: Direction, e: PointerEvent): void { @@ -332,37 +358,43 @@ export class CropFrame extends Block { } const cropBox = this.$['*cropBox'] as Rectangle; - const svgElement = this.ref['svg-el'] as SVGSVGElement; + const svgElement = this._svgElement; + if (!svgElement) { + return; + } const { x: svgX, y: svgY } = svgElement.getBoundingClientRect(); const x = e.x - svgX; const y = e.y - svgY; - this.$.dragging = true; + this._dragging = true; this._draggingThumb = thumb; this._dragStartPoint = [x, y]; this._dragStartCrop = { ...cropBox }; } - private _handlePointerUp_(e: PointerEvent): void { + private readonly _handlePointerUp = (e: PointerEvent): void => { this._updateCursor(); - if (!this.$.dragging) { + if (!this._dragging) { return; } e.stopPropagation(); e.preventDefault(); - this.$.dragging = false; - } + this._dragging = false; + }; - private _handlePointerMove_(e: PointerEvent): void { - if (!this.$.dragging || !this._dragStartPoint || !this._draggingThumb) { + private readonly _handlePointerMove = (e: PointerEvent): void => { + if (!this._dragging || !this._dragStartPoint || !this._draggingThumb) { return; } e.stopPropagation(); e.preventDefault(); - const svg = this.ref['svg-el'] as SVGSVGElement; + const svg = this._svgElement; + if (!svg) { + return; + } const { x: svgX, y: svgY } = svg.getBoundingClientRect(); const x = e.x - svgX; const y = e.y - svgY; @@ -374,7 +406,7 @@ export class CropFrame extends Block { if (movedCropBox) { this.$['*cropBox'] = movedCropBox; } - } + }; private _calcCropBox(direction: Direction, delta: Delta): Rectangle | undefined { const [dx, dy] = delta; @@ -399,7 +431,7 @@ export class CropFrame extends Block { return constraintRect(roundRect(rect), imageBox); } - private _handleSvgPointerMove_(e: PointerEvent): void { + private readonly _handleSvgPointerMove = (e: PointerEvent): void => { if (!this._frameThumbs) return; const hoverThumb = Object.values(this._frameThumbs).find((thumb) => { @@ -423,11 +455,14 @@ export class CropFrame extends Block { this._hoverThumb = hoverThumb as FrameThumb | undefined; this._updateCursor(); - } + }; private _updateCursor(): void { const hoverThumb = this._hoverThumb; - const svg = this.ref['svg-el'] as SVGSVGElement; + const svg = this._svgElement; + if (!svg) { + return; + } svg.style.cursor = hoverThumb ? thumbCursor(hoverThumb.direction) : 'initial'; } @@ -437,7 +472,12 @@ export class CropFrame extends Block { return; } - const svg = this.ref['svg-el'] as SVGSVGElement; + const svg = this._svgElement; + if (!svg) { + this._pendingMaskHref = href; + return; + } + this._pendingMaskHref = null; const fr = document.createDocumentFragment(); const imageNode = createSvgNode('image', { @@ -471,12 +511,15 @@ export class CropFrame extends Block { } private _render(): void { + if (!this._svgReady) { + return; + } this._updateBackdrop(); this._updateFrame(); this._updateMask(); } - toggleThumbs(visible: boolean): void { + public toggleThumbs(visible: boolean): void { if (!this._frameThumbs) return; for (const thumb of Object.values(this._frameThumbs)) { if (!thumb) { @@ -493,14 +536,14 @@ export class CropFrame extends Block { } } - override initCallback() { + public override initCallback(): void { super.initCallback(); - this._createBackdrop(); - this._createFrame(); - this.sub('*imageBox', () => { this._resizeBackdrop(); + if (!this._svgReady) { + return; + } window.requestAnimationFrame(() => { this._render(); }); @@ -511,6 +554,10 @@ export class CropFrame extends Block { return; } this._guidesHidden = cropBox.height <= MIN_CROP_SIZE || cropBox.width <= MIN_CROP_SIZE; + this._applyGuidesDragState(); + if (!this._svgReady) { + return; + } window.requestAnimationFrame(() => { this._render(); }); @@ -522,32 +569,44 @@ export class CropFrame extends Block { } }); - this.sub('dragging', (dragging: boolean) => { - if (!this._frameGuides) return; - this._frameGuides.setAttribute( - 'class', - classNames({ - 'uc-guides--hidden': this._guidesHidden, - 'uc-guides--visible': !this._guidesHidden && dragging, - 'uc-guides--semi-hidden': !this._guidesHidden && !dragging, - }), - ); - }); - - const svg = this.ref['svg-el'] as SVGSVGElement; - svg.addEventListener('pointermove', this._handleSvgPointerMove, true); document.addEventListener('pointermove', this._handlePointerMove, true); document.addEventListener('pointerup', this._handlePointerUp, true); } - override destroyCallback() { - super.destroyCallback(); + protected override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this._initializeSvg(); + } - const svg = this.ref['svg-el'] as SVGSVGElement; - svg.removeEventListener('pointermove', this._handleSvgPointerMove, true); - document.removeEventListener('pointermove', this._handlePointerMove); - document.removeEventListener('pointerup', this._handlePointerUp); + private _initializeSvg(): void { + const svg = this._svgElement; + if (!svg || this._svgReady) { + return; + } + this._createBackdrop(); + this._createFrame(); + this._svgReady = true; + svg.addEventListener('pointermove', this._handleSvgPointerMove, true); + + if (this._pendingMaskHref) { + const pendingMask = this._pendingMaskHref; + this._pendingMaskHref = null; + this._createMask(pendingMask); + } + + this._render(); + } + + public override disconnectedCallback(): void { + super.disconnectedCallback(); + + const svg = this._svgElement; + svg?.removeEventListener('pointermove', this._handleSvgPointerMove, true); + document.removeEventListener('pointermove', this._handlePointerMove, true); + document.removeEventListener('pointerup', this._handlePointerUp, true); } -} -CropFrame.template = /* HTML */ ` `; + public override render(): TemplateResult { + return html``; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts b/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts index 77830d9e1..ff8045775 100644 --- a/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts @@ -1,4 +1,7 @@ -import { createSvgNode } from './crop-utils.js'; +import { html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { classMap } from 'lit/directives/class-map.js'; +import { ifDefined } from 'lit/directives/if-defined.js'; import { EditorButtonControl } from './EditorButtonControl.js'; import type { CropAspectRatio } from './types'; @@ -22,88 +25,88 @@ const getAdjustResolutions = (value: CropAspectRatio) => { }; export class EditorFreeformButtonControl extends EditorButtonControl { - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - this.$.icon = 'arrow-dropdown'; - this.$['on.click'] = this.handleClick.bind(this); + this.icon = 'arrow-dropdown'; - this.sub('*currentAspectRatio', (opt: CropAspectRatio) => { - this.$.title = opt.hasFreeform - ? this.l10n('freeform-crop') - : this.l10n('crop-to-shape', { value: `${opt.width}:${opt.height}` }); - - this.bindL10n('title-prop', () => this.$.title); + this.sub('*currentAspectRatio', (opt: CropAspectRatio | null) => { + const title = this._computeTitle(opt); + this.title = title; + this.titleProp = title; }); } - handleClick(): void { + public override onClick(): void { this.$['*showListAspectRatio'] = true; } -} -EditorFreeformButtonControl.template = /* html */ ` - -`; + private _computeTitle(aspectRatio: CropAspectRatio | null): string { + if (!aspectRatio) { + return ''; + } + return aspectRatio.hasFreeform + ? this.l10n('freeform-crop') + : this.l10n('crop-to-shape', { value: `${aspectRatio.width}:${aspectRatio.height}` }); + } -export interface EditorAspectRatioButtonControl { - get aspectRatio(): CropAspectRatio | undefined; - set aspectRatio(value: CropAspectRatio | undefined); + public override render() { + const clickHandler = this.onClick; + const title = this.title; + return html` + + `; + } } - -// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: This is intentional interface merging, used to add configuration setters/getters export class EditorAspectRatioButtonControl extends EditorButtonControl { - constructor() { - super(); + private _aspectRatio: CropAspectRatio | null = null; - this.init$ = { - ...this.init$, - active: false, - once: false, - }; + @property({ attribute: false }) + public get aspectRatio(): CropAspectRatio | null { + return this._aspectRatio; } - override initCallback(): void { - super.initCallback(); - this.defineAccessor('aspectRatio', (value: CropAspectRatio) => { - if (!value) return; - - const isFreeform = !!value.hasFreeform; - this.$.title = isFreeform ? this.l10n('custom') : `${value.width}:${value.height}`; - - if (!isFreeform) { - this._renderRectBasedOnAspectRatio(value); - } - - if (isFreeform) { - this.setAttribute('uc-aspect-ratio-freeform', ''); - } + public set aspectRatio(value: CropAspectRatio | null) { + if (this._aspectRatio === value) { + return; + } + const previous = this._aspectRatio; + this._aspectRatio = value; + this.requestUpdate('aspectRatio', previous); + if (value) { + this._updateAspectRatioPresentation(value); + } else { + this.removeAttribute('uc-aspect-ratio-freeform'); + this.title = ''; + this.titleProp = ''; + } + } - this._aspectRatio = value; + public override initCallback(): void { + super.initCallback(); - this.bindL10n('title-prop', () => { - return this.l10n('a11y-cloud-editor-apply-aspect-ratio', { - name: isFreeform - ? this.l10n('custom').toLowerCase() - : this.l10n('crop-to-shape', { value: `${value.width}:${value.height}` }).toLowerCase(), - value: '', - }); - }); - }); + if (this._aspectRatio) { + this._updateAspectRatioPresentation(this._aspectRatio); + } - this.sub('*currentAspectRatio', (opt: CropAspectRatio | undefined) => { - this.$.active = + this.sub('*currentAspectRatio', (opt: CropAspectRatio | null) => { + this.active = (opt && opt.id === this._aspectRatio?.id) || (opt?.width === this._aspectRatio?.width && opt?.height === this._aspectRatio?.height); }); - - this.$['on.click'] = this.handleClick.bind(this); } - handleClick(): void { + protected override onClick(): void { const currentAspectRatio = this.$['*currentAspectRatio'] as CropAspectRatio | undefined; if (currentAspectRatio?.id === this._aspectRatio?.id) { return; @@ -112,28 +115,83 @@ export class EditorAspectRatioButtonControl extends EditorButtonControl { this.$['*currentAspectRatio'] = this._aspectRatio; } - private _renderRectBasedOnAspectRatio(value: CropAspectRatio): void { - const { width, height } = getAdjustResolutions(value); - - const rect = createSvgNode('rect', { - 'stroke-linejoin': 'round', - fill: 'none', - stroke: 'currentColor', - 'stroke-width': 1.2, - 'fill-rule': 'evenodd', - x: (SIZE_SVG_WRAPPER - width) / 2, - y: (SIZE_SVG_WRAPPER - height) / 2, - rx: 2, - width, - height, - }); + private _updateAspectRatioPresentation(value: CropAspectRatio): void { + const isFreeform = !!value.hasFreeform; + this.toggleAttribute('uc-aspect-ratio-freeform', isFreeform); + + const resolveTitle = () => { + const titleText = isFreeform ? this.l10n('custom') : `${value.width}:${value.height}`; + this.title = titleText; + return titleText; + }; + + const resolveTitleProp = () => { + const label = this.l10n('a11y-cloud-editor-apply-aspect-ratio', { + name: isFreeform + ? this.l10n('custom').toLowerCase() + : this.l10n('crop-to-shape', { value: `${value.width}:${value.height}` }).toLowerCase(), + value: '', + }); + this.titleProp = label; + return label; + }; + + resolveTitle(); + resolveTitleProp(); + + if (!isFreeform) { + this.requestUpdate(); + } + } - const svgEl = this.ref['icon-el']?.ref?.svg; + private _renderIcon() { + const ratio = this._aspectRatio; + if (!ratio || ratio.hasFreeform) { + return html``; + } - if (!svgEl) return; - svgEl.innerHTML = ''; - svgEl.appendChild(rect); + const { width, height } = getAdjustResolutions(ratio); + const x = (SIZE_SVG_WRAPPER - width) / 2; + const y = (SIZE_SVG_WRAPPER - height) / 2; + + return html` + + + + `; } - private _aspectRatio?: CropAspectRatio; + public override render() { + const clickHandler = this.onClick; + const title = this.title; + return html` + + `; + } } diff --git a/src/blocks/CloudImageEditor/src/EditorButtonControl.ts b/src/blocks/CloudImageEditor/src/EditorButtonControl.ts index 3e55d9743..2384e00db 100644 --- a/src/blocks/CloudImageEditor/src/EditorButtonControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorButtonControl.ts @@ -1,56 +1,68 @@ -import { Block } from '../../../abstract/Block'; -import { classNames } from './lib/classNames.js'; - -interface EditorButtonControlInitState { - active: boolean; - title: string; - icon: string; - 'on.click': ((event: MouseEvent) => unknown) | null; - 'title-prop': string; -} +import type { PropertyValues } from 'lit'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; +import { ifDefined } from 'lit/directives/if-defined.js'; +import { LitBlock } from '../../../lit/LitBlock'; + +export class EditorButtonControl extends LitBlock { + // This is public because it's used in the updated lifecycle to assign to the shared state. + @state() + public active = false; + + // TODO: Rename title since it conflicts with HTMLElement.title + @state() + public override title = ''; + + @state() + protected icon = ''; -export class EditorButtonControl extends Block { - private _titleEl?: HTMLElement; - - constructor() { - super(); - this.init$ = { - ...this.init$, - active: false, - title: '', - icon: '', - 'on.click': null, - 'title-prop': '', - } as EditorButtonControlInitState; + @state() + protected titleProp = ''; + + protected get buttonClasses(): Record { + const isActive = this.active; + return { + 'uc-active': isActive, + 'uc-not_active': !isActive, + }; } - override initCallback(): void { - super.initCallback(); - - this._titleEl = this.ref['title-el'] as HTMLElement | undefined; - this.sub('title', (title: string) => { - const titleEl = this._titleEl; - if (titleEl) { - titleEl.style.display = title ? 'block' : 'none'; - } - }); - - this.sub('active', (active: boolean) => { - this.className = classNames({ - 'uc-active': active, - 'uc-not_active': !active, - }); - }); - - this.sub('on.click', (onClick: ((event: MouseEvent) => unknown) | null) => { - this.onclick = onClick ?? null; - }); + private _updateHostStateClasses(): void { + const classes = this.buttonClasses; + for (const [className, enabled] of Object.entries(classes)) { + this.classList.toggle(className, enabled); + } } -} -EditorButtonControl.template = /* HTML */ ` - -`; + protected onClick(_event: MouseEvent): void {} + + public override connectedCallback(): void { + super.connectedCallback(); + this._updateHostStateClasses(); + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + if (changedProperties.has('active')) { + this._updateHostStateClasses(); + } + } + + public override render() { + const clickHandler = this.onClick; + const title = this.title; + + return html` + + `; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorCropButtonControl.ts b/src/blocks/CloudImageEditor/src/EditorCropButtonControl.ts index c61694242..43cc7f88d 100644 --- a/src/blocks/CloudImageEditor/src/EditorCropButtonControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorCropButtonControl.ts @@ -1,3 +1,5 @@ +import type { PropertyValues } from 'lit'; +import { property } from 'lit/decorators.js'; import { EditorButtonControl } from './EditorButtonControl.js'; import type { EditorImageCropper } from './EditorImageCropper.js'; import type { CropOperation } from './toolbar-constants'; @@ -19,49 +21,39 @@ function nextValue(operation: CropOperation, prev: number | boolean): number | b throw new Error(`Unsupported operation: ${operation}`); } -export interface EditorCropButtonControl { - get operation(): CropOperation | undefined; - set operation(value: CropOperation | undefined); -} - -// biome-ignore lint/suspicious/noUnsafeDeclarationMerging: This is intentional interface merging, used to add configuration setters/getters export class EditorCropButtonControl extends EditorButtonControl { - private _operation: CropOperation | undefined = undefined; - - override initCallback(): void { - super.initCallback(); + @property({ type: String }) + public operation: CropOperation | undefined = undefined; - this.defineAccessor('operation', (operation?: CropOperation) => { - if (!operation) { - return; - } + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); - this._operation = operation; - this.$.icon = operation; - - this.bindL10n('title-prop', () => - this.l10n('a11y-cloud-editor-apply-crop', { - name: this.l10n(operation).toLowerCase(), - }), - ); - }); + if (this.operation) { + this.titleProp = this.l10n('a11y-cloud-editor-apply-crop', { + name: this.l10n(this.operation).toLowerCase(), + }); + this.icon = this.operation; + } else { + this.icon = ''; + this.titleProp = ''; + } + } - this.$['on.click'] = (e: MouseEvent) => { - if (!this._operation) { - return; - } + protected override onClick(e: MouseEvent) { + if (!this.operation) { + return; + } - const cropper = this.$['*cropperEl'] as EditorImageCropper; - const prev = cropper.getValue(this._operation); - const next = nextValue(this._operation, prev); + const cropper = this.$['*cropperEl'] as EditorImageCropper; + const prev = cropper.getValue(this.operation); + const next = nextValue(this.operation, prev); - this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { - operation: this._operation, - next, - prev, - }); + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + operation: this.operation, + next, + prev, + }); - cropper.setValue(this._operation, next); - }; + cropper.setValue(this.operation, next); } } diff --git a/src/blocks/CloudImageEditor/src/EditorFilterControl.ts b/src/blocks/CloudImageEditor/src/EditorFilterControl.ts index c2a1a3b46..973b7b504 100644 --- a/src/blocks/CloudImageEditor/src/EditorFilterControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorFilterControl.ts @@ -1,3 +1,8 @@ +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { classMap } from 'lit/directives/class-map.js'; +import { ifDefined } from 'lit/directives/if-defined.js'; +import { styleMap } from 'lit/directives/style-map.js'; import { createCdnUrl, createCdnUrlModifiers } from '../../../utils/cdn-utils.js'; import { preloadImage } from '../../../utils/preloadImage.js'; import { EditorButtonControl } from './EditorButtonControl.js'; @@ -12,23 +17,64 @@ export class EditorFilterControl extends EditorButtonControl { private _originalUrl = ''; private _observer?: IntersectionObserver; private _cancelPreload?: () => void; + private _lastPreviewRequestId = 0; + private _previewVisibilityCheckRaf?: number; + private _previewVisibilityCheckTimeout?: number; - constructor() { - super(); - - this.init$ = { - ...this.init$, - active: false, - title: '', - icon: '', - isOriginal: false, - iconSize: '20', - 'on.click': null, - }; + @state() + private _previewImage: string | null = null; + + @state() + private _previewLoaded = false; + + // This is public because it's used in the updated lifecycle to assign to the shared state. + @state() + public isOriginal = false; + + @state() + private _iconSize = 20; + + @property({ type: String }) + public get filter(): string { + return this._filter; + } + + public set filter(value: string) { + const nextFilter = value ?? ''; + if (this._filter === nextFilter) { + return; + } + const previousValue = this._filter; + this._filter = nextFilter; + this._operation = 'filter'; + this.isOriginal = nextFilter === FAKE_ORIGINAL_FILTER; + this.icon = this.isOriginal ? 'original' : 'slider'; + this._iconSize = this.isOriginal ? 40 : 20; + this.requestUpdate('filter', previousValue); + this._updateFilterLabels(nextFilter); + } + + public override onClick(e: MouseEvent) { + if (!this.active) { + const slider = this.$['*sliderEl'] as { setOperation: (op: string, filter: string) => void; apply: () => void }; + slider.setOperation(this._operation, this._filter); + slider.apply(); + } else if (!this.isOriginal) { + const slider = this.$['*sliderEl'] as { setOperation: (op: string, filter: string) => void }; + slider.setOperation(this._operation, this._filter); + this.$['*showSlider'] = true; + } + + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + operation: parseFilterValue(this.$['*operationTooltip']), + }); + + this.$['*currentFilter'] = this._filter; } private _previewSrc(): string { - const previewSize = parseInt(window.getComputedStyle(this).getPropertyValue('--l-base-min-width'), 10); + const cssSize = parseInt(window.getComputedStyle(this).getPropertyValue('--l-base-min-width'), 10); + const previewSize = Number.isFinite(cssSize) && cssSize > 0 ? cssSize : this._iconSize || 32; const dpr = window.devicePixelRatio; const size = Math.ceil(dpr * previewSize); const quality = dpr >= 2 ? 'lightest' : 'normal'; @@ -43,7 +89,6 @@ export class EditorFilterControl extends EditorButtonControl { amount: filterValue, } : undefined; - return createCdnUrl( this._originalUrl, createCdnUrlModifiers( @@ -58,119 +103,218 @@ export class EditorFilterControl extends EditorButtonControl { private async _observerCallback(entries: IntersectionObserverEntry[], observer: IntersectionObserver): Promise { const intersectionEntry = entries[0]; if (intersectionEntry?.isIntersecting) { - const src = await this.proxyUrl(this._previewSrc()); - const previewEl = this.ref['preview-el'] as HTMLElement; - const { promise, cancel } = preloadImage(src); - this._cancelPreload = cancel; - promise - .catch((err) => { - this.$['*networkProblems'] = true; - console.error('Failed to load image', { error: err }); - }) - .finally(() => { - previewEl.style.backgroundImage = `url(${src})`; - previewEl.setAttribute('loaded', ''); - - observer.unobserve(this); - }); + await this._loadPreview(observer); } else { this._cancelPreload?.(); } } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - this.$['on.click'] = (e: MouseEvent) => { - if (!this.$.active) { - const slider = this.$['*sliderEl'] as { setOperation: (op: string, filter: string) => void; apply: () => void }; - slider.setOperation(this._operation, this._filter); - slider.apply(); - } else if (!this.$.isOriginal) { - const slider = this.$['*sliderEl'] as { setOperation: (op: string, filter: string) => void }; - slider.setOperation(this._operation, this._filter); - this.$['*showSlider'] = true; + if ('IntersectionObserver' in window) { + this._observer = new window.IntersectionObserver(this._observerCallback.bind(this), { + threshold: [0, 1], + }); + } + + const originalUrl = this.$['*originalUrl'] as string; + this._originalUrl = originalUrl ?? ''; + + this.sub('*originalUrl', (nextUrl: string | null) => { + this._originalUrl = nextUrl ?? ''; + if (!this.isOriginal && this._originalUrl && this.isConnected && !this._previewImage) { + this._observer?.observe(this); + this._schedulePreviewVisibilityCheck(); } + }); - this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { - operation: parseFilterValue(this.$['*operationTooltip']), - }); + if (!this.isOriginal) { + this._observer?.observe(this); + this._schedulePreviewVisibilityCheck(); + } - this.$['*currentFilter'] = this._filter; - }; + if (this._filter) { + this._updateFilterLabels(this._filter); + } - this.defineAccessor('filter', (filter: string) => { - this._operation = 'filter'; - this._filter = filter; - this.$.isOriginal = filter === FAKE_ORIGINAL_FILTER; - this.$.icon = this.$.isOriginal ? 'original' : 'slider'; - - this.bindL10n('title-prop', () => - this.l10n('a11y-cloud-editor-apply-filter', { - name: filter.toLowerCase(), - }), - ); + this.sub('*currentFilter', (currentFilter: string) => { + this.active = !!(currentFilter && currentFilter === this._filter); }); - this._observer = new window.IntersectionObserver(this._observerCallback.bind(this), { - threshold: [0, 1], + this.sub('*networkProblems', async (networkProblems: boolean) => { + if (networkProblems) { + return; + } + if (this._previewImage) { + await this._loadPreview(); + } else { + this._schedulePreviewVisibilityCheck(); + } }); + } - const originalUrl = this.$['*originalUrl'] as string; - this._originalUrl = originalUrl; + public override disconnectedCallback(): void { + super.disconnectedCallback(); + this._observer?.disconnect(); + this._cancelPreload?.(); + this._clearPreviewVisibilityChecks(); + } - if (this.$.isOriginal) { - const iconEl = this.ref['icon-el'] as HTMLElement; - iconEl.classList.add('uc-original-icon'); - } else { - this._observer.observe(this); + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + + if (changedProperties.has('isOriginal')) { + if (this.isOriginal) { + this._observer?.unobserve(this); + } else { + this._observer?.observe(this); + this._schedulePreviewVisibilityCheck(); + } } + } - this.sub('*currentFilter', (currentFilter: string) => { - this.$.active = currentFilter && currentFilter === this._filter; - }); + private _updateFilterLabels(filterName: string): void { + if (!filterName) { + this.titleProp = ''; + return; + } - this.sub('isOriginal', (isOriginal: boolean) => { - this.$.iconSize = isOriginal ? 40 : 20; + const label = this.l10n('a11y-cloud-editor-apply-filter', { + name: filterName.toLowerCase(), }); + this.titleProp = label; + } + + private async _loadPreview(observer?: IntersectionObserver): Promise { + if (!this.isConnected) { + observer?.unobserve(this); + this._cancelPreload?.(); + this._cancelPreload = undefined; + return; + } - this.sub('active', (active: boolean) => { - if (this.$.isOriginal) { + if (!this._originalUrl) { + if (!this._previewVisibilityCheckTimeout && !this._previewVisibilityCheckRaf) { + this._schedulePreviewVisibilityCheck(); + } + return; + } + const requestId = ++this._lastPreviewRequestId; + let src = ''; + try { + src = await this.proxyUrl(this._previewSrc()); + } catch (err) { + this.$['*networkProblems'] = true; + console.error('Failed to resolve preview URL', { error: err }); + return; + } + + this._previewLoaded = false; + this._cancelPreload?.(); + const { promise, cancel } = preloadImage(src); + this._cancelPreload = () => { + cancel(); + if (this._lastPreviewRequestId === requestId) { + this._cancelPreload = undefined; + } + }; + + try { + await promise; + if (this._lastPreviewRequestId !== requestId || !this.isConnected) { return; } - const iconEl = this.ref['icon-el'] as HTMLElement; - iconEl.style.opacity = active ? '1' : '0'; - - const previewEl = this.ref['preview-el'] as HTMLElement; - if (active) { - previewEl.style.opacity = '0'; - } else if (previewEl.style.backgroundImage) { - previewEl.style.opacity = '1'; + this._previewImage = src; + this._previewLoaded = true; + this._clearPreviewVisibilityChecks(); + (observer ?? this._observer)?.unobserve(this); + } catch (err) { + this.$['*networkProblems'] = true; + console.error('Failed to load image', { error: err }); + this._schedulePreviewVisibilityCheck(); + } finally { + if (this._lastPreviewRequestId === requestId) { + this._cancelPreload = undefined; } - }); + } + } - this.sub('*networkProblems', async (networkProblems: boolean) => { - if (!networkProblems) { - const src = await this.proxyUrl(this._previewSrc()); - const previewEl = this.ref['preview-el'] as HTMLElement; - if (previewEl.style.backgroundImage) { - previewEl.style.backgroundImage = 'none'; - previewEl.style.backgroundImage = `url(${src})`; - } + private _schedulePreviewVisibilityCheck(): void { + if (!this.isConnected || this._previewImage || this._previewLoaded || this.isOriginal) { + this._clearPreviewVisibilityChecks(); + return; + } + if (this._previewVisibilityCheckRaf) { + cancelAnimationFrame(this._previewVisibilityCheckRaf); + } + this._previewVisibilityCheckRaf = requestAnimationFrame(() => { + this._previewVisibilityCheckRaf = undefined; + if (!this.isConnected || this._previewImage || this._previewLoaded || this.isOriginal) { + this._clearPreviewVisibilityChecks(); + return; + } + const rect = this.getBoundingClientRect(); + const hasSize = rect.width > 0 && rect.height > 0; + const viewportWidth = window.innerWidth || document.documentElement.clientWidth; + const viewportHeight = window.innerHeight || document.documentElement.clientHeight; + const isVisible = + hasSize && rect.bottom > 0 && rect.right > 0 && rect.top < viewportHeight && rect.left < viewportWidth; + if (isVisible) { + void this._loadPreview(); + return; } + this._previewVisibilityCheckTimeout = window.setTimeout(() => { + this._previewVisibilityCheckTimeout = undefined; + this._schedulePreviewVisibilityCheck(); + }, 500); }); } - override destroyCallback(): void { - super.destroyCallback(); - this._observer?.disconnect(); - this._cancelPreload?.(); + private _clearPreviewVisibilityChecks(): void { + if (this._previewVisibilityCheckRaf) { + cancelAnimationFrame(this._previewVisibilityCheckRaf); + this._previewVisibilityCheckRaf = undefined; + } + if (this._previewVisibilityCheckTimeout) { + window.clearTimeout(this._previewVisibilityCheckTimeout); + this._previewVisibilityCheckTimeout = undefined; + } } -} -EditorFilterControl.template = /* HTML */ ` - -`; + private get _shouldShowPreview(): boolean { + return Boolean(this._previewLoaded && !this.active && !this.isOriginal); + } + + public override render() { + const clickHandler = this.onClick; + const previewStyles: Record = { + opacity: this._shouldShowPreview ? '1' : '0', + }; + if (this._previewImage) { + previewStyles.backgroundImage = `url(${this._previewImage})`; + } + + const iconStyles = { + opacity: this._shouldShowPreview ? '0' : '1', + }; + + return html` + + `; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorImageCropper.ts b/src/blocks/CloudImageEditor/src/EditorImageCropper.ts index 6fd709e42..bd600ef6c 100644 --- a/src/blocks/CloudImageEditor/src/EditorImageCropper.ts +++ b/src/blocks/CloudImageEditor/src/EditorImageCropper.ts @@ -1,7 +1,12 @@ -import { Block } from '../../../abstract/Block'; +import type { PropertyValues, TemplateResult } from 'lit'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { LitBlock } from '../../../lit/LitBlock'; import { debounce } from '../../../utils/debounce.js'; import { preloadImage } from '../../../utils/preloadImage.js'; import { throttle } from '../../../utils/throttle.js'; +import type { CropFrame } from './CropFrame'; import { clamp, constraintRect, @@ -36,8 +41,8 @@ function validateCrop(crop: Transformations['crop']): boolean { return shouldMatch.every((matcher) => matcher(crop)); } -export class EditorImageCropper extends Block { - override ctxOwner = true; +export class EditorImageCropper extends LitBlock { + public override ctxOwner = true; private _commitDebounced: ReturnType; private _handleResizeThrottled: ReturnType; @@ -46,14 +51,17 @@ export class EditorImageCropper extends Block { private _ctx: CanvasRenderingContext2D | null = null; private _isActive = false; private _observer?: ResizeObserver; + @state() + private _image: HTMLImageElement | null = null; private _cancelPreload?: () => void; + private readonly _canvasRef = createRef(); + private readonly _frameRef = createRef(); - constructor() { + public constructor() { super(); this.init$ = { ...this.init$, - image: null, '*padding': CROP_PADDING, '*operations': { rotate: 0, @@ -76,18 +84,21 @@ export class EditorImageCropper extends Block { this._commitDebounced = debounce(this._commit.bind(this), 300); - this._handleResizeThrottled = throttle(this._handleResize.bind(this), 100); + this._handleResizeThrottled = throttle(() => { + if (!this.isConnected || !this._isActive) { + return; + } + this._initCanvas(); + this._syncTransformations(); + this._alignImage(); + this._alignCrop(); + this._draw(); + }, 100); } - private _handleResize(): void { - if (!this.isConnected || !this._isActive) { - return; - } + protected override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); this._initCanvas(); - this._syncTransformations(); - this._alignImage(); - this._alignCrop(); - this._draw(); } private _syncTransformations(): void { @@ -101,7 +112,10 @@ export class EditorImageCropper extends Block { } private _initCanvas(): void { - const canvas = this.ref['canvas-el'] as HTMLCanvasElement; + const canvas = this._canvasRef.value; + if (!canvas) { + return; + } const ctx = canvas.getContext('2d'); const width = this.offsetWidth; @@ -118,11 +132,11 @@ export class EditorImageCropper extends Block { } private _alignImage(): void { - if (!this._isActive || !this.$.image) { + if (!this._isActive || !this._image) { return; } - const image = this.$.image as HTMLImageElement; + const image = this._image; const padding = this.$['*padding'] as number; const operations = this.$['*operations'] as Operations; const { rotate } = operations; @@ -215,7 +229,10 @@ export class EditorImageCropper extends Block { private _drawImage(): void { const ctx = this._ctx; if (!ctx) return; - const image = this.$.image as HTMLImageElement; + const image = this._image; + if (!image) { + return; + } const imageBox = this.$['*imageBox'] as Rectangle; const operations = this.$['*operations'] as Operations; const { mirror, flip, rotate } = operations; @@ -229,7 +246,7 @@ export class EditorImageCropper extends Block { } private _draw(): void { - if (!this._isActive || !this.$.image || !this._canvas || !this._ctx) { + if (!this._isActive || !this._image || !this._canvas || !this._ctx) { return; } const canvas = this._canvas; @@ -241,8 +258,8 @@ export class EditorImageCropper extends Block { } private _animateIn({ fromViewer }: { fromViewer?: boolean }): void { - if (this.$.image) { - this.ref['frame-el'].toggleThumbs(true); + if (this._image) { + this._frameRef.value?.toggleThumbs(true); this._transitionToImage(); setTimeout(() => { this.className = classNames({ @@ -324,7 +341,7 @@ export class EditorImageCropper extends Block { this.$['*editorTransformations'] = transformations; } - setValue(operation: K, value: Operations[K]): void { + public setValue(operation: K, value: Operations[K]): void { this.$['*operations'] = { ...this.$['*operations'], [operation]: value, @@ -339,23 +356,26 @@ export class EditorImageCropper extends Block { this._draw(); } - getValue(operation: K): Operations[K] { + public getValue(operation: K): Operations[K] { return this.$['*operations'][operation]; } - async activate(imageSize: ImageSize, { fromViewer }: { fromViewer?: boolean } = {}): Promise { + public async activate(imageSize: ImageSize, { fromViewer }: { fromViewer?: boolean } = {}): Promise { if (this._isActive) { return; } this._isActive = true; + await this.updateComplete; + this._initCanvas(); this._imageSize = imageSize; this.removeEventListener('transitionend', this._reset); try { const originalUrl = this.$['*originalUrl'] as string; const transformations = this.$['*editorTransformations'] as Transformations; - this.$.image = await this._waitForImage(originalUrl, transformations); + this._image = await this._waitForImage(originalUrl, transformations); this._syncTransformations(); + this._handleResizeThrottled(); this._animateIn({ fromViewer }); } catch (err) { console.error('Failed to activate cropper', { error: err }); @@ -368,13 +388,13 @@ export class EditorImageCropper extends Block { return; } const nonZeroSize = entry.contentRect.width > 0 && entry.contentRect.height > 0; - if (nonZeroSize && this._isActive && this.$.image) { + if (nonZeroSize && this._isActive && this._image) { this._handleResizeThrottled(); } }); this._observer.observe(this); } - deactivate({ reset = false }: { reset?: boolean } = {}): void { + public deactivate({ reset = false }: { reset?: boolean } = {}): void { if (!this._isActive) { return; } @@ -389,7 +409,7 @@ export class EditorImageCropper extends Block { 'uc-inactive_to_editor': true, }); - this.ref['frame-el'].toggleThumbs(false); + this._frameRef.value?.toggleThumbs(false); this.addEventListener('transitionend', this._reset, { once: true }); this._observer?.disconnect(); } @@ -419,10 +439,9 @@ export class EditorImageCropper extends Block { } private _reset(): void { - if (this._isActive) { - return; + if (!this._isActive) { + this._image = null; } - this.$.image = null; } private async _waitForImage(originalUrl: string, transformations: Transformations): Promise { @@ -475,7 +494,7 @@ export class EditorImageCropper extends Block { }; } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.sub('*imageBox', () => { @@ -483,7 +502,7 @@ export class EditorImageCropper extends Block { }); this.sub('*cropBox', () => { - if (this.$.image) { + if (this._image) { this._commitDebounced(); } }); @@ -495,7 +514,7 @@ export class EditorImageCropper extends Block { setTimeout(() => { this.sub('*networkProblems', (networkProblems: boolean) => { if (!networkProblems) { - if (this._isActive) { + if (this._isActive && this._imageSize) { void this.activate(this._imageSize, { fromViewer: false }); } } @@ -503,13 +522,18 @@ export class EditorImageCropper extends Block { }, 0); } - override destroyCallback(): void { - super.destroyCallback(); + public override disconnectedCallback(): void { + super.disconnectedCallback(); this._observer?.disconnect(); + if (this._image) { + this._image = null; + } } -} -EditorImageCropper.template = /* HTML */ ` - - -`; + public override render(): TemplateResult { + return html` + + + `; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorImageFader.ts b/src/blocks/CloudImageEditor/src/EditorImageFader.ts index f0edaf80e..a566826fc 100644 --- a/src/blocks/CloudImageEditor/src/EditorImageFader.ts +++ b/src/blocks/CloudImageEditor/src/EditorImageFader.ts @@ -1,4 +1,7 @@ -import { Block } from '../../../abstract/Block'; +import type { TemplateResult } from 'lit'; +import { html } from 'lit'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { LitBlock } from '../../../lit/LitBlock'; import { debounce } from '../../../utils/debounce.js'; import { batchPreloadImages } from '../../../utils/preloadImage.js'; import { classNames } from './lib/classNames.js'; @@ -24,6 +27,14 @@ type ImageSrcOptions = { value?: number; }; +type DebouncedKeypointHandler = (( + operation: OperationKey, + filter: string | undefined, + value: number, +) => Promise) & { + cancel: () => void; +}; + function isOperationKey(value: unknown): value is OperationKey { return typeof value === 'string' && value in COLOR_OPERATIONS_CONFIG; } @@ -73,7 +84,7 @@ function keypointsRange(operation: OperationKey, value: number): number[] { ); } -export class EditorImageFader extends Block { +export class EditorImageFader extends LitBlock { private _isActive = false; private _hidden = true; private _operation: OperationKey | 'initial' = 'initial'; @@ -81,19 +92,72 @@ export class EditorImageFader extends Block { private _value?: number; private _transformations: Transformations = {}; private _keypoints: Keypoint[] = []; - private _container?: HTMLDivElement; private _previewImage?: HTMLImageElement; private _cancelLastImages?: () => void; private _cancelBatchPreload?: () => void; private _url?: string; private _fromViewer?: boolean; private _raf = 0; - private _addKeypointDebounced = debounce(this._addKeypoint.bind(this), 600); + private _addKeypointDebounced!: DebouncedKeypointHandler; + private readonly _previewHostRef = createRef(); + private readonly _layersHostRef = createRef(); - constructor() { + public constructor() { super(); this.classList.add('uc-inactive_to_cropper'); + this._addKeypointDebounced = debounce(async (operation, filter, value) => { + const shouldSkip = () => + !this._isSame(operation, filter) || this._value !== value || !!this._keypoints.find((kp) => kp.value === value); + + if (shouldSkip()) { + return; + } + const keypoint = await this._constructKeypoint(operation, value); + const image = new Image(); + image.src = keypoint.src; + const stop = this._handleImageLoading(keypoint.src); + image.addEventListener('load', stop, { once: true }); + image.addEventListener('error', stop, { once: true }); + keypoint.image = image; + image.classList.add('uc-fader-image'); + + image.addEventListener( + 'load', + () => { + if (shouldSkip()) { + return; + } + const keypoints = this._keypoints; + let insertIndex = keypoints.findIndex((kp) => kp.value > value); + if (insertIndex === -1) { + insertIndex = keypoints.length; + } + const nextKeypoint = keypoints[insertIndex]; + const insertBeforeNode = nextKeypoint?.image; + const container = this._layersHostRef.value; + if (!container || (insertBeforeNode && !container.contains(insertBeforeNode))) { + return; + } + keypoints.splice(insertIndex, 0, keypoint); + if (insertBeforeNode) { + container.insertBefore(image, insertBeforeNode); + } else { + container.appendChild(image); + } + this._update(operation, value); + }, + { once: true }, + ); + + image.addEventListener( + 'error', + () => { + this.$['*networkProblems'] = true; + }, + { once: true }, + ); + }, 600); } private _handleImageLoading(src: string): () => void { @@ -176,56 +240,7 @@ export class EditorImageFader extends Block { return this._operation === operation && this._filter === filter; } - private async _addKeypoint(operation: OperationKey, filter: string | undefined, value: number): Promise { - const shouldSkip = () => - !this._isSame(operation, filter) || this._value !== value || !!this._keypoints.find((kp) => kp.value === value); - - if (shouldSkip()) { - return; - } - const keypoint = await this._constructKeypoint(operation, value); - const image = new Image(); - image.src = keypoint.src; - const stop = this._handleImageLoading(keypoint.src); - image.addEventListener('load', stop, { once: true }); - image.addEventListener('error', stop, { once: true }); - keypoint.image = image; - image.classList.add('uc-fader-image'); - - image.addEventListener( - 'load', - () => { - if (shouldSkip()) { - return; - } - const keypoints = this._keypoints; - let insertIndex = keypoints.findIndex((kp) => kp.value > value); - if (insertIndex === -1) { - insertIndex = keypoints.length; - } - const nextKeypoint = keypoints[insertIndex]; - const insertBeforeNode = nextKeypoint?.image; - const container = this._container; - if (!container || (insertBeforeNode && !container.contains(insertBeforeNode))) { - return; - } - keypoints.splice(insertIndex, 0, keypoint); - insertBeforeNode && container.insertBefore(image, insertBeforeNode); - this._update(operation, value); - }, - { once: true }, - ); - - image.addEventListener( - 'error', - () => { - this.$['*networkProblems'] = true; - }, - { once: true }, - ); - } - - set(value: string | number): void { + public set(value: string | number): void { const numericValue = typeof value === 'string' ? parseInt(value, 10) : value; if (!isOperationKey(this._operation) || !Number.isFinite(numericValue)) { return; @@ -266,16 +281,12 @@ export class EditorImageFader extends Block { } private async _initNodes(): Promise { - const fr = document.createDocumentFragment(); this._previewImage = this._previewImage || this._createPreviewImage(); const previewImage = this._previewImage; - if (!this.contains(previewImage)) { - fr.appendChild(previewImage); + if (previewImage) { + this._ensurePreviewAttached(previewImage); } - const container = document.createElement('div'); - fr.appendChild(container); - const srcList = this._keypoints.map((kp) => kp.src); const { images, promise, cancel } = batchPreloadImages(srcList); @@ -292,8 +303,11 @@ export class EditorImageFader extends Block { const filter = this._filter; await promise; if (this._isActive && this._isSame(operation, filter)) { - this._container?.remove(); - this._container = container; + const host = this._layersHostRef.value; + if (!host) { + return; + } + host.replaceChildren(); this._keypoints.forEach((kp, idx) => { const kpImage = images[idx]; if (!kpImage) { @@ -301,14 +315,13 @@ export class EditorImageFader extends Block { } kpImage.classList.add('uc-fader-image'); kp.image = kpImage; - this._container?.appendChild(kpImage); + host.appendChild(kpImage); }); - this.appendChild(fr); this._flush(); } } - async setTransformations(transformations: Transformations): Promise { + public async setTransformations(transformations: Transformations): Promise { this._transformations = transformations; if (this._previewImage) { const src = await this._imageSrc(); @@ -328,7 +341,7 @@ export class EditorImageFader extends Block { } } - async preload({ + public async preload({ url, filter, operation, @@ -353,9 +366,7 @@ export class EditorImageFader extends Block { private _setOriginalSrc(src: string): void { const image = this._previewImage || this._createPreviewImage(); - if (!this.contains(image)) { - this.appendChild(image); - } + this._ensurePreviewAttached(image); this._previewImage = image; if (image.src === src) { @@ -399,7 +410,7 @@ export class EditorImageFader extends Block { ); } - async activate({ + public async activate({ url, operation, value, @@ -414,6 +425,7 @@ export class EditorImageFader extends Block { }): Promise { this._isActive = true; this._hidden = false; + await this.updateComplete; this._url = url; this._operation = operation ?? 'initial'; this._value = value; @@ -424,7 +436,7 @@ export class EditorImageFader extends Block { if (isOriginal) { const src = await this._imageSrc({ operation, value }); this._setOriginalSrc(src); - this._container?.remove(); + this._clearLayersHost(); return; } if (!operation || typeof value !== 'number') { @@ -438,7 +450,7 @@ export class EditorImageFader extends Block { this._initNodes(); } - deactivate({ hide = true }: { hide?: boolean } = {}): void { + public deactivate({ hide = true }: { hide?: boolean } = {}): void { this._isActive = false; this._cancelLastImages?.(); @@ -458,12 +470,33 @@ export class EditorImageFader extends Block { this.addEventListener( 'transitionend', () => { - this._container?.remove(); + this._clearLayersHost(); }, { once: true }, ); } else { - this._container?.remove(); + this._clearLayersHost(); } } + + private _ensurePreviewAttached(image: HTMLImageElement): void { + const host = this._previewHostRef.value; + if (!host) { + return; + } + if (!host.contains(image)) { + host.appendChild(image); + } + } + + private _clearLayersHost(): void { + this._layersHostRef.value?.replaceChildren(); + } + + public override render(): TemplateResult { + return html` +
+
+ `; + } } diff --git a/src/blocks/CloudImageEditor/src/EditorOperationControl.ts b/src/blocks/CloudImageEditor/src/EditorOperationControl.ts index 0798f502a..3e0dfddeb 100644 --- a/src/blocks/CloudImageEditor/src/EditorOperationControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorOperationControl.ts @@ -1,3 +1,4 @@ +import { property } from 'lit/decorators.js'; import { EditorButtonControl } from './EditorButtonControl.js'; import type { ColorOperation } from './toolbar-constants'; import { COLOR_OPERATIONS_CONFIG } from './toolbar-constants.js'; @@ -7,32 +8,51 @@ import { parseFilterValue } from './utils/parseFilterValue.js'; export class EditorOperationControl extends EditorButtonControl { private _operation: ColorOperation | '' = ''; - override initCallback(): void { - super.initCallback(); + @property({ type: String }) + public get operation(): ColorOperation | '' { + return this._operation; + } + + public set operation(value: ColorOperation | '') { + const normalizedValue = value ?? ''; + if (this._operation === normalizedValue) { + return; + } + const previousValue = this._operation; + this._operation = normalizedValue; + this.requestUpdate('operation', previousValue); + if (normalizedValue) { + this._updateOperationMetadata(normalizedValue as ColorOperation); + } + } - this.$['on.click'] = (e: MouseEvent) => { - const slider = this.$['*sliderEl'] as { setOperation: (operation: ColorOperation | '') => void }; - slider.setOperation(this._operation); - this.$['*showSlider'] = true; - this.$['*currentOperation'] = this._operation; + private _updateOperationMetadata(operation: ColorOperation): void { + this.icon = operation; - this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { - operation: parseFilterValue(this.$['*operationTooltip']), + const resolveTitleProp = () => { + const label = this.l10n('a11y-cloud-editor-apply-tuning', { + name: this.l10n(operation).toLowerCase(), }); + this.titleProp = label; + return label; }; - this.defineAccessor('operation', (operation: ColorOperation) => { - if (operation) { - this._operation = operation; - this.$.icon = operation; - this.bindL10n('title-prop', () => - this.l10n('a11y-cloud-editor-apply-tuning', { - name: this.l10n(operation).toLowerCase(), - }), - ); - this.bindL10n('title', () => this.l10n(operation)); - } - }); + const resolveTitle = () => { + const titleText = this.l10n(operation); + this.title = titleText; + return titleText; + }; + + resolveTitleProp(); + resolveTitle(); + } + + public override initCallback(): void { + super.initCallback(); + + if (this._operation) { + this._updateOperationMetadata(this._operation as ColorOperation); + } this.sub('*editorTransformations', (editorTransformations: Transformations) => { if (!this._operation) { @@ -42,7 +62,17 @@ export class EditorOperationControl extends EditorButtonControl { const { zero } = COLOR_OPERATIONS_CONFIG[this._operation]; const value = editorTransformations[this._operation]; const isActive = typeof value !== 'undefined' ? value !== zero : false; - this.$.active = isActive; + this.active = isActive; + }); + } + protected override onClick(e: MouseEvent) { + const slider = this.$['*sliderEl'] as { setOperation: (operation: ColorOperation | '') => void } | undefined; + slider?.setOperation(this._operation); + this.$['*showSlider'] = true; + this.$['*currentOperation'] = this._operation; + + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + operation: parseFilterValue(this.$['*operationTooltip']), }); } } diff --git a/src/blocks/CloudImageEditor/src/EditorScroller.ts b/src/blocks/CloudImageEditor/src/EditorScroller.ts index 613840d27..beb3bda44 100644 --- a/src/blocks/CloudImageEditor/src/EditorScroller.ts +++ b/src/blocks/CloudImageEditor/src/EditorScroller.ts @@ -1,33 +1,29 @@ -import { Block } from '../../../abstract/Block'; +import { LitBlock } from '../../../lit/LitBlock'; const X_THRESHOLD = 1; +const noopScrollListener = () => {}; -export class EditorScroller extends Block { - override initCallback(): void { - super.initCallback(); +export class EditorScroller extends LitBlock { + private readonly _handleWheel = (event: WheelEvent): void => { + event.preventDefault(); + const { deltaY, deltaX } = event; + if (Math.abs(deltaX) > X_THRESHOLD) { + this.scrollLeft += deltaX; + return; + } + this.scrollLeft += deltaY; + }; - this.addEventListener( - 'wheel', - (e: WheelEvent) => { - e.preventDefault(); - - const { deltaY, deltaX } = e; - if (Math.abs(deltaX) > X_THRESHOLD) { - this.scrollLeft += deltaX; - } else { - this.scrollLeft += deltaY; - } - }, - { - passive: false, - }, - ); + public override connectedCallback(): void { + super.connectedCallback(); + this.addEventListener('wheel', this._handleWheel, { passive: false }); + // This fixes a macOS issue where wheel events skip without an attached scroll listener + this.addEventListener('scroll', noopScrollListener, { passive: true }); + } - // This fixes some strange bug on MacOS - wheel event doesn't fire for physical mouse wheel if no scroll event attached also - this.addEventListener('scroll', () => {}, { - passive: true, - }); + public override disconnectedCallback(): void { + this.removeEventListener('wheel', this._handleWheel); + this.removeEventListener('scroll', noopScrollListener); + super.disconnectedCallback(); } } - -EditorScroller.template = /* HTML */ ` `; diff --git a/src/blocks/CloudImageEditor/src/EditorSlider.ts b/src/blocks/CloudImageEditor/src/EditorSlider.ts index f8771c685..0e401608e 100644 --- a/src/blocks/CloudImageEditor/src/EditorSlider.ts +++ b/src/blocks/CloudImageEditor/src/EditorSlider.ts @@ -1,4 +1,6 @@ -import { Block } from '../../../abstract/Block'; +import { html, type PropertyValues } from 'lit'; +import { state } from 'lit/decorators.js'; +import { LitBlock } from '../../../lit/LitBlock'; import type { EditorImageFader } from './EditorImageFader'; import type { ColorOperation, FilterId } from './toolbar-constants'; import { COLOR_OPERATIONS_CONFIG } from './toolbar-constants'; @@ -9,57 +11,52 @@ type SliderFilter = FilterId | typeof FAKE_ORIGINAL_FILTER; export const FAKE_ORIGINAL_FILTER = 'original'; -export class EditorSlider extends Block { - private _operation: SliderOperation = 'filter'; - private _filter?: SliderFilter; - private _originalUrl = ''; - - constructor() { - super(); - - this.init$ = { - ...this.init$, - disabled: false, - min: 0, - max: 100, - value: 0, - defaultValue: 0, - zero: 0, - 'on.input': (value: number) => { - const fader = this.$['*faderEl'] as EditorImageFader | undefined; - fader?.set(value); - this.$.value = value; - }, - }; - } +export class EditorSlider extends LitBlock { + // This is public because it's used in the updated lifecycle to assign to the shared state. + @state() + public state = { + operation: 'filter' as SliderOperation, + filter: undefined as SliderFilter | undefined, + originalUrl: '', + disabled: false, + min: 0, + max: 100, + value: 0, + defaultValue: 0, + zero: 0, + }; + + private _handleInput = (e: CustomEvent<{ value: number }>): void => { + const { value } = e.detail; + const fader = this.$['*faderEl'] as EditorImageFader | undefined; + fader?.set(value); + this.state = { ...this.state, value }; + }; - setOperation(operation: SliderOperation, filter?: SliderFilter): void { - this._operation = operation; - this._filter = filter; + public setOperation(operation: SliderOperation, filter?: SliderFilter): void { + this.state = { ...this.state, operation, filter }; this._initializeValues(); const fader = this.$['*faderEl'] as EditorImageFader | undefined; - const originalUrl = this._originalUrl || (this.$['*originalUrl'] as string | undefined); + const originalUrl = this.state.originalUrl || (this.$['*originalUrl'] as string | undefined); if (fader && originalUrl) { fader.activate({ url: originalUrl, - operation: this._operation, - value: this._filter === FAKE_ORIGINAL_FILTER ? undefined : (this.$.value as number), - filter: this._filter === FAKE_ORIGINAL_FILTER ? undefined : this._filter, + operation: this.state.operation, + value: this.state.filter === FAKE_ORIGINAL_FILTER ? undefined : this.state.value, + filter: this.state.filter === FAKE_ORIGINAL_FILTER ? undefined : this.state.filter, fromViewer: false, }); } } private _initializeValues(): void { - const operation = this._operation; + const operation = this.state.operation; const { range, zero } = COLOR_OPERATIONS_CONFIG[operation]; const [min, max] = range; - this.$.min = min; - this.$.max = max; - this.$.zero = zero; + this.state = { ...this.state, min, max, zero }; const editorTransformations = this.$['*editorTransformations'] as Transformations; const transformation = editorTransformations[operation]; @@ -69,57 +66,66 @@ export class EditorSlider extends Block { const filterTransformation = transformation as Transformations['filter'] | undefined; if (filterTransformation) { const { name, amount } = filterTransformation; - value = name === this._filter ? amount : max; + value = name === this.state.filter ? amount : max; } - this.$.value = value; - this.$.defaultValue = value; + this.state = { ...this.state, value, defaultValue: value }; return; } const value = typeof transformation !== 'undefined' ? (transformation as number) : zero; - this.$.value = value; - this.$.defaultValue = value; + this.state = { ...this.state, value, defaultValue: value }; } - apply(): void { + public apply(): void { const editorTransformations = this.$['*editorTransformations'] as Transformations; const transformations: Transformations = { ...editorTransformations }; - if (this._operation === 'filter') { - if (!this._filter || this._filter === FAKE_ORIGINAL_FILTER) { + if (this.state.operation === 'filter') { + if (!this.state.filter || this.state.filter === FAKE_ORIGINAL_FILTER) { delete transformations.filter; } else { - transformations.filter = { name: this._filter, amount: this.$.value as number }; + transformations.filter = { name: this.state.filter, amount: this.state.value }; } } else { - transformations[this._operation] = this.$.value as Transformations[typeof this._operation]; + transformations[this.state.operation] = this.state.value as Transformations[typeof this.state.operation]; } this.$['*editorTransformations'] = transformations; } - cancel(): void { + public cancel(): void { const fader = this.$['*faderEl'] as EditorImageFader | undefined; fader?.deactivate({ hide: false }); } - override initCallback(): void { - super.initCallback(); - - this.sub('*originalUrl', (originalUrl: string) => { - this._originalUrl = originalUrl; + public override initCallback(): void { + this.sub('*originalUrl', (originalUrl: string | null) => { + if (!originalUrl) { + return; + } + this.state = { ...this.state, originalUrl }; }); + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); - this.sub('value', (value: number) => { - const tooltip = `${this._filter ?? this._operation} ${value}`; + if (changedProperties.has('state')) { + const tooltip = `${this.state.filter ?? this.state.operation} ${this.state.value}`; this.$['*operationTooltip'] = tooltip; - }); + } } -} -EditorSlider.template = /* HTML */ ` - -`; + public override render() { + return html` + + `; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorToolbar.ts b/src/blocks/CloudImageEditor/src/EditorToolbar.ts index ed9da17cd..ec23c83ca 100644 --- a/src/blocks/CloudImageEditor/src/EditorToolbar.ts +++ b/src/blocks/CloudImageEditor/src/EditorToolbar.ts @@ -1,12 +1,14 @@ -import { Block } from '../../../abstract/Block'; +import type { PropertyValues, TemplateResult } from 'lit'; +import { html, nothing } from 'lit'; +import { state } from 'lit/decorators.js'; +import type { Ref } from 'lit/directives/ref.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { styleMap } from 'lit/directives/style-map.js'; +import { LitBlock } from '../../../lit/LitBlock'; import { debounce } from '../../../utils/debounce'; import { batchPreloadImages } from '../../../utils/preloadImage'; -import { EditorAspectRatioButtonControl, EditorFreeformButtonControl } from './EditorAspectRatioButtonControl'; -import { EditorCropButtonControl } from './EditorCropButtonControl'; -import { EditorFilterControl } from './EditorFilterControl'; import type { EditorImageCropper } from './EditorImageCropper'; import type { EditorImageFader } from './EditorImageFader'; -import { EditorOperationControl } from './EditorOperationControl'; import { type EditorSlider, FAKE_ORIGINAL_FILTER } from './EditorSlider'; import { ALL_COLOR_OPERATIONS, @@ -23,270 +25,164 @@ import { parseFilterValue } from './utils/parseFilterValue'; type TabIdValue = (typeof TabId)[keyof typeof TabId]; -function renderTabToggle(id: TabIdValue): string { - return /* HTML */ ` - - - - - `; -} +export class EditorToolbar extends LitBlock { + @state() + private _showLoader = false; -function renderTabContent(id: TabIdValue): string { - return /* HTML */ ` - - -
-
-
-
-
- `; -} + // This is public because it's used in the updated lifecycle to assign to the shared state. + @state() + public showMainToolbar = true; -export class EditorToolbar extends Block { - private _debouncedShowLoader: ReturnType; - private _cancelPreload?: () => void; - private _updateInfoTooltip: ReturnType; - - constructor() { - super(); - - this.init$ = { - ...this.init$, - '*sliderEl': null, - '*listAspectRatioEl': null, - /** @type {import('./types.js').LoadingOperations} */ - '*loadingOperations': new Map(), - '*showSlider': false, - '*showListAspectRatio': false, - hideSliderOrList: false, - '*currentFilter': FAKE_ORIGINAL_FILTER, - '*currentOperation': null, - showLoader: false, - filters: ALL_FILTERS, - colorOperations: ALL_COLOR_OPERATIONS, - cropOperations: ALL_CROP_OPERATIONS, - '*operationTooltip': null, - - 'presence.mainToolbar': true, - 'presence.subToolbar': false, - 'presence.tabToggles': true, - 'presence.tabContent.crop': false, - 'presence.tabContent.tuning': false, - 'presence.tabContent.filters': false, - 'presence.tabToggle.crop': true, - 'presence.tabToggle.tuning': true, - 'presence.tabToggle.filters': true, - 'presence.subTopToolbarStyles': { - hidden: 'uc-sub-toolbar--top-hidden', - visible: 'uc-sub-toolbar--visible', - }, - 'presence.subBottomToolbarStyles': { - hidden: 'uc-sub-toolbar--bottom-hidden', - visible: 'uc-sub-toolbar--visible', - }, - 'presence.tabContentStyles': { - hidden: 'uc-tab-content--hidden', - visible: 'uc-tab-content--visible', - }, - 'presence.tabToggleStyles': { - hidden: 'uc-tab-toggle--hidden', - visible: 'uc-tab-toggle--visible', - }, - 'presence.tabTogglesStyles': { - hidden: 'uc-tab-toggles--hidden', - visible: 'uc-tab-toggles--visible', - }, - 'on.cancel': (e: MouseEvent) => { - this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { - action: 'cancel', - }); - - this._cancelPreload?.(); - const onCancel = this.$['*on.cancel'] as () => void; - onCancel(); - }, - 'on.apply': (e: MouseEvent) => { - this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { - action: 'apply', - }); - const onApply = this.$['*on.apply'] as (transformations: Transformations) => void; - onApply(this.$['*editorTransformations'] as Transformations); - }, - 'on.applySlider': (e: MouseEvent) => { - this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { - action: 'apply-slider', - operation: parseFilterValue(this.$['*operationTooltip']), - }); - const slider = this.ref['slider-el'] as EditorSlider; - slider.apply(); - this._onSliderClose(); - }, - 'on.cancelSlider': (e: MouseEvent) => { - this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { - action: 'cancel-slider', - }); - const slider = this.ref['slider-el'] as EditorSlider; - slider.cancel(); - this._onSliderClose(); - }, - 'on.clickTab': (e: MouseEvent) => { - const target = e.currentTarget as HTMLElement | null; - const id = target?.getAttribute('data-id') as TabIdValue | null; - if (id) { - this.telemetryManager.sendEventCloudImageEditor(e, id); - this._activateTab(id, { fromViewer: false }); - } - }, - tab_role: 'tab', - [`tab_${TabId.TUNING}`]: `tab_${TabId.TUNING}`, - [`tab_${TabId.CROP}`]: `tab_${TabId.CROP}`, - [`tab_${TabId.FILTERS}`]: `tab_${TabId.FILTERS}`, - cancel: 'cancel', - apply: 'apply', - 'a11y-editor-tab-filters': 'a11y-editor-tab-filters', - 'a11y-editor-tab-tuning': 'a11y-editor-tab-tuning', - 'a11y-editor-tab-crop': 'a11y-editor-tab-crop', - }; - - this._debouncedShowLoader = debounce(this._showLoader.bind(this), 500); - this._updateInfoTooltip = debounce(this._updateInfoTooltipHandler.bind(this), 0); - } + // This is public because it's used in the updated lifecycle to assign to the shared state. + @state() + public showSubToolbar = false; - private _onSliderClose(): void { - this.$['*showSlider'] = false; + @state() + private _showTabToggles = true; - if (this.$['*tabId'] === TabId.CROP) { - this.$['*showListAspectRatio'] = false; - } - - if (this.$['*tabId'] === TabId.TUNING) { - const tooltipEl = this.ref['tooltip-el'] as HTMLElement; - tooltipEl.classList.toggle('uc-info-tooltip_visible', false); - } - } + // This is public because it's used in the updated lifecycle to assign to the shared state. + @state() + public tabList: readonly TabIdValue[] = [...ALL_TABS]; - private _createOperationControl(operation: string): EditorOperationControl { - const el = new EditorOperationControl(); - (el as unknown as { operation: string }).operation = operation; - return el; - } + // This is public because it's used in the updated lifecycle to assign to the shared state. + @state() + public activeTab: TabIdValue = TabId.CROP; - private _createFilterControl(filter: string): EditorFilterControl { - const el = new EditorFilterControl(); - (el as unknown as { filter: string }).filter = filter; - return el; - } + @state() + private _useSliderPanel = true; - private _createToggleControl(operation: CropOperation): EditorCropButtonControl { - const el = new EditorCropButtonControl(); - el.operation = operation; - return el; - } + @state() + private _tooltipVisible = false; - private _createAspectRatioControl(config: CropAspectRatio): EditorAspectRatioButtonControl { - const el = new EditorAspectRatioButtonControl(); - el.aspectRatio = config; - return el; - } + @state() + private _operationTooltip: string | null = null; - private _createFreeformControl(): EditorFreeformButtonControl { - return new EditorFreeformButtonControl(); - } + private _tabIndicatorOffset = 0; + private _tabIndicatorWidth = 0; - private _clearListAspectRatio(): void { - const listAspectRatioEl = this.$['*listAspectRatioEl'] as HTMLElement | null; - if (listAspectRatioEl) { - listAspectRatioEl.innerHTML = ''; - } - } + private readonly _sliderRef = createRef(); + private readonly _tabIndicatorRef = createRef(); + protected readonly tabToggleRefs: Record> = { + [TabId.CROP]: createRef(), + [TabId.TUNING]: createRef(), + [TabId.FILTERS]: createRef(), + }; - private _renderControlsList(tabId: TabIdValue): void { - const listEl = this.ref[`controls-list-${tabId}`] as HTMLElement; - const fr = document.createDocumentFragment(); + private readonly _handleWindowResize = () => { + this._syncTabIndicator(); + }; - this._clearListAspectRatio(); + @state() + private _cropPresets: CropAspectRatio[] = []; - if (tabId === TabId.CROP) { - const cropPresetList = this.$['*cropPresetList'] as CropAspectRatio[]; - const hasFreeformAspectRatio = cropPresetList.length >= 3; + private _cancelPreload?: () => void; - if (hasFreeformAspectRatio) { - const el = this._createFreeformControl(); - fr.appendChild(el); - } + private readonly _debouncedShowLoader = debounce((show: boolean) => { + this._showLoader = show; + }, 500); - for (const preset of cropPresetList) { - const el = this._createAspectRatioControl(preset); - fr.appendChild(el); + private readonly _updateInfoTooltip = debounce(() => { + const transformations = this.$['*editorTransformations']; + const currentOperation = this.$['*currentOperation'] as keyof typeof COLOR_OPERATIONS_CONFIG | null; + let text = ''; + let visible = false; - if (hasFreeformAspectRatio) { - const listAspectRatioEl = this.$['*listAspectRatioEl'] as HTMLElement | null; - listAspectRatioEl?.appendChild(el); - } + if (this.$['*tabId'] === TabId.FILTERS) { + visible = true; + if (this.$['*currentFilter'] && transformations?.filter?.name === this.$['*currentFilter']) { + const value = transformations?.filter?.amount || 100; + text = `${this.$['*currentFilter']} ${value}`; + } else { + text = this.l10n(FAKE_ORIGINAL_FILTER); } + } else if (this.showSubToolbar && this.$['*tabId'] === TabId.TUNING && currentOperation) { + visible = true; + const value = transformations?.[currentOperation] || COLOR_OPERATIONS_CONFIG[currentOperation].zero; + text = `${this.l10n(currentOperation)} ${value}`; + } + if (visible) { + this.$['*operationTooltip'] = text; + } + this._tooltipVisible = visible; + }, 0); + + private readonly _subTopToolbarStyles = { + hidden: 'uc-sub-toolbar--top-hidden', + visible: 'uc-sub-toolbar--visible', + }; + + private readonly _subBottomToolbarStyles = { + hidden: 'uc-sub-toolbar--bottom-hidden', + visible: 'uc-sub-toolbar--visible', + }; + + private readonly _tabContentStyles = { + hidden: 'uc-tab-content--hidden', + visible: 'uc-tab-content--visible', + }; + + private readonly _tabToggleStyles = { + hidden: 'uc-tab-toggle--hidden', + visible: 'uc-tab-toggle--visible', + }; + + private readonly _tabTogglesStyles = { + hidden: 'uc-tab-toggles--hidden', + visible: 'uc-tab-toggles--visible', + }; + + public override init$: Record = { + ...this.init$, + '*sliderEl': null, + '*showSlider': false, + '*showListAspectRatio': false, + '*currentFilter': FAKE_ORIGINAL_FILTER, + '*currentOperation': null, + '*operationTooltip': null, + }; - for (const operation of this.$.cropOperations as CropOperation[]) { - const el = this._createToggleControl(operation); - fr.appendChild(el); - } - } else if (tabId === TabId.FILTERS) { - const filters = this.$.filters as string[]; - [FAKE_ORIGINAL_FILTER, ...filters].forEach((filterId) => { - const el = this._createFilterControl(filterId); - fr.appendChild(el); - }); - } else if (tabId === TabId.TUNING) { - for (const operation of this.$.colorOperations as string[]) { - const el = this._createOperationControl(operation); - fr.appendChild(el); - } + private _onSliderClose(): void { + this.$['*showSlider'] = false; + + if (this.$['*tabId'] === TabId.CROP) { + this.$['*showListAspectRatio'] = false; } - [...fr.children].forEach((el, idx) => { - if (idx === fr.childNodes.length - 1) { - el.classList.add('uc-controls-list_last-item'); - } - }); + if (this.$['*tabId'] === TabId.TUNING) { + this._tooltipVisible = false; + } + } - listEl.innerHTML = ''; - listEl.appendChild(fr); + private _activateTab( + id: TabIdValue, + { fromViewer = false, force = false }: { fromViewer?: boolean; force?: boolean } = {}, + ): void { + if (this.$['*tabId'] !== id) { + this.$['*tabId'] = id; + } + this._applyTabState(id, { fromViewer, force }); } - private _activateTab(id: TabIdValue, { fromViewer }: { fromViewer?: boolean } = {}): void { - this.$['*tabId'] = id; + private _applyTabState( + id: TabIdValue, + { fromViewer, force = false }: { fromViewer: boolean; force?: boolean }, + ): void { + if (!force && this.activeTab === id) { + this._syncTabIndicator(); + return; + } + + this.activeTab = id; const faderEl = this.$['*faderEl'] as EditorImageFader | undefined; const cropperEl = this.$['*cropperEl'] as EditorImageCropper | undefined; if (id === TabId.CROP) { faderEl?.deactivate(); - cropperEl?.activate( - this.$['*imageSize'] as { - width: number; - height: number; - }, - { fromViewer }, - ); + const imageSize = this.$['*imageSize'] as { width: number; height: number } | undefined; + if (imageSize) { + cropperEl?.activate(this.$['*imageSize'] as { width: number; height: number }, { fromViewer }); + } } else { faderEl?.activate({ url: this.$['*originalUrl'] as string, @@ -297,31 +193,113 @@ export class EditorToolbar extends Block { for (const tabId of ALL_TABS) { const isCurrentTab = tabId === id; - - const tabToggleEl = this.ref[`tab-toggle-${tabId}`] as HTMLElement & { active: boolean }; - tabToggleEl.active = isCurrentTab; - + const toggleRef = this.tabToggleRefs[tabId]; + const toggleEl = toggleRef?.value as (HTMLElement & { active?: boolean }) | null; + if (toggleEl) { + toggleEl.active = isCurrentTab; + } if (isCurrentTab) { - this._renderControlsList(id); this._syncTabIndicator(); - } else { - this._unmountTabControls(tabId); } - this.$[`presence.tabContent.${tabId}`] = isCurrentTab; } } - private _unmountTabControls(tabId: TabIdValue): void { - const listEl = this.ref[`controls-list-${tabId}`] as HTMLElement | undefined; - if (listEl) { - listEl.innerHTML = ''; + private _syncTabIndicator(): void { + const toggleRef = this.tabToggleRefs[this.activeTab]; + const toggleEl = toggleRef?.value; + const indicatorEl = this._tabIndicatorRef.value; + if (!toggleEl || !indicatorEl) { + return; + } + const offset = toggleEl.offsetLeft; + + const width = toggleEl.offsetWidth || Number(getComputedStyle(toggleEl).width.replace('px', '')); + if (this._tabIndicatorOffset !== offset || this._tabIndicatorWidth !== width) { + this._tabIndicatorOffset = offset; + this._tabIndicatorWidth = width; + indicatorEl.style.transform = `translateX(${offset}px)`; + indicatorEl.style.width = `${width}px`; } } - private _syncTabIndicator(): void { - const tabToggleEl = this.ref[`tab-toggle-${this.$['*tabId']}`] as HTMLElement; - const indicatorEl = this.ref['tabs-indicator'] as HTMLElement; - indicatorEl.style.transform = `translateX(${tabToggleEl.offsetLeft}px)`; + private get _hasAspectRatioPicker(): boolean { + return this._cropPresets.length >= 3; + } + + private _renderControlsByTab(tabId: TabIdValue): TemplateResult[] { + switch (tabId) { + case TabId.CROP: + return this._renderCropTabControls(); + case TabId.FILTERS: + return this._renderFilterTabControls(); + case TabId.TUNING: + return this._renderTuningTabControls(); + default: + return []; + } + } + + private _renderCropTabControls(): TemplateResult[] { + const renderers: Array<() => TemplateResult> = []; + if (this._hasAspectRatioPicker) { + renderers.push(() => this._renderFreeformControl()); + } else { + for (const preset of this._cropPresets) { + renderers.push(() => this._renderAspectRatioControl(preset)); + } + } + + for (const operation of ALL_CROP_OPERATIONS) { + renderers.push(() => this._renderCropOperationControl(operation)); + } + + return this._renderControlGroup(renderers); + } + + private _renderFilterTabControls(): TemplateResult[] { + const filterIds = [FAKE_ORIGINAL_FILTER, ...ALL_FILTERS]; + const renderers = filterIds.map((filterId) => () => this._renderFilterControl(filterId)); + return this._renderControlGroup(renderers); + } + + private _renderTuningTabControls(): TemplateResult[] { + const renderers = ALL_COLOR_OPERATIONS.map((operation) => () => this._renderOperationControl(operation)); + return this._renderControlGroup(renderers); + } + + private _renderControlGroup(renderers: Array<() => TemplateResult>): TemplateResult[] { + const total = renderers.length; + if (!total) { + return []; + } + return renderers.map((renderControl) => renderControl()); + } + + private _renderFreeformControl(): TemplateResult { + return html``; + } + + private _renderAspectRatioControl(preset: CropAspectRatio): TemplateResult { + return html``; + } + + private _renderCropOperationControl(operation: CropOperation): TemplateResult { + return html``; + } + + private _renderFilterControl(filterId: string): TemplateResult { + return html``; + } + + private _renderOperationControl(operation: string): TemplateResult { + return html``; + } + + private _renderAspectRatioList(): TemplateResult[] { + if (!this._hasAspectRatioPicker) { + return []; + } + return this._cropPresets.map((preset) => this._renderAspectRatioControl(preset)); } private async _preloadEditedImage(): Promise { @@ -337,40 +315,14 @@ export class EditorToolbar extends Block { } } - private _showLoader(show: boolean): void { - this.$.showLoader = show; - } - - private _updateInfoTooltipHandler(): void { - const transformations = this.$['*editorTransformations']; - const currentOperation = this.$['*currentOperation'] as keyof typeof COLOR_OPERATIONS_CONFIG | null; - let text = ''; - let visible = false; - - if (this.$['*tabId'] === TabId.FILTERS) { - visible = true; - if (this.$['*currentFilter'] && transformations?.filter?.name === this.$['*currentFilter']) { - const value = transformations?.filter?.amount || 100; - text = `${this.$['*currentFilter']} ${value}`; - } else { - text = this.l10n(FAKE_ORIGINAL_FILTER); - } - } else if (this.$['*tabId'] === TabId.TUNING && currentOperation) { - visible = true; - const value = transformations?.[currentOperation] || COLOR_OPERATIONS_CONFIG[currentOperation].zero; - text = `${this.l10n(currentOperation)} ${value}`; - } - if (visible) { - this.$['*operationTooltip'] = text; - } - this.ref['tooltip-el'].classList.toggle('uc-info-tooltip_visible', visible); - } - - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - this.$['*sliderEl'] = this.ref['slider-el']; - this.$['*listAspectRatioEl'] = this.ref['list-el']; + const initialCropPresets = (this.$['*cropPresetList'] as CropAspectRatio[]) ?? []; + this._cropPresets = [...initialCropPresets]; + this.sub('*cropPresetList', (cropPresetList: CropAspectRatio[]) => { + this._cropPresets = [...(cropPresetList ?? [])]; + }); this.sub('*imageSize', (imageSize: { width: number; height: number } | null) => { if (imageSize) { @@ -383,7 +335,7 @@ export class EditorToolbar extends Block { this.sub('*editorTransformations', (editorTransformations: Transformations) => { const appliedFilter = editorTransformations?.filter?.name; if (this.$['*currentFilter'] !== appliedFilter) { - this.$['*currentFilter'] = appliedFilter; + this.$['*currentFilter'] = appliedFilter ?? ''; } }); @@ -395,7 +347,8 @@ export class EditorToolbar extends Block { this._updateInfoTooltip(); }); - this.sub('*tabId', () => { + this.sub('*tabId', (tabId: TabIdValue) => { + this._applyTabState(tabId, { fromViewer: false, force: true }); this._updateInfoTooltip(); }); @@ -425,85 +378,246 @@ export class EditorToolbar extends Block { }); this.sub('*showSlider', (showSlider: boolean) => { - this.$['presence.subToolbar'] = showSlider; - this.$['presence.mainToolbar'] = !showSlider; - - this.$.hideSliderOrList = true; + if (showSlider) { + this.showSubToolbar = true; + this.showMainToolbar = false; + this._useSliderPanel = true; + } else if (!this.$['*showListAspectRatio']) { + this.showSubToolbar = false; + this.showMainToolbar = true; + } }); this.sub('*showListAspectRatio', (show: boolean) => { - this.$['presence.subToolbar'] = show; - this.$['presence.mainToolbar'] = !show; - this.$.hideSliderOrList = false; + if (show) { + this.showSubToolbar = true; + this.showMainToolbar = false; + this._useSliderPanel = false; + } else if (!this.$['*showSlider']) { + this.showSubToolbar = false; + this.showMainToolbar = true; + } }); - this.sub('*tabList', (tabList: TabIdValue[]) => { - this.$['presence.tabToggles'] = tabList.length > 1; - for (const tabId of ALL_TABS) { - this.$[`presence.tabToggle.${tabId}`] = tabList.includes(tabId); - const toggleEl = this.ref[`tab-toggle-${tabId}`] as HTMLElement; - toggleEl.style.gridColumn = `${tabList.indexOf(tabId) + 1}`; - } + this.sub('*tabList', (tabList: readonly TabIdValue[]) => { + this.tabList = tabList; + this._showTabToggles = tabList.length > 1; if (!tabList.includes(this.$['*tabId']) && tabList.length > 0) { const [firstTab] = tabList; if (firstTab) { this._activateTab(firstTab, { fromViewer: false }); } + return; } + + this._syncTabIndicator(); + }); + + this.sub('*operationTooltip', (tooltip: string | null) => { + this._operationTooltip = tooltip; }); this._updateInfoTooltip(); } - override destroyCallback(): void { + public override connectedCallback(): void { + super.connectedCallback(); + window.addEventListener('resize', this._handleWindowResize); + } + + public override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this._assignSharedElements(); + + this._syncTabIndicator(); + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + + if (changedProperties.has('activeTab') || changedProperties.has('tabList')) { + this.updateComplete.then(() => this._syncTabIndicator()); + } + + if (changedProperties.has('showSubToolbar') || changedProperties.has('showMainToolbar')) { + this._assignSharedElements(); + } + } + + public override disconnectedCallback(): void { + window.removeEventListener('resize', this._handleWindowResize); + super.disconnectedCallback(); + this.$['*showSlider'] = false; this.$['*showListAspectRatio'] = false; } -} -EditorToolbar.template = /* HTML */ ` - -
-
-
{{*operationTooltip}}
-
-
-
- -
${ALL_TABS.map(renderTabContent).join('')}
-
+ private _assignSharedElements(): void { + const slider = this._sliderRef.value; + if (slider) { + this.$['*sliderEl'] = slider; + } + } + + private readonly _handleCancel = (e: MouseEvent): void => { + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + action: 'cancel', + }); + this._cancelPreload?.(); + const onCancel = this.$['*on.cancel'] as (() => void) | undefined; + onCancel?.(); + }; + + private readonly _handleApply = (e: MouseEvent): void => { + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + action: 'apply', + }); + const onApply = this.$['*on.apply'] as ((transformations: Transformations) => void) | undefined; + onApply?.(this.$['*editorTransformations'] as Transformations); + }; + + private readonly _handleApplySlider = (e: MouseEvent): void => { + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + action: 'apply-slider', + operation: parseFilterValue(this.$['*operationTooltip']), + }); + const slider = this._sliderRef.value; + slider?.apply(); + this._onSliderClose(); + }; + + private readonly _handleCancelSlider = (e: MouseEvent): void => { + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + action: 'cancel-slider', + }); + const slider = this._sliderRef.value; + slider?.cancel(); + this._onSliderClose(); + }; + + private readonly _handleTabClick = (e: MouseEvent): void => { + const target = e.currentTarget as HTMLElement | null; + const id = target?.getAttribute('data-id') as TabIdValue | null; + if (!id) { + return; + } + this.telemetryManager.sendEventCloudImageEditor(e, id); + this._activateTab(id, { fromViewer: false }); + }; + + private _renderTabToggle(id: TabIdValue) { + const isVisible = this.tabList.includes(id); + const isActive = this.activeTab === id; + const columnIndex = this.tabList.indexOf(id); + const style = columnIndex >= 0 ? styleMap({ gridColumn: `${columnIndex + 1}` }) : nothing; + + return html` + + + + `; + } + + private _renderTabContent(id: TabIdValue) { + const isVisible = this.activeTab === id; + const controls = this._renderControlsByTab(id); + + return html` + + +
+
+ ${controls.length ? controls : nothing} +
+
+
+
+ `; + } + + public override render() { + const tooltipClasses = [ + 'uc-info-tooltip', + this._tooltipVisible ? 'uc-info-tooltip_visible' : 'uc-info-tooltip_hidden', + ].join(' '); + const showAspectRatioList = this._hasAspectRatioPicker; + + return html` + +
+
+
${this._operationTooltip ?? ''}
+
+
+
-
- ${ALL_TABS.map(renderTabToggle).join('')} +
+ ${ALL_TABS.map((tabId) => this._renderTabContent(tabId))} +
+
+ this._syncTabIndicator()} + > +
+ ${ALL_TABS.map((tabId) => this._renderTabToggle(tabId))} +
+ + +
+
+ +
+ +
+ +
+ ${ + showAspectRatioList + ? html`
${this._renderAspectRatioList()}
` + : nothing + } +
+
+ + +
- - - -
- - -
- -
- -
-
-
-
- -
-
-
-`; + `; + } +} diff --git a/src/blocks/CloudImageEditor/src/css/common.css b/src/blocks/CloudImageEditor/src/css/common.css index e31e3a972..d3c5a7569 100644 --- a/src/blocks/CloudImageEditor/src/css/common.css +++ b/src/blocks/CloudImageEditor/src/css/common.css @@ -1,3 +1,5 @@ +/** biome-ignore-all lint/complexity/noImportantStyles: TODO: Refactor styles to get rid of !important rules */ + @layer uc.solutions { /* TODO: we should use basic theme there */ @@ -6,7 +8,7 @@ --color-text-base: var(--uc-foreground); --color-text-accent-contrast: var(--uc-background); --color-fill-contrast: var(--uc-background); - --color-modal-backdrop: oklch(0 0 0 / 0.1); + --color-modal-backdrop: oklch(0% 0 0 / 0.1); --color-image-background: var(--uc-muted); --color-focus-ring: var(--color-primary-accent); --color-crop-guides: var(--uc-foreground); @@ -54,7 +56,7 @@ } [uc-cloud-image-editor] - :is([tabindex][focus-visible], [tabindex]:hover, [with-effects][focus-visible], [with-effects]:hover) { + :is([tabindex]:focus-visible, [tabindex]:hover, [with-effects]:focus-visible, [with-effects]:hover) { --filter-effect: var(--hover-filter) !important; --opacity-effect: var(--hover-opacity) !important; --color-effect: var(--hover-color-rgb) !important; @@ -421,14 +423,6 @@ --hover-opacity: 1; } - uc-editor-filter-control.uc-not_active .uc-preview[loaded] { - opacity: 1; - } - - uc-editor-filter-control.uc-active .uc-preview { - opacity: 0; - } - uc-editor-button-control.uc-not_active, uc-editor-operation-control.uc-not_active, uc-editor-crop-button-control.uc-not_active, @@ -510,6 +504,14 @@ transition: var(--transition-duration-3); } + uc-editor-filter-control.uc-not_active .uc-preview[loaded] { + opacity: 1; + } + + uc-editor-filter-control.uc-active .uc-preview { + opacity: 0; + } + uc-editor-filter-control > .uc-original-icon { color: var(--color-effect); opacity: 0.3; @@ -723,7 +725,7 @@ position: relative; display: grid; grid-auto-flow: column; - grid-gap: 0px var(--l-tab-gap); + gap: 0px var(--l-tab-gap); align-items: center; height: 100%; } @@ -862,10 +864,6 @@ padding-right: var(--uc-padding); } - uc-editor-toolbar .uc-controls-list_last-item { - margin-right: var(--cldtr-gap-max); - } - uc-editor-toolbar .uc-info-tooltip_container { position: absolute; display: flex; @@ -886,7 +884,7 @@ } uc-editor-toolbar .uc-info-tooltip { - z-index: 3; + z-index: 10; padding: 3px 6px; color: var(--color-text-base); font-size: 0.7em; diff --git a/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts b/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts index 8c0cd39a6..ff26f1012 100644 --- a/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts @@ -1,101 +1,100 @@ -import { Block } from '../../../../../abstract/Block'; -import { classNames } from '../../lib/classNames'; +import type { PropertyValues } from 'lit'; +import { html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { classMap } from 'lit/directives/class-map.js'; +import { ifDefined } from 'lit/directives/if-defined.js'; +import { LitBlock } from '../../../../../lit/LitBlock'; type Theme = string | null; -export class BtnUi extends Block { - private _iconReversed = false; - private _iconSingle = false; - private _iconHidden = false; - - constructor() { - super(); - - this.init$ = { - ...this.init$, - text: '', - icon: '', - iconCss: this._iconCss(), - theme: null as Theme, - 'aria-role': '', - 'aria-controls': '', - 'title-prop': '', - }; +export class BtnUi extends LitBlock { + @property({ type: String }) + public text = ''; - this.defineAccessor('active', (active: boolean) => { - if (active) { - this.setAttribute('active', ''); - } else { - this.removeAttribute('active'); - } - }); - } + @property({ type: String }) + public icon = ''; + + @property({ type: Boolean, reflect: true }) + public active = false; + + @property({ type: Boolean, reflect: true }) + public reverse = false; + + @property({ type: String, reflect: true }) + public theme: Theme = 'default'; - private _iconCss(): string { - return classNames('uc-icon', { - 'uc-icon_left': !this._iconReversed, - 'uc-icon_right': this._iconReversed, - 'uc-icon_hidden': this._iconHidden, - 'uc-icon_single': this._iconSingle, - }); + @property({ attribute: 'aria-role' }) + public ariaRole = ''; + + @property({ attribute: 'aria-controls' }) + public ariaControls = ''; + + @property({ attribute: 'title-prop' }) + public titleProp = ''; + + protected override firstUpdated(changed: PropertyValues): void { + super.firstUpdated(changed); + this._applyReverse(); + this._applyThemeClass(); } - override initCallback(): void { - super.initCallback(); + protected override updated(changed: PropertyValues): void { + super.updated(changed); - this.sub('icon', (iconName: string) => { - this._iconSingle = !this.$.text; - this._iconHidden = !iconName; - this.$.iconCss = this._iconCss(); - }); + if (changed.has('reverse')) { + this._applyReverse(); + } - this.sub('theme', (theme: Theme) => { - if (theme && theme !== 'custom') { - this.className = `uc-${theme}`; - } - }); + if (changed.has('theme')) { + this._applyThemeClass(); + } + } - this.sub('text', () => { - this._iconSingle = false; - }); + private _applyReverse(): void { + this.style.flexDirection = this.reverse ? 'row-reverse' : ''; + } - if (!this.hasAttribute('theme')) { - this.setAttribute('theme', 'default'); + private _applyThemeClass(): void { + if (this.theme && this.theme !== 'custom') { + this.className = `uc-${this.theme}`; } + } - this.defineAccessor('aria-role', (value: string | null) => { - this.$['aria-role'] = value || ''; - }); + private get _iconClassMap(): Record { + const iconHidden = this._computedIconHidden; + return { + 'uc-icon': true, + 'uc-icon_left': !this.reverse, + 'uc-icon_right': this.reverse, + 'uc-icon_hidden': iconHidden, + 'uc-icon_single': this._computedIconSingle, + }; + } - this.defineAccessor('aria-controls', (value: string | null) => { - this.$['aria-controls'] = value || ''; - }); + private get _computedIconHidden(): boolean { + return !this.icon; + } - this.defineAccessor('title-prop', (value: string | null) => { - this.$['title-prop'] = value || ''; - }); + private get _computedIconSingle(): boolean { + return !this.text && !this._computedIconHidden; } - set reverse(_value: boolean) { - if (this.hasAttribute('reverse')) { - this.style.flexDirection = 'row-reverse'; - this._iconReversed = true; - } else { - this._iconReversed = false; - this.style.flexDirection = ''; - } + public override render() { + return html` + + `; } } - -BtnUi.bindAttributes({ text: 'text', icon: 'icon', reverse: 'reverse', theme: 'theme' }); - -BtnUi.template = /* HTML */ ` - -`; diff --git a/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts b/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts index 7a5f3b367..da55f5ddc 100644 --- a/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts @@ -1,36 +1,54 @@ -import { Block } from '../../../../../abstract/Block'; +import type { PropertyValues } from 'lit'; +import { html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { LitBlock } from '../../../../../lit/LitBlock'; -export class LineLoaderUi extends Block { - private _active = false; +export class LineLoaderUi extends LitBlock { + @property({ type: Boolean, reflect: true }) + public active = false; + + private readonly _lineRef = createRef(); + private _isAnimating = false; private readonly _handleTransitionEndRight = (): void => { - const lineEl = this.ref['line-el'] as HTMLElement; - lineEl.style.transition = 'initial'; - lineEl.style.opacity = '0'; - lineEl.style.transform = 'translateX(-101%)'; - if (this._active) { + const lineEl = this._lineRef.value; + if (!lineEl) { + return; + } + this._resetLine(lineEl); + if (this._isAnimating && this.active) { this._start(); } }; - override initCallback(): void { - super.initCallback(); - this.defineAccessor('active', (active: boolean | undefined) => { - if (typeof active !== 'boolean') { - return; - } - if (active) { + protected override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + if (this.active) { + this._start(); + } + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + + if (changedProperties.has('active')) { + if (this.active) { this._start(); } else { this._stop(); } - }); + } } private _start(): void { - this._active = true; + const lineEl = this._lineRef.value; + if (!lineEl) { + return; + } + this._isAnimating = true; const { width } = this.getBoundingClientRect(); - const lineEl = this.ref['line-el'] as HTMLElement; + lineEl.removeEventListener('transitionend', this._handleTransitionEndRight); lineEl.style.transition = 'transform 1s'; lineEl.style.opacity = '1'; lineEl.style.transform = `translateX(${width}px)`; @@ -40,12 +58,26 @@ export class LineLoaderUi extends Block { } private _stop(): void { - this._active = false; + const lineEl = this._lineRef.value; + if (!lineEl) { + return; + } + this._isAnimating = false; + lineEl.removeEventListener('transitionend', this._handleTransitionEndRight); + this._resetLine(lineEl); } -} -LineLoaderUi.template = /* HTML */ ` -
-
-
-`; + private _resetLine(lineEl: HTMLDivElement): void { + lineEl.style.transition = 'initial'; + lineEl.style.opacity = '0'; + lineEl.style.transform = 'translateX(-101%)'; + } + + public override render() { + return html` +
+
+
+ `; + } +} diff --git a/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts b/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts index 5f0dfe03a..7d08ec01b 100644 --- a/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts +++ b/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts @@ -1,4 +1,5 @@ -import { Block } from '../../../../../abstract/Block'; +import { property } from 'lit/decorators.js'; +import { LitBlock } from '../../../../../lit/LitBlock'; import { applyClassNames } from '../../lib/classNames'; type PresenceToggleStyle = { @@ -13,32 +14,33 @@ const DEFAULT_STYLE: Required = { hidden: 'uc-hidden', }; -export class PresenceToggle extends Block { +export class PresenceToggle extends LitBlock { private _visible = false; + private _styles: PresenceToggleStyle = DEFAULT_STYLE; private _visibleStyle: string = DEFAULT_STYLE.visible; private _hiddenStyle: string = DEFAULT_STYLE.hidden; private _externalTransitions = false; + private _initialRenderComplete = false; - constructor() { - super(); - - this.defineAccessor('styles', (styles?: PresenceToggleStyle) => { - if (!styles) { - return; - } - this._externalTransitions = true; - this._visibleStyle = styles.visible ?? DEFAULT_STYLE.visible; - this._hiddenStyle = styles.hidden ?? DEFAULT_STYLE.hidden; - }); + @property({ type: Boolean }) + public set visible(value: boolean) { + this._visible = value; + this._handleVisible(); + } - this.defineAccessor('visible', (visible?: boolean) => { - if (typeof visible !== 'boolean') { - return; - } + public get visible(): boolean { + return this._visible; + } - this._visible = visible; - this._handleVisible(); - }); + @property({ attribute: false }) + public set styles(styles: PresenceToggleStyle) { + this._styles = styles; + this._externalTransitions = true; + this._visibleStyle = styles.visible ?? DEFAULT_STYLE.visible; + this._hiddenStyle = styles.hidden ?? DEFAULT_STYLE.hidden; + } + public get styles(): PresenceToggleStyle { + return this._styles; } private _handleVisible(): void { @@ -48,10 +50,24 @@ export class PresenceToggle extends Block { [this._visibleStyle]: this._visible, [this._hiddenStyle]: !this._visible, }); - this.setAttribute('aria-hidden', this._visible ? 'false' : 'true'); + this.toggleAttribute('inert', !this._visible); + } + + private _dispatchInitialRenderEvent(): void { + if (this._initialRenderComplete) { + return; + } + + this._initialRenderComplete = true; + this.dispatchEvent( + new CustomEvent('initial-render', { + bubbles: true, + composed: true, + }), + ); } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.classList.toggle('uc-initial', true); @@ -63,7 +79,7 @@ export class PresenceToggle extends Block { this._handleVisible(); setTimeout(() => { this.classList.toggle('uc-initial', false); + this._dispatchInitialRenderEvent(); }, 0); } } -PresenceToggle.template = /* HTML */ ` `; diff --git a/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts b/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts index 144b2f0f2..a78be15cd 100644 --- a/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts @@ -1,135 +1,135 @@ -import { Block } from '../../../../../abstract/Block'; +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { LitBlock } from '../../../../../lit/LitBlock'; -type SliderHandler = (value: number) => void; - -export class SliderUi extends Block { +export class SliderUi extends LitBlock { private _observer?: ResizeObserver; private _thumbSize = 0; - private _zero = 0; private _zeroDotEl?: HTMLDivElement; private _stepsCount?: number; + private readonly _inputRef = createRef(); + private readonly _thumbRef = createRef(); + private readonly _stepsRef = createRef(); - constructor() { - super(); + @property({ type: Boolean, reflect: true }) + public disabled = false; - this.init$ = { - ...this.init$, - disabled: false, - min: 0, - max: 100, - onInput: null as SliderHandler | null, - onChange: null as SliderHandler | null, - defaultValue: 0, - 'on.sliderInput': () => { - const value = Number.parseInt(this._inputEl().value, 10); - this._updateValue(value); - this.$.onInput?.(value); - }, - 'on.sliderChange': () => { - const value = Number.parseInt(this._inputEl().value, 10); - this.$.onChange?.(value); - }, - }; + @property({ type: Number }) + public min = 0; - this.setAttribute('with-effects', ''); - } + @property({ type: Number }) + public max = 100; - override initCallback(): void { - super.initCallback(); + @property({ type: Number, attribute: false }) + public defaultValue = 0; - this.defineAccessor('disabled', (disabled: boolean) => { - this.$.disabled = disabled; - }); + @property({ type: Number }) + public zero = 0; - this.defineAccessor('min', (min: number) => { - this.$.min = min; - }); + @state() + private _currentValue = 0; - this.defineAccessor('max', (max: number) => { - this.$.max = max; - }); + public constructor() { + super(); + this.setAttribute('with-effects', ''); + } - this.defineAccessor('defaultValue', (defaultValue: number) => { - this.$.defaultValue = defaultValue; - const inputEl = this._inputEl(); - inputEl.value = String(defaultValue); - this._updateValue(defaultValue); - }); + private _emitSliderEvent(type: 'slider-input' | 'slider-change', value: number): void { + this.dispatchEvent( + new CustomEvent(type, { + detail: { value }, + bubbles: true, + composed: true, + }), + ); + } - this.defineAccessor('zero', (zero: number) => { - this._zero = zero; - }); + private readonly _handleSliderInput = (event: Event): void => { + event.stopPropagation(); + const value = this._extractEventValue(event); + if (value === null) { + return; + } + this._setCurrentValue(value); + this._emitSliderEvent('slider-input', value); + }; + + private readonly _handleSliderChange = (event: Event): void => { + event.stopPropagation(); + const value = this._extractEventValue(event); + if (value === null) { + return; + } + this._setCurrentValue(value); + this._emitSliderEvent('slider-change', value); + }; - this.defineAccessor('onInput', (onInput: SliderHandler | null) => { - if (!onInput) { - return; - } - this.$.onInput = onInput; - }); + private readonly _handleInputFocus = (): void => { + this.style.setProperty('--color-effect', 'var(--hover-color-rgb)'); + }; - this.defineAccessor('onChange', (onChange: SliderHandler | null) => { - if (!onChange) { - return; - } - this.$.onChange = onChange; - }); + private readonly _handleInputBlur = (): void => { + this.style.setProperty('--color-effect', 'var(--idle-color-rgb)'); + }; + + protected override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this._thumbSize = Number.parseInt(window.getComputedStyle(this).getPropertyValue('--l-thumb-size'), 10) || 0; + this._syncInputValue(this._currentValue); this._updateSteps(); this._observer = new ResizeObserver(() => { this._updateSteps(); - const value = Number.parseInt(this._inputEl().value, 10); - this._updateValue(value); + this._updateValue(this._currentValue); }); this._observer.observe(this); - this._thumbSize = Number.parseInt(window.getComputedStyle(this).getPropertyValue('--l-thumb-size'), 10); + const inputEl = this._inputRef.value; + inputEl?.addEventListener('focus', this._handleInputFocus); + inputEl?.addEventListener('blur', this._handleInputBlur); - setTimeout(() => { - const value = Number.parseInt(this._inputEl().value, 10); - this._updateValue(value); + window.setTimeout(() => { + this._updateValue(this._currentValue); }, 0); - - this.sub('disabled', (disabled: boolean) => { - const el = this._inputEl(); - if (disabled) { - el.setAttribute('disabled', 'disabled'); - } else { - el.removeAttribute('disabled'); - } - }); - - const inputEl = this._inputEl(); - inputEl.addEventListener('focus', () => { - this.style.setProperty('--color-effect', 'var(--hover-color-rgb)'); - }); - inputEl.addEventListener('blur', () => { - this.style.setProperty('--color-effect', 'var(--idle-color-rgb)'); - }); } - private _inputEl(): HTMLInputElement { - return this.ref['input-el'] as HTMLInputElement; - } + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); - private _thumbEl(): HTMLElement { - return this.ref['thumb-el'] as HTMLElement; - } + if (changedProperties.has('defaultValue') && this.defaultValue !== this._currentValue) { + this._setCurrentValue(this.defaultValue); + } - private _stepsEl(): HTMLElement { - return this.ref['steps-el'] as HTMLElement; + const boundsChanged = changedProperties.has('min') || changedProperties.has('max'); + if (boundsChanged && this.hasUpdated) { + this._updateSteps(); + this._updateValue(this._currentValue); + } + + if (changedProperties.has('zero') && this.hasUpdated) { + this._updateZeroDot(this._currentValue); + } } private _updateValue(value: number): void { this._updateZeroDot(value); + const range = this.max - this.min; + if (range === 0) { + return; + } const { width } = this.getBoundingClientRect(); - const slope = 100 / (this.$.max - this.$.min); - const mappedValue = slope * (value - this.$.min); + const slope = 100 / range; + const mappedValue = slope * (value - this.min); const offset = (mappedValue * (width - this._thumbSize)) / 100; window.requestAnimationFrame(() => { - this._thumbEl().style.transform = `translateX(${offset}px)`; + const thumbEl = this._thumbRef.value; + if (thumbEl) { + thumbEl.style.transform = `translateX(${offset}px)`; + } }); } @@ -137,10 +137,14 @@ export class SliderUi extends Block { if (!this._zeroDotEl) { return; } - this._zeroDotEl.style.opacity = value === this._zero ? '0' : '1'; + const range = this.max - this.min; + if (range === 0) { + return; + } + this._zeroDotEl.style.opacity = value === this.zero ? '0' : '1'; const { width } = this.getBoundingClientRect(); - const slope = 100 / (this.$.max - this.$.min); - const mappedValue = slope * (this._zero - this.$.min); + const slope = 100 / range; + const mappedValue = slope * (this.zero - this.min); const offset = (mappedValue * (width - this._thumbSize)) / 100; window.requestAnimationFrame(() => { if (this._zeroDotEl) { @@ -151,8 +155,11 @@ export class SliderUi extends Block { private _updateSteps(): void { const STEP_GAP = 15; + const stepsEl = this._stepsRef.value; + if (!stepsEl) { + return; + } - const stepsEl = this._stepsEl(); const { width } = stepsEl.getBoundingClientRect(); const half = Math.ceil(width / 2); const count = Math.ceil(half / STEP_GAP) - 2; @@ -186,18 +193,57 @@ export class SliderUi extends Block { this._stepsCount = count; } - override destroyCallback(): void { - super.destroyCallback(); + public override disconnectedCallback(): void { + super.disconnectedCallback(); + const inputEl = this._inputRef.value; + inputEl?.removeEventListener('focus', this._handleInputFocus); + inputEl?.removeEventListener('blur', this._handleInputBlur); this._observer?.disconnect(); + this._observer = undefined; + } + + private _setCurrentValue(value: number): void { + if (!Number.isFinite(value)) { + return; + } + this._currentValue = value; + if (this.hasUpdated) { + this._syncInputValue(value); + this._updateValue(value); + } + } + + private _syncInputValue(value: number): void { + const inputEl = this._inputRef.value; + if (inputEl) { + inputEl.value = String(value); + } + } + + private _extractEventValue(event: Event): number | null { + const target = event.currentTarget as HTMLInputElement | null; + if (!target) { + return null; + } + const parsedValue = Number.parseInt(target.value, 10); + return Number.isFinite(parsedValue) ? parsedValue : null; + } + + public override render() { + return html` +
+
+ + `; } } -SliderUi.template = /* HTML */ ` -
-
- -`; diff --git a/src/blocks/CloudImageEditor/src/lib/FocusVisible.ts b/src/blocks/CloudImageEditor/src/lib/FocusVisible.ts deleted file mode 100644 index 288bd7fc4..000000000 --- a/src/blocks/CloudImageEditor/src/lib/FocusVisible.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { applyFocusVisiblePolyfill } from './applyFocusVisiblePolyfill.js'; - -type FocusVisibleDestructor = () => void; - -const destructors = new WeakMap(); - -function handleFocusVisible(focusVisible: boolean, element: EventTarget): void { - if (!(element instanceof HTMLElement)) { - return; - } - if (focusVisible) { - const customOutline = element.style.getPropertyValue('--focus-visible-outline'); - element.style.outline = customOutline || '2px solid var(--color-focus-ring)'; - } else { - element.style.outline = 'none'; - } -} - -export const FocusVisible = { - handleFocusVisible, - register(scope: ShadowRoot | Document): void { - destructors.set(scope, applyFocusVisiblePolyfill(scope, handleFocusVisible)); - }, - unregister(scope: Document | ShadowRoot): void { - const removeFocusVisiblePolyfill = destructors.get(scope); - if (!removeFocusVisiblePolyfill) { - return; - } - removeFocusVisiblePolyfill(); - destructors.delete(scope); - }, -}; diff --git a/src/blocks/CloudImageEditor/src/lib/applyFocusVisiblePolyfill.ts b/src/blocks/CloudImageEditor/src/lib/applyFocusVisiblePolyfill.ts deleted file mode 100644 index eb453d26d..000000000 --- a/src/blocks/CloudImageEditor/src/lib/applyFocusVisiblePolyfill.ts +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Helper function for legacy browsers and iframes which sometimes focus on elements like document, body, and - * non-interactive SVG. - */ -function isElement(target: EventTarget | null): target is Element { - return target instanceof Element; -} - -function isValidFocusTarget(target: EventTarget | null): target is Element { - if (!target || target === document) { - return false; - } - - if (!isElement(target)) { - return false; - } - - if (target.nodeName === 'HTML' || target.nodeName === 'BODY') { - return false; - } - - return 'classList' in target && 'contains' in target.classList; -} - -/* - * Computes whether the given element should automatically trigger the `focus-visible` class being added, i.e., whether - * it should always match `:focus-visible` when focused. - */ -function focusTriggersKeyboardModality(target: EventTarget | null): boolean { - if (!isElement(target)) { - return false; - } - - if (target instanceof HTMLInputElement && !target.readOnly) { - return true; - } - - if (target instanceof HTMLTextAreaElement && !target.readOnly) { - return true; - } - - if (target instanceof HTMLElement && target.isContentEditable) { - return true; - } - - return false; -} - -let hadKeyboardEvent = true; -let hadFocusVisibleRecently = false; - -/* - * Applies the :focus-visible polyfill at the given scope. A scope, in this case, is either the top-level Document or a - * Shadow Root. - */ -export function applyFocusVisiblePolyfill( - scope: Document | ShadowRoot, - callback?: (focusVisible: boolean, target: EventTarget) => void, -): () => void { - let hadFocusVisibleRecentlyTimeout: number | null = null; - const onFocusVisibleChange = callback ?? (() => {}); - - function addFocusVisibleClass(target: Element): void { - target.setAttribute('focus-visible', ''); - onFocusVisibleChange(true, target); - } - - function removeFocusVisibleClass(target: Element): void { - if (!target.hasAttribute('focus-visible')) { - return; - } - target.removeAttribute('focus-visible'); - onFocusVisibleChange(false, target); - } - - function onKeyDown(event: KeyboardEvent): void { - if (event.metaKey || event.altKey || event.ctrlKey) { - return; - } - - const activeElement = scope.activeElement; - if (isValidFocusTarget(activeElement)) { - addFocusVisibleClass(activeElement); - } - - hadKeyboardEvent = true; - } - - function onPointerDown(): void { - hadKeyboardEvent = false; - } - - function onFocus(event: Event): void { - const target = event.target; - if (!isValidFocusTarget(target)) { - return; - } - - if (hadKeyboardEvent || focusTriggersKeyboardModality(target)) { - addFocusVisibleClass(target); - } - } - - function onBlur(event: Event): void { - const target = event.target; - if (!isValidFocusTarget(target)) { - return; - } - - if (target.hasAttribute('focus-visible')) { - hadFocusVisibleRecently = true; - if (hadFocusVisibleRecentlyTimeout) { - window.clearTimeout(hadFocusVisibleRecentlyTimeout); - } - hadFocusVisibleRecentlyTimeout = window.setTimeout(() => { - hadFocusVisibleRecently = false; - }, 100); - removeFocusVisibleClass(target); - } - } - - function onVisibilityChange(): void { - if (document.visibilityState === 'hidden') { - if (hadFocusVisibleRecently) { - hadKeyboardEvent = true; - } - addInitialPointerMoveListeners(); - } - } - - function onInitialPointerMove(event: Event): void { - const target = event.target; - if (isElement(target) && target.nodeName.toLowerCase() === 'html') { - return; - } - - hadKeyboardEvent = false; - removeInitialPointerMoveListeners(); - } - - function addInitialPointerMoveListeners(): void { - document.addEventListener('mousemove', onInitialPointerMove); - document.addEventListener('mousedown', onInitialPointerMove); - document.addEventListener('mouseup', onInitialPointerMove); - document.addEventListener('pointermove', onInitialPointerMove); - document.addEventListener('pointerdown', onInitialPointerMove); - document.addEventListener('pointerup', onInitialPointerMove); - document.addEventListener('touchmove', onInitialPointerMove); - document.addEventListener('touchstart', onInitialPointerMove); - document.addEventListener('touchend', onInitialPointerMove); - } - - function removeInitialPointerMoveListeners(): void { - document.removeEventListener('mousemove', onInitialPointerMove); - document.removeEventListener('mousedown', onInitialPointerMove); - document.removeEventListener('mouseup', onInitialPointerMove); - document.removeEventListener('pointermove', onInitialPointerMove); - document.removeEventListener('pointerdown', onInitialPointerMove); - document.removeEventListener('pointerup', onInitialPointerMove); - document.removeEventListener('touchmove', onInitialPointerMove); - document.removeEventListener('touchstart', onInitialPointerMove); - document.removeEventListener('touchend', onInitialPointerMove); - } - - document.addEventListener('keydown', onKeyDown, true); - document.addEventListener('mousedown', onPointerDown, true); - document.addEventListener('pointerdown', onPointerDown, true); - document.addEventListener('touchstart', onPointerDown, true); - document.addEventListener('visibilitychange', onVisibilityChange, true); - - addInitialPointerMoveListeners(); - - scope.addEventListener('focus', onFocus, true); - scope.addEventListener('blur', onBlur, true); - - return () => { - removeInitialPointerMoveListeners(); - - document.removeEventListener('keydown', onKeyDown, true); - document.removeEventListener('mousedown', onPointerDown, true); - document.removeEventListener('pointerdown', onPointerDown, true); - document.removeEventListener('touchstart', onPointerDown, true); - document.removeEventListener('visibilitychange', onVisibilityChange, true); - - scope.removeEventListener('focus', onFocus, true); - scope.removeEventListener('blur', onBlur, true); - }; -} diff --git a/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts b/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts index f78483c81..ccc234c4f 100644 --- a/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts +++ b/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts @@ -1,5 +1,6 @@ -import { UID } from '@symbiotejs/symbiote'; import { describe, expect, it, vi } from 'vitest'; +import type { Uid } from '../../../../lit/Uid'; +import { UID } from '../../../../utils/UID'; import { getClosestAspectRatio, parseCropPreset } from './parseCropPreset'; describe('parseCropPreset', () => { @@ -10,7 +11,7 @@ describe('parseCropPreset', () => { const generateSpy = vi.spyOn(UID, 'generate').mockImplementation(() => { const id = `id-${(uidCallCount % uniqueIds) + 1}`; uidCallCount += 1; - return id; + return id as Uid; }); const input = '16:9, 3:4, 4:3, 1:1'; diff --git a/src/blocks/CloudImageEditor/src/lib/parseCropPreset.ts b/src/blocks/CloudImageEditor/src/lib/parseCropPreset.ts index d9e953b25..1cfa6a386 100644 --- a/src/blocks/CloudImageEditor/src/lib/parseCropPreset.ts +++ b/src/blocks/CloudImageEditor/src/lib/parseCropPreset.ts @@ -1,6 +1,6 @@ -import { UID } from '@symbiotejs/symbiote'; import type { ConfigType } from '../../../../types/exported'; import { stringToArray } from '../../../../utils/stringToArray'; +import { UID } from '../../../../utils/UID'; import type { CropAspectRatio, CropPresetList } from '../types'; const EXCLUDED_TYPES = ['free']; diff --git a/src/blocks/CloudImageEditor/src/state.ts b/src/blocks/CloudImageEditor/src/state.ts index ebaabf73b..261cd158f 100644 --- a/src/blocks/CloudImageEditor/src/state.ts +++ b/src/blocks/CloudImageEditor/src/state.ts @@ -1,14 +1,14 @@ import { createCdnUrl, createCdnUrlModifiers } from '../../../utils/cdn-utils'; -import { serializeCsv } from '../../../utils/comma-separated'; import { TRANSPARENT_PIXEL_SRC } from '../../../utils/transparentPixelSrc'; import type { CloudImageEditorBlock } from './CloudImageEditorBlock'; import { transformationsToOperations } from './lib/transformationUtils'; import { ALL_TABS, TabId } from './toolbar-constants'; -import type { ApplyResult, Transformations } from './types'; +import type { ApplyResult, LoadingOperations, Transformations } from './types'; export function initState(fnCtx: CloudImageEditorBlock) { return { '*originalUrl': null, + '*loadingOperations': new Map() as LoadingOperations, '*faderEl': null, '*cropperEl': null, '*imgEl': null, @@ -20,26 +20,6 @@ export function initState(fnCtx: CloudImageEditorBlock) { '*currentAspectRatio': null, '*tabList': ALL_TABS, '*tabId': TabId.CROP, - - entry: null, - extension: null, - editorMode: false, - modalCaption: '', - isImage: false, - msg: '', - src: TRANSPARENT_PIXEL_SRC, - fileType: '', - showLoader: false, - - uuid: null, - cdnUrl: null, - cropPreset: '', - tabs: serializeCsv([...ALL_TABS]), - - 'presence.networkProblems': false, - 'presence.modalCaption': true, - 'presence.editorToolbar': false, - 'presence.viewerToolbar': true, // TODO: beware of wrong ctx in case of element re-creation: '*on.retryNetwork': () => { const images = fnCtx.querySelectorAll('img'); @@ -55,6 +35,10 @@ export function initState(fnCtx: CloudImageEditorBlock) { return; } const originalUrl = fnCtx.$['*originalUrl']; + if (!originalUrl) { + console.warn('Original URL is null, cannot apply transformations'); + return; + } const cdnUrlModifiers = createCdnUrlModifiers(transformationsToOperations(transformations), 'preview'); const cdnUrl = createCdnUrl(originalUrl, cdnUrlModifiers); diff --git a/src/blocks/CloudImageEditor/src/template.ts b/src/blocks/CloudImageEditor/src/template.ts deleted file mode 100644 index 1f09e09dd..000000000 --- a/src/blocks/CloudImageEditor/src/template.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TRANSPARENT_PIXEL_SRC } from '../../../utils/transparentPixelSrc'; -import svgIconsSprite from './svg-sprite'; - -export const TEMPLATE = /* HTML */ ` - ${svgIconsSprite} -
- -
-
- -
-
Network error
-
- -
-
-
-
{{fileType}}
-
-
- - - -
-
{{msg}}
-
-
- -
- -
-
-
-`; diff --git a/src/blocks/CloudImageEditor/src/utils/parseFilterValue.test.ts b/src/blocks/CloudImageEditor/src/utils/parseFilterValue.test.ts index 72b5ad1ba..758c21bcf 100644 --- a/src/blocks/CloudImageEditor/src/utils/parseFilterValue.test.ts +++ b/src/blocks/CloudImageEditor/src/utils/parseFilterValue.test.ts @@ -13,4 +13,12 @@ describe('parseFilterValue', () => { expect(parseFilterValue('no number')).toBeNull(); expect(parseFilterValue('123 456')).toBeNull(); }); + + it('returns null for null input', () => { + expect(parseFilterValue(null)).toBeNull(); + }); + + it('returns null for empty string', () => { + expect(parseFilterValue('')).toBeNull(); + }); }); diff --git a/src/blocks/CloudImageEditor/src/utils/parseFilterValue.ts b/src/blocks/CloudImageEditor/src/utils/parseFilterValue.ts index 4eeb6bcb3..b8ebb5e94 100644 --- a/src/blocks/CloudImageEditor/src/utils/parseFilterValue.ts +++ b/src/blocks/CloudImageEditor/src/utils/parseFilterValue.ts @@ -1,7 +1,8 @@ /** * Parses a string like "iothari 100" into an object { filter: "iothari", value: 100 } */ -export function parseFilterValue(str: string): { filter: string; value: number } | null { +export function parseFilterValue(str: string | null): { filter: string; value: number } | null { + if (!str) return null; const match = str.match(/^([A-Za-z]+)\s+(\d+)$/); if (!match) return null; const [, filter, amount] = match; diff --git a/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts b/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts index f5c493ab7..50c5e06c6 100644 --- a/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts +++ b/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts @@ -1,21 +1,32 @@ -import './cloud-image-editor-activity.css'; -import { ActivityBlock } from '../../abstract/ActivityBlock'; +import { html, nothing } from 'lit'; +import { state } from 'lit/decorators.js'; +import { ifDefined } from 'lit/directives/if-defined.js'; import type { TypedData } from '../../abstract/TypedData'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; -import type { uploadEntrySchema } from '../../abstract/uploadEntrySchema'; -import { CloudImageEditorBlock } from '../CloudImageEditor/index'; +import { LitActivityBlock } from '../../lit/LitActivityBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import type { ApplyResult, ChangeResult } from '../CloudImageEditor/src/types'; +import './cloud-image-editor-activity.css'; +import type { UploadEntryData } from '../../abstract/uploadEntrySchema'; +import type { Uid } from '../../lit/Uid'; export type ActivityParams = { internalId: string }; -export class CloudImageEditorActivity extends UploaderBlock { - override couldBeCtxOwner = true; - override activityType = ActivityBlock.activities.CLOUD_IMG_EDIT; +type EditorTemplateConfig = { + cdnUrl: string; + cropPreset?: string; + tabs?: string; +}; + +export class CloudImageEditorActivity extends LitUploaderBlock { + public override couldBeCtxOwner = true; + public override activityType = LitActivityBlock.activities.CLOUD_IMG_EDIT; + + private _entry?: TypedData; - private _entry?: TypedData; - private _instance?: CloudImageEditorBlock; + @state() + private _editorConfig: EditorTemplateConfig | null = null; - override get activityParams(): ActivityParams { + public override get activityParams(): ActivityParams { const params = super.activityParams; if ('internalId' in params) { return params; @@ -23,48 +34,71 @@ export class CloudImageEditorActivity extends UploaderBlock { throw new Error(`Cloud Image Editor activity params not found`); } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.registerActivity(this.activityType, { - onActivate: () => this.mountEditor(), - onDeactivate: () => this.unmountEditor(), + onActivate: () => this._mountEditor(), + onDeactivate: () => this._unmountEditor(), }); this.subConfigValue('cropPreset', (cropPreset) => { - if (this._instance && this._instance.getAttribute('crop-preset') !== cropPreset) { - this._instance.setAttribute('crop-preset', cropPreset); + if (!this._editorConfig) { + return; } + const normalized = cropPreset || undefined; + if (this._editorConfig.cropPreset === normalized) { + return; + } + this._editorConfig = { + ...this._editorConfig, + cropPreset: normalized, + }; }); this.subConfigValue('cloudImageEditorTabs', (tabs) => { - if (this._instance && this._instance.getAttribute('tabs') !== tabs) { - this._instance.setAttribute('tabs', tabs); + if (!this._editorConfig) { + return; + } + const normalized = tabs || undefined; + if (this._editorConfig.tabs === normalized) { + return; } + this._editorConfig = { + ...this._editorConfig, + tabs: normalized, + }; }); } - handleApply(e: CustomEvent): void { + private _handleApply(e: CustomEvent): void { if (!this._entry) { return; } + this.debugPrint(`editor event "apply"`, e.detail); const result = e.detail; this._entry.setMultipleValues({ cdnUrl: result.cdnUrl, cdnUrlModifiers: result.cdnUrlModifiers, }); - this.modalManager?.close(ActivityBlock.activities.CLOUD_IMG_EDIT); + this.modalManager?.close(LitActivityBlock.activities.CLOUD_IMG_EDIT); this.historyBack(); } - handleCancel(): void { - this.modalManager?.close(ActivityBlock.activities.CLOUD_IMG_EDIT); + private _handleCancel(event?: Event): void { + const detail = event instanceof CustomEvent ? event.detail : undefined; + this.debugPrint(`editor event "cancel"`, detail); + this.modalManager?.close(LitActivityBlock.activities.CLOUD_IMG_EDIT); this.historyBack(); } - mountEditor(): void { + public handleChange(event: CustomEvent): void { + this.debugPrint(`editor event "change"`, event.detail); + } + + private _mountEditor(): void { const { internalId } = this.activityParams; - const entry = this.uploadCollection.read(internalId); + const entry = this.uploadCollection.read(internalId as Uid); if (!entry) { throw new Error(`Entry with internalId "${internalId}" not found`); } @@ -73,45 +107,43 @@ export class CloudImageEditorActivity extends UploaderBlock { if (!cdnUrl) { throw new Error(`Entry with internalId "${internalId}" hasn't uploaded yet`); } + this._editorConfig = this._createEditorConfig(cdnUrl); + } - const instance = new CloudImageEditorBlock(); - const cropPreset = this.cfg.cropPreset; - const tabs = this.cfg.cloudImageEditorTabs; + private _unmountEditor(): void { + this._entry = undefined; + this._editorConfig = null; + } - instance.setAttribute('ctx-name', this.ctxName); - instance.setAttribute('cdn-url', cdnUrl); + public override render() { + if (!this._editorConfig) { + return nothing; + } + const { cdnUrl, cropPreset, tabs } = this._editorConfig; + + return html` + + `; + } + + private _createEditorConfig(cdnUrl: string): EditorTemplateConfig { + const config: EditorTemplateConfig = { cdnUrl }; + const cropPreset = this.cfg.cropPreset; if (cropPreset) { - instance.setAttribute('crop-preset', cropPreset); + config.cropPreset = cropPreset; } + const tabs = this.cfg.cloudImageEditorTabs; if (tabs) { - instance.setAttribute('tabs', tabs); + config.tabs = tabs; } - - instance.addEventListener('apply', (e) => { - const customEvent = e as CustomEvent; - this.handleApply(customEvent); - this.debugPrint(`editor event "apply"`, customEvent.detail); - }); - instance.addEventListener('cancel', (e) => { - const customEvent = e as CustomEvent; - this.handleCancel(); - this.debugPrint(`editor event "cancel"`, customEvent.detail); - }); - instance.addEventListener('change', (e) => { - const customEvent = e as CustomEvent; - this.debugPrint(`editor event "change"`, customEvent.detail); - }); - - this.innerHTML = ''; - this.appendChild(instance); - - this._instance = instance; - } - - unmountEditor(): void { - this._instance = undefined; - this._entry = undefined; - this.innerHTML = ''; + return config; } } diff --git a/src/blocks/Config/Config.ts b/src/blocks/Config/Config.ts index b87491462..106d573fc 100644 --- a/src/blocks/Config/Config.ts +++ b/src/blocks/Config/Config.ts @@ -1,10 +1,10 @@ // @ts-check -import { Block } from '../../abstract/Block'; import { sharedConfigKey } from '../../abstract/sharedConfigKey'; import type { ConfigComplexType, ConfigPlainType, ConfigType } from '../../types'; import { toKebabCase } from '../../utils/toKebabCase'; import { runAssertions } from './assertions'; import './config.css'; +import { LitBlock } from '../../lit/LitBlock'; import { computeProperty } from './computed-properties'; import { initialConfig } from './initialConfig'; import { normalizeConfigValue } from './normalizeConfigValue'; @@ -52,20 +52,19 @@ const attrStateMapping: Record = { const getLocalPropName = (key: string) => `__${key}`; // biome-ignore lint/suspicious/noUnsafeDeclarationMerging: This is intentional interface merging, used to add configuration setters/getters -export class Config extends Block { - override requireCtxName = true; - - constructor() { - super(); - - this.init$ = { - ...this.init$, - ...Object.fromEntries( - Object.entries(initialConfig).map(([key, value]) => [sharedConfigKey(key as keyof ConfigType), value]), - ), - computationControllers: new Map(), - } as unknown as Block['init$'] & ConfigType; - } +export class Config extends LitBlock { + public declare attributesMeta: Partial & { + 'ctx-name': string; + }; + + public override init$ = { + ...this.init$, + ...Object.fromEntries( + Object.entries(initialConfig).map(([key, value]) => [sharedConfigKey(key as keyof ConfigType), value]), + ), + } as unknown as LitBlock['init$'] & ConfigType; + + private _computationControllers: Map = new Map(); private _flushValueToAttribute(key: keyof ConfigType, value: unknown) { if (!isComplexKey(key)) { @@ -81,11 +80,13 @@ export class Config extends Block { } } - private _flushValueToState(key: keyof ConfigType, value: unknown) { + private _flushValueToState(key: TKey, value: unknown) { if (this.$[sharedConfigKey(key)] !== value) { if (typeof value === 'undefined' || value === null) { + // @ts-expect-error this.$[sharedConfigKey(key)] = initialConfig[key]; } else { + // @ts-expect-error this.$[sharedConfigKey(key)] = value; } } @@ -118,7 +119,7 @@ export class Config extends Block { return anyThis[localPropName] ?? this.$[sharedConfigKey(key)]; } - _assertSameValueDifferentReference(key: string, previousValue: unknown, nextValue: unknown) { + private _assertSameValueDifferentReference(key: string, previousValue: unknown, nextValue: unknown) { if (this.cfg.debug) { if ( nextValue !== previousValue && @@ -138,7 +139,7 @@ export class Config extends Block { } } - override initCallback() { + public override initCallback(): void { super.initCallback(); const anyThis = this as any; @@ -182,13 +183,15 @@ export class Config extends Block { key, setValue: this._setValue.bind(this), getValue: this._getValue.bind(this), - computationControllers: this.computationControllers, + computationControllers: this._computationControllers, }); }); } } - override attributeChangedCallback(name: keyof typeof attrStateMapping, oldVal: string, newVal: string) { + public override attributeChangedCallback(name: keyof typeof attrStateMapping, oldVal: string, newVal: string) { + super.attributeChangedCallback(name, oldVal, newVal); + if (oldVal === newVal) return; const anyThis = this as any; @@ -201,15 +204,18 @@ export class Config extends Block { if (key) { anyThis[key] = newVal; } + + if (attrStateMapping[name]) { + (this as any)[name] = newVal; + } } - get computationControllers() { - return this.$.computationControllers; + public static override get observedAttributes(): string[] { + const superObserved = super.observedAttributes; + return [...superObserved, ...Object.keys(attrKeyMapping)]; } } -Config.bindAttributes(attrStateMapping); - /** * Define empty DOM properties for all config keys on the Custom Element class prototype to make them checkable using * `key in element` syntax. This is required for the frameworks DOM property bindings to work. diff --git a/src/blocks/Config/computed-properties.ts b/src/blocks/Config/computed-properties.ts index 448e45084..8834233c5 100644 --- a/src/blocks/Config/computed-properties.ts +++ b/src/blocks/Config/computed-properties.ts @@ -2,7 +2,6 @@ import { getPrefixedCdnBaseAsync, isPrefixedCdnBase } from '@uploadcare/cname-pr import type { ConfigType } from '../../types/index'; import { deserializeCsv, serializeCsv } from '../../utils/comma-separated'; import { isPromiseLike } from '../../utils/isPromiseLike'; -import type { Config } from './Config'; import { DEFAULT_CDN_CNAME } from './initialConfig'; type ConfigKey = keyof ConfigType; diff --git a/src/blocks/Copyright/Copyright.ts b/src/blocks/Copyright/Copyright.ts index 1834359e8..b27e32ed9 100644 --- a/src/blocks/Copyright/Copyright.ts +++ b/src/blocks/Copyright/Copyright.ts @@ -1,8 +1,9 @@ -import { Block } from '../../abstract/Block'; +import { html } from 'lit'; +import { LitBlock } from '../../lit/LitBlock'; import './copyright.css'; -export class Copyright extends Block { - override initCallback() { +export class Copyright extends LitBlock { + public override initCallback(): void { super.initCallback(); this.subConfigValue('removeCopyright', (value) => { @@ -10,12 +11,14 @@ export class Copyright extends Block { }); } - static override template = /* HTML */ ` - Powered by Uploadcare - `; + public override render() { + return html` + Powered by Uploadcare + `; + } } diff --git a/src/blocks/DropArea/DropArea.ts b/src/blocks/DropArea/DropArea.ts index 53e1a5878..c271a04a6 100644 --- a/src/blocks/DropArea/DropArea.ts +++ b/src/blocks/DropArea/DropArea.ts @@ -1,54 +1,75 @@ -import { Data } from '@symbiotejs/symbiote'; -import { ActivityBlock } from '../../abstract/ActivityBlock'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { createRef, type Ref, ref } from 'lit/directives/ref.js'; +import { LitActivityBlock } from '../../lit/LitActivityBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import { stringToArray } from '../../utils/stringToArray'; import { UploadSource } from '../../utils/UploadSource'; -import { asBoolean } from '../Config/validatorsType'; import { addDropzone, DropzoneState, type DropzoneStateValue } from './addDropzone'; import './drop-area.css'; import type { DropItem } from './getDropItems'; -const GLOBAL_CTX_NAME = 'uc-drop-area'; -const REGISTRY_KEY = `${GLOBAL_CTX_NAME}/registry`; +const dropAreaRegistry = new Set(); -type DropAreaInitState = typeof UploaderBlock.prototype.init$ & { - state: DropzoneStateValue; - withIcon: boolean; - isClickable: boolean; - isFullscreen: boolean; - isEnabled: boolean; - isVisible: boolean; - isInitFlow: boolean; - text: string; - [REGISTRY_KEY]: Set; -}; +export class DropArea extends LitUploaderBlock { + public static override styleAttrs = [...super.styleAttrs, 'uc-drop-area']; -export class DropArea extends UploaderBlock { - static override styleAttrs = [...super.styleAttrs, 'uc-drop-area']; + @property({ type: Boolean, reflect: true }) + public disabled = false; + + @property({ type: Boolean, reflect: true }) + public clickable = false; + + @property({ type: Boolean, attribute: 'with-icon', reflect: true }) + public withIcon = false; + + @property({ type: Boolean, reflect: true }) + public fullscreen = false; + + @property({ type: Boolean, reflect: true }) + public initflow = false; + + @property({ type: String }) + public text?: string; + + @state() + private _isEnabled = true; + + @state() + private _isVisible = true; + + private get _localizedText() { + const customText = this.text; + if (typeof customText === 'string' && customText.length > 0) { + return this.l10n(customText) || customText; + } + return this.l10n('drop-files-here'); + } private _destroyDropzone: (() => void) | null = null; private _destroyContentWrapperDropzone: (() => void) | null = null; - private _onAreaClicked: ((event: Event) => void) | null = null; - - constructor() { - super(); - - this.init$ = { - ...this.init$, - state: DropzoneState.INACTIVE, - withIcon: false, - isClickable: false, - isFullscreen: false, - isEnabled: true, - isVisible: true, - isInitFlow: false, - text: '', - [REGISTRY_KEY]: new Set(), - } as DropAreaInitState; - } + private _contentWrapperRef: Ref = createRef(); + private readonly _handleAreaInteraction = (event: Event) => { + if (event instanceof KeyboardEvent) { + if (event.code !== 'Space' && event.code !== 'Enter') { + return; + } + } else if (!(event instanceof MouseEvent)) { + return; + } - isActive(): boolean { - if (!this.$.isEnabled) { + if (this.initflow) { + this.api.initFlow(); + return; + } + + this.api.openSystemDialog(); + }; + private _sourceListAllowsLocal = true; + private _clickableListenersAttached = false; + + public isActive(): boolean { + if (!this._isEnabled) { return false; } const bounds = this.getBoundingClientRect(); @@ -65,43 +86,20 @@ export class DropArea extends UploaderBlock { return hasSize && visible && isInViewport; } - override initCallback() { + public override initCallback(): void { super.initCallback(); - this.bindL10n('text', () => this.l10n('drop-files-here')); - - const registry = (this.$ as DropAreaInitState)[REGISTRY_KEY]; - registry.add(this); - - this.defineAccessor('disabled', (value: unknown) => { - this.set$({ isEnabled: !asBoolean(value) }); - }); - this.defineAccessor('clickable', (value: unknown) => { - this.set$({ isClickable: asBoolean(value) }); - }); - this.defineAccessor('initflow', (value: unknown) => { - this.set$({ isInitFlow: asBoolean(value) }); - }); - this.defineAccessor('with-icon', (value: unknown) => { - this.set$({ withIcon: asBoolean(value) }); - }); - this.defineAccessor('fullscreen', (value: unknown) => { - this.set$({ isFullscreen: asBoolean(value) }); - }); - - this.defineAccessor('text', (value: unknown) => { - if (typeof value === 'string') { - this.bindL10n('text', () => this.l10n(value) || value); - } else { - this.bindL10n('text', () => this.l10n('drop-files-here')); - } - }); + dropAreaRegistry.add(this); + this._updateIsEnabled(); + this._updateVisibility(); + this._updateClickableListeners(); + this._updateDragStateAttribute(DropzoneState.INACTIVE); this._destroyDropzone = addDropzone({ element: this, shouldIgnore: () => this._shouldIgnore(), onChange: (state: DropzoneStateValue) => { - this.$.state = state; + this._updateDragStateAttribute(state); }, onItems: (items: DropItem[]) => { if (!items.length) { @@ -116,15 +114,15 @@ export class DropArea extends UploaderBlock { } }); if (this.uploadCollection.size) { - this.modalManager?.open(ActivityBlock.activities.UPLOAD_LIST); + this.modalManager?.open(LitActivityBlock.activities.UPLOAD_LIST); this.set$({ - '*currentActivity': ActivityBlock.activities.UPLOAD_LIST, + '*currentActivity': LitActivityBlock.activities.UPLOAD_LIST, }); } }, }); - const contentWrapperEl = this.ref['content-wrapper']; + const contentWrapperEl = this._contentWrapperRef.value; if (contentWrapperEl) { this._destroyContentWrapperDropzone = addDropzone({ element: contentWrapperEl, @@ -139,70 +137,43 @@ export class DropArea extends UploaderBlock { }); } - this.sub('state', (state: DropzoneStateValue) => { - const stateText = Object.entries(DropzoneState) - .find(([, value]) => value === state)?.[0] - .toLowerCase(); - if (stateText) { - this.setAttribute('drag-state', stateText); - } - }); - this.subConfigValue('sourceList', (value: string) => { const list = stringToArray(value); - // Enable drop area if local files are allowed - this.$.isEnabled = list.includes(UploadSource.LOCAL); - // Show drop area if it's enabled or default slot is overrided - this.$.isVisible = this.$.isEnabled || !this.querySelector('[data-default-slot]'); - }); - - this.sub('isVisible', (value: boolean) => { - this.toggleAttribute('hidden', !value); - }); - - this.sub('isClickable', (value: boolean) => { - this.toggleAttribute('clickable', value); + this._sourceListAllowsLocal = list.includes(UploadSource.LOCAL); + this._updateIsEnabled(); + this._updateVisibility(); }); + } - if (this.$.isClickable) { - const onAreaClicked = (event: Event) => { - if (event instanceof KeyboardEvent) { - if (event.code === 'Space' || event.code === 'Enter') { - if (this.$.isInitFlow) { - this.api.initFlow(); - return; - } + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); - this.api.openSystemDialog(); - } - } else if (event instanceof MouseEvent) { - if (this.$.isInitFlow) { - this.api.initFlow(); - return; - } + if (changedProperties.has('disabled')) { + this._updateIsEnabled(); + this._updateVisibility(); + } + } - this.api.openSystemDialog(); - } - }; + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); - this._onAreaClicked = onAreaClicked; - this.addEventListener('keydown', onAreaClicked); - this.addEventListener('click', onAreaClicked); + if (changedProperties.has('clickable')) { + this._updateClickableListeners(); } } /** Ignore drop events if there are other visible drop areas on the page. */ private _shouldIgnore(): boolean { - if (!this.$.isEnabled) { + if (!this._isEnabled) { return true; } if (!this._couldHandleFiles()) { return true; } - if (!this.$.isFullscreen) { + if (!this.fullscreen) { return false; } - const registry = (this.$ as DropAreaInitState)[REGISTRY_KEY]; + const registry = dropAreaRegistry; if (registry.size === 0) { return false; } @@ -227,50 +198,65 @@ export class DropArea extends UploaderBlock { return true; } - override destroyCallback() { - super.destroyCallback(); + private _updateIsEnabled(): void { + const nextIsEnabled = this._sourceListAllowsLocal && !this.disabled; + this._isEnabled = nextIsEnabled; + } - const registry = (this.$ as DropAreaInitState)[REGISTRY_KEY]; - registry.delete(this); + private _updateVisibility(): void { + const shouldBeVisible = this._isEnabled || !this.querySelector('[data-default-slot]'); + this._isVisible = shouldBeVisible; + this.hidden = !shouldBeVisible; + } - if (registry.size === 0) { - Data.deleteCtx(GLOBAL_CTX_NAME); + private _updateDragStateAttribute(state: DropzoneStateValue): void { + const stateText = Object.entries(DropzoneState) + .find(([, value]) => value === state)?.[0] + .toLowerCase(); + if (stateText) { + this.setAttribute('drag-state', stateText); + } + } + + private _updateClickableListeners(): void { + if (this.clickable && !this._clickableListenersAttached) { + this.addEventListener('keydown', this._handleAreaInteraction); + this.addEventListener('click', this._handleAreaInteraction); + this._clickableListenersAttached = true; + } else if (!this.clickable && this._clickableListenersAttached) { + this.removeEventListener('keydown', this._handleAreaInteraction); + this.removeEventListener('click', this._handleAreaInteraction); + this._clickableListenersAttached = false; } + } + + public override disconnectedCallback(): void { + super.disconnectedCallback(); + + dropAreaRegistry.delete(this); this._destroyDropzone?.(); this._destroyContentWrapperDropzone?.(); - if (this._onAreaClicked) { - this.removeEventListener('keydown', this._onAreaClicked); - this.removeEventListener('click', this._onAreaClicked); - this._onAreaClicked = null; + if (this._clickableListenersAttached) { + this.removeEventListener('keydown', this._handleAreaInteraction); + this.removeEventListener('click', this._handleAreaInteraction); + this._clickableListenersAttached = false; } } -} -DropArea.template = /* HTML */ ` - - -
-
+ public override render() { + return html` + ${this.yield( + '', + html` +
+
- {{text}} -
- -`; - -DropArea.bindAttributes({ - // @ts-expect-error TODO: fix types inside symbiote - 'with-icon': null, - // @ts-expect-error TODO: fix types inside symbiote - clickable: null, - // @ts-expect-error TODO: fix types inside symbiote - text: null, - // @ts-expect-error TODO: fix types inside symbiote - fullscreen: null, - // @ts-expect-error TODO: fix types inside symbiote - disabled: null, - // @ts-expect-error TODO: fix types inside symbiote - initflow: null, -}); + ${this._localizedText} +
`, + )} + `; + } +} diff --git a/src/blocks/ExternalSource/ExternalSource.ts b/src/blocks/ExternalSource/ExternalSource.ts index 9982f7723..303a2de05 100644 --- a/src/blocks/ExternalSource/ExternalSource.ts +++ b/src/blocks/ExternalSource/ExternalSource.ts @@ -1,12 +1,14 @@ -import { create } from '@symbiotejs/symbiote'; -import { ActivityBlock } from '../../abstract/ActivityBlock'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { LitActivityBlock } from '../../lit/LitActivityBlock'; import { getTopLevelOrigin } from '../../utils/get-top-level-origin'; import { stringToArray } from '../../utils/stringToArray'; import { ExternalUploadSource } from '../../utils/UploadSource'; import { wildcardRegexp } from '../../utils/wildcardRegexp'; import { buildThemeDefinition } from './buildThemeDefinition'; import './external-source.css'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import { MessageBridge } from './MessageBridge'; import { queryString } from './query-string'; import type { InputMessageMap } from './types'; @@ -17,82 +19,54 @@ const SOCIAL_SOURCE_MAPPING: Record = { export type ActivityParams = { externalSourceType: string }; -type BaseInitState = InstanceType['init$']; -interface ExternalSourceInitState extends BaseInitState { - activityIcon: string; - activityCaption: string; +export class ExternalSource extends LitUploaderBlock { + public override couldBeCtxOwner = true; + public override activityType = LitActivityBlock.activities.EXTERNAL; + private _messageBridge?: MessageBridge; - selectedList: NonNullable; - total: number; + private _iframeRef = createRef(); + private _latestSelectionSummary: { selectedCount: number; total: number } | null = null; - isSelectionReady: boolean; - isDoneBtnEnabled: boolean; - couldSelectAll: boolean; - couldDeselectAll: boolean; - showSelectionStatus: boolean; - counterText: string; - doneBtnTextClass: string; - toolbarVisible: boolean; + @state() + private _selectedList: NonNullable = []; - onDone: () => void; - onCancel: () => void; + @state() + private _isSelectionReady = false; - onSelectAll: () => void; - onDeselectAll: () => void; -} + @state() + private _isDoneBtnEnabled = false; -export class ExternalSource extends UploaderBlock { - override couldBeCtxOwner = true; - override activityType = ActivityBlock.activities.EXTERNAL; - private _messageBridge?: MessageBridge; + @state() + private _couldSelectAll = false; - constructor() { - super(); - - this.init$ = { - ...this.init$, - activityIcon: '', - activityCaption: '', - - selectedList: [], - total: 0, - - isSelectionReady: false, - isDoneBtnEnabled: false, - couldSelectAll: false, - couldDeselectAll: false, - showSelectionStatus: false, - showDoneBtn: false, - counterText: '', - doneBtnTextClass: 'uc-hidden', - toolbarVisible: true, - - onDone: () => { - for (const message of this.$.selectedList) { - const url = this.extractUrlFromSelectedFile(message); - const { filename } = message; - const { externalSourceType } = this.activityParams; - this.api.addFileFromUrl(url, { fileName: filename, source: externalSourceType }); - } + @state() + private _couldDeselectAll = false; - this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; - this.modalManager?.open(ActivityBlock.activities.UPLOAD_LIST); - }, - onCancel: () => { - this.historyBack(); - }, + @state() + private _showSelectionStatus = false; - onSelectAll: () => { - this._messageBridge?.send({ type: 'select-all' }); - }, + @state() + private _showDoneBtn = false; - onDeselectAll: () => { - this._messageBridge?.send({ type: 'deselect-all' }); - }, - } as ExternalSourceInitState; + @state() + private _doneBtnTextClass = 'uc-hidden'; + + @state() + private _toolbarVisible = true; + + private get _counterText(): string { + if (!this._latestSelectionSummary) { + return ''; + } + + const { selectedCount, total } = this._latestSelectionSummary; + return this.l10n('selected-count', { + count: selectedCount, + total, + }); } - override get activityParams(): ActivityParams { + public override get activityParams(): ActivityParams { const params = super.activityParams; if ('externalSourceType' in params) { return params as ActivityParams; @@ -100,7 +74,7 @@ export class ExternalSource extends UploaderBlock { throw new Error(`External Source activity params not found`); } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.registerActivity(this.activityType, { onActivate: () => { @@ -113,40 +87,35 @@ export class ExternalSource extends UploaderBlock { return; } - this.set$({ - activityCaption: `${externalSourceType[0]?.toUpperCase()}${externalSourceType?.slice(1)}`, - activityIcon: externalSourceType, - }); - - this.mountIframe(); + this._mountIframe(); }, }); - this.sub('*currentActivityParams', (val) => { + this.sub('*currentActivityParams', () => { if (!this.isActivityActive) { return; } - this.unmountIframe(); - this.mountIframe(); + this._unmountIframe(); + this._mountIframe(); }); this.sub('*currentActivity', (val) => { if (val !== this.activityType) { - this.unmountIframe(); + this._unmountIframe(); } }); this.subConfigValue('multiple', (multiple) => { - this.$.showSelectionStatus = multiple; + this._showSelectionStatus = multiple; }); - this.subConfigValue('localeName', (val) => { - this.setupL10n(); + this.subConfigValue('localeName', () => { + this._setupL10n(); }); this.subConfigValue('externalSourcesEmbedCss', (embedCss) => { - this.applyEmbedCss(embedCss); + this._applyEmbedCss(embedCss); }); } - private extractUrlFromSelectedFile( + private _extractUrlFromSelectedFile( selectedFile: NonNullable[number], ): string { if (selectedFile.alternatives) { @@ -164,65 +133,56 @@ export class ExternalSource extends UploaderBlock { return selectedFile.url; } - private handleToolbarStateChange(message: InputMessageMap['toolbar-state-change']): void { - this.set$({ - toolbarVisible: message.isVisible, - }); + private _handleToolbarStateChange(message: InputMessageMap['toolbar-state-change']): void { + this._toolbarVisible = message.isVisible; } - private async handleSelectedFilesChange(message: InputMessageMap['selected-files-change']) { + private async _handleSelectedFilesChange(message: InputMessageMap['selected-files-change']) { if (this.cfg.multiple !== message.isMultipleMode) { console.error('Multiple mode mismatch'); return; } - this.bindL10n('counterText', () => - this.l10n('selected-count', { - count: message.selectedCount, - total: message.total, - }), - ); - - this.set$({ - doneBtnTextClass: message.isReady ? '' : 'uc-hidden', - isSelectionReady: message.isReady, - isDoneBtnEnabled: message.isReady && message.selectedFiles.length > 0, - showSelectionStatus: message.isMultipleMode && message.total > 0, - couldSelectAll: message.selectedCount < message.total, - couldDeselectAll: message.selectedCount === message.total, - selectedList: message.selectedFiles, - showDoneBtn: message.total > 0, - }); + this._setSelectionSummary(message.selectedCount, message.total); + + this._doneBtnTextClass = message.isReady ? '' : 'uc-hidden'; + this._isSelectionReady = message.isReady; + this._isDoneBtnEnabled = message.isReady && message.selectedFiles.length > 0; + this._showSelectionStatus = message.isMultipleMode && message.total > 0; + this._couldSelectAll = message.selectedCount < message.total; + this._couldDeselectAll = message.selectedCount === message.total; + this._selectedList = message.selectedFiles ?? []; + this._showDoneBtn = message.total > 0; } - private handleIframeLoad(): void { - this.applyEmbedCss(this.cfg.externalSourcesEmbedCss); - this.applyTheme(); - this.setupL10n(); + private _handleIframeLoad(): void { + this._applyEmbedCss(this.cfg.externalSourcesEmbedCss); + this._applyTheme(); + this._setupL10n(); } - private applyTheme(): void { + private _applyTheme(): void { this._messageBridge?.send({ type: 'set-theme-definition', theme: buildThemeDefinition(this), }); } - private applyEmbedCss(css: string): void { + private _applyEmbedCss(css: string): void { this._messageBridge?.send({ type: 'set-embed-css', css, }); } - private setupL10n(): void { + private _setupL10n(): void { this._messageBridge?.send({ type: 'set-locale-definition', localeDefinition: this.cfg.localeName, }); } - private remoteUrl(): string { + private _remoteUrl(): string { const { pubkey, remoteTabSessionKey, socialBaseUrl, multiple } = this.cfg; const { externalSourceType } = this.activityParams; const sourceName = SOCIAL_SOURCE_MAPPING[externalSourceType] ?? externalSourceType; @@ -242,21 +202,52 @@ export class ExternalSource extends UploaderBlock { return url.toString(); } - private mountIframe(): void { - const iframe = create({ - tag: 'iframe', - attributes: { - src: this.remoteUrl(), - marginheight: 0, - marginwidth: 0, - frameborder: 0, - allowTransparency: true, - }, - }) as unknown as HTMLIFrameElement; - iframe.addEventListener('load', this.handleIframeLoad.bind(this)); + private _handleDone = (): void => { + for (const message of this._selectedList) { + const url = this._extractUrlFromSelectedFile(message); + const { filename } = message; + const { externalSourceType } = this.activityParams; + this.api.addFileFromUrl(url, { fileName: filename, source: externalSourceType }); + } + + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; + this.modalManager?.open(LitActivityBlock.activities.UPLOAD_LIST); + }; + + private _handleCancel = (): void => { + this.historyBack(); + }; + + private _handleSelectAll = (): void => { + this._messageBridge?.send({ type: 'select-all' }); + }; + + private _handleDeselectAll = (): void => { + this._messageBridge?.send({ type: 'deselect-all' }); + }; + + private _setSelectionSummary(selectedCount: number, total: number): void { + this._latestSelectionSummary = { selectedCount, total }; + } - this.ref.iframeWrapper.innerHTML = ''; - this.ref.iframeWrapper.appendChild(iframe); + private _mountIframe(): void { + const iframe = document.createElement('iframe'); + iframe.src = this._remoteUrl(); + // @ts-expect-error + iframe.marginHeight = 0; + // @ts-expect-error + iframe.marginWidth = 0; + iframe.frameBorder = '0'; + // @ts-expect-error + iframe.allowTransparency = true; + iframe.addEventListener('load', this._handleIframeLoad.bind(this)); + + iframe.addEventListener('load', this._handleIframeLoad.bind(this)); + + if (this._iframeRef.value) { + this._iframeRef.value.innerHTML = ''; + this._iframeRef.value.appendChild(iframe); + } if (!iframe.contentWindow) { return; @@ -265,61 +256,73 @@ export class ExternalSource extends UploaderBlock { this._messageBridge?.destroy(); this._messageBridge = new MessageBridge(iframe.contentWindow, () => this.cfg.socialBaseUrl); - this._messageBridge.on('selected-files-change', this.handleSelectedFilesChange.bind(this)); - this._messageBridge.on('toolbar-state-change', this.handleToolbarStateChange.bind(this)); + this._messageBridge.on('selected-files-change', this._handleSelectedFilesChange.bind(this)); + this._messageBridge.on('toolbar-state-change', this._handleToolbarStateChange.bind(this)); - this.resetSelectionStatus(); + this._resetSelectionStatus(); } - private unmountIframe(): void { + private _unmountIframe(): void { this._messageBridge?.destroy(); this._messageBridge = undefined; - this.ref.iframeWrapper.innerHTML = ''; + if (this._iframeRef.value) { + this._iframeRef.value.innerHTML = ''; + } - this.resetSelectionStatus(); + this._resetSelectionStatus(); } - private resetSelectionStatus(): void { - this.set$({ - selectedList: [], - total: 0, - isDoneBtnEnabled: false, - couldSelectAll: false, - couldDeselectAll: false, - showSelectionStatus: false, - showDoneBtn: false, - }); + private _resetSelectionStatus(): void { + this._selectedList = []; + this._isSelectionReady = false; + this._isDoneBtnEnabled = false; + this._couldSelectAll = false; + this._couldDeselectAll = false; + this._showSelectionStatus = false; + this._showDoneBtn = false; + this._doneBtnTextClass = 'uc-hidden'; + this._latestSelectionSummary = null; } -} -ExternalSource.template = /* HTML */ ` - - - -
-
-
- -
- {{counterText}} - - -
- -
-
-`; + public override disconnectedCallback(): void { + super.disconnectedCallback(); + this._unmountIframe(); + } + + public override render() { + return html` + + + +
+
+
+ +
+ ${this._counterText} + + +
+ +
+
+ `; + } +} diff --git a/src/blocks/ExternalSource/MessageBridge.ts b/src/blocks/ExternalSource/MessageBridge.ts index 6b7f18a46..eea27b6ab 100644 --- a/src/blocks/ExternalSource/MessageBridge.ts +++ b/src/blocks/ExternalSource/MessageBridge.ts @@ -21,14 +21,14 @@ export class MessageBridge { private _getTargetOrigin: () => string; - constructor(context: Window, getTargetOrigin: () => string) { + public constructor(context: Window, getTargetOrigin: () => string) { this._context = context; this._getTargetOrigin = getTargetOrigin; window.addEventListener('message', this._handleMessage); } - _handleMessage = (e: MessageEvent) => { + private _handleMessage = (e: MessageEvent) => { if (e.source !== this._context) { return; } @@ -45,7 +45,7 @@ export class MessageBridge { } }; - on(type: T, handler: InputMessageHandler) { + public on(type: T, handler: InputMessageHandler) { const handlers = this._handlerMap.get(type) ?? new Set>(); if (!this._handlerMap.has(type)) { this._handlerMap.set(type, handlers); @@ -54,12 +54,12 @@ export class MessageBridge { handlers.add(handler as InputMessageHandler); } - send(message: OutputMessage) { + public send(message: OutputMessage) { const targetOrigin = this._getTargetOrigin(); this._context.postMessage(message, targetOrigin); } - destroy() { + public destroy() { window.removeEventListener('message', this._handleMessage); } } diff --git a/src/blocks/ExternalSource/external-source.css b/src/blocks/ExternalSource/external-source.css index 3a0d9538d..1bf16fea2 100644 --- a/src/blocks/ExternalSource/external-source.css +++ b/src/blocks/ExternalSource/external-source.css @@ -35,7 +35,7 @@ uc-external-source .uc-toolbar { display: flex; width: 100%; - grid-gap: var(--uc-padding); + gap: var(--uc-padding); align-items: center; justify-content: space-between; padding: var(--uc-padding); diff --git a/src/blocks/FileItem/FileItem.ts b/src/blocks/FileItem/FileItem.ts index 399223ab9..7340e778f 100644 --- a/src/blocks/FileItem/FileItem.ts +++ b/src/blocks/FileItem/FileItem.ts @@ -6,14 +6,16 @@ import { type UploadcareFile, uploadFile, } from '@uploadcare/upload-client'; -import { ActivityBlock } from '../../abstract/ActivityBlock'; +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; import type { UploadEntryTypedData } from '../../abstract/uploadEntrySchema'; +import { LitActivityBlock } from '../../lit/LitActivityBlock'; import { debounce } from '../../utils/debounce'; import { parseShrink } from '../../utils/parseShrink'; import { throttle } from '../../utils/throttle'; import { ExternalUploadSource } from '../../utils/UploadSource'; import './file-item.css'; -import { EventType, InternalEventType } from '../UploadCtxProvider/EventEmitter'; +import type { Uid } from '../../lit/Uid'; import { FileItemConfig } from './FileItemConfig'; const FileItemState = Object.freeze({ @@ -30,96 +32,98 @@ type FileItemStateValue = (typeof FileItemState)[keyof typeof FileItemState]; type UploadTrigger = Set; -type BaseInitState = InstanceType['init$']; - -interface FileItemInitState extends BaseInitState { - uid: string; - itemName: string; - errorText: string; - hint: string; - thumbUrl: string; - progressValue: number; - progressVisible: boolean; - badgeIcon: string; - isFinished: boolean; - isFailed: boolean; - isUploading: boolean; - isFocused: boolean; - isEditable: boolean; - showFileNames: boolean; - state: FileItemStateValue; - ariaLabelStatusFile: string; - onEdit: () => void; - onRemove: () => void; - onUpload: () => void; -} - export class FileItem extends FileItemConfig { - override couldBeCtxOwner = true; - override pauseRender = true; + protected override couldBeCtxOwner = true; + + @state() + private _pauseRender = true; + + @property({ type: String, attribute: false }) + public uid: Uid = '' as Uid; + + @state() + private _itemName = ''; + + @state() + private _errorText = ''; + + @state() + private _hint = ''; + + @state() + private _progressValue = 0; + + @state() + private _progressVisible = false; + + @state() + private _badgeIcon = ''; + + @state() + private _isFinished = false; + + @state() + private _isFailed = false; + + @state() + private _isUploading = false; + + @state() + private _isFocused = false; + + @state() + private _isEditable = false; + + @state() + private _showFileNames = false; + + @state() + private _ariaLabelStatusFile = ''; private _renderedOnce = false; private _observer?: IntersectionObserver; - protected _isIntersecting = false; - protected _thumbRect?: DOMRectReadOnly; - - constructor() { - super(); - - this.init$ = { - ...this.init$, - uid: '', - itemName: '', - errorText: '', - hint: '', - thumbUrl: '', - progressValue: 0, - progressVisible: false, - badgeIcon: '', - isFinished: false, - isFailed: false, - isUploading: false, - isFocused: false, - isEditable: false, - showFileNames: false, - state: FileItemState.IDLE, - ariaLabelStatusFile: '', - onEdit: this._withEntry((entry) => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'edit-file', - node: this.tagName, - }, - }, - }); - this.$['*currentActivityParams'] = { - internalId: entry.uid, - }; - this.modalManager?.open(ActivityBlock.activities.CLOUD_IMG_EDIT); - this.$['*currentActivity'] = ActivityBlock.activities.CLOUD_IMG_EDIT; - }), - onRemove: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'remove-file', - node: this.tagName, - }, - }, - }); - this.uploadCollection.remove(this.$.uid); + private _handleEdit = this.withEntry((entry) => { + this.telemetryManager.sendEvent({ + payload: { + metadata: { + event: 'edit-file', + node: this.tagName, + }, }, - onUpload: () => { - this.upload(); + }); + this.$['*currentActivityParams'] = { + internalId: entry.uid, + }; + this.modalManager?.open(LitActivityBlock.activities.CLOUD_IMG_EDIT); + this.$['*currentActivity'] = LitActivityBlock.activities.CLOUD_IMG_EDIT; + }); + + private _handleRemove = (): void => { + this.telemetryManager.sendEvent({ + payload: { + metadata: { + event: 'remove-file', + node: this.tagName, + }, }, - } as FileItemInitState; - } + }); + + if (this.uid) { + this.uploadCollection.remove(this.uid); + } + }; + + private _handleUploadClick = (): void => { + this._upload(); + }; + + private _calculateState(): void { + const entry = this.entry; + if (!entry) { + return; + } - private _calculateState = this._withEntry((entry) => { let state: FileItemStateValue = FileItemState.IDLE; if (entry.getValue('errors').length > 0) { @@ -136,14 +140,14 @@ export class FileItem extends FileItemConfig { state = FileItemState.FINISHED; } - this.$.state = state; - }); + this._handleState(entry, state); + } - private _debouncedCalculateState = debounce(this._calculateState.bind(this), 100); + private _debouncedCalculateState = debounce(() => this._calculateState(), 100); - private _updateHintAndProgress = this._withEntry( + private _updateHintAndProgress = this.withEntry( throttle((entry: UploadEntryTypedData, state?: FileItemStateValue) => { - const errorText = entry.getValue('errors')?.[0]?.message; + const errorText = entry.getValue('errors')?.[0]?.message ?? ''; const source = entry.getValue('source'); const externalUrl = entry.getValue('externalUrl'); const isFinished = state === FileItemState.FINISHED; @@ -160,44 +164,41 @@ export class FileItem extends FileItemConfig { hint = this.l10n('waiting-for', { source: this.l10n(`src-type-${source}`) }); } - this.set$({ - hint, - errorText, - progressVisible: isUploading || isQueuedForUploading || isQueuedForValidation || isValidationPending, - progressValue: isQueuedForValidation || isValidationPending ? 0 : entry.getValue('uploadProgress'), - ariaLabelStatusFile: - fileName && - this.l10n('a11y-file-item-status', { + this._hint = hint; + this._errorText = errorText; + this._progressVisible = isUploading || isQueuedForUploading || isQueuedForValidation || isValidationPending; + this._progressValue = isQueuedForValidation || isValidationPending ? 0 : entry.getValue('uploadProgress'); + this._ariaLabelStatusFile = fileName + ? this.l10n('a11y-file-item-status', { fileName, status: this.l10n(state?.description?.toLocaleLowerCase() ?? '').toLocaleLowerCase(), - }), - }); + }) + : ''; }, 100), ); - private _handleState = this._withEntry((entry, state: FileItemStateValue) => { + private _handleState(entry: UploadEntryTypedData, state: FileItemStateValue): void { if (state === FileItemState.FAILED) { - this.$.badgeIcon = 'badge-error'; + this._badgeIcon = 'badge-error'; } else if (state === FileItemState.FINISHED) { - this.$.badgeIcon = 'badge-success'; + this._badgeIcon = 'badge-success'; } if (state === FileItemState.UPLOADING) { - this.$.isFocused = false; + this._isFocused = false; + this.removeAttribute('focused'); } - this.set$({ - isFailed: state === FileItemState.FAILED, - isUploading: state === FileItemState.UPLOADING, - isFinished: state === FileItemState.FINISHED, - isEditable: this.cfg.useCloudImageEditor && entry.getValue('isImage') && entry.getValue('cdnUrl'), - }); + this._isFailed = state === FileItemState.FAILED; + this._isUploading = state === FileItemState.UPLOADING; + this._isFinished = state === FileItemState.FINISHED; + this._isEditable = Boolean(this.cfg.useCloudImageEditor && entry.getValue('isImage') && entry.getValue('cdnUrl')); this._updateHintAndProgress(state); - }); + } - override _reset(): void { - super._reset(); + protected override reset(): void { + super.reset(); this._debouncedCalculateState.cancel(); } @@ -207,81 +208,82 @@ export class FileItem extends FileItemConfig { return; } - this._isIntersecting = entry.isIntersecting; - this._thumbRect = entry.boundingClientRect; - if (entry.isIntersecting && !this._renderedOnce) { - this.render(); + this._pauseRender = false; this._renderedOnce = true; } } - private _handleEntryId(id: string): void { - this._reset(); + private _handleEntryId(id: Uid): void { + this.reset(); const entry = this.uploadCollection?.read(id); - this._entry = entry; + this.entry = entry; if (!entry) { return; } - this._subEntry('isQueuedForValidation', () => { + this.subEntry('isQueuedForValidation', () => { this._debouncedCalculateState(); }); - this._subEntry('isValidationPending', () => { + this.subEntry('isValidationPending', () => { this._debouncedCalculateState(); }); - this._subEntry('uploadProgress', () => { + this.subEntry('uploadProgress', () => { this._debouncedCalculateState(); }); - this._subEntry('isQueuedForUploading', () => { + this.subEntry('isQueuedForUploading', () => { this._debouncedCalculateState(); }); - this._subEntry('fileName', (name) => { - this.$.itemName = name || entry.getValue('externalUrl') || this.l10n('file-no-name'); + this.subEntry('fileName', (name) => { + this._itemName = name || entry.getValue('externalUrl') || this.l10n('file-no-name'); this._debouncedCalculateState(); }); - this._subEntry('externalUrl', (externalUrl) => { - this.$.itemName = entry.getValue('fileName') || externalUrl || this.l10n('file-no-name'); + this.subEntry('externalUrl', (externalUrl) => { + this._itemName = entry.getValue('fileName') || externalUrl || this.l10n('file-no-name'); }); - this._subEntry('fileInfo', () => { + this.subEntry('fileInfo', () => { this._debouncedCalculateState(); }); - this._subEntry('errors', () => this._debouncedCalculateState()); - this._subEntry('isUploading', () => this._debouncedCalculateState()); - this._subEntry('fileSize', () => this._debouncedCalculateState()); - this._subEntry('mimeType', () => this._debouncedCalculateState()); - this._subEntry('isImage', () => this._debouncedCalculateState()); + this.subEntry('errors', () => this._debouncedCalculateState()); + this.subEntry('isUploading', () => this._debouncedCalculateState()); + this.subEntry('fileSize', () => this._debouncedCalculateState()); + this.subEntry('mimeType', () => this._debouncedCalculateState()); + this.subEntry('isImage', () => this._debouncedCalculateState()); + + this._calculateState(); } private _updateShowFileNames(value: boolean): void { const isListMode = this.cfg.filesViewMode === 'list'; if (isListMode) { - this.$.showFileNames = true; + this._showFileNames = true; return; } - this.$.showFileNames = value; + this._showFileNames = value; } - override initCallback(): void { - super.initCallback(); + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); - this.sub('uid', (uid: string) => { - this._handleEntryId(uid); - }); + if (changedProperties.has('uid')) { + this._handleEntryId(this.uid); + } + } - this.sub('state', (state: FileItemStateValue) => { - this._handleState(state); - }); + public override initCallback(): void { + super.initCallback(); + + this._handleEntryId(this.uid); this.subConfigValue('useCloudImageEditor', () => this._debouncedCalculateState()); @@ -306,23 +308,15 @@ export class FileItem extends FileItemConfig { }; this.sub('*uploadTrigger', (itemsToUpload: UploadTrigger) => { - if (this._entry && !itemsToUpload.has(this._entry.uid)) { + if (this.entry && !itemsToUpload.has(this.entry.uid)) { return; } - setTimeout(() => this.isConnected && this.upload()); + setTimeout(() => this.isConnected && this._upload()); }); FileItem.activeInstances.add(this); } - override destroyCallback(): void { - super.destroyCallback(); - - FileItem.activeInstances.delete(this); - - this._reset(); - } - - override connectedCallback(): void { + public override connectedCallback(): void { super.connectedCallback(); this._observer = new window.IntersectionObserver(this._observerCallback.bind(this), { @@ -331,26 +325,17 @@ export class FileItem extends FileItemConfig { this._observer.observe(this); } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); this._observer?.disconnect(); - } - private _settingsOfShrink(): ReturnType { - return parseShrink(this.cfg.imageShrink); - } + FileItem.activeInstances.delete(this); - private async _processShrink(file: File): ReturnType { - const settings = this._settingsOfShrink(); - if (!settings) { - console.warn('Image shrink settings are invalid, skipping shrinking'); - return file; - } - return await shrinkFile(file, settings); + this.reset(); } - upload = this._withEntry(async (entry) => { + private _upload = this.withEntry(async (entry) => { if (!this.uploadCollection.read(entry.uid)) { return; } @@ -385,7 +370,12 @@ export class FileItem extends FileItemConfig { let file: File | Blob | null = entry.getValue('file'); if (file instanceof File && this.cfg.imageShrink) { try { - file = await this._processShrink(file); + const settings = parseShrink(this.cfg.imageShrink); + if (!settings) { + console.warn('Image shrink settings are invalid, skipping shrinking'); + } else { + file = await shrinkFile(file, settings); + } } catch { // keep original file if shrinking fails } @@ -429,7 +419,7 @@ export class FileItem extends FileItemConfig { source: entry.getValue('source') ?? null, }); - if (entry === this._entry) { + if (entry === this.entry) { this._debouncedCalculateState(); } } catch (cause) { @@ -457,49 +447,58 @@ export class FileItem extends FileItemConfig { }); } - if (entry === this._entry) { + if (entry === this.entry) { this._debouncedCalculateState(); } } }); - static override template = /* HTML */ ` -
- - -
- {{itemName}} - {{errorText}} - {{hint}} -
-
- - - -
- - -
-`; - - static activeInstances: Set = new Set(); + public static activeInstances: Set = new Set(); + + protected override shouldUpdate(changedProperties: PropertyValues): boolean { + if (this._pauseRender) { + return false; + } + return super.shouldUpdate(changedProperties); + } + + public override render() { + return html` +
+ + +
+ ${this._itemName} + ${this._errorText} + ${this._hint} +
+
+ + + +
+ + +
+ `; + } } diff --git a/src/blocks/FileItem/FileItemConfig.ts b/src/blocks/FileItem/FileItemConfig.ts index edf701c12..b95e15137 100644 --- a/src/blocks/FileItem/FileItemConfig.ts +++ b/src/blocks/FileItem/FileItemConfig.ts @@ -1,18 +1,18 @@ -import { UploaderBlock } from '../../abstract/UploaderBlock'; import type { UploadEntryData, UploadEntryKeys, UploadEntryTypedData } from '../../abstract/uploadEntrySchema'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; type EntrySubscription = ReturnType; -export class FileItemConfig extends UploaderBlock { - protected _entrySubs: Set = new Set(); +export class FileItemConfig extends LitUploaderBlock { + private _entrySubs: Set = new Set(); - protected _entry: UploadEntryTypedData | null = null; + protected entry: UploadEntryTypedData | null = null; - protected _withEntry( + protected withEntry( fn: (entry: UploadEntryTypedData, ...args: A) => R, ): (...args: A) => R | undefined { return (...args: A) => { - const entry = this._entry; + const entry = this.entry; if (!entry) { console.warn('No entry found'); return undefined; @@ -21,8 +21,8 @@ export class FileItemConfig extends UploaderBlock { }; } - protected _subEntry(prop: K, handler: (value: UploadEntryData[K]) => void): void { - this._withEntry<[K, (value: UploadEntryData[K]) => void], void>((entry, propInner, handlerInner) => { + protected subEntry(prop: K, handler: (value: UploadEntryData[K]) => void): void { + this.withEntry<[K, (value: UploadEntryData[K]) => void], void>((entry, propInner, handlerInner) => { const sub = entry.subscribe(propInner, (value) => { if (this.isConnected) { handlerInner(value); @@ -32,16 +32,16 @@ export class FileItemConfig extends UploaderBlock { })(prop, handler); } - protected _reset(): void { + protected reset(): void { for (const sub of this._entrySubs) { sub.remove(); } this._entrySubs = new Set(); - this._entry = null; + this.entry = null; } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); this._entrySubs = new Set(); } diff --git a/src/blocks/FileItem/file-item.css b/src/blocks/FileItem/file-item.css index 59ee9ec55..e6c131f79 100644 --- a/src/blocks/FileItem/file-item.css +++ b/src/blocks/FileItem/file-item.css @@ -130,13 +130,14 @@ } uc-file-item .uc-progress-bar { - opacity: 0.7; + --visible-opacity: 0.7; + top: calc(100% - 2px); height: 2px; } :where(.uc-contrast) uc-file-item .uc-progress-bar { - opacity: 1; + --visible-opacity: 1; } uc-file-item .uc-file-actions { @@ -222,8 +223,8 @@ uc-file-item[mode="grid"] .uc-progress-bar { width: initial; - height: 4px !important; - top: initial !important; + height: 4px; + top: initial; bottom: var(--uc-padding); left: var(--uc-padding); right: var(--uc-padding); diff --git a/src/blocks/FormInput/FormInput.ts b/src/blocks/FormInput/FormInput.ts index 4d94e82cf..c36bfd09e 100644 --- a/src/blocks/FormInput/FormInput.ts +++ b/src/blocks/FormInput/FormInput.ts @@ -1,14 +1,15 @@ -import { applyStyles } from '@symbiotejs/symbiote'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import type { OutputCollectionState } from '../../types/index'; +import { applyStyles } from '../../utils/applyStyles'; -export class FormInput extends UploaderBlock { - override requireCtxName = true; +export class FormInput extends LitUploaderBlock { + public declare propertiesMeta: { + 'ctx-name': string; + }; + private _validationInputElement: HTMLInputElement | null = null; + private _dynamicInputsContainer: HTMLDivElement | null = null; - _validationInputElement: HTMLInputElement | null = null; - _dynamicInputsContainer: HTMLDivElement | null = null; - - _createValidationInput(): HTMLInputElement { + private _createValidationInput(): HTMLInputElement { const validationInput = document.createElement('input'); validationInput.type = 'text'; validationInput.name = this.ctxName; @@ -22,7 +23,7 @@ export class FormInput extends UploaderBlock { return validationInput; } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this._validationInputElement = this._createValidationInput(); @@ -30,67 +31,68 @@ export class FormInput extends UploaderBlock { this.sub( '*collectionState', - (collectionState: OutputCollectionState) => { - { - if (!this._dynamicInputsContainer) { - const dynamicInputsContainer = document.createElement('div'); - this.appendChild(dynamicInputsContainer); - this._dynamicInputsContainer = dynamicInputsContainer; - } - if (!this._validationInputElement) { - const input = this._createValidationInput(); - this.appendChild(input); - this._validationInputElement = input; - } - - this._dynamicInputsContainer.innerHTML = ''; + (collectionState: OutputCollectionState | null) => { + if (!collectionState) { + return; + } + if (!this._dynamicInputsContainer) { + const dynamicInputsContainer = document.createElement('div'); + this.appendChild(dynamicInputsContainer); + this._dynamicInputsContainer = dynamicInputsContainer; + } + if (!this._validationInputElement) { + const input = this._createValidationInput(); + this.appendChild(input); + this._validationInputElement = input; + } - if (collectionState.status === 'uploading' || collectionState.status === 'idle') { - this._validationInputElement.value = ''; - this._validationInputElement.setCustomValidity(''); - return; - } + this._dynamicInputsContainer.innerHTML = ''; - if (collectionState.status === 'failed') { - const errorMsg = collectionState.errors[0]?.message; - this._validationInputElement.value = ''; - this._validationInputElement.setCustomValidity(errorMsg ?? ''); - return; - } + if (collectionState.status === 'uploading' || collectionState.status === 'idle') { + this._validationInputElement.value = ''; + this._validationInputElement.setCustomValidity(''); + return; + } - const group = collectionState.group ? collectionState.group : null; - if (group) { - this._validationInputElement.value = group.cdnUrl ?? ''; - this._validationInputElement.setCustomValidity(''); - return; - } + if (collectionState.status === 'failed') { + const errorMsg = collectionState.errors[0]?.message; + this._validationInputElement.value = ''; + this._validationInputElement.setCustomValidity(errorMsg ?? ''); + return; + } - const cdnUrls = collectionState.allEntries - .map((entry) => entry.cdnUrl) - .filter((url): url is string => typeof url === 'string'); + const group = collectionState.group ? collectionState.group : null; + if (group) { + this._validationInputElement.value = group.cdnUrl ?? ''; + this._validationInputElement.setCustomValidity(''); + return; + } - if (!this.cfg.multiple && cdnUrls.length === 1 && cdnUrls[0]) { - this._validationInputElement.value = cdnUrls[0]; - this._validationInputElement.setCustomValidity(''); - return; - } + const cdnUrls = collectionState.allEntries + .map((entry) => entry.cdnUrl) + .filter((url): url is string => typeof url === 'string'); - // Remove validation input to prevent it from being submitted - this._validationInputElement.remove(); - this._validationInputElement = null; + if (!this.cfg.multiple && cdnUrls.length === 1 && cdnUrls[0]) { + this._validationInputElement.value = cdnUrls[0]; + this._validationInputElement.setCustomValidity(''); + return; + } - const fr = new DocumentFragment(); + // Remove validation input to prevent it from being submitted + this._validationInputElement.remove(); + this._validationInputElement = null; - for (const value of cdnUrls) { - const input = document.createElement('input'); - input.type = 'hidden'; - input.name = `${this.ctxName}[]`; - input.value = value; - fr.appendChild(input); - } + const fr = new DocumentFragment(); - this._dynamicInputsContainer.replaceChildren(fr); + for (const value of cdnUrls) { + const input = document.createElement('input'); + input.type = 'hidden'; + input.name = `${this.ctxName}[]`; + input.value = value; + fr.appendChild(input); } + + this._dynamicInputsContainer.replaceChildren(fr); }, false, ); diff --git a/src/blocks/Icon/Icon.ts b/src/blocks/Icon/Icon.ts index feef2cd1e..aa66be89d 100644 --- a/src/blocks/Icon/Icon.ts +++ b/src/blocks/Icon/Icon.ts @@ -1,44 +1,54 @@ -import './icon.css'; -import { Block } from '../../abstract/Block'; +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { LitBlock } from '../../lit/LitBlock'; import type { IconHrefResolver } from '../../types/index'; +import './icon.css'; -export class Icon extends Block { - constructor() { - super(); +export class Icon extends LitBlock { + @property({ type: String }) + public name = ''; - this.init$ = { - ...this.init$, - name: '', - href: '', - }; - } + @state() + private _resolvedHref = ''; + + private _iconHrefResolver: IconHrefResolver | null = null; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - this.sub('name', (val: string) => { - if (!val) { - return; - } - let iconHref = `#uc-icon-${val}`; - this.subConfigValue('iconHrefResolver', (iconHrefResolver: IconHrefResolver | null) => { - if (iconHrefResolver) { - const customIconHref = iconHrefResolver(val); - iconHref = customIconHref ?? iconHref; - } - this.$.href = iconHref; - }); + this.setAttribute('aria-hidden', 'true'); + + this.subConfigValue('iconHrefResolver', (resolver: IconHrefResolver | null) => { + this._iconHrefResolver = resolver; + this._updateResolvedHref(); }); + } - this.setAttribute('aria-hidden', 'true'); + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + if (changedProperties.has('name')) { + this._updateResolvedHref(); + } } -} -Icon.template = /* HTML */ ` - - - -`; + private _updateResolvedHref(): void { + if (!this.name) { + this._resolvedHref = ''; + return; + } + + const defaultHref = `#uc-icon-${this.name}`; + const customHref = this._iconHrefResolver?.(this.name); + this._resolvedHref = customHref ?? defaultHref; + } -Icon.bindAttributes({ - name: 'name', -}); + public override render() { + return html` + ${this.yield( + '', + html``, + )} + `; + } +} diff --git a/src/blocks/Img/Img.js b/src/blocks/Img/Img.ts similarity index 57% rename from src/blocks/Img/Img.js rename to src/blocks/Img/Img.ts index 6251a06fb..1a2d35440 100644 --- a/src/blocks/Img/Img.js +++ b/src/blocks/Img/Img.ts @@ -1,8 +1,15 @@ import { ImgBase } from './ImgBase.js'; export class Img extends ImgBase { - initCallback() { - super.initCallback(); + public declare attributesMeta: + | { + src: string; + } + | { + uuid: string; + }; + public override connectedCallback(): void { + super.connectedCallback(); this.sub$$('src', () => { this.init(); @@ -12,7 +19,7 @@ export class Img extends ImgBase { this.init(); }); - this.sub$$('lazy', (val) => { + this.sub$$('lazy', (val) => { if (!this.$$('is-background-for') && !this.$$('is-preview-blur')) { this.img.loading = val ? 'lazy' : 'eager'; } diff --git a/src/blocks/Img/ImgBase.js b/src/blocks/Img/ImgBase.js deleted file mode 100644 index b1a6b17eb..000000000 --- a/src/blocks/Img/ImgBase.js +++ /dev/null @@ -1,408 +0,0 @@ -import { createCdnUrl, createCdnUrlModifiers, createOriginalUrl } from '../../utils/cdn-utils.js'; -import { stringToArray } from '../../utils/stringToArray.js'; -import { applyTemplateData } from '../../utils/template-utils.js'; -import { uniqueArray } from '../../utils/uniqueArray.js'; -import { - DEV_MODE, - HI_RES_K, - ImgTypeEnum, - MAX_WIDTH, - MAX_WIDTH_JPG, - ULTRA_RES_K, - UNRESOLVED_ATTR, -} from './configurations.js'; -import { ImgConfig } from './ImgConfig.js'; -import { parseObjectToString } from './utils/parseObjectToString.js'; - -export class ImgBase extends ImgConfig { - _img = new Image(); - _imgPreview = new Image(); - - /** - * @private - * @param {String} src - */ - _fmtAbs(src) { - const isRel = !src.includes('//'); - if (isRel && !DEV_MODE) { - src = new URL(src, document.baseURI).href; - } - return src; - } - - /** - * Validate size - * - * @param {String} [size] - * @returns {String | Number} - */ - _validateSize(size) { - if (size?.trim() !== '') { - // Extract numeric part - const numericPart = size.match(/\d+/)[0]; - - // Extract alphabetic part - const alphabeticPart = size.match(/[a-zA-Z]+/)[0]; - - const bp = parseInt(numericPart, 10); - - if (Number(bp) > MAX_WIDTH_JPG && this.hasFormatJPG) { - return MAX_WIDTH_JPG + alphabeticPart; - } else if (Number(bp) > MAX_WIDTH && !this.hasFormatJPG) { - return MAX_WIDTH + alphabeticPart; - } - } - - return size; - } - - /** - * Image operations - * - * @param {String} [size] - * @param {String} [blur] - */ - _getCdnModifiers(size, blur) { - const params = { - format: this.$$('format'), - quality: this.$$('quality'), - resize: this._validateSize(size), - blur, - 'cdn-operations': this.$$('cdn-operations'), - analytics: this.analyticsParams(), - }; - - return createCdnUrlModifiers(...parseObjectToString(params)); - } - - /** - * @private - * @param {String} [size] - * @param {String} [blur] - * @returns {any} - */ - _getUrlBase(size = '', blur = '') { - if (this.$$('src').startsWith('data:') || this.$$('src').startsWith('blob:')) { - return this.$$('src'); - } - - // Localhost + relative image path (DO NOTHING): - if (DEV_MODE && this.$$('src') && !this.$$('src').includes('//')) { - return this._proxyUrl(this.$$('src')); - } - - const cdnModifiers = this._getCdnModifiers(size, blur); - - if (this.$$('src').startsWith(this.$$('cdn-cname'))) { - return createCdnUrl(this.$$('src'), cdnModifiers); - } - - // Alternative CDN name: - if (this.$$('cdn-cname') && this.$$('uuid')) { - return this._proxyUrl( - createCdnUrl( - // - createOriginalUrl(this.$$('cdn-cname'), this.$$('uuid')), - cdnModifiers, - ), - ); - } - - // UUID only: - if (this.$$('uuid')) { - return this._proxyUrl( - createCdnUrl( - // - createOriginalUrl(this.$$('cdn-cname'), this.$$('uuid')), - cdnModifiers, - ), - ); - } - - // Alternative proxy name: - if (this.$$('proxy-cname')) { - return this._proxyUrl( - createCdnUrl( - // - this.$$('proxy-cname'), - cdnModifiers, - this._fmtAbs(this.$$('src')), - ), - ); - } - - // Project pubkey only: - if (this.$$('pubkey')) { - return this._proxyUrl( - createCdnUrl( - // - `https://${this.$$('pubkey')}.ucr.io/`, - cdnModifiers, - this._fmtAbs(this.$$('src')), - ), - ); - } - } - - /** - * @private - * @param {String} url - * @returns {String} - */ - _proxyUrl(url) { - const previewProxy = this.$$('secure-delivery-proxy'); - if (!previewProxy) { - return url; - } - return applyTemplateData( - this.$$('secure-delivery-proxy'), - { previewUrl: url }, - { transform: (value) => window.encodeURIComponent(value) }, - ); - } - - /** - * @param {HTMLElement} el - * @param {Number} [k] - * @param {Boolean} [wOnly] - */ - _getElSize(el, k = 1, wOnly = true) { - const rect = el.getBoundingClientRect(); - const w = k * Math.round(rect.width); - const h = wOnly ? '' : k * Math.round(rect.height); - - if (w || h) { - return `${w ? w : ''}x${h ? h : ''}`; - } else { - return null; - } - } - - /** @param {HTMLImageElement} img */ - _setupEventProxy(img) { - /** @param {Event} e */ - const proxifyEvent = (e) => { - e.stopPropagation(); - const event = new Event(e.type, e); - this.dispatchEvent(event); - }; - const EVENTS = ['load', 'error']; - for (const event of EVENTS) { - img.addEventListener(event, proxifyEvent); - } - } - - /** @type {HTMLImageElement} */ - get img() { - if (!this.hasPreviewImage) { - this._setupConfigForImage({ elNode: this._img }); - this.appendChild(this._img); - } - return this._img; - } - - get currentImg() { - return this.hasPreviewImage - ? { - type: ImgTypeEnum.PREVIEW, - img: this._imgPreview, - } - : { - type: ImgTypeEnum.MAIN, - img: this.img, - }; - } - - get hasPreviewImage() { - return this.$$('is-preview-blur'); - } - - get bgSelector() { - return this.$$('is-background-for'); - } - - get breakpoints() { - if (this.$$('breakpoints')) { - const list = stringToArray(this.$$('breakpoints')); - return uniqueArray(list.map((bp) => parseInt(bp, 10))); - } else { - return null; - } - } - - get hasFormatJPG() { - return this.$$('format').toLowerCase() === 'jpeg'; - } - - /** @param {HTMLElement} el */ - renderBg(el) { - const imgSet = new Set(); - - imgSet.add(`url("${this._getUrlBase(this._getElSize(el))}") 1x`); - if (this.$$('hi-res-support')) { - imgSet.add(`url("${this._getUrlBase(this._getElSize(el, HI_RES_K))}") ${HI_RES_K}x`); - } - - if (this.$$('ultra-res-support')) { - imgSet.add(`url("${this._getUrlBase(this._getElSize(el, ULTRA_RES_K))}") ${ULTRA_RES_K}x`); - } - - const iSet = `image-set(${[...imgSet].join(', ')})`; - el.style.setProperty('background-image', iSet); - el.style.setProperty('background-image', '-webkit-' + iSet); - } - - getSrcset() { - const srcset = new Set(); - if (this.breakpoints) { - this.breakpoints.forEach((bp) => { - srcset.add(this._getUrlBase(bp + 'x') + ` ${this._validateSize(bp + 'w')}`); - if (this.$$('hi-res-support')) { - srcset.add(this._getUrlBase(bp * HI_RES_K + 'x') + ` ${this._validateSize(bp * HI_RES_K + 'w')}`); - } - if (this.$$('ultra-res-support')) { - srcset.add(this._getUrlBase(bp * ULTRA_RES_K + 'x') + ` ${this._validateSize(bp * ULTRA_RES_K + 'w')}`); - } - }); - } else { - srcset.add(this._getUrlBase(this._getElSize(this.currentImg.img)) + ' 1x'); - if (this.$$('hi-res-support')) { - srcset.add(this._getUrlBase(this._getElSize(this.currentImg.img, 2)) + ' 2x'); - } - if (this.$$('ultra-res-support')) { - srcset.add(this._getUrlBase(this._getElSize(this.currentImg.img, 3)) + ' 3x'); - } - } - return [...srcset].join(); - } - - getSrc() { - return this._getUrlBase(); - } - - get srcUrlPreview() { - return this._getUrlBase('100x', '100'); - } - - renderBackground() { - [...document.querySelectorAll(this.bgSelector)].forEach((el) => { - if (this.$$('intersection')) { - this.initIntersection(el, () => { - this.renderBg(el); - }); - } else { - this.renderBg(el); - } - }); - } - - _appendURL({ elNode, src, srcset }) { - if (src) { - elNode.src = src; - } - - if (srcset) { - elNode.srcset = srcset; - } - } - - _setupConfigForImage({ elNode }) { - this._setupEventProxy(elNode); - this.initAttributes(elNode); - } - - loaderImage({ src, srcset, elNode }) { - return new Promise((resolve, reject) => { - this._setupConfigForImage({ elNode }); - - elNode.setAttribute(UNRESOLVED_ATTR, ''); - - elNode.addEventListener('load', () => { - elNode.removeAttribute(UNRESOLVED_ATTR); - resolve(elNode); - }); - - elNode.addEventListener('error', () => { - reject(false); - }); - - this._appendURL({ - elNode, - src, - srcset, - }); - }); - } - - async renderImage() { - if (this.$$('intersection')) { - if (this.hasPreviewImage) { - this._setupConfigForImage({ elNode: this._imgPreview }); - this.appendChild(this._imgPreview); - } - - this.initIntersection(this.currentImg.img, async () => { - if (this.hasPreviewImage) { - this._imgPreview.src = this.srcUrlPreview; - } - - try { - await this.loaderImage({ - src: this.getSrc(), - srcset: this.getSrcset(), - elNode: this._img, - }); - - if (this.hasPreviewImage) { - await this._imgPreview.remove(); - } - - this.appendChild(this._img); - } catch (e) { - if (this.hasPreviewImage) { - await this._imgPreview?.remove(); - } - this.appendChild(this._img); - } - }); - - return; - } - - try { - if (this.hasPreviewImage) { - await this.loaderImage({ - src: this.srcUrlPreview, - elNode: this._imgPreview, - }); - - this.appendChild(this._imgPreview); - } - - await this.loaderImage({ - src: this.getSrc(), - srcset: this.getSrcset(), - elNode: this._img, - }); - - if (this.hasPreviewImage) { - await this._imgPreview?.remove(); - } - - this.appendChild(this._img); - } catch (e) { - if (this.hasPreviewImage) { - await this._imgPreview?.remove(); - } - this.appendChild(this._img); - } - } - - init() { - if (this.bgSelector) { - this.renderBackground(); - } else { - this.renderImage(); - } - } -} diff --git a/src/blocks/Img/ImgBase.ts b/src/blocks/Img/ImgBase.ts new file mode 100644 index 000000000..6f9096158 --- /dev/null +++ b/src/blocks/Img/ImgBase.ts @@ -0,0 +1,391 @@ +import { createCdnUrl, createCdnUrlModifiers, createOriginalUrl } from '../../utils/cdn-utils.js'; +import { stringToArray } from '../../utils/stringToArray'; +import { applyTemplateData } from '../../utils/template-utils'; +import { uniqueArray } from '../../utils/uniqueArray'; +import { + DEV_MODE, + HI_RES_K, + ImgTypeEnum, + MAX_WIDTH, + MAX_WIDTH_JPG, + ULTRA_RES_K, + UNRESOLVED_ATTR, +} from './configurations'; +import { ImgConfig } from './ImgConfig'; +import { type ParseableParams, parseObjectToString } from './utils/parseObjectToString'; + +type ImgType = (typeof ImgTypeEnum)[keyof typeof ImgTypeEnum]; + +type LoaderParams = { + src?: string; + srcset?: string; + elNode: HTMLImageElement; +}; + +type ConfigImageParams = { + elNode: HTMLImageElement; +}; + +type AppendUrlParams = { + elNode: HTMLImageElement; + src?: string; + srcset?: string; +}; + +type CurrentImg = { + type: ImgType; + img: HTMLImageElement; +}; + +export class ImgBase extends ImgConfig { + private _img: HTMLImageElement = new Image(); + private _imgPreview: HTMLImageElement = new Image(); + + private _fmtAbs(src: string): string { + const isRel = !src.includes('//'); + if (isRel && !DEV_MODE) { + src = new URL(src, document.baseURI).href; + } + return src; + } + + private _validateSize(size?: string | null): string | null | undefined { + if (!size) { + return undefined; + } + const ensuredSize = size; + const numericPart = ensuredSize.match(/\d+/)?.[0]; + const alphabeticPart = ensuredSize.match(/[a-zA-Z]+/)?.[0]; + + if (!numericPart || !alphabeticPart) { + return undefined; + } + + const bp = parseInt(numericPart, 10); + + if (Number(bp) > MAX_WIDTH_JPG && this._hasFormatJPG) { + return MAX_WIDTH_JPG + alphabeticPart; + } else if (Number(bp) > MAX_WIDTH && !this._hasFormatJPG) { + return MAX_WIDTH + alphabeticPart; + } + + return size; + } + + private _getCdnModifiers(size?: string | null, blur?: string | null): string { + const params: ParseableParams = { + format: this._getTypedCssValue('format'), + quality: this._getTypedCssValue('quality'), + resize: this._validateSize(size), + blur, + 'cdn-operations': this._getTypedCssValue('cdn-operations') ?? undefined, + analytics: this.analyticsParams(), + }; + + return createCdnUrlModifiers(...parseObjectToString(params)); + } + + private _getTypedCssValue(key: string): string | number | boolean | null | undefined { + const value = this.$$(key); + if (value === null || value === undefined) { + return value as null | undefined; + } + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + return value; + } + return undefined; + } + + private _getUrlBase(size: string | null = '', blur: string | null = ''): string | undefined { + const src = this.$$('src') as string; + if (src.startsWith('data:') || src.startsWith('blob:')) { + return src; + } + + if (DEV_MODE && src && !src.includes('//')) { + return this._proxyUrl(src); + } + + const cdnModifiers = this._getCdnModifiers(size, blur); + const cdnCnameRaw = this.$$('cdn-cname') as string | undefined; + const cdnCname = cdnCnameRaw; + + if (src.startsWith(String(cdnCnameRaw))) { + return createCdnUrl(src, cdnModifiers); + } + + const uuid = this.$$('uuid') as string | undefined; + + if (cdnCname && uuid) { + return this._proxyUrl(createCdnUrl(createOriginalUrl(cdnCname, uuid), cdnModifiers)); + } + + if (uuid) { + return this._proxyUrl(createCdnUrl(createOriginalUrl(cdnCname as string, uuid), cdnModifiers)); + } + + const proxyCname = this.$$('proxy-cname') as string | undefined; + if (proxyCname) { + return this._proxyUrl(createCdnUrl(proxyCname, cdnModifiers, this._fmtAbs(src))); + } + + const pubkey = this.$$('pubkey') as string | undefined; + if (pubkey) { + return this._proxyUrl(createCdnUrl(`https://${pubkey}.ucr.io/`, cdnModifiers, this._fmtAbs(src))); + } + + return undefined; + } + + private _proxyUrl(url: string): string { + const previewProxy = this.$$('secure-delivery-proxy') as string | undefined; + if (!previewProxy) { + return url; + } + return applyTemplateData( + previewProxy, + { previewUrl: url }, + { transform: (value) => window.encodeURIComponent(value) }, + ); + } + + protected _getElSize(el: HTMLElement, k = 1, wOnly = true): string | null { + const rect = el.getBoundingClientRect(); + const w = k * Math.round(rect.width); + const h = wOnly ? '' : k * Math.round(rect.height); + + if (w || h) { + return `${w ? w : ''}x${h ? h : ''}`; + } else { + return null; + } + } + + private _setupEventProxy(img: HTMLImageElement): void { + const proxifyEvent = (e: Event) => { + e.stopPropagation(); + const event = new Event(e.type, e as EventInit); + this.dispatchEvent(event); + }; + const EVENTS: Array<'load' | 'error'> = ['load', 'error']; + for (const event of EVENTS) { + img.addEventListener(event, proxifyEvent); + } + } + + protected get img(): HTMLImageElement { + if (!this._hasPreviewImage) { + this._setupConfigForImage({ elNode: this._img }); + this.appendChild(this._img); + } + return this._img; + } + + private get _currentImg(): CurrentImg { + return this._hasPreviewImage + ? { + type: ImgTypeEnum.PREVIEW as ImgType, + img: this._imgPreview, + } + : { + type: ImgTypeEnum.MAIN as ImgType, + img: this.img, + }; + } + + private get _hasPreviewImage(): string | number | boolean | undefined { + return this.$$('is-preview-blur') as string | number | boolean | undefined; + } + + private get _bgSelector(): string | undefined { + return this.$$('is-background-for') as string | undefined; + } + + private get _breakpoints(): number[] | null { + const breakpointsValue = this.$$('breakpoints') as string | undefined; + if (breakpointsValue) { + const list = stringToArray(breakpointsValue); + return uniqueArray(list.map((bp) => parseInt(bp, 10))); + } else { + return null; + } + } + + private get _hasFormatJPG(): boolean { + return (this.$$('format') as string).toLowerCase() === 'jpeg'; + } + + private _renderBg(el: HTMLElement): void { + const imgSet = new Set(); + + imgSet.add(`url("${this._getUrlBase(this._getElSize(el)) as string}") 1x`); + if (this.$$('hi-res-support')) { + imgSet.add(`url("${this._getUrlBase(this._getElSize(el, HI_RES_K)) as string}") ${HI_RES_K}x`); + } + + if (this.$$('ultra-res-support')) { + imgSet.add(`url("${this._getUrlBase(this._getElSize(el, ULTRA_RES_K)) as string}") ${ULTRA_RES_K}x`); + } + + const iSet = `image-set(${[...imgSet].join(', ')})`; + el.style.setProperty('background-image', iSet); + el.style.setProperty('background-image', `-webkit-${iSet}`); + } + + private _getSrcset(): string { + const srcset = new Set(); + if (this._breakpoints) { + this._breakpoints.forEach((bp) => { + srcset.add(`${this._getUrlBase(`${bp}x`) as string} ${this._validateSize(`${bp}w`)}`); + if (this.$$('hi-res-support')) { + srcset.add(`${this._getUrlBase(`${bp * HI_RES_K}x`) as string} ${this._validateSize(`${bp * HI_RES_K}w`)}`); + } + if (this.$$('ultra-res-support')) { + srcset.add( + `${this._getUrlBase(`${bp * ULTRA_RES_K}x`) as string} ${this._validateSize(`${bp * ULTRA_RES_K}w`)}`, + ); + } + }); + } else { + srcset.add(`${this._getUrlBase(this._getElSize(this._currentImg.img)) as string} 1x`); + if (this.$$('hi-res-support')) { + srcset.add(`${this._getUrlBase(this._getElSize(this._currentImg.img, 2)) as string} 2x`); + } + if (this.$$('ultra-res-support')) { + srcset.add(`${this._getUrlBase(this._getElSize(this._currentImg.img, 3)) as string} 3x`); + } + } + return [...srcset].join(); + } + + private _getSrc(): string | undefined { + return this._getUrlBase(); + } + + private get _srcUrlPreview(): string | undefined { + return this._getUrlBase('100x', '100'); + } + + private _renderBackground(): void { + const selector = this._bgSelector as string; + [...document.querySelectorAll(selector)].forEach((el) => { + if (this.$$('intersection')) { + this.initIntersection(el as HTMLElement, () => { + this._renderBg(el as HTMLElement); + }); + } else { + this._renderBg(el as HTMLElement); + } + }); + } + + private _appendURL({ elNode, src, srcset }: AppendUrlParams): void { + if (src) { + elNode.src = src; + } + + if (srcset) { + elNode.srcset = srcset; + } + } + + private _setupConfigForImage({ elNode }: ConfigImageParams): void { + this._setupEventProxy(elNode); + this.initAttributes(elNode); + } + + private _loaderImage({ src, srcset, elNode }: LoaderParams): Promise { + return new Promise((resolve, reject) => { + this._setupConfigForImage({ elNode }); + + elNode.setAttribute(UNRESOLVED_ATTR, ''); + + elNode.addEventListener('load', () => { + elNode.removeAttribute(UNRESOLVED_ATTR); + resolve(elNode); + }); + + elNode.addEventListener('error', () => { + reject(false); + }); + + this._appendURL({ + elNode, + src, + srcset, + }); + }); + } + + private async _renderImage(): Promise { + if (this.$$('intersection')) { + if (this._hasPreviewImage) { + this._setupConfigForImage({ elNode: this._imgPreview }); + this.appendChild(this._imgPreview); + } + + this.initIntersection(this._currentImg.img, async () => { + if (this._hasPreviewImage) { + this._imgPreview.src = this._srcUrlPreview as string; + } + + try { + await this._loaderImage({ + src: this._getSrc(), + srcset: this._getSrcset(), + elNode: this._img, + }); + + if (this._hasPreviewImage) { + await this._imgPreview.remove(); + } + + this.appendChild(this._img); + } catch { + if (this._hasPreviewImage) { + await this._imgPreview?.remove(); + } + this.appendChild(this._img); + } + }); + + return; + } + + try { + if (this._hasPreviewImage) { + await this._loaderImage({ + src: this._srcUrlPreview, + elNode: this._imgPreview, + }); + + this.appendChild(this._imgPreview); + } + + await this._loaderImage({ + src: this._getSrc(), + srcset: this._getSrcset(), + elNode: this._img, + }); + + if (this._hasPreviewImage) { + await this._imgPreview?.remove(); + } + + this.appendChild(this._img); + } catch { + if (this._hasPreviewImage) { + await this._imgPreview?.remove(); + } + this.appendChild(this._img); + } + } + + protected init(): void { + if (this._bgSelector) { + this._renderBackground(); + } else { + this._renderImage(); + } + } +} diff --git a/src/blocks/Img/ImgConfig.js b/src/blocks/Img/ImgConfig.js deleted file mode 100644 index e6c708426..000000000 --- a/src/blocks/Img/ImgConfig.js +++ /dev/null @@ -1,102 +0,0 @@ -import { BaseComponent, Data } from '@symbiotejs/symbiote'; -import { PACKAGE_NAME, PACKAGE_VERSION } from '../../env.ts'; -import { CSS_PREF } from './configurations.js'; -import { PROPS_MAP } from './props-map.js'; - -const CSS_PROPS = Object.create(null); -for (const prop in PROPS_MAP) { - CSS_PROPS[CSS_PREF + prop] = PROPS_MAP[prop]?.default || ''; -} - -export class ImgConfig extends BaseComponent { - cssInit$ = CSS_PROPS; - - /** - * @param {String} key - * @returns {any} - */ - $$(key) { - return this.$[CSS_PREF + key]; - } - - /** @param {Object} kvObj */ - set$$(kvObj) { - for (const key in kvObj) { - this.$[CSS_PREF + key] = kvObj[key]; - } - } - - /** - * @param {String} key - * @param {(val: any) => void} kbFn - */ - sub$$(key, kbFn) { - this.sub(CSS_PREF + key, (val) => { - // null comes from CSS context property - // empty string comes from attribute value - if (val === null || val === '') { - return; - } - kbFn(val); - }); - } - - analyticsParams() { - return `-/@clib/${PACKAGE_NAME}/${PACKAGE_VERSION}/uc-img/`; - } - - initAttributes(el) { - [...this.attributes].forEach((attr) => { - if (!PROPS_MAP[attr.name]) { - el.setAttribute(attr.name, attr.value); - } - }); - } - - /** - * @param {HTMLElement} el - * @param {() => void} cbkFn - */ - initIntersection(el, cbkFn) { - const opts = { - root: null, - rootMargin: '0px', - }; - /** @private */ - this._isnObserver = new IntersectionObserver((entries) => { - entries.forEach((ent) => { - if (ent.isIntersecting) { - cbkFn(); - this._isnObserver.unobserve(el); - } - }); - }, opts); - this._isnObserver.observe(el); - if (!this._observed) { - /** @private */ - this._observed = new Set(); - } - this._observed.add(el); - } - - destroyCallback() { - super.destroyCallback(); - if (this._isnObserver) { - this._observed.forEach((el) => { - this._isnObserver.unobserve(el); - }); - this._isnObserver = null; - } - Data.deleteCtx(this); - } - - static get observedAttributes() { - return Object.keys(PROPS_MAP); - } - - attributeChangedCallback(name, oldVal, newVal) { - window.setTimeout(() => { - this.$[CSS_PREF + name] = newVal; - }); - } -} diff --git a/src/blocks/Img/ImgConfig.ts b/src/blocks/Img/ImgConfig.ts new file mode 100644 index 000000000..6afc3203d --- /dev/null +++ b/src/blocks/Img/ImgConfig.ts @@ -0,0 +1,137 @@ +import { LitElement } from 'lit'; +import { PACKAGE_NAME, PACKAGE_VERSION } from '../../env.js'; +import { CssDataMixin } from '../../lit/CssDataMixin.js'; +import { RegisterableElementMixin } from '../../lit/RegisterableElementMixin.js'; +import { CSS_PREF } from './configurations.js'; +import { PROPS_MAP } from './props-map.js'; + +type CssPropValue = string | number | undefined | null; +type CssPropRecord = Record; +type PropConfig = { default?: CssPropValue } | Record; + +export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement)) { + private _state: CssPropRecord = {}; + private _subscribers: Map void>> = new Map(); + private _isnObserver: IntersectionObserver | null = null; + private _observed: Set | null = null; + + public override createRenderRoot(): HTMLElement | ShadowRoot { + return this; + } + + public constructor() { + super(); + for (const prop in PROPS_MAP) { + const config = PROPS_MAP[prop as keyof typeof PROPS_MAP] as PropConfig | undefined; + this._state[CSS_PREF + prop] = (config as { default?: CssPropValue })?.default || ''; + } + } + + protected $$(key: string): unknown { + return this._state[CSS_PREF + key]; + } + + protected set$$(kvObj: Record): void { + for (const key in kvObj) { + const fullKey = CSS_PREF + key; + const val = kvObj[key]; + this._state[fullKey] = val; + this._notify(fullKey, val); + } + } + + protected sub$$(key: string, kbFn: (val: T) => void): void { + const fullKey = CSS_PREF + key; + if (!this._subscribers.has(fullKey)) { + this._subscribers.set(fullKey, new Set()); + } + this._subscribers.get(fullKey)?.add(kbFn as any); + + const currentVal = this._state[fullKey]; + if (currentVal !== null && currentVal !== '') { + kbFn(currentVal as T); + } + } + + private _notify(key: string, val: unknown) { + if (this._subscribers.has(key)) { + this._subscribers.get(key)?.forEach((cb) => { + if (val === null || val === '') { + return; + } + cb(val); + }); + } + } + + protected analyticsParams(): string { + return `-/@clib/${PACKAGE_NAME}/${PACKAGE_VERSION}/uc-img/`; + } + + protected initAttributes(el: HTMLElement): void { + Array.from(this.attributes).forEach((attr) => { + const currentAttr = attr as Attr; + if (!PROPS_MAP[currentAttr.name as keyof typeof PROPS_MAP]) { + el.setAttribute(currentAttr.name, currentAttr.value); + } + }); + } + + protected initIntersection(el: HTMLElement, cbkFn: () => void): void { + const opts: IntersectionObserverInit = { + root: null, + rootMargin: '0px', + }; + this._isnObserver = new IntersectionObserver((entries) => { + entries.forEach((ent) => { + if (ent.isIntersecting) { + cbkFn(); + this._isnObserver?.unobserve(el); + } + }); + }, opts); + this._isnObserver.observe(el); + if (!this._observed) { + this._observed = new Set(); + } + this._observed.add(el); + } + + public override connectedCallback(): void { + super.connectedCallback(); + this._initCssProperties(); + } + + private _initCssProperties(): void { + for (const prop in PROPS_MAP) { + const fullKey = CSS_PREF + prop; + const val = this.getCssData(fullKey, true); + if (val !== null && val !== undefined) { + this._state[fullKey] = val as CssPropValue; + } + } + } + + public override disconnectedCallback(): void { + super.disconnectedCallback(); + if (this._isnObserver) { + this._observed?.forEach((el) => { + this._isnObserver?.unobserve(el); + }); + this._isnObserver = null; + } + this._subscribers.clear(); + } + + public static override get observedAttributes(): string[] { + return Object.keys(PROPS_MAP); + } + + public override attributeChangedCallback(name: string, _oldVal: string | null, newVal: string | null): void { + window.setTimeout(() => { + const fullKey = CSS_PREF + name; + this._state[fullKey] = newVal; + this._notify(fullKey, newVal); + }); + } +} diff --git a/src/blocks/Img/test.css b/src/blocks/Img/test.css deleted file mode 100644 index 740a1223c..000000000 --- a/src/blocks/Img/test.css +++ /dev/null @@ -1,16 +0,0 @@ -uc-img { - --uc-img-pubkey: "364c0864158c27472ffe"; - --uc-img-test: "TEST"; - - display: contents; -} - -uc-img > img { - transition: 1s; -} - -uc-img > img[unresolved] { - transform: scale(0.8); - opacity: 0; - transition: 1s; -} diff --git a/src/blocks/Img/utils/parseObjectToString.ts b/src/blocks/Img/utils/parseObjectToString.ts index 40898405a..18b4390f3 100644 --- a/src/blocks/Img/utils/parseObjectToString.ts +++ b/src/blocks/Img/utils/parseObjectToString.ts @@ -1,4 +1,4 @@ -type ParseableParams = Record; +export type ParseableParams = Record; export const parseObjectToString = (params: ParseableParams): (string | number | boolean | null | undefined)[] => Object.entries(params) diff --git a/src/blocks/Modal/Modal.ts b/src/blocks/Modal/Modal.ts index 303e52feb..71ab3b6aa 100644 --- a/src/blocks/Modal/Modal.ts +++ b/src/blocks/Modal/Modal.ts @@ -1,34 +1,20 @@ -import { Block } from '../../abstract/Block'; +import { html } from 'lit'; import type { ModalCb, ModalId } from '../../abstract/managers/ModalManager'; import { ModalEvents } from '../../abstract/managers/ModalManager'; +import { LitBlock } from '../../lit/LitBlock'; import { EventType } from '../UploadCtxProvider/EventEmitter'; import './modal.css'; +import { createRef, ref } from 'lit/directives/ref.js'; let LAST_ACTIVE_MODAL_ID: ModalId | null = null; -export class Modal extends Block { - static override styleAttrs = [...super.styleAttrs, 'uc-modal']; - static override StateConsumerScope = 'modal'; +export class Modal extends LitBlock { + public static override styleAttrs = [...super.styleAttrs, 'uc-modal']; private _mouseDownTarget: EventTarget | null | undefined; + private _dialogEl = createRef(); - handleModalOpen!: ModalCb; - handleModalClose!: ModalCb; - handleModalCloseAll!: ModalCb; - - constructor() { - super(); - this.init$ = { - ...this.init$, - closeClicked: this._handleDialogClose, - }; - } - - _handleBackdropClick = (): void => { - this._closeDialog(); - }; - - _closeDialog = (): void => { + private _closeDialog = (): void => { this.modalManager?.close(this.id); if (!this.modalManager?.hasActiveModals) { @@ -36,23 +22,23 @@ export class Modal extends Block { } }; - _handleDialogClose = (): void => { + private _handleDialogClose = (): void => { this._closeDialog(); }; - _handleDialogMouseDown = (e: MouseEvent): void => { + private _handleDialogMouseDown = (e: MouseEvent): void => { this._mouseDownTarget = e.target; }; - _handleDialogMouseUp = (e: MouseEvent): void => { + private _handleDialogMouseUp = (e: MouseEvent): void => { const target = e.target as EventTarget | null; - if (target === this.ref.dialog && target === this._mouseDownTarget) { + if (target === this._dialogEl.value && target === this._mouseDownTarget) { this._closeDialog(); } }; - show(): void { - const dialog = this.ref.dialog as HTMLDialogElement & { + public show(): void { + const dialog = this._dialogEl.value as HTMLDialogElement & { showModal?: () => void; }; if (typeof dialog.showModal === 'function') { @@ -67,8 +53,8 @@ export class Modal extends Block { } } - hide(): void { - const dialog = this.ref.dialog as HTMLDialogElement & { + public hide(): void { + const dialog = this._dialogEl.value as HTMLDialogElement & { close?: () => void; }; if (typeof dialog.close === 'function') { @@ -79,7 +65,7 @@ export class Modal extends Block { } } - private _handleModalOpen({ id }: Parameters[0]): void { + private _handleModalOpen = ({ id }: Parameters[0]): void => { if (id === this.id) { LAST_ACTIVE_MODAL_ID = id; this.show(); @@ -87,9 +73,9 @@ export class Modal extends Block { } else { this.hide(); } - } + }; - private _handleModalClose({ id }: Parameters[0]): void { + private _handleModalClose = ({ id }: Parameters[0]): void => { if (id === this.id) { this.hide(); this.emit( @@ -98,9 +84,9 @@ export class Modal extends Block { { debounce: true }, ); } - } + }; - private _handleModalCloseAll(_data: Parameters[0]): void { + private _handleModalCloseAll = (_data: Parameters[0]): void => { this.hide(); if (LAST_ACTIVE_MODAL_ID === this.id) { @@ -110,18 +96,13 @@ export class Modal extends Block { { debounce: true }, ); } - } + }; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.modalManager?.registerModal(this.id, this); - const dialog = this.ref.dialog as HTMLDialogElement; - dialog.addEventListener('close', this._handleDialogClose); - dialog.addEventListener('mousedown', this._handleDialogMouseDown); - dialog.addEventListener('mouseup', this._handleDialogMouseUp); - this.subConfigValue('modalBackdropStrokes', (val: boolean) => { if (val) { this.setAttribute('strokes', ''); @@ -130,32 +111,34 @@ export class Modal extends Block { } }); - this.handleModalOpen = this._handleModalOpen.bind(this); - this.handleModalClose = this._handleModalClose.bind(this); - this.handleModalCloseAll = this._handleModalCloseAll.bind(this); - - this.modalManager?.subscribe(ModalEvents.OPEN, this.handleModalOpen); - this.modalManager?.subscribe(ModalEvents.CLOSE, this.handleModalClose); - this.modalManager?.subscribe(ModalEvents.CLOSE_ALL, this.handleModalCloseAll); + this.modalManager?.subscribe(ModalEvents.OPEN, this._handleModalOpen); + this.modalManager?.subscribe(ModalEvents.CLOSE, this._handleModalClose); + this.modalManager?.subscribe(ModalEvents.CLOSE_ALL, this._handleModalCloseAll); } - override destroyCallback(): void { - super.destroyCallback(); + public override disconnectedCallback(): void { + super.disconnectedCallback(); document.body.style.overflow = ''; this._mouseDownTarget = undefined; - const dialog = this.ref.dialog as HTMLDialogElement; - dialog.removeEventListener('close', this._handleDialogClose); - dialog.removeEventListener('mousedown', this._handleDialogMouseDown); - dialog.removeEventListener('mouseup', this._handleDialogMouseUp); - - this.modalManager?.unsubscribe(ModalEvents.OPEN, this.handleModalOpen); - this.modalManager?.unsubscribe(ModalEvents.CLOSE, this.handleModalClose); - this.modalManager?.unsubscribe(ModalEvents.CLOSE_ALL, this.handleModalCloseAll); + + this.modalManager?.unsubscribe(ModalEvents.OPEN, this._handleModalOpen); + this.modalManager?.unsubscribe(ModalEvents.CLOSE, this._handleModalClose); + this.modalManager?.unsubscribe(ModalEvents.CLOSE_ALL, this._handleModalCloseAll); } -} -Modal.template = /* HTML */ ` - - + private _handleDialogRef(dialog: Element | undefined): void { + this._dialogEl = { value: dialog } as typeof this._dialogEl; + + this._dialogEl.value?.addEventListener('close', this._handleDialogClose); + this._dialogEl.value?.addEventListener('mousedown', this._handleDialogMouseDown); + this._dialogEl.value?.addEventListener('mouseup', this._handleDialogMouseUp); + } + + public override render() { + return html` + + ${this.yield('')} `; + } +} diff --git a/src/blocks/Modal/modal.css b/src/blocks/Modal/modal.css index 892e3f552..904a2718b 100644 --- a/src/blocks/Modal/modal.css +++ b/src/blocks/Modal/modal.css @@ -2,7 +2,7 @@ @supports selector(dialog::backdrop) { :where([uc-modal]) > dialog::backdrop { /* backdrop don't inherit theme properties */ - background-color: oklch(0 0 0 / 0.1); + background-color: oklch(0% 0 0 / 0.1); } :where([uc-modal])[strokes] > dialog::backdrop { /* TODO: it's not working, fix it */ diff --git a/src/blocks/ProgressBar/ProgressBar.ts b/src/blocks/ProgressBar/ProgressBar.ts index bb9cc9621..1e0534de2 100644 --- a/src/blocks/ProgressBar/ProgressBar.ts +++ b/src/blocks/ProgressBar/ProgressBar.ts @@ -1,50 +1,95 @@ import './progress-bar.css'; -import { Block } from '../../abstract/Block'; +import type { PropertyValues } from 'lit'; +import { html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { LitBlock } from '../../lit/LitBlock'; -export class ProgressBar extends Block { - private _value = 0; +export class ProgressBar extends LitBlock { + @property({ type: Number }) + public value = 0; - private _visible = true; + @property({ type: Boolean, reflect: true }) + public visible = true; - constructor() { - super(); - this.init$ = { - ...this.init$, - width: 0, - opacity: 0, - }; + private _progressValue = 0; + + private readonly _fakeProgressLineRef = createRef(); + + private readonly _handleFakeProgressAnimation = (): void => { + const fakeProgressLine = this._fakeProgressLineRef.value; + if (!fakeProgressLine) { + return; + } + + if (!this.visible) { + fakeProgressLine.classList.add('uc-fake-progress--hidden'); + return; + } + + if (this._progressValue > 0) { + fakeProgressLine.classList.add('uc-fake-progress--hidden'); + } + }; + + protected override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + + this._progressValue = this._normalizeProgressValue(this.value); + this._updateProgressValueStyle(); + this._fakeProgressLineRef.value?.addEventListener('animationiteration', this._handleFakeProgressAnimation); } - override initCallback(): void { - super.initCallback(); - const handleFakeProgressAnimation = (): void => { - const fakeProgressLine = this.ref.fakeProgressLine as HTMLElement; - if (!this._visible) { - fakeProgressLine.classList.add('uc-fake-progress--hidden'); - return; + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + + if (changedProperties.has('value')) { + const normalizedValue = this._normalizeProgressValue(this.value); + + if (!this.visible) { + this._progressValue = normalizedValue; + } else { + const nextValue = Math.max(this._progressValue, normalizedValue); + if (nextValue !== this._progressValue) { + this._progressValue = nextValue; + this._updateProgressValueStyle(); + } } - if (this._value > 0) { - fakeProgressLine.classList.add('uc-fake-progress--hidden'); + } + + if (changedProperties.has('visible')) { + this.classList.toggle('uc-progress-bar--hidden', !this.visible); + if (this.visible) { + this._updateProgressValueStyle(); + } else { + this._progressValue = this._normalizeProgressValue(this.value); } - }; + } + } - (this.ref.fakeProgressLine as HTMLElement).addEventListener('animationiteration', handleFakeProgressAnimation); + public override disconnectedCallback(): void { + super.disconnectedCallback(); + this._fakeProgressLineRef.value?.removeEventListener('animationiteration', this._handleFakeProgressAnimation); + } - this.defineAccessor('value', (value: number | null | undefined) => { - if (value === undefined || value === null) return; - this._value = value; - if (!this._visible) return; - this.style.setProperty('--l-progress-value', this._value.toString()); - }); + private _normalizeProgressValue(value: number): number { + if (!Number.isFinite(value)) { + return 0; + } + return Math.min(100, Math.max(0, value)); + } - this.defineAccessor('visible', (visible: boolean) => { - this._visible = visible; - this.classList.toggle('uc-progress-bar--hidden', !visible); - }); + private _updateProgressValueStyle(): void { + if (!this.visible) { + return; + } + this.style.setProperty('--l-progress-value', this._progressValue.toString()); } -} -ProgressBar.template = /* HTML */ ` -
-
-`; + public override render() { + return html` +
+
+ `; + } +} diff --git a/src/blocks/ProgressBar/progress-bar.css b/src/blocks/ProgressBar/progress-bar.css index a9864b3d0..336ba6fb5 100644 --- a/src/blocks/ProgressBar/progress-bar.css +++ b/src/blocks/ProgressBar/progress-bar.css @@ -1,5 +1,6 @@ @layer uc.components { uc-progress-bar { + --visible-opacity: 1; --l-progress-value: 0; position: absolute; @@ -24,7 +25,7 @@ height: 100%; background-color: var(--uc-primary); transform: translateX(0); - opacity: 1; + opacity: var(--visible-opacity); transition: width 0.6s, opacity 0.3s; @@ -32,6 +33,7 @@ uc-progress-bar .uc-progress--hidden { opacity: 0; + transition: opacity 0.3s; } uc-progress-bar .uc-fake-progress { @@ -42,7 +44,7 @@ height: 100%; background-color: var(--uc-primary); animation: fake-progress-animation 1s ease-in-out infinite; - opacity: 1; + opacity: var(--visible-opacity); transition: opacity 0.3s; z-index: 1; } diff --git a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts index 0573b946d..dfe0a4498 100644 --- a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts +++ b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts @@ -1,29 +1,32 @@ +import { html, type PropertyValues } from 'lit'; +import { state } from 'lit/decorators.js'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import './progress-bar-common.css'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; -type BaseInitState = InstanceType['init$']; +type BaseInitState = InstanceType['init$']; interface ProgressBarCommonInitState extends BaseInitState { - visible: boolean; - value: number; '*commonProgress': number; } -export class ProgressBarCommon extends UploaderBlock { +export class ProgressBarCommon extends LitUploaderBlock { private _unobserveCollectionCb?: () => void; - constructor() { + @state() + private _visible = false; + + @state() + private _value = 0; + + public constructor() { super(); this.init$ = { ...this.init$, - visible: false, - value: 0, - '*commonProgress': 0, } as ProgressBarCommonInitState; } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this._unobserveCollectionCb = this.uploadCollection.observeProperties(() => { const anyUploading = this.uploadCollection.items().some((id) => { @@ -31,27 +34,33 @@ export class ProgressBarCommon extends UploaderBlock { return item?.getValue('isUploading') ?? false; }); - this.$.visible = anyUploading; + this._visible = anyUploading; + }); + + this.sub('*commonProgress', (progress: number) => { + this._value = progress; }); + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); - this.sub('visible', (visible: boolean) => { - if (visible) { + if (changedProperties.has('visible' as keyof ProgressBarCommon)) { + if (this._visible) { this.setAttribute('active', ''); } else { this.removeAttribute('active'); } - }); - - this.sub('*commonProgress', (progress: number) => { - this.$.value = progress; - }); + } } - override destroyCallback(): void { - super.destroyCallback(); + public override disconnectedCallback(): void { + super.disconnectedCallback(); this._unobserveCollectionCb?.(); this._unobserveCollectionCb = undefined; } -} -ProgressBarCommon.template = /* HTML */ ` `; + public override render() { + return html` `; + } +} diff --git a/src/blocks/Range/Range.ts b/src/blocks/Range/Range.ts deleted file mode 100644 index 9b7b3214d..000000000 --- a/src/blocks/Range/Range.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { BaseComponent } from '@symbiotejs/symbiote'; - -interface RangeInitState { - cssLeft: string; - barActive: boolean; - value: number; - onChange: (e: Event) => void; -} - -export class Range extends BaseComponent { - private _range!: HTMLInputElement; - - constructor() { - super(); - this.init$ = { - ...this.init$, - cssLeft: '50%', - barActive: false, - value: 50, - onChange: (e: Event) => { - e.preventDefault(); - e.stopPropagation(); - this.$.value = parseFloat(this._range.value); - this.dispatchEvent(new Event('change')); - }, - } as RangeInitState; - } - - override initCallback(): void { - super.initCallback(); - this._range = this.ref.range as HTMLInputElement; - [...this.attributes].forEach((attr) => { - const exclude = ['style', 'ref']; - if (!exclude.includes(attr.name)) { - this.ref.range.setAttribute(attr.name, attr.value); - } - }); - this.sub('value', (val: number) => { - const pcnt = (val / 100) * 100; - this.$.cssLeft = `${pcnt}%`; - }); - this.defineAccessor('value', (val: number) => { - this.$.value = val; - }); - } -} - -Range.template = /* HTML */ ` -
-
-
-
-
- - -`; diff --git a/src/blocks/Range/range.css b/src/blocks/Range/range.css deleted file mode 100644 index 7d822ae8c..000000000 --- a/src/blocks/Range/range.css +++ /dev/null @@ -1,67 +0,0 @@ -@layer uc.components { - uc-range { - position: relative; - display: inline-flex; - align-items: center; - justify-content: center; - height: var(--uc-button-size); - } - - uc-range datalist { - display: none; - } - - uc-range input { - width: 100%; - height: 100%; - opacity: 0; - } - - uc-range .uc-track-wrapper { - position: absolute; - right: 10px; - left: 10px; - display: flex; - align-items: center; - justify-content: center; - height: 2px; - user-select: none; - pointer-events: none; - } - - uc-range .uc-track { - position: absolute; - right: 0; - left: 0; - display: flex; - align-items: center; - justify-content: center; - height: 2px; - background-color: currentColor; - border-radius: 2px; - opacity: 0.5; - } - - uc-range .uc-slider { - position: absolute; - width: 16px; - height: 16px; - background-color: currentColor; - border-radius: 100%; - transform: translateX(-50%); - } - - uc-range .uc-bar { - position: absolute; - left: 0; - height: 100%; - background-color: currentColor; - border-radius: 2px; - } - - uc-range .uc-caption { - position: absolute; - display: inline-flex; - justify-content: center; - } -} diff --git a/src/blocks/Select/Select.ts b/src/blocks/Select/Select.ts index ec90403f0..dbc164d29 100644 --- a/src/blocks/Select/Select.ts +++ b/src/blocks/Select/Select.ts @@ -1,4 +1,6 @@ -import { Block } from '../../abstract/Block'; +import { html } from 'lit'; +import { property } from 'lit/decorators.js'; +import { LitBlock } from '../../lit/LitBlock'; import './select.css'; type SelectOption = { @@ -6,52 +8,40 @@ type SelectOption = { value: string; }; -type BaseInitState = InstanceType['init$']; +export class Select extends LitBlock { + @property({ type: String, attribute: false }) + public value = ''; -interface SelectInitState extends BaseInitState { - currentText: string; - options: SelectOption[]; - selectHtml: string; - onSelect: (event: Event) => void; -} + @property({ type: Boolean, reflect: true }) + public disabled = false; -export class Select extends Block { - declare ref: { select: HTMLSelectElement } & Record; - declare value: string; - - constructor() { - super(); - this.init$ = { - ...this.init$, - currentText: '', - options: [], - selectHtml: '', - onSelect: (event: Event) => { - event.preventDefault(); - event.stopPropagation(); - const selectElement = this.ref.select; - this.value = selectElement.value; - this.$.currentText = - this.$.options.find((option: SelectOption) => { - return option.value === this.value; - })?.text || ''; - this.dispatchEvent(new Event('change')); - }, - } as SelectInitState; - } + @property({ type: Array, attribute: false }) + public options: SelectOption[] = []; - override initCallback(): void { - super.initCallback(); - - this.sub('options', (options: SelectOption[]) => { - this.$.currentText = options?.[0]?.text || ''; - let html = ''; - options?.forEach((option) => { - html += /* HTML */ ``; - }); - this.$.selectHtml = html; - }); + public override render() { + return html` + + `; } -} -Select.template = /* HTML */ ` `; + private _handleChange = (event: Event): void => { + if (this.disabled) { + event.preventDefault(); + event.stopPropagation(); + return; + } + + event.preventDefault(); + event.stopPropagation(); + + const selectEl = event.currentTarget as HTMLSelectElement | null; + if (!selectEl) { + return; + } + + this.value = selectEl.value; + this.dispatchEvent(new Event('change')); + }; +} diff --git a/src/blocks/SimpleBtn/SimpleBtn.ts b/src/blocks/SimpleBtn/SimpleBtn.ts index caa5f57e4..85078f107 100644 --- a/src/blocks/SimpleBtn/SimpleBtn.ts +++ b/src/blocks/SimpleBtn/SimpleBtn.ts @@ -1,58 +1,40 @@ +import { html } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import './simple-btn.css'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; -import { asBoolean } from '../Config/validatorsType'; -type BaseInitState = InstanceType['init$']; -interface SimpleBtnInitState extends BaseInitState { - withDropZone: boolean; - onClick: () => void; - 'button-text': string; -} +export class SimpleBtn extends LitUploaderBlock { + public static override styleAttrs = [...super.styleAttrs, 'uc-simple-btn']; + public override couldBeCtxOwner = true; -export class SimpleBtn extends UploaderBlock { - static override styleAttrs = [...super.styleAttrs, 'uc-simple-btn']; - override couldBeCtxOwner = true; + @property({ attribute: 'dropzone', type: Boolean }) + public dropzone = true; - constructor() { - super(); + @state() + private _buttonTextKey = 'upload-file'; - this.init$ = { - ...this.init$, - withDropZone: true, - onClick: () => { - this.api.initFlow(); - }, - 'button-text': '', - } as SimpleBtnInitState; - } + private readonly _handleClick = () => { + this.api.initFlow(); + }; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - this.defineAccessor('dropzone', (val: unknown) => { - if (typeof val === 'undefined') { - return; - } - this.$.withDropZone = asBoolean(val); - }); this.subConfigValue('multiple', (val) => { - this.$['button-text'] = val ? 'upload-files' : 'upload-file'; + this._buttonTextKey = val ? 'upload-files' : 'upload-file'; }); } -} -SimpleBtn.template = /* HTML */ ` - - -`; - -SimpleBtn.bindAttributes({ - // @ts-expect-error TODO: we need to update symbiote types - dropzone: null, -}); + `; + } +} diff --git a/src/blocks/SourceBtn/SourceBtn.ts b/src/blocks/SourceBtn/SourceBtn.ts index dade6d4b9..9499c65c5 100644 --- a/src/blocks/SourceBtn/SourceBtn.ts +++ b/src/blocks/SourceBtn/SourceBtn.ts @@ -1,6 +1,7 @@ -import type { ActivityType } from '../../abstract/ActivityBlock'; -import { ActivityBlock } from '../../abstract/ActivityBlock'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { type ActivityType, LitActivityBlock } from '../../lit/LitActivityBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import { browserFeatures } from '../../utils/browser-info'; import { ExternalUploadSource, UploadSource, UploadSourceMobile } from '../../utils/UploadSource'; import { CameraSourceTypes } from '../CameraSource/constants'; @@ -17,43 +18,35 @@ type SourceTypeConfig = { activityParams?: Record; }; -type BaseInitState = InstanceType['init$']; -interface SourceBtnInitState extends BaseInitState { - iconName: string; - 'src-type': string; -} - -export class SourceBtn extends UploaderBlock { - override couldBeCtxOwner = true; - private type: string | undefined = undefined; +export class SourceBtn extends LitUploaderBlock { + public override couldBeCtxOwner = true; private _registeredTypes: Record = {}; - constructor() { - super(); + @property({ type: String }) + public type?: string; - this.init$ = { - ...this.init$, - iconName: 'default', - 'src-type': '', - } as SourceBtnInitState; - } + @state() + private _iconName = 'default'; - initTypes(): void { - this.registerType({ + @state() + private _srcTypeKey = ''; + + private _initTypes(): void { + this._registerType({ type: UploadSource.LOCAL, activate: () => { this.api.openSystemDialog(); return false; }, }); - this.registerType({ + this._registerType({ type: UploadSource.URL, - activity: ActivityBlock.activities.URL, + activity: LitActivityBlock.activities.URL, textKey: 'from-url', }); - this.registerType({ + this._registerType({ type: UploadSource.CAMERA, - activity: ActivityBlock.activities.CAMERA, + activity: LitActivityBlock.activities.CAMERA, activate: () => { const supportsCapture = browserFeatures.htmlMediaCapture; @@ -64,16 +57,16 @@ export class SourceBtn extends UploaderBlock { }, }); - this.registerType({ + this._registerType({ type: 'draw', - activity: ActivityBlock.activities.DRAW, + activity: LitActivityBlock.activities.DRAW, icon: 'edit-draw', }); for (const mobileSourceType of Object.values(UploadSourceMobile)) { - this.registerType({ + this._registerType({ type: mobileSourceType, - activity: ActivityBlock.activities.CAMERA, + activity: LitActivityBlock.activities.CAMERA, activate: () => { const supportsCapture = browserFeatures.htmlMediaCapture; if (supportsCapture) { @@ -89,9 +82,9 @@ export class SourceBtn extends UploaderBlock { } for (const externalSourceType of Object.values(ExternalUploadSource)) { - this.registerType({ + this._registerType({ type: externalSourceType, - activity: ActivityBlock.activities.EXTERNAL, + activity: LitActivityBlock.activities.EXTERNAL, activityParams: { externalSourceType: externalSourceType, }, @@ -99,27 +92,20 @@ export class SourceBtn extends UploaderBlock { } } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - this.initTypes(); + this._initTypes(); - this.defineAccessor('type', (val: string) => { - if (!val) { - return; - } - this.applyType(val); - }); + if (this.type) { + this._applyType(this.type); + } } - registerType(typeConfig: SourceTypeConfig): void { + private _registerType(typeConfig: SourceTypeConfig): void { this._registeredTypes[typeConfig.type] = typeConfig; } - getType(type: string): SourceTypeConfig | undefined { - return this._registeredTypes[type]; - } - - activate(): void { + public activate(): void { if (!this.type) { return; } @@ -142,7 +128,7 @@ export class SourceBtn extends UploaderBlock { } } - applyType(type: string): void { + private _applyType(type: string): void { const configType = this._registeredTypes[type]; if (!configType) { console.warn(`Unsupported source type: ${type}`); @@ -150,21 +136,29 @@ export class SourceBtn extends UploaderBlock { } const { textKey = type, icon = type } = configType; - this.$['src-type'] = `${L10N_PREFIX}${textKey}`; - this.$.iconName = icon; - this.onclick = () => { - this.activate(); - }; + this._srcTypeKey = `${L10N_PREFIX}${textKey}`; + this._iconName = icon; + } + + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + + if (changedProperties.has('type')) { + if (this.type) { + this._applyType(this.type); + } else { + this._srcTypeKey = ''; + this._iconName = 'default'; + } + } } -} -SourceBtn.template = /* HTML */ ` - -`; -SourceBtn.bindAttributes({ - // @ts-expect-error symbiote types bug - type: null, -}); + `; + } +} diff --git a/src/blocks/SourceList/SourceList.ts b/src/blocks/SourceList/SourceList.ts index 871349e0b..8b61d35f9 100644 --- a/src/blocks/SourceList/SourceList.ts +++ b/src/blocks/SourceList/SourceList.ts @@ -1,50 +1,71 @@ -import { Block } from '../../abstract/Block'; +import type { PropertyValues } from 'lit'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; +import { LitBlock } from '../../lit/LitBlock'; import { browserFeatures } from '../../utils/browser-info'; import { deserializeCsv } from '../../utils/comma-separated'; import { stringToArray } from '../../utils/stringToArray'; -export class SourceList extends Block { - override initCallback(): void { +export class SourceList extends LitBlock { + private _rawSourceList: string[] = []; + private _cameraModes: string[] = []; + + public override initCallback(): void { super.initCallback(); this.subConfigValue('sourceList', (val: string) => { - const list = stringToArray(val); - let html = ''; - - list.forEach((srcName) => { - if (srcName === 'instagram') { - console.error( - "Instagram source was removed because the Instagram Basic Display API hasn't been available since December 4, 2024. " + - 'Official statement, see here:' + - 'https://developers.facebook.com/blog/post/2024/09/04/update-on-instagram-basic-display-api/?locale=en_US', - ); - return; - } - - if (srcName === 'camera' && browserFeatures.htmlMediaCapture) { - this.subConfigValue('cameraModes', (cameraModesValue: string) => { - const cameraModes = deserializeCsv(cameraModesValue); - - cameraModes.forEach((mode) => { - html += /* HTML */ ``; - }); - - if (cameraModes.length === 0) { - html += /* HTML */ ``; - } - }); - - return; - } - - html += /* HTML */ ``; - }); - - if (this.cfg.sourceListWrap) { - this.innerHTML = html; - } else { - this.outerHTML = html; - } + this._rawSourceList = stringToArray(val); + this._updateSources(); }); + + this.subConfigValue('cameraModes', (cameraModesValue: string) => { + this._cameraModes = deserializeCsv(cameraModesValue); + this._updateSources(); + }); + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + + if (this.cfg.sourceListWrap) { + this.style.removeProperty('display'); + } else { + this.style.display = 'contents'; + } + } + + private _updateSources(): void { + const resolvedSources: string[] = []; + + for (const srcName of this._rawSourceList) { + if (srcName === 'instagram') { + console.error( + "Instagram source was removed because the Instagram Basic Display API hasn't been available since December 4, 2024. " + + 'Official statement, see here:' + + 'https://developers.facebook.com/blog/post/2024/09/04/update-on-instagram-basic-display-api/?locale=en_US', + ); + continue; + } + + if (srcName === 'camera' && browserFeatures.htmlMediaCapture) { + const cameraSources = this._cameraModes.length + ? this._cameraModes.map((mode) => `mobile-${mode}-camera`) + : ['mobile-photo-camera']; + + resolvedSources.push(...cameraSources); + continue; + } + + resolvedSources.push(srcName); + } + + this._sources = resolvedSources; + } + + @state() + private _sources: string[] = []; + + public override render() { + return html`${this._sources.map((type) => html``)}`; } } diff --git a/src/blocks/Spinner/Spinner.ts b/src/blocks/Spinner/Spinner.ts index 18959aa08..5cdb35db7 100644 --- a/src/blocks/Spinner/Spinner.ts +++ b/src/blocks/Spinner/Spinner.ts @@ -1,6 +1,9 @@ -import { BaseComponent } from '@symbiotejs/symbiote'; +import { html } from 'lit'; +import { LitBlock } from '../../lit/LitBlock'; import './spinner.css'; -export class Spinner extends BaseComponent {} - -Spinner.template = /* HTML */ `
`; +export class Spinner extends LitBlock { + public override render() { + return html`
`; + } +} diff --git a/src/blocks/StartFrom/StartFrom.ts b/src/blocks/StartFrom/StartFrom.ts index 23b373539..94746d563 100644 --- a/src/blocks/StartFrom/StartFrom.ts +++ b/src/blocks/StartFrom/StartFrom.ts @@ -1,15 +1,17 @@ -import type { ActivityType } from '../../abstract/ActivityBlock'; -import { ActivityBlock } from '../../abstract/ActivityBlock'; import './start-from.css'; +import { html } from 'lit'; +import { type ActivityType, LitActivityBlock } from '../../lit/LitActivityBlock'; -export class StartFrom extends ActivityBlock { - override historyTracked = true; - override activityType: ActivityType = ActivityBlock.activities.START_FROM; +export class StartFrom extends LitActivityBlock { + protected override historyTracked = true; + public override activityType: ActivityType = LitActivityBlock.activities.START_FROM; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.registerActivity(this.activityType ?? ''); } -} -StartFrom.template = /* HTML */ `
`; + public override render() { + return html`
${this.yield('')}
`; + } +} diff --git a/src/blocks/Thumb/Thumb.ts b/src/blocks/Thumb/Thumb.ts index 83d1c3dcf..5b968211f 100644 --- a/src/blocks/Thumb/Thumb.ts +++ b/src/blocks/Thumb/Thumb.ts @@ -1,3 +1,5 @@ +import { html, type PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; import { createCdnUrl, createCdnUrlModifiers, createOriginalUrl } from '../../utils/cdn-utils'; import { debounce } from '../../utils/debounce'; import { preloadImage } from '../../utils/preloadImage'; @@ -5,10 +7,26 @@ import { generateThumb } from '../../utils/resizeImage'; import { FileItemConfig } from '../FileItem/FileItemConfig'; import { fileCssBg } from '../svg-backgrounds/svg-backgrounds'; import './thumb.css'; +import type { Uid } from '../../lit/Uid'; const CDN_MAX_OUTPUT_DIMENSION = 3000; +type PendingThumbUpdate = { + controller: AbortController; + rafId?: number; + cancel: () => void; +}; + export class Thumb extends FileItemConfig { + @property({ type: String }) + public badgeIcon = ''; + + @property({ type: String }) + public uid: Uid = '' as Uid; + + @state() + private _thumbUrl = ''; + private _renderedGridOnce = false; private _thumbRect: IntersectionObserverEntry['boundingClientRect'] | null = null; @@ -19,16 +37,7 @@ export class Thumb extends FileItemConfig { private _observer?: IntersectionObserver; - constructor() { - super(); - - this.init$ = { - ...this.init$, - thumbUrl: '', - badgeIcon: '', - uid: '', - } as typeof this.init$ & { thumbUrl: string; badgeIcon: string; uid: string }; - } + private _pendingThumbUpdate?: PendingThumbUpdate; private _calculateThumbSize(force = false): number { if (force) { @@ -49,7 +58,7 @@ export class Thumb extends FileItemConfig { } // biome-ignore lint/style/noInferrableTypes: Here the type is needed because `_withEntry` could not infer it correctly - private _generateThumbnail = this._withEntry(async (entry, force: boolean = false) => { + private _generateThumbnail = this.withEntry(async (entry, force: boolean = false) => { const fileInfo = entry.getValue('fileInfo'); const isImage = entry.getValue('isImage'); const uuid = entry.getValue('uuid'); @@ -115,6 +124,126 @@ export class Thumb extends FileItemConfig { private _debouncedGenerateThumb = debounce(this._generateThumbnail.bind(this), 100); + private _decodeImage(src: string, signal?: AbortSignal): Promise { + return new Promise((resolve, reject) => { + const image = new Image(); + image.decoding = 'async'; + + const cleanup = () => { + image.src = ''; + signal?.removeEventListener('abort', onAbort); + }; + + const onAbort = () => { + cleanup(); + reject(new DOMException('Aborted', 'AbortError')); + }; + + if (signal) { + if (signal.aborted) { + onAbort(); + return; + } + signal.addEventListener('abort', onAbort, { once: true }); + } + + const resolveSafe = () => { + cleanup(); + resolve(); + }; + + const rejectSafe = (error: unknown) => { + cleanup(); + reject(error); + }; + + if (typeof image.decode === 'function') { + image.src = src; + image.decode().then(resolveSafe).catch(rejectSafe); + return; + } + + image.onload = resolveSafe; + image.onerror = rejectSafe as OnErrorEventHandler; + image.src = src; + }); + } + + private _cancelPendingThumbUpdate(): void { + this._pendingThumbUpdate?.cancel(); + this._pendingThumbUpdate = undefined; + } + + private _scheduleThumbUpdate(nextThumbUrl?: string): void { + this._cancelPendingThumbUpdate(); + + if (!nextThumbUrl) { + if (this._thumbUrl) { + this._thumbUrl = ''; + } + return; + } + + if (nextThumbUrl === this._thumbUrl) { + return; + } + + const abortController = new AbortController(); + const pending: PendingThumbUpdate = { + controller: abortController, + cancel: () => { + abortController.abort(); + if (pending.rafId !== undefined) { + window.cancelAnimationFrame(pending.rafId); + } + }, + }; + + this._pendingThumbUpdate = pending; + + this._decodeImage(nextThumbUrl, abortController.signal) + .catch(() => {}) + .then(() => { + if (abortController.signal.aborted) { + return; + } + pending.rafId = window.requestAnimationFrame(() => { + if (!abortController.signal.aborted) { + this._thumbUrl = nextThumbUrl; + } + }); + }); + } + + private _requestThumbGeneration(force = false): void { + if (!this.entry) { + return; + } + + if (force) { + this._generateThumbnail(true); + return; + } + + if (!this._isIntersecting) { + return; + } + + this._debouncedGenerateThumb(); + } + + protected override firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + this._bindToEntry(); + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + if (changedProperties.has('uid')) { + this._bindToEntry(); + } + } + private _observerCallback(entries: IntersectionObserverEntry[]): void { const [entry] = entries; if (!entry) { @@ -124,7 +253,7 @@ export class Thumb extends FileItemConfig { if (entry.isIntersecting) { this._thumbRect = entry.boundingClientRect; - this._debouncedGenerateThumb(); + this._requestThumbGeneration(); this._observer?.disconnect(); } @@ -133,61 +262,58 @@ export class Thumb extends FileItemConfig { } } - protected override _reset(): void { - super._reset(); + protected override reset(): void { + super.reset(); this._debouncedGenerateThumb.cancel(); + this._cancelPendingThumbUpdate(); + if (this._thumbUrl) { + this._thumbUrl = ''; + } } - private _handleEntryId(id: string): void { - this._reset(); + private _bindToEntry(): void { + const id = this.uid?.trim() as Uid; + if (!id) { + if (this.entry) { + this.reset(); + } + return; + } const entry = this.uploadCollection?.read(id); - this._entry = entry; - - if (!entry) { + if (!entry || entry === this.entry) { return; } - this._subEntry('fileInfo', (fileInfo) => { - if (fileInfo?.isImage && this._isIntersecting) { - this._debouncedGenerateThumb(); + this.reset(); + this.entry = entry; + + const requestThumb = () => { + this._requestThumbGeneration(); + }; + + this.subEntry('fileInfo', (fileInfo) => { + if (fileInfo?.isImage) { + requestThumb(); } }); - this._subEntry('thumbUrl', (thumbUrl) => { - this.$.thumbUrl = thumbUrl ? `url(${thumbUrl})` : ''; + this.subEntry('thumbUrl', (thumbUrl) => { + this._scheduleThumbUpdate(thumbUrl ?? undefined); }); - this._subEntry('cdnUrlModifiers', () => { - if (this._isIntersecting) { - this._debouncedGenerateThumb(); - } - }); + this.subEntry('cdnUrlModifiers', requestThumb); - if (this._isIntersecting) { - this._debouncedGenerateThumb(); - } + this._requestThumbGeneration(true); } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - this.defineAccessor('badgeIcon', (val: string) => { - this.$.badgeIcon = val; - }); - - this.defineAccessor('uid', (value: string) => { - this.set$({ uid: value }); - }); - - this.sub('uid', (uid: string) => { - this._handleEntryId(uid); - }); - this.subConfigValue('filesViewMode', (viewMode) => { if (viewMode === 'grid' && !this._renderedGridOnce) { if (this._firstViewMode === 'list') { - this._debouncedGenerateThumb(true); + this._requestThumbGeneration(true); } this._renderedGridOnce = true; } @@ -196,34 +322,31 @@ export class Thumb extends FileItemConfig { this.setAttribute('role', 'img'); } - override connectedCallback(): void { + public override connectedCallback(): void { super.connectedCallback(); + this._observer?.disconnect(); this._observer = new window.IntersectionObserver(this._observerCallback.bind(this), { threshold: 0.1 }); this._observer.observe(this); } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); - this._entrySubs = new Set(); this._debouncedGenerateThumb.cancel(); + this._cancelPendingThumbUpdate(); this._observer?.disconnect(); } -} -Thumb.template = /* html */ ` -
+ public override render() { + return html` +
+
- +
`; - -Thumb.bindAttributes({ - // @ts-expect-error TODO: fix types inside symbiote - badgeIcon: null, - // @ts-expect-error TODO: fix types inside symbiote - uid: null, -}); + } +} diff --git a/src/blocks/Thumb/thumb.css b/src/blocks/Thumb/thumb.css index 19483f282..600a0b5c4 100644 --- a/src/blocks/Thumb/thumb.css +++ b/src/blocks/Thumb/thumb.css @@ -3,4 +3,18 @@ width: 100%; height: 100%; } + + .uc-thumb { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + } + + .uc-thumb__img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + } } diff --git a/src/blocks/UploadCtxProvider/EventEmitter.ts b/src/blocks/UploadCtxProvider/EventEmitter.ts index 961712393..40321bb0c 100644 --- a/src/blocks/UploadCtxProvider/EventEmitter.ts +++ b/src/blocks/UploadCtxProvider/EventEmitter.ts @@ -1,6 +1,6 @@ -import type { ActivityType } from '../../abstract/ActivityBlock'; -import type { Block } from '../../abstract/Block'; import type { ModalId } from '../../abstract/managers/ModalManager'; +import type { ActivityType } from '../../lit/LitActivityBlock'; +import type { LitBlock } from '../../lit/LitBlock'; import type { OutputCollectionState, OutputFileEntry } from '../../types'; const DEFAULT_DEBOUNCE_TIMEOUT = 20; @@ -68,21 +68,19 @@ export type EventPayload = { export class EventEmitter { private _timeoutStore: Map = new Map(); - private _targets: Set = new Set(); + private _targets: Set = new Set(); private _debugPrint: ((...args: unknown[]) => void) | null = null; - constructor(debugPrint: (...args: unknown[]) => void) { + public constructor(debugPrint: (...args: unknown[]) => void) { this._debugPrint = debugPrint; } - bindTarget(target: Block): void { + public bindTarget(target: LitBlock) { this._targets.add(target); + return () => { + this._targets.delete(target); + }; } - - unbindTarget(target: Block): void { - this._targets.delete(target); - } - private _dispatch(type: T, payload?: EventPayload[T]): void { for (const target of this._targets) { target.dispatchEvent( @@ -98,7 +96,7 @@ export class EventEmitter { }); } - emit( + public emit( type: T, payload?: TDebounce extends false | undefined ? EventPayload[T] : () => EventPayload[T], options: { debounce?: TDebounce } = {}, @@ -114,8 +112,13 @@ export class EventEmitter { } const timeout = typeof debounce === 'number' ? debounce : DEFAULT_DEBOUNCE_TIMEOUT; const timeoutId = window.setTimeout(() => { - this._dispatch(type, typeof payload === 'function' ? payload() : (payload as EventPayload[T])); - this._timeoutStore.delete(type); + try { + const data = typeof payload === 'function' ? payload() : (payload as EventPayload[T]); + this._dispatch(type, data); + this._timeoutStore.delete(type); + } catch (error) { + this._debugPrint?.(() => `Error while getting payload for event "${type}"`, error); + } }, timeout); this._timeoutStore.set(type, timeoutId); } diff --git a/src/blocks/UploadCtxProvider/UploadCtxProvider.ts b/src/blocks/UploadCtxProvider/UploadCtxProvider.ts index 5f3618584..790a71e3b 100644 --- a/src/blocks/UploadCtxProvider/UploadCtxProvider.ts +++ b/src/blocks/UploadCtxProvider/UploadCtxProvider.ts @@ -1,25 +1,28 @@ // @ts-check -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import { type EventPayload, EventType } from './EventEmitter'; // biome-ignore lint/suspicious/noUnsafeDeclarationMerging: This is intentional interface merging, used to add event listener types -export class UploadCtxProvider extends UploaderBlock { - static override styleAttrs = ['uc-wgt-common']; - static EventType = EventType; +export class UploadCtxProvider extends LitUploaderBlock { + public declare propertiesMeta: { + 'ctx-name': string; + }; + public static override styleAttrs = ['uc-wgt-common']; + public static EventType = EventType; - override requireCtxName = true; + private _unbindEventEmitter: (() => void) | null = null; - override initCallback() { + public override initCallback() { super.initCallback(); - this.$['*eventEmitter'].bindTarget(this); + this._unbindEventEmitter = this.eventEmitter.bindTarget(this); } - override destroyCallback() { - super.destroyCallback(); + public override disconnectedCallback(): void { + super.disconnectedCallback(); - this.$['*eventEmitter'].unbindTarget(this); + this._unbindEventEmitter?.(); } } @@ -27,7 +30,7 @@ type EventListenerMap = { [K in (typeof EventType)[keyof typeof EventType]]: (e: CustomEvent) => void; }; -export interface UploadCtxProvider extends UploaderBlock { +export interface UploadCtxProvider extends LitUploaderBlock { addEventListener( type: T, listener: EventListenerMap[T], diff --git a/src/blocks/UploadList/UploadList.ts b/src/blocks/UploadList/UploadList.ts index dec9e5df6..1dbdd3036 100644 --- a/src/blocks/UploadList/UploadList.ts +++ b/src/blocks/UploadList/UploadList.ts @@ -1,10 +1,12 @@ -// @ts-check -import { ActivityBlock } from '../../abstract/ActivityBlock'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; +import { LitActivityBlock } from '../../lit/LitActivityBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import type { OutputCollectionErrorType, OutputError } from '../../types'; import { throttle } from '../../utils/throttle'; import { EventType, InternalEventType } from '../UploadCtxProvider/EventEmitter'; import './upload-list.css'; +import { repeat } from 'lit/directives/repeat.js'; export type FilesViewMode = 'grid' | 'list'; @@ -16,63 +18,79 @@ export type Summary = { validatingBeforeUploading: number; }; -export class UploadList extends UploaderBlock { - // Context owner should have access to CSS l10n - // TODO: We need to move away l10n from CSS - override couldBeCtxOwner = true; - override historyTracked = true; - override activityType = ActivityBlock.activities.UPLOAD_LIST; - - constructor() { - super(); - - this.init$ = { - ...this.init$, - doneBtnVisible: false, - doneBtnEnabled: false, - uploadBtnVisible: false, - addMoreBtnVisible: false, - addMoreBtnEnabled: false, - headerText: '', - commonErrorMessage: '', - - hasFiles: false, - onAdd: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'add-more', - node: this.tagName, - }, - }, - }); - - this.api.initFlow(true); - }, - onUpload: () => { - this.emit(EventType.UPLOAD_CLICK); - this.api.uploadAll(); - this._throttledHandleCollectionUpdate(); - }, - onDone: () => { - this.emit(EventType.DONE_CLICK, this.api.getOutputCollectionState()); - this.api.doneFlow(); +export class UploadList extends LitUploaderBlock { + public override couldBeCtxOwner = true; + protected override historyTracked = true; + public override activityType = LitActivityBlock.activities.UPLOAD_LIST; + + @state() + private _doneBtnVisible = false; + + @state() + private _doneBtnEnabled = false; + + @state() + private _uploadBtnVisible = false; + + @state() + private _addMoreBtnVisible = false; + + @state() + private _addMoreBtnEnabled = false; + + @state() + private _commonErrorMessage: string | null = null; + + @state() + private _hasFiles = false; + + @state() + private _latestSummary: Summary | null = null; + + private get _headerText() { + if (!this._latestSummary) { + return ''; + } + return this._getHeaderText(this._latestSummary); + } + + private _handleAdd = (): void => { + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'add-more', + node: this.tagName, + }, }, - onCancel: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'clear-all', - node: this.tagName, - }, - }, - }); - this.uploadCollection.clearAll(); + }); + this.api.initFlow(true); + }; + + private _handleUpload = (): void => { + this.emit(EventType.UPLOAD_CLICK); + this.api.uploadAll(); + this._throttledHandleCollectionUpdate(); + }; + + private _handleDone = (): void => { + this.emit(EventType.DONE_CLICK, this.api.getOutputCollectionState()); + this.api.doneFlow(); + }; + + private _handleCancel = (): void => { + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'clear-all', + node: this.tagName, + }, }, - } as any; - } + }); + + this.uploadCollection.clearAll(); + }; private _throttledHandleCollectionUpdate = throttle(() => { if (!this.isConnected) { @@ -118,19 +136,14 @@ export class UploadList extends UploaderBlock { doneBtnEnabled = summary.total === summary.succeed && fitCountRestrictions && validationOk && groupOk; } - this.set$({ - doneBtnVisible: allDone, - doneBtnEnabled: doneBtnEnabled, - - uploadBtnVisible, + this._doneBtnVisible = allDone; + this._doneBtnEnabled = doneBtnEnabled; + this._uploadBtnVisible = uploadBtnVisible; + this._addMoreBtnEnabled = summary.total === 0 || (!tooMany && !exact); + this._addMoreBtnVisible = !exact || this.cfg.multiple; + this._hasFiles = summary.total > 0; - addMoreBtnEnabled: summary.total === 0 || (!tooMany && !exact), - addMoreBtnVisible: !exact || this.cfg.multiple, - - hasFiles: summary.total > 0, - }); - - this.bindL10n('headerText', () => this._getHeaderText(summary)); + this._latestSummary = summary; } private _getHeaderText(summary: Summary): string { @@ -156,11 +169,11 @@ export class UploadList extends UploaderBlock { return localizedText('total'); } - override get couldOpenActivity(): boolean { + public override get couldOpenActivity(): boolean { return this.cfg.showEmptyList || this.uploadCollection.size > 0; } - override initCallback() { + public override initCallback() { super.initCallback(); this.registerActivity(this.activityType); @@ -192,77 +205,95 @@ export class UploadList extends UploaderBlock { this.sub('*collectionErrors', (errors: OutputError[]) => { const firstError = errors.filter((err) => err.type !== 'SOME_FILES_HAS_ERRORS')[0]; if (!firstError) { - this.set$({ - commonErrorMessage: null, - }); + this._commonErrorMessage = null; return; } - this.set$({ - commonErrorMessage: firstError.message, - }); + this._commonErrorMessage = firstError.message; }); } - override destroyCallback() { - super.destroyCallback(); - this.uploadCollection.unobserveProperties(this._throttledHandleCollectionUpdate); - this.uploadCollection.unobserveCollection(this._throttledHandleCollectionUpdate); + public override disconnectedCallback(): void { + super.disconnectedCallback(); + if (this.has('*uploadCollection')) { + this.uploadCollection.unobserveProperties(this._throttledHandleCollectionUpdate); + this.uploadCollection.unobserveCollection(this._throttledHandleCollectionUpdate); + } } -} -UploadList.template = /* HTML */ ` + public override render() { + return html` - {{headerText}} + ${this._headerText} -
- +
+ ${this.yield('empty', html`${this.l10n('no-files')}`)}
-
+
+ ${repeat( + this.$['*uploadList'] ?? [], + ({ uid }) => uid, + ({ uid }) => html``, + )} +
-
+
+ ${this._commonErrorMessage ?? ''} +
- +
+ ?hidden=${!this._uploadBtnVisible} + @click=${this._handleUpload} + >${this.l10n('upload')} + ?hidden=${!this._doneBtnVisible} + ?disabled=${!this._doneBtnEnabled} + @click=${this._handleDone} + > + ${this.l10n('done')} +
`; + } +} diff --git a/src/blocks/UrlSource/UrlSource.ts b/src/blocks/UrlSource/UrlSource.ts index 4aae34424..b17af7692 100644 --- a/src/blocks/UrlSource/UrlSource.ts +++ b/src/blocks/UrlSource/UrlSource.ts @@ -1,95 +1,103 @@ -import type { ActivityType } from '../../abstract/ActivityBlock'; -import { ActivityBlock } from '../../abstract/ActivityBlock'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; +import { createRef, ref } from 'lit/directives/ref.js'; +import { type ActivityType, LitActivityBlock } from '../../lit/LitActivityBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import { UploadSource } from '../../utils/UploadSource'; -import { EventType, InternalEventType } from '../UploadCtxProvider/EventEmitter'; +import { InternalEventType } from '../UploadCtxProvider/EventEmitter'; import './url-source.css'; -type BaseInitState = InstanceType['init$']; - -interface UrlSourceInitState extends BaseInitState { +interface UrlSourceState { importDisabled: boolean; - onUpload: (event: Event) => void; - onCancel: () => void; - onInput: (event: Event) => void; } -export class UrlSource extends UploaderBlock { - override couldBeCtxOwner = true; - override activityType: ActivityType = ActivityBlock.activities.URL; - - constructor() { - super(); +export class UrlSource extends LitUploaderBlock { + public override couldBeCtxOwner = true; + public override activityType: ActivityType = LitActivityBlock.activities.URL; - this.init$ = { - ...this.init$, - importDisabled: true, - onUpload: (event: Event) => { - event.preventDefault(); - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'upload-from-url', - node: this.tagName, - }, - }, - }); - - const url = this.ref.input['value'] as string; - this.api.addFileFromUrl(url, { source: UploadSource.URL }); - this.modalManager?.open(ActivityBlock.activities.UPLOAD_LIST); - this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; - }, - onCancel: () => { - this.historyBack(); - }, - onInput: (event: Event) => { - const value = (event.target as HTMLInputElement | null)?.value ?? ''; - this.set$({ importDisabled: !value }); - }, - } as UrlSourceInitState; - } + @state() + private _formState: UrlSourceState = { + importDisabled: true, + }; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.registerActivity(this.activityType ?? '', { onActivate: () => { - const input = this.ref.input as HTMLInputElement; - input.value = ''; - input.focus(); + const input = this._inputRef.value; + if (input) { + input.value = ''; + input.focus(); + } + this._formState = { importDisabled: true }; }, }); } -} -UrlSource.template = /* HTML */ ` - - -
- - -
- -
-
- - -
-`; + private _inputRef = createRef(); + + private _handleInput = (event: Event) => { + const value = (event.target as HTMLInputElement | null)?.value ?? ''; + this._formState = { importDisabled: !value }; + }; + + private _handleUpload = (event: Event) => { + event.preventDefault(); + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'upload-from-url', + node: this.tagName, + }, + }, + }); + const input = this._inputRef.value; + const url = input?.value?.trim(); + if (!url) { + return; + } + this.api.addFileFromUrl(url, { source: UploadSource.URL }); + this.modalManager?.open(LitActivityBlock.activities.UPLOAD_LIST); + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; + }; + + public override render() { + return html` + + +
+ + ${this.l10n('caption-from-url')} +
+ +
+
+ + +
+ `; + } +} diff --git a/src/blocks/UrlSource/url-source.css b/src/blocks/UrlSource/url-source.css index 96e13eb97..6453977bb 100644 --- a/src/blocks/UrlSource/url-source.css +++ b/src/blocks/UrlSource/url-source.css @@ -6,7 +6,7 @@ uc-url-source > .uc-content { display: grid; - grid-gap: 4px; + gap: 4px; grid-template-columns: 1fr min-content; padding: var(--uc-padding); padding-top: 0; diff --git a/src/index.ts b/src/index.ts index 8cfb95e35..d3352ed3e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,52 +1,62 @@ +/** biome-ignore-all assist/source/organizeImports: Order should be pretty */ import './blocks/themes/uc-basic/index.css'; // Symbiote.js -export { BaseComponent, Data, UID } from '@symbiotejs/symbiote'; -export { ActivityBlock } from './abstract/ActivityBlock'; - -// Abstract: -export { Block } from './abstract/Block'; +export { PubSub as Data } from './lit/PubSubCompat'; +export { BaseComponent } from './lit/BaseComponent'; +export { UID } from './utils/UID'; // Utils: export { defineComponents } from './abstract/defineComponents'; export { loadFileUploaderFrom } from './abstract/loadFileUploaderFrom'; export { defineLocale } from './abstract/localeRegistry'; export { ModalEvents, type ModalId } from './abstract/managers/ModalManager'; -export { SolutionBlock } from './abstract/SolutionBlock'; -export { UploaderBlock } from './abstract/UploaderBlock'; -export { ActivityHeader } from './blocks/ActivityHeader/ActivityHeader'; -export { CameraSource } from './blocks/CameraSource/CameraSource'; -export * from './blocks/CloudImageEditor/index'; -export { CloudImageEditorActivity } from './blocks/CloudImageEditorActivity/CloudImageEditorActivity'; -export { Config } from './blocks/Config/Config'; -export { Copyright } from './blocks/Copyright/Copyright'; -export { DropArea } from './blocks/DropArea/DropArea'; -export { ExternalSource } from './blocks/ExternalSource/ExternalSource'; -export { FileItem } from './blocks/FileItem/FileItem'; -export { FormInput } from './blocks/FormInput/FormInput'; -// Blocks: +export { toKebabCase } from './utils/toKebabCase'; + +// Shared: export { Icon } from './blocks/Icon/Icon'; export { Img } from './blocks/Img/Img'; export { Modal } from './blocks/Modal/Modal'; +export { FormInput } from './blocks/FormInput/FormInput'; +export { Copyright } from './blocks/Copyright/Copyright'; export { ProgressBar } from './blocks/ProgressBar/ProgressBar'; export { ProgressBarCommon } from './blocks/ProgressBarCommon/ProgressBarCommon'; export { Select } from './blocks/Select/Select'; -export { SimpleBtn } from './blocks/SimpleBtn/SimpleBtn'; export { SourceBtn } from './blocks/SourceBtn/SourceBtn'; export { SourceList } from './blocks/SourceList/SourceList'; export { Spinner } from './blocks/Spinner/Spinner'; -export { StartFrom } from './blocks/StartFrom/StartFrom'; export { Thumb } from './blocks/Thumb/Thumb'; +export { ActivityHeader } from './blocks/ActivityHeader/ActivityHeader'; + +// Composed: +export { StartFrom } from './blocks/StartFrom/StartFrom'; export { UploadCtxProvider } from './blocks/UploadCtxProvider/UploadCtxProvider'; export { UploadList } from './blocks/UploadList/UploadList'; export { UrlSource } from './blocks/UrlSource/UrlSource'; -// Other -export * from './env'; +export { CameraSource } from './blocks/CameraSource/CameraSource'; +export * from './blocks/CloudImageEditor/index'; +export { CloudImageEditorActivity } from './blocks/CloudImageEditorActivity/CloudImageEditorActivity'; +export { Config } from './blocks/Config/Config'; +export { DropArea } from './blocks/DropArea/DropArea'; +export { ExternalSource } from './blocks/ExternalSource/ExternalSource'; +export { FileItem } from './blocks/FileItem/FileItem'; +export { ExternalUploadSource, UploadSource } from './utils/UploadSource'; +export { SimpleBtn } from './blocks/SimpleBtn/SimpleBtn'; + +// Abstract: +export { LitBlock as Block } from './lit/LitBlock'; +export { LitSolutionBlock as SolutionBlock } from './lit/LitSolutionBlock'; +export { LitUploaderBlock as UploaderBlock } from './lit/LitUploaderBlock'; +export { LitActivityBlock as ActivityBlock } from './lit/LitActivityBlock'; + +// Solutions: +export { FileUploaderRegular } from './solutions/file-uploader/regular/FileUploaderRegular'; export { CloudImageEditor } from './solutions/cloud-image-editor/CloudImageEditor'; export { FileUploaderInline } from './solutions/file-uploader/inline/FileUploaderInline'; export { FileUploaderMinimal } from './solutions/file-uploader/minimal/FileUploaderMinimal'; -// Solutions: -export { FileUploaderRegular } from './solutions/file-uploader/regular/FileUploaderRegular'; + +// Types export * from './types/index'; -export { toKebabCase } from './utils/toKebabCase'; -export { ExternalUploadSource, UploadSource } from './utils/UploadSource'; + +// Other +export * from './env'; diff --git a/src/lit/BaseComponent.ts b/src/lit/BaseComponent.ts new file mode 100644 index 000000000..54115ffbc --- /dev/null +++ b/src/lit/BaseComponent.ts @@ -0,0 +1,7 @@ +import { LitElement } from 'lit'; +import { CssDataMixin } from './CssDataMixin'; +import { LightDomMixin } from './LightDomMixin'; +import { RegisterableElementMixin } from './RegisterableElementMixin'; +import { SymbioteMixin } from './SymbioteCompatMixin'; + +export class BaseComponent extends RegisterableElementMixin(SymbioteMixin()(CssDataMixin(LightDomMixin(LitElement)))) {} diff --git a/src/lit/Constructor.ts b/src/lit/Constructor.ts new file mode 100644 index 000000000..f13c91a81 --- /dev/null +++ b/src/lit/Constructor.ts @@ -0,0 +1 @@ +export type Constructor = new (...args: any[]) => T; diff --git a/src/lit/CssDataMixin.ts b/src/lit/CssDataMixin.ts new file mode 100644 index 000000000..e8fab5c54 --- /dev/null +++ b/src/lit/CssDataMixin.ts @@ -0,0 +1,35 @@ +import type { LitElement } from 'lit'; +import type { Constructor } from './Constructor'; +import { parseCssPropertyValue } from './parseCssPropertyValue'; + +declare class CssDataMixinClassInterface { + public getCssData(propName: string, silentCheck?: boolean): string | number | boolean | null | undefined; +} + +export function CssDataMixin>(ctor: T): T & Constructor { + abstract class CssDataMixinClass extends ctor { + private _cssDataCache: Record | null = null; + private _computedStyle: CSSStyleDeclaration | null = null; + + public getCssData(propName: string, silentCheck = false): string | number | boolean | null | undefined { + const cssDataCache = this._cssDataCache ?? Object.create(null); + if (!Object.keys(cssDataCache).includes(propName) || !cssDataCache[propName]) { + if (!this._computedStyle) { + this._computedStyle = window.getComputedStyle(this); + } + const val = this._computedStyle.getPropertyValue(propName).trim(); + try { + cssDataCache[propName] = parseCssPropertyValue(val); + } catch (error) { + if (!silentCheck) { + console.warn(`CSS Data error: ${propName}`, error); + } + cssDataCache[propName] = null; + } + } + this._cssDataCache = cssDataCache; + return cssDataCache[propName]; + } + } + return CssDataMixinClass as unknown as T & Constructor; +} diff --git a/src/lit/LightDomMixin.ts b/src/lit/LightDomMixin.ts new file mode 100644 index 000000000..e306d313b --- /dev/null +++ b/src/lit/LightDomMixin.ts @@ -0,0 +1,137 @@ +import { html, type LitElement, type PropertyValues } from 'lit'; +import type { Constructor } from './Constructor'; + +type AdoptedNode = ChildNode & { contentFor?: string }; + +declare class LightDomElementInterface { + public willYield: boolean; + public yield(slot: string, defaultContent?: unknown): unknown; +} + +export function LightDomMixin>(ctor: T): T & Constructor { + abstract class LightDomMixinClass extends ctor { + // Set this to true to adopt children before the first update when multiple slots are expected. + public willYield = true; + + private _slotsMap: Record = {}; + private _initialLightDomChildren: AdoptedNode[] | null = null; + private _hasAdoptedChildren = false; + + public override createRenderRoot(): HTMLElement | ShadowRoot { + return this; + } + + public override connectedCallback(): void { + if (!this._initialLightDomChildren) { + this._initialLightDomChildren = Array.from(this.childNodes) as AdoptedNode[]; + } + super.connectedCallback(); + } + + private _adoptChildren(): void { + if (this._hasAdoptedChildren) { + return; + } + + this._hasAdoptedChildren = true; + this._slotsMap = {}; + + const directChildren = Array.from(this.childNodes) as AdoptedNode[]; + const nodesToProcess = directChildren.length ? directChildren : (this._initialLightDomChildren ?? []); + + for (const child of nodesToProcess) { + const slotName = this._getSlotNameForChild(child); + const slotContent = this._slotsMap[slotName] ?? []; + + if (child instanceof Element) { + child.removeAttribute('slot'); + child.removeAttribute('content-for'); + } + + slotContent.push(child); + this._slotsMap[slotName] = slotContent; + } + + this._initialLightDomChildren = null; + } + + private _getSlotNameForChild(child: AdoptedNode): string { + // Both Angular and AngularJS will decorate nodes with comments when they + // compile their template expressions. When we see a comment directly before + // an element look ahead to find the slot. + if (child instanceof Comment && child.nextSibling instanceof Element) { + return this._getSlotNameForChild(child.nextSibling); + } + + if ('contentFor' in child) { + return child.contentFor || ''; + } + + if (child instanceof Element && child.hasAttribute('content-for')) { + return child.getAttribute('content-for') || ''; + } + + return ''; + } + + private _isTextNodeEmpty(node: Text): boolean { + return !node.textContent || !node.textContent.trim(); + } + + // I'm not sure what the behavior here should be. If there is an expression + // but it evaluates to nothing being rendered is the slot empty or not? I'm + // inclined to think that it is not empty; however, I'm not sure how to deal + // with the fact that lit-html inserts a bunch of empty text placeholder + // nodes. + private _isSlotEmpty(slot: string): boolean { + const content = this._slotsMap[slot]; + + return ( + !content || + content.every((child) => { + return child instanceof Comment || (child instanceof Text && this._isTextNodeEmpty(child)); + }) + ); + } + + // Adopting children needs to happen here, opposed to connectedCallback, + // otherwise AngularJS template expressions will not work. You may think that + // beating all frameworks to the childNodes would be the answer but Angular, + // for example, will pre-compile the templates. So it is impossible to beat + // Angular to the childNodes. + public override update(changedProperties: PropertyValues) { + if (!this.hasUpdated && this.willYield) { + this._adoptChildren(); + } + + super.update(changedProperties); + } + + public yield(slot: string, defaultContent?: unknown) { + if (slot === '' && !this._slotsMap[slot] && !this._hasAdoptedChildren && this._initialLightDomChildren?.length) { + const slotContent: AdoptedNode[] = []; + + for (const child of this._initialLightDomChildren) { + if (child instanceof Element) { + child.removeAttribute('slot'); + child.removeAttribute('content-for'); + } + slotContent.push(child); + } + + this._slotsMap[slot] = slotContent; + this._hasAdoptedChildren = true; + this._initialLightDomChildren = null; + } + + const slotContent = this._slotsMap[slot]; + + return html` + ${slotContent} + ${this._isSlotEmpty(slot) ? defaultContent : undefined} + `; + } + } + + return LightDomMixinClass as unknown as Constructor & T; +} diff --git a/src/abstract/ActivityBlock.ts b/src/lit/LitActivityBlock.ts similarity index 65% rename from src/abstract/ActivityBlock.ts rename to src/lit/LitActivityBlock.ts index 6b73532fb..3879e3a2a 100644 --- a/src/abstract/ActivityBlock.ts +++ b/src/lit/LitActivityBlock.ts @@ -1,9 +1,9 @@ +import { activityBlockCtx } from '../abstract/CTX'; import type { ActivityParams as CloudImageEditorActivityParams } from '../blocks/CloudImageEditorActivity/CloudImageEditorActivity'; import type { ActivityParams as ExternalSourceActivityParams } from '../blocks/ExternalSource/ExternalSource'; import { EventType } from '../blocks/UploadCtxProvider/EventEmitter'; import { debounce } from '../utils/debounce'; -import { Block } from './Block'; -import { activityBlockCtx } from './CTX'; +import { LitBlock } from './LitBlock'; const ACTIVE_ATTR = 'active'; const ACTIVE_PROP = '___ACTIVITY_IS_ACTIVE___'; @@ -13,24 +13,24 @@ export type ActivityParamsMap = { external: ExternalSourceActivityParams; }; -export class ActivityBlock extends Block { +export class LitActivityBlock extends LitBlock { protected historyTracked = false; private [ACTIVE_PROP]?: boolean; - override init$ = activityBlockCtx(this); + public override init$ = activityBlockCtx(this); - _debouncedHistoryFlush = debounce(this._historyFlush.bind(this), 10); + private _debouncedHistoryFlush = debounce(this._historyFlush.bind(this), 10); private _deactivate(): void { - const actDesc = ActivityBlock._activityCallbacks.get(this); + const actDesc = LitActivityBlock._activityCallbacks.get(this); this[ACTIVE_PROP] = false; this.removeAttribute(ACTIVE_ATTR); actDesc?.deactivateCallback?.(); } private _activate(): void { - const actDesc = ActivityBlock._activityCallbacks.get(this); + const actDesc = LitActivityBlock._activityCallbacks.get(this); this.$['*historyBack'] = this.historyBack.bind(this); this[ACTIVE_PROP] = true; this.setAttribute(ACTIVE_ATTR, ''); @@ -44,7 +44,7 @@ export class ActivityBlock extends Block { } // must match visibility of base class - override initCallback(): void { + public override initCallback(): void { super.initCallback(); // TODO: rename activityType to activityId @@ -86,11 +86,11 @@ export class ActivityBlock extends Block { } private _isActivityRegistered(): boolean { - return !!this.activityType && ActivityBlock._activityCallbacks.has(this); + return !!this.activityType && LitActivityBlock._activityCallbacks.has(this); } private static _activityCallbacks: Map< - ActivityBlock, + LitActivityBlock, { activateCallback?: (() => void) | undefined; deactivateCallback?: (() => void) | undefined; @@ -98,7 +98,7 @@ export class ActivityBlock extends Block { > = new Map(); // declare static activities to satisfy type references below - static activities: Readonly<{ + public static activities: Readonly<{ START_FROM: 'start-from'; CAMERA: 'camera'; DRAW: 'draw'; @@ -108,63 +108,64 @@ export class ActivityBlock extends Block { EXTERNAL: 'external'; }>; - get isActivityActive(): boolean { + protected get isActivityActive(): boolean { return !!this[ACTIVE_PROP]; } - get couldOpenActivity(): boolean { + public get couldOpenActivity(): boolean { return true; } /** TODO: remove name argument */ - registerActivity(_name: string, options: { onActivate?: () => void; onDeactivate?: () => void } = {}): void { + protected registerActivity( + _name: string, + options: { onActivate?: () => void; onDeactivate?: () => void } = {}, + ): void { const { onActivate, onDeactivate } = options; - ActivityBlock._activityCallbacks.set(this, { + LitActivityBlock._activityCallbacks.set(this, { activateCallback: onActivate, deactivateCallback: onDeactivate, }); } - unregisterActivity(): void { + private _unregisterActivity(): void { if (this.isActivityActive) { this._deactivate(); } - ActivityBlock._activityCallbacks.delete(this); + LitActivityBlock._activityCallbacks.delete(this); } - override destroyCallback(): void { - super.destroyCallback(); - this._isActivityRegistered() && this.unregisterActivity(); + public override disconnectedCallback(): void { + super.disconnectedCallback(); + this._isActivityRegistered() && this._unregisterActivity(); const currentActivity = this.$['*currentActivity'] as string | null; - const hasCurrentActivityInCtx = !![...this.blocksRegistry].find( - (block) => block instanceof ActivityBlock && block.activityType === currentActivity, - ); + if (this.blocksRegistry) { + const hasCurrentActivityInCtx = !![...this.blocksRegistry].find( + (block) => block instanceof LitActivityBlock && block.activityType === currentActivity, + ); - if (!hasCurrentActivityInCtx) { - this.$['*currentActivity'] = null; - this.modalManager?.closeAll(); + if (!hasCurrentActivityInCtx) { + this.$['*currentActivity'] = null; + this.modalManager?.closeAll(); + } } } - get activityKey(): string { - return this.ctxName + this.activityType; - } - - get activityParams(): ActivityParamsMap[keyof ActivityParamsMap] { + public get activityParams(): ActivityParamsMap[keyof ActivityParamsMap] { return this.$['*currentActivityParams'] as ActivityParamsMap[keyof ActivityParamsMap]; } - get initActivity(): string { - return this.getCssData('--cfg-init-activity'); + public get initActivity(): string | null { + return (this.getCssData('--cfg-init-activity') as string | null) ?? null; } - get doneActivity(): string { - return this.getCssData('--cfg-done-activity'); + public get doneActivity(): string | null { + return (this.getCssData('--cfg-done-activity') as string | null) ?? null; } - historyBack(): void { + public historyBack(): void { const history = this.$['*history'] as string[]; if (history) { @@ -176,15 +177,15 @@ export class ActivityBlock extends Block { let couldOpenActivity = !!nextActivity; if (nextActivity) { - const nextActivityBlock = [...this.blocksRegistry].find((block) => block.activityType === nextActivity); - couldOpenActivity = (nextActivityBlock as ActivityBlock | undefined)?.couldOpenActivity ?? false; + const nextLitActivityBlock = [...this.blocksRegistry].find((block) => block.activityType === nextActivity); + couldOpenActivity = (nextLitActivityBlock as LitActivityBlock | undefined)?.couldOpenActivity ?? false; } nextActivity = couldOpenActivity ? nextActivity : undefined; if (nextActivity) this.modalManager?.open(nextActivity); - this.$['*currentActivity'] = nextActivity; + this.$['*currentActivity'] = nextActivity ?? null; this.$['*history'] = history; if (!nextActivity) { @@ -194,7 +195,7 @@ export class ActivityBlock extends Block { } } -ActivityBlock.activities = Object.freeze({ +LitActivityBlock.activities = Object.freeze({ START_FROM: 'start-from', CAMERA: 'camera', DRAW: 'draw', @@ -204,5 +205,6 @@ ActivityBlock.activities = Object.freeze({ EXTERNAL: 'external', }); -export type RegisteredActivityType = (typeof ActivityBlock)['activities'][keyof (typeof ActivityBlock)['activities']]; +export type RegisteredActivityType = + (typeof LitActivityBlock)['activities'][keyof (typeof LitActivityBlock)['activities']]; export type ActivityType = RegisteredActivityType | (string & {}) | null; diff --git a/src/lit/LitBlock.ts b/src/lit/LitBlock.ts new file mode 100644 index 000000000..93fb09dc8 --- /dev/null +++ b/src/lit/LitBlock.ts @@ -0,0 +1,335 @@ +import { LitElement } from 'lit'; +import { blockCtx } from '../abstract/CTX'; +import { A11y } from '../abstract/managers/a11y'; +import { LocaleManager, localeStateKey } from '../abstract/managers/LocaleManager'; +import { ModalManager } from '../abstract/managers/ModalManager'; +import { type ITelemetryManager, TelemetryManager } from '../abstract/managers/TelemetryManager'; +import { sharedConfigKey } from '../abstract/sharedConfigKey'; +import { initialConfig } from '../blocks/Config/initialConfig'; +import { EventEmitter } from '../blocks/UploadCtxProvider/EventEmitter'; +import type { ActivityType } from '../lit/LitActivityBlock'; +import { PubSub } from '../lit/PubSubCompat'; +import type { ConfigType } from '../types'; +import { extractCdnUrlModifiers, extractFilename, extractUuid } from '../utils/cdn-utils'; +import { getLocaleDirection } from '../utils/getLocaleDirection'; +import { getPluralForm } from '../utils/getPluralForm'; +import { applyTemplateData, getPluralObjects } from '../utils/template-utils'; +import { WindowHeightTracker } from '../utils/WindowHeightTracker'; +import { CssDataMixin } from './CssDataMixin'; +import { LightDomMixin } from './LightDomMixin'; +import { RegisterableElementMixin } from './RegisterableElementMixin'; +import type { SharedState } from './SharedState'; +import { SymbioteMixin } from './SymbioteCompatMixin'; +import { TestModeController } from './TestModeController'; + +interface SharedContextInstance { + destroy?(): void; +} + +const LitBlockBase = RegisterableElementMixin(SymbioteMixin()(CssDataMixin(LightDomMixin(LitElement)))); +export class LitBlock extends LitBlockBase { + private _cfgProxy!: ConfigType; + private _sharedContextInstances: Map< + keyof SharedState, + { + persist: boolean; + instance: SharedContextInstance; + } + > = new Map(); + + public static styleAttrs: string[] = []; + + public activityType: ActivityType = null; + + public init$ = blockCtx(); + + public constructor() { + super(); + new TestModeController(this); + } + + public l10n(str: string, variables: Record = {}): string { + if (!str) { + return ''; + } + const template = this.$[localeStateKey(str)] || str; + const pluralObjects = getPluralObjects(template); + for (const pluralObject of pluralObjects) { + variables[pluralObject.variable] = this._pluralize( + pluralObject.pluralKey, + Number(variables[pluralObject.countVariable]), + ); + } + const result = applyTemplateData(template, variables); + return result; + } + + private _pluralize(key: string, count: number): string { + const locale = this.l10n('locale-id') || 'en'; + const pluralForm = getPluralForm(locale, count); + return this.l10n(`${key}__${pluralForm}`); + } + + public emit( + type: Parameters[0], + payload?: Parameters[1], + options?: Parameters[2], + ): void { + const eventEmitter = this.has('*eventEmitter') ? this.$['*eventEmitter'] : undefined; + if (!eventEmitter) { + return; + } + + eventEmitter.emit(type, payload, options); + + const resolvedPayload = typeof payload === 'function' ? payload() : payload; + + this.telemetryManager.sendEvent({ + eventType: type, + payload: (resolvedPayload ?? undefined) as Record | undefined, + }); + } + + public hasBlockInCtx(callback: (block: LitBlock) => boolean): boolean { + for (const block of this.blocksRegistry) { + if (callback(block)) { + return true; + } + } + return false; + } + + public override connectedCallback(): void { + const styleAttrs = (this.constructor as typeof LitBlock).styleAttrs; + styleAttrs.forEach((attr: string) => { + this.setAttribute(attr, ''); + }); + + super.connectedCallback(); + + WindowHeightTracker.registerClient(this); + } + + public override initCallback(): void { + this.addSharedContextInstance('*blocksRegistry', () => new Set(), { + persist: true, + }); + this.addSharedContextInstance('*eventEmitter', () => new EventEmitter(this.debugPrint.bind(this)), { + persist: true, + }); + this.addSharedContextInstance('*localeManager', () => new LocaleManager(this)); + this.addSharedContextInstance('*modalManager', () => new ModalManager(this)); + this.addSharedContextInstance('*a11y', () => new A11y(), { + persist: true, + }); + this.addSharedContextInstance('*telemetryManager', () => { + if (this.cfg.qualityInsights) { + return new TelemetryManager(this); + } + return { + sendEvent: () => {}, + sendEventError: () => {}, + sendEventCloudImageEditor: () => {}, + } as ITelemetryManager; + }); + + this.sub(localeStateKey('locale-id'), (localeId: string) => { + const direction = getLocaleDirection(localeId); + this.style.direction = direction === 'ltr' ? '' : direction; + this.requestUpdate(); + }); + + this.subConfigValue('testMode', (testMode) => { + if (!testMode || !this.testId) { + this.removeAttribute('data-testid'); + return; + } + this.setAttribute('data-testid', this.testId); + }); + + this.blocksRegistry.add(this); + } + + public get testId(): string { + const testId = window.customElements.getName(this.constructor as CustomElementConstructor) as string; + return testId; + } + + public get modalManager(): ModalManager | null { + return this.getSharedContextInstance('*modalManager', false); + } + + public get telemetryManager(): ITelemetryManager { + return this.getSharedContextInstance('*telemetryManager'); + } + + public get localeManager(): LocaleManager { + return this.getSharedContextInstance('*localeManager'); + } + + public get a11y(): A11y { + return this.getSharedContextInstance('*a11y'); + } + + public get blocksRegistry(): Set { + return this.getSharedContextInstance('*blocksRegistry'); + } + + public get eventEmitter(): EventEmitter { + return this.getSharedContextInstance('*eventEmitter'); + } + + public override disconnectedCallback(): void { + super.disconnectedCallback(); + WindowHeightTracker.unregisterClient(this); + + const blocksRegistry = this.blocksRegistry; + blocksRegistry?.delete(this); + + this._destroySharedContextInstances(); + + if (blocksRegistry?.size === 0) { + setTimeout(() => { + // Destroy global context after all blocks are destroyed and all callbacks are run + this.destroyCtxCallback(); + }, 0); + } + } + + /** + * Called when the last block is removed from the context. Note that inheritors must run their callback before that. + */ + protected destroyCtxCallback(): void { + this._destroySharedContextInstances(true); + PubSub.deleteCtx(this.ctxName); + } + + /** + * Adds a shared context instance if it does not exist yet. + * @param key The shared state key. + * @param resolver The resolver function that creates the instance. + * @param persist Whether to persist the instance in the context if the creator block is removed. It's usually needed for those instances that depends on the current block. Defaults to false. + */ + protected addSharedContextInstance( + key: TKey, + resolver: () => SharedState[TKey], + { persist = false } = {}, + ): void { + if (this._sharedContextInstances.has(key)) { + return; + } + if (!this.has(key) || !this.$[key]) { + const managerInstance = resolver(); + this.add(key, managerInstance, true); + this._sharedContextInstances.set(key, { persist, instance: managerInstance }); + return; + } + } + + private _destroySharedContextInstances(destroyPersisted = false): void { + for (const [key, item] of this._sharedContextInstances.entries()) { + const { persist, instance } = item; + if (persist && !destroyPersisted) { + continue; + } + instance?.destroy?.(); + this.pub(key as keyof SharedState, null as never); + this._sharedContextInstances.delete(key); + } + } + + protected getSharedContextInstance( + key: TKey, + isRequired: TRequired = true as TRequired, + ): TRequired extends true ? NonNullable : SharedState[TKey] { + if (this.has(key) && !!this.$[key]) { + return this.$[key] as NonNullable; + } + + if (!isRequired) { + return this.$[key] as SharedState[TKey]; + } + + throw new Error(`Unexpected error: context manager for key "${String(key)}" is not available`); + } + + protected async proxyUrl(url: string): Promise { + if (this.cfg.secureDeliveryProxy && this.cfg.secureDeliveryProxyUrlResolver) { + console.warn( + 'Both secureDeliveryProxy and secureDeliveryProxyUrlResolver are set. The secureDeliveryProxyUrlResolver will be used.', + ); + } + if (this.cfg.secureDeliveryProxyUrlResolver) { + try { + return await this.cfg.secureDeliveryProxyUrlResolver(url, { + uuid: extractUuid(url), + cdnUrlModifiers: extractCdnUrlModifiers(url), + fileName: extractFilename(url), + }); + } catch (err) { + console.error('Failed to resolve secure delivery proxy URL. Falling back to the default URL.', err); + this.telemetryManager.sendEventError( + err, + 'secureDeliveryProxyUrlResolver. Failed to resolve secure delivery proxy URL. Falling back to the default URL.', + ); + return url; + } + } + if (this.cfg.secureDeliveryProxy) { + return applyTemplateData( + this.cfg.secureDeliveryProxy, + { previewUrl: url }, + { transform: (value) => window.encodeURIComponent(value) }, + ); + } + return url; + } + + public get cfg(): ConfigType { + if (!this._cfgProxy) { + const proxyTarget = {} as ConfigType; + this._cfgProxy = new Proxy(proxyTarget, { + set: (_obj: ConfigType, key: string | symbol, value: unknown) => { + if (typeof key !== 'string' || !(key in initialConfig)) { + return false; + } + const typedKey = key as keyof ConfigType; + const sharedKey = sharedConfigKey(typedKey); + if (!this.has(sharedKey)) { + this.add(sharedKey, initialConfig[typedKey]); + } + (this.$ as Record)[sharedKey] = value; + return true; + }, + get: (_obj: ConfigType, key: keyof ConfigType) => { + const sharedKey = sharedConfigKey(key); + if (!this.has(sharedKey)) { + this.add(sharedKey, initialConfig[key]); + } + return (this.$ as Record)[sharedKey] as ConfigType[typeof key]; + }, + }); + } + return this._cfgProxy; + } + + public subConfigValue(key: T, callback: (value: ConfigType[T]) => void): () => void { + const sharedKey = sharedConfigKey(key); + if (!this.has(sharedKey)) { + this.add(sharedKey, initialConfig[key] as unknown as SharedState[typeof sharedKey]); + } + return this.sub(sharedKey as any, callback); + } + + public debugPrint(...args: unknown[]): void { + if (!this.cfg.debug) { + return; + } + let consoleArgs = args; + if (typeof args?.[0] === 'function') { + const resolver = args[0] as () => unknown[]; + consoleArgs = resolver(); + } + console.log(`[${this.ctxName}]`, ...consoleArgs); + } +} diff --git a/src/lit/LitSolutionBlock.ts b/src/lit/LitSolutionBlock.ts new file mode 100644 index 000000000..56c89313f --- /dev/null +++ b/src/lit/LitSolutionBlock.ts @@ -0,0 +1,19 @@ +import { html } from 'lit'; +import { unsafeSVG } from 'lit/directives/unsafe-svg.js'; +import { solutionBlockCtx } from '../abstract/CTX'; +import svgIconsSprite from '../blocks/themes/uc-basic/svg-sprite'; +import { LitBlock } from './LitBlock'; + +export class LitSolutionBlock extends LitBlock { + public static override styleAttrs = ['uc-wgt-common']; + public override init$ = solutionBlockCtx(this); + + public override initCallback(): void { + super.initCallback(); + this.a11y?.registerBlock(this); + } + + public override render() { + return html`${unsafeSVG(svgIconsSprite)}`; + } +} diff --git a/src/abstract/UploaderBlock.ts b/src/lit/LitUploaderBlock.ts similarity index 74% rename from src/abstract/UploaderBlock.ts rename to src/lit/LitUploaderBlock.ts index 47715ef87..ce815a53a 100644 --- a/src/abstract/UploaderBlock.ts +++ b/src/lit/LitUploaderBlock.ts @@ -1,7 +1,12 @@ // @ts-check -import { Data } from '@symbiotejs/symbiote'; import { type FileFromOptions, uploadFileGroup } from '@uploadcare/upload-client'; +import { uploaderBlockCtx } from '../abstract/CTX'; +import { SecureUploadsManager } from '../abstract/managers/SecureUploadsManager'; +import { ValidationManager } from '../abstract/managers/ValidationManager'; +import { TypedCollection, type TypedCollectionObserverHandler } from '../abstract/TypedCollection'; +import { UploaderPublicApi } from '../abstract/UploaderPublicApi'; +import { initialUploadEntryData, type UploadEntryData } from '../abstract/uploadEntrySchema'; import { calculateMaxCenteredCropFrame } from '../blocks/CloudImageEditor/src/crop-utils'; import { parseCropPreset } from '../blocks/CloudImageEditor/src/lib/parseCropPreset'; import { EventType } from '../blocks/UploadCtxProvider/EventEmitter'; @@ -10,133 +15,110 @@ import { createCdnUrl, createCdnUrlModifiers } from '../utils/cdn-utils'; import { debounce } from '../utils/debounce'; import { ExternalUploadSource, UploadSource } from '../utils/UploadSource'; import { customUserAgent } from '../utils/userAgent'; -import { ActivityBlock } from './ActivityBlock'; -import { uploaderBlockCtx } from './CTX'; -import { SecureUploadsManager } from './managers/SecureUploadsManager'; -import { ValidationManager } from './managers/ValidationManager'; -import { TypedCollection, type TypedCollectionObserverHandler } from './TypedCollection'; -import { UploaderPublicApi } from './UploaderPublicApi'; -import { type UploadEntryData, uploadEntrySchema } from './uploadEntrySchema'; - -export class UploaderBlock extends ActivityBlock { - static extSrcList: Readonly; - static sourceTypes: Readonly; +import { LitActivityBlock } from './LitActivityBlock'; +import { PubSub } from './PubSubCompat'; +import type { Uid } from './Uid'; + +export class LitUploaderBlock extends LitActivityBlock { + public static extSrcList: Readonly; + public static sourceTypes: Readonly; protected couldBeCtxOwner = false; - private isCtxOwner = false; + private _isCtxOwner = false; private _unobserveCollection?: () => void; private _unobserveCollectionProperties?: () => void; - override init$ = uploaderBlockCtx(this); + public override init$ = uploaderBlockCtx(this); - private get hasCtxOwner(): boolean { + private get _hasCtxOwner(): boolean { return this.hasBlockInCtx((block) => { - if (block instanceof UploaderBlock) { - return block.isCtxOwner && block.isConnected && block !== this; + if (block instanceof LitUploaderBlock) { + return block._isCtxOwner && block.isConnected && block !== this; } return false; }); } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); - if (!this.has('*uploadCollection')) { - const uploadCollection = new TypedCollection({ - typedSchema: uploadEntrySchema, - watchList: [ - 'uploadProgress', - 'uploadError', - 'fileInfo', - 'errors', - 'cdnUrl', - 'isUploading', - 'isValidationPending', - ], - }); - this.add('*uploadCollection', uploadCollection); - } - - if (!this.has('*publicApi')) { - this.add('*publicApi', new UploaderPublicApi(this)); - } + this.addSharedContextInstance( + '*uploadCollection', + () => { + return new TypedCollection({ + initialValue: initialUploadEntryData, + watchList: [ + 'uploadProgress', + 'uploadError', + 'fileInfo', + 'errors', + 'cdnUrl', + 'isUploading', + 'isValidationPending', + ], + }); + }, + { + persist: true, + }, + ); - if (!this.has('*validationManager')) { - this.add('*validationManager', new ValidationManager(this)); - } + this.addSharedContextInstance('*secureUploadsManager', () => new SecureUploadsManager(this)); + this.addSharedContextInstance('*validationManager', () => new ValidationManager(this)); + this.addSharedContextInstance('*publicApi', () => new UploaderPublicApi(this)); - if (!this.hasCtxOwner && this.couldBeCtxOwner) { + if (!this._hasCtxOwner && this.couldBeCtxOwner) { this._initCtxOwner(); } } protected get validationManager(): ValidationManager { - if (!this.has('*validationManager')) { - throw new Error('Unexpected error: ValidationManager is not initialized'); - } - return this.$['*validationManager']; + return this.getSharedContextInstance('*validationManager'); } - get api(): UploaderPublicApi { - if (!this.has('*publicApi')) { - throw new Error('Unexpected error: UploaderPublicApi is not initialized'); - } - return this.$['*publicApi']; + public get api(): UploaderPublicApi { + return this.getSharedContextInstance('*publicApi'); } - getAPI(): UploaderPublicApi { + public getAPI(): UploaderPublicApi { return this.api; } - get uploadCollection(): TypedCollection { - if (!this.has('*uploadCollection')) { - throw new Error('Unexpected error: TypedCollection is not initialized'); - } - return this.$['*uploadCollection']; + public get uploadCollection(): TypedCollection { + return this.getSharedContextInstance('*uploadCollection'); } - override destroyCtxCallback(): void { - this.uploadCollection.destroy(); - this.$['*uploadCollection'] = null; - - super.destroyCtxCallback(); + public get secureUploadsManager(): SecureUploadsManager { + return this.getSharedContextInstance('*secureUploadsManager'); } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); - if (this.isCtxOwner) { + if (this._isCtxOwner) { this._unobserveUploadCollection(); } + + this._flushOutputItems.cancel(); } - override connectedCallback(): void { + public override connectedCallback(): void { super.connectedCallback(); - if (this.isCtxOwner) { + if (this._isCtxOwner) { this._observeUploadCollection(); } } - override destroyCallback(): void { - super.destroyCallback(); - - this._flushOutputItems.cancel(); - } - private _initCtxOwner(): void { - this.isCtxOwner = true; + this._isCtxOwner = true; this._observeUploadCollection(); this.subConfigValue('maxConcurrentRequests', (value) => { this.$['*uploadQueue'].concurrency = Number(value) || 1; }); - - if (!this.$['*secureUploadsManager']) { - this.$['*secureUploadsManager'] = new SecureUploadsManager(this); - } } private _observeUploadCollection(): void { @@ -199,11 +181,8 @@ export class UploaderBlock extends ActivityBlock { } }, 300); - private _handleCollectionUpdate: TypedCollectionObserverHandler = ( - entries, - added, - removed, - ) => { + private _handleCollectionUpdate: TypedCollectionObserverHandler = (entries, added, removed) => { + if (!this.isConnected) return; if (added.size || removed.size) { this.$['*groupInfo'] = null; } @@ -245,7 +224,8 @@ export class UploaderBlock extends ActivityBlock { this._flushOutputItems(); }; - private _handleCollectionPropertiesUpdate = (changeMap: Record>): void => { + private _handleCollectionPropertiesUpdate = (changeMap: Record>): void => { + if (!this.isConnected) return; this._flushOutputItems(); const uploadCollection = this.uploadCollection; @@ -259,9 +239,10 @@ export class UploaderBlock extends ActivityBlock { entriesToRunValidation.length > 0 && setTimeout(() => { + if (!this.isConnected) return; // We can't modify entry properties in the same tick, so we need to wait a bit const entriesToRunOnUpload = entriesToRunValidation.filter( - (entryId) => changeMap.fileInfo?.has(entryId) && !!Data.getCtx(entryId).store.fileInfo, + (entryId) => changeMap.fileInfo?.has(entryId) && !!PubSub.getCtx(entryId)?.store.fileInfo, ); if (entriesToRunOnUpload.length > 0) { this.validationManager.runFileValidators('upload', entriesToRunOnUpload); @@ -271,7 +252,9 @@ export class UploaderBlock extends ActivityBlock { if (changeMap.uploadProgress) { for (const entryId of changeMap.uploadProgress) { - const { isUploading, silent } = Data.getCtx(entryId).store; + const ctx = PubSub.getCtx(entryId); + if (!ctx) continue; + const { isUploading, silent } = ctx.store; if (isUploading && !silent) { this.emit(EventType.FILE_UPLOAD_PROGRESS, this.api.getOutputItem(entryId)); } @@ -281,7 +264,9 @@ export class UploaderBlock extends ActivityBlock { } if (changeMap.isUploading) { for (const entryId of changeMap.isUploading) { - const { isUploading, silent } = Data.getCtx(entryId).store; + const ctx = PubSub.getCtx(entryId); + if (!ctx) continue; + const { isUploading, silent } = ctx.store; if (isUploading && !silent) { this.emit(EventType.FILE_UPLOAD_START, this.api.getOutputItem(entryId)); } @@ -289,24 +274,28 @@ export class UploaderBlock extends ActivityBlock { } if (changeMap.fileInfo) { for (const entryId of changeMap.fileInfo) { - const { fileInfo, silent } = Data.getCtx(entryId).store; + const ctx = PubSub.getCtx(entryId); + if (!ctx) continue; + const { fileInfo, silent } = ctx.store; if (fileInfo && !silent) { this.emit(EventType.FILE_UPLOAD_SUCCESS, this.api.getOutputItem(entryId)); } } if (this.cfg.cropPreset) { - this.setInitialCrop(); + this._setInitialCrop(); } if (this.cfg.cloudImageEditorAutoOpen) { - this.openCloudImageEditor(); + this._openCloudImageEditor(); } } if (changeMap.errors) { this.validationManager.runCollectionValidators(); for (const entryId of changeMap.errors) { - const { errors } = Data.getCtx(entryId).store; + const ctx = PubSub.getCtx(entryId); + if (!ctx) continue; + const { errors } = ctx.store; if (errors.length > 0) { this.emit(EventType.FILE_UPLOAD_FAILED, this.api.getOutputItem(entryId)); this.emit( @@ -348,7 +337,7 @@ export class UploaderBlock extends ActivityBlock { private _flushCommonUploadProgress = (): void => { let commonProgress = 0; - const uploadTrigger: Set = this.$['*uploadTrigger']; + const uploadTrigger: Set = this.$['*uploadTrigger']; const items = [...uploadTrigger].filter((id) => !!this.uploadCollection.read(id)); items.forEach((id) => { const uploadProgress = this.uploadCollection.readProp(id, 'uploadProgress'); @@ -369,7 +358,7 @@ export class UploaderBlock extends ActivityBlock { ); }; - openCloudImageEditor(): void { + private _openCloudImageEditor(): void { const [entry] = this.uploadCollection .findItems((entry) => !!entry.getValue('fileInfo') && entry.getValue('isImage')) .map((id) => this.uploadCollection.read(id)); @@ -378,17 +367,17 @@ export class UploaderBlock extends ActivityBlock { entry && this.uploadCollection.size === 1 && this.cfg.useCloudImageEditor && - this.hasBlockInCtx((block) => block.activityType === ActivityBlock.activities.CLOUD_IMG_EDIT) + this.hasBlockInCtx((block) => block.activityType === LitActivityBlock.activities.CLOUD_IMG_EDIT) ) { this.$['*currentActivityParams'] = { internalId: entry.uid, }; - this.$['*currentActivity'] = ActivityBlock.activities.CLOUD_IMG_EDIT; - this.modalManager?.open(ActivityBlock.activities.CLOUD_IMG_EDIT); + this.$['*currentActivity'] = LitActivityBlock.activities.CLOUD_IMG_EDIT; + this.modalManager?.open(LitActivityBlock.activities.CLOUD_IMG_EDIT); } } - private setInitialCrop(): void { + private _setInitialCrop(): void { const cropPreset = parseCropPreset(this.cfg.cropPreset); if (cropPreset) { const [aspectRatioPreset] = cropPreset; @@ -435,13 +424,13 @@ export class UploaderBlock extends ActivityBlock { if ( this.uploadCollection.size === 1 && this.cfg.useCloudImageEditor && - this.hasBlockInCtx((block) => block.activityType === ActivityBlock.activities.CLOUD_IMG_EDIT) + this.hasBlockInCtx((block) => block.activityType === LitActivityBlock.activities.CLOUD_IMG_EDIT) ) { this.$['*currentActivityParams'] = { internalId: entry.uid, }; - this.$['*currentActivity'] = ActivityBlock.activities.CLOUD_IMG_EDIT; - this.modalManager?.open(ActivityBlock.activities.CLOUD_IMG_EDIT); + this.$['*currentActivity'] = LitActivityBlock.activities.CLOUD_IMG_EDIT; + this.modalManager?.open(LitActivityBlock.activities.CLOUD_IMG_EDIT); } } } @@ -458,8 +447,7 @@ export class UploaderBlock extends ActivityBlock { } protected async getUploadClientOptions(): Promise { - const secureUploadsManager: SecureUploadsManager = this.$['*secureUploadsManager']; - const secureToken = await secureUploadsManager.getSecureToken().catch(() => null); + const secureToken = await this.secureUploadsManager.getSecureToken().catch(() => null); const options = { store: this.cfg.store, @@ -483,7 +471,7 @@ export class UploaderBlock extends ActivityBlock { return options; } - getOutputData(): OutputFileEntry[] { + public getOutputData(): OutputFileEntry[] { const entriesIds = this.uploadCollection.items(); const data = entriesIds.map((itemId) => this.api.getOutputItem(itemId)); return data; @@ -493,13 +481,13 @@ export class UploaderBlock extends ActivityBlock { /** * @deprecated Use list sources ExternalUploadSource from from blocks/utils/UploadSource.js */ -UploaderBlock.extSrcList = Object.freeze({ +LitUploaderBlock.extSrcList = Object.freeze({ ...ExternalUploadSource, }); /** * @deprecated Use list sources UploadSource from from blocks/utils/UploadSource.js */ -UploaderBlock.sourceTypes = Object.freeze({ +LitUploaderBlock.sourceTypes = Object.freeze({ ...UploadSource, }); diff --git a/src/lit/PubSubCompat.ts b/src/lit/PubSubCompat.ts new file mode 100644 index 000000000..0f082aaea --- /dev/null +++ b/src/lit/PubSubCompat.ts @@ -0,0 +1,91 @@ +import { listenKeys, type MapStore, map } from 'nanostores'; + +export type Subscription = { + remove: () => void; +}; + +export class PubSub = Record> { + private static _contexts = new Map>>(); + + private _store: MapStore; + + private constructor(_ctxId: string, store: MapStore) { + this._store = store; + } + + public pub(key: K, value: T[K]): void { + if (!(key in this._store.get())) { + console.warn(`PubSub#pub: Key "${String(key)}" not found`); + } + this._store.setKey(key as never, value as never); + } + + public sub(key: K, callback: (value: T[K]) => void, init = true): Subscription { + if (!(key in this._store.get())) { + console.warn(`PubSub#sub: Key "${String(key)}" not found`); + } + + if (init) { + callback(this._store.get()[key]); + } + + const unsubscribe = listenKeys(this._store, [key as any], (values: Partial) => { + callback(values[key] as T[K]); + }); + + return { + remove: unsubscribe, + }; + } + + public read(key: K): T[K] { + if (!(key in this._store.get())) { + console.warn(`PubSub#read: Key "${String(key)}" not found`); + } + return this._store.get()[key]; + } + + public add(key: K, value: T[K], rewrite = false): void { + const exists = key in this._store.get(); + + if (!exists || rewrite) { + // biome-ignore lint/suspicious/noExplicitAny: nanostores doesn't export AllKeys type that they use to resolve setKey param type + this._store.setKey(key as any, value as any); + } + } + + public has(key: keyof T): boolean { + return key in this._store.get(); + } + + public get store(): T { + return this._store.get(); + } + + public static registerCtx>(initialValue: T, ctxId: string): PubSub { + if (PubSub._contexts.has(ctxId)) { + throw new Error(`PubSub: Context with id "${ctxId}" already exists`); + } + + const store = map(initialValue); + + PubSub._contexts.set(ctxId, store as MapStore>); + return new PubSub(ctxId, store); + } + + public static deleteCtx(ctxId: string): void { + PubSub._contexts.delete(ctxId); + } + + public static getCtx = Record>(ctxId: string): PubSub | null { + const store = PubSub._contexts.get(ctxId); + if (!store) { + return null; + } + return new PubSub(ctxId, store as MapStore); + } + + public static hasCtx(ctxId: string): boolean { + return PubSub._contexts.has(ctxId); + } +} diff --git a/src/lit/RegisterableElementMixin.ts b/src/lit/RegisterableElementMixin.ts new file mode 100644 index 000000000..346d45567 --- /dev/null +++ b/src/lit/RegisterableElementMixin.ts @@ -0,0 +1,32 @@ +import type { LitElement } from 'lit'; +import type { Constructor } from './Constructor'; + +type RegisterableElementMixinClassInterface = Constructor & { + reg(tagName: string): void; +}; + +export function RegisterableElementMixin>( + ctor: T, +): T & RegisterableElementMixinClassInterface { + abstract class RegisterableElementMixinClass extends ctor { + public static reg(tagName: string) { + const currentCtor = this as unknown as CustomElementConstructor; + const registeredClass = window.customElements.get(tagName); + if (registeredClass) { + if (registeredClass !== currentCtor) { + console.warn( + [ + `Element with tag name "${tagName}" already registered.`, + `You're trying to override it with another class "${this.name}".`, + `This is most likely a mistake.`, + `New element will not be registered.`, + ].join('\n'), + ); + } + return; + } + window.customElements.define(tagName, currentCtor); + } + } + return RegisterableElementMixinClass as unknown as T & RegisterableElementMixinClassInterface; +} diff --git a/src/lit/SharedState.ts b/src/lit/SharedState.ts new file mode 100644 index 000000000..f6384db03 --- /dev/null +++ b/src/lit/SharedState.ts @@ -0,0 +1,114 @@ +import type { Queue, UploadcareGroup } from '@uploadcare/upload-client'; +import type { EditorImageCropper, EditorImageFader, EditorSlider } from '..'; +import type { A11y } from '../abstract/managers/a11y'; +import type { LocaleManager } from '../abstract/managers/LocaleManager'; +import type { ModalManager } from '../abstract/managers/ModalManager'; +import type { SecureUploadsManager } from '../abstract/managers/SecureUploadsManager'; +import type { ITelemetryManager } from '../abstract/managers/TelemetryManager'; +import type { ValidationManager } from '../abstract/managers/ValidationManager'; +import type { TypedCollection } from '../abstract/TypedCollection'; +import type { UploaderPublicApi } from '../abstract/UploaderPublicApi'; +import type { UploadEntryData } from '../abstract/uploadEntrySchema'; +import type { TabIdValue } from '../blocks/CloudImageEditor/src/toolbar-constants'; +import type { + CropAspectRatio, + CropPresetList, + LoadingOperations, + Transformations, +} from '../blocks/CloudImageEditor/src/types'; +import type { EventEmitter } from '../blocks/UploadCtxProvider/EventEmitter'; +import type { ConfigType, OutputCollectionState, OutputErrorCollection } from '../types'; +import type { LitBlock } from './LitBlock'; +import type { Uid } from './Uid'; + +type SharedConfigState = { + [K in keyof ConfigType as `*cfg/${K}`]: ConfigType[K]; +}; + +type BlockCtxState = Record; + +type ActivityBlockCtxState = BlockCtxState & { + '*currentActivity': string | null; + '*currentActivityParams': Record; + '*history': (string | null)[]; + '*historyBack': (() => void) | null; + '*closeModal': () => void; +}; + +type UploaderBlockCtxState = ActivityBlockCtxState & { + '*commonProgress': number; + '*uploadList': { uid: Uid }[]; + '*uploadQueue': Queue; + '*collectionErrors': OutputErrorCollection[]; + '*collectionState': OutputCollectionState | null; + '*groupInfo': UploadcareGroup | null; + '*uploadTrigger': Set; + '*secureUploadsManager': SecureUploadsManager; +}; + +type SolutionBlockCtxState = UploaderBlockCtxState & { + '*solution': string | null; +}; + +type CloudImageEditorState = { + '*originalUrl': string | null; + '*loadingOperations': LoadingOperations; + '*faderEl': EditorImageFader | null; + '*cropperEl': EditorImageCropper | null; + '*imgEl': HTMLImageElement | null; + '*imgContainerEl': HTMLElement | null; + '*networkProblems': boolean; + '*imageSize': { width: number; height: number } | null; + '*editorTransformations': Transformations; + '*cropPresetList': CropPresetList; + '*currentAspectRatio': CropAspectRatio | null; + '*tabList': readonly TabIdValue[]; + '*tabId': TabIdValue; + '*on.retryNetwork': () => void; + '*on.apply': (transformations: Transformations) => void; + '*on.cancel': () => void; +}; + +type EditorImageCropperState = { + '*padding': number; + '*operations': { rotate: number; mirror: boolean; flip: boolean }; + '*imageBox': { x: number; y: number; width: number; height: number }; + '*cropBox': { x: number; y: number; width: number; height: number }; +}; + +type EditorToolbarState = { + '*showListAspectRatio': boolean; + '*sliderEl': EditorSlider | null; + '*showSlider': boolean; + '*currentFilter': string; + '*currentOperation': string | null; + '*operationTooltip': string | null; +}; + +type DynamicBlockState = { + '*blocksRegistry': Set; + '*eventEmitter': EventEmitter; + '*localeManager': LocaleManager; + '*telemetryManager': ITelemetryManager; + '*a11y': A11y; + '*modalManager': ModalManager | null; +}; + +type DynamicUploaderBlockState = { + '*uploadCollection': TypedCollection | null; + '*publicApi': UploaderPublicApi; + '*validationManager': ValidationManager; +}; + +type LocaleState = { + [key: `*l10n/${string}`]: string; +}; + +export type SharedState = SolutionBlockCtxState & + SharedConfigState & + CloudImageEditorState & + EditorImageCropperState & + EditorToolbarState & + DynamicBlockState & + DynamicUploaderBlockState & + LocaleState; diff --git a/src/lit/SymbioteCompatMixin.ts b/src/lit/SymbioteCompatMixin.ts new file mode 100644 index 000000000..041f8a5a0 --- /dev/null +++ b/src/lit/SymbioteCompatMixin.ts @@ -0,0 +1,384 @@ +import { ContextConsumer, ContextProvider, createContext } from '@lit/context'; +import type { LitElement, PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { debounce } from '../utils/debounce'; +import type { Constructor } from './Constructor'; +import { PubSub } from './PubSubCompat'; + +type SymbioteStateBag> = T; + +// Context for providing ctxName across component tree +export const ctxNameContext = createContext('ctx-name-context'); + +/** + * Interface for components using SymbioteMixin + */ +export declare class SymbioteComponent = Record> { + public $: SymbioteStateBag; + public sub(key: TKey, callback: (value: TState[TKey]) => void, init?: boolean): () => void; + public pub(key: TKey, value: TState[TKey]): void; + public set$(obj: T): void; + public has(key: TKey): boolean; + public add(key: TKey, val: TState[TKey], rewrite?: boolean): void; + public add$( + obj: T, + rewrite?: boolean, + ): void; + public initCallback(): void; + public ctxName: string; + public ctxOwner: boolean; +} + +/** + * SymbioteMixin - Compatibility layer between SymbioteJS and Lit Element + * + * This decorator allows Lit elements to use Symbiote's reactive state management + * and data binding features while maintaining Lit's rendering capabilities. + * + * Usage: + * class MyComponent extends SymbioteMixin()(LitElement) { ... } + * // or without state type: + * class MyComponent extends SymbioteMixin()(LitElement) { ... } + */ +export function SymbioteMixin = Record>() { + return function >(ctor: TCtor): TCtor & Constructor> { + class SymbioteMixinClass extends ctor { + private _symbioteSharedPubSub: PubSub | null = null; + private _symbioteFirstUpdated = false; + private _needsReconnectInit = false; + // biome-ignore lint/correctness/noUnusedPrivateClassMembers: keep consumer reference to maintain subscription lifecycle + private _ctxNameConsumer: ContextConsumer<{ __context__: string | undefined }, this>; + private _ctxNameProvider: + | ContextProvider<{ + __context__: string | undefined; + }> + | undefined = undefined; + private _pendingSharedAdds: Map = new Map(); + private _symbioteSubscriptions: Set<() => void> = new Set(); + + // Symbiote-style initial values declaration + protected init$: TState = {} as TState; + public ctxOwner = false; + + private _ctxNameAttrValue: string | undefined = undefined; + + private _pendingCtxInitOnConnect = false; + + @property({ type: String, attribute: 'ctx-name', noAccessor: true }) + private get _ctxNameAttr(): string | undefined { + return this._ctxNameAttrValue; + } + + private set _ctxNameAttr(value: string | undefined) { + const normalizedValue = value ?? undefined; + const oldValue = this._ctxNameAttrValue; + if (oldValue === normalizedValue) { + return; + } + this._ctxNameAttrValue = normalizedValue; + this._handleCtxNameSourceChange(); + } + + @state() + private _ctxNameFromContext: string | undefined; + + @state() + public ctxName: string | undefined = this._effectiveCtxName; + + @state() + private _isInitialized = false; + + protected override shouldUpdate(changedProperties: PropertyValues): boolean { + if (!this._isInitialized) { + return false; + } + return super.shouldUpdate(changedProperties); + } + + public constructor(...args: any[]) { + super(...args); + + // Consume ctxName from parent context + this._ctxNameAttrValue = this.getAttribute('ctx-name') || undefined; + this.ctxName = this._effectiveCtxName; + + this._ctxNameConsumer = new ContextConsumer(this, { + context: ctxNameContext, + callback: (value) => { + if (!value) { + console.error('SymbioteMixin: Received invalid ctx-name from context'); + return; + } + this._ctxNameFromContext = value; + this._handleCtxNameSourceChange(); + }, + subscribe: true, + }); + } + + private get _effectiveCtxName(): string | undefined { + return this._ctxNameAttr || this._ctxNameFromContext || undefined; + } + + private _handleCtxNameSourceChange(): void { + this.ctxName = this._effectiveCtxName; + + if (!this.ctxName || this._symbioteFirstUpdated) { + return; + } + + if (this.isConnected) { + this._performInitialization(); + return; + } + + this._pendingCtxInitOnConnect = true; + } + + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + + // Update effective ctxName before updates + this.ctxName = this._effectiveCtxName; + + if (this.ctxName) { + if (!this._ctxNameProvider) { + // Provide ctxName to children + this._ctxNameProvider = new ContextProvider(this, { + context: ctxNameContext, + initialValue: this.ctxName, + }); + } else { + this._ctxNameProvider.setValue(this.ctxName); + } + } + } + + private _applyPendingSharedAdds(): void { + if (!this._symbioteSharedPubSub || this._pendingSharedAdds.size === 0) { + return; + } + + for (const [key, { value, rewrite }] of this._pendingSharedAdds) { + this._symbioteSharedPubSub.add(key, value, rewrite); + } + this._pendingSharedAdds.clear(); + } + + private _getSharedPubSub(): PubSub | null { + if (!this._symbioteSharedPubSub && this._effectiveCtxName) { + this._initSharedContext(); + } + if (this._symbioteSharedPubSub) { + this._applyPendingSharedAdds(); + } + return this._symbioteSharedPubSub; + } + + private _requireSharedPubSub(): PubSub { + const pubsub = this._getSharedPubSub(); + if (!pubsub) { + throw new Error('SymbioteMixin: Shared context is not initialized.'); + } + return pubsub; + } + + /** + * Initialize shared context after ctxName is available + */ + private _initSharedContext() { + const initialValue = this.init$; + const ctxName = this._effectiveCtxName; + + if (!ctxName) { + console.error('SymbioteMixin: ctx-name is required for components with shared properties (*)'); + return; + } + + if (!this._symbioteSharedPubSub) { + this._symbioteSharedPubSub = + PubSub.getCtx(ctxName) ?? PubSub.registerCtx(initialValue, ctxName); + + for (const [key, defaultValue] of Object.entries(this.init$) as [keyof TState, TState[keyof TState]][]) { + this._symbioteSharedPubSub.add(key, defaultValue, this.ctxOwner); + } + + this._applyPendingSharedAdds(); + } + } + + /** + * Proxy for getting/setting values in the shared Symbiote data store. + * Keys must start with '*' as local state support has been removed. + */ + public get $(): SymbioteStateBag { + if (this._effectiveCtxName) { + this._initSharedContext(); + } + return new Proxy( + {}, + { + get: (_target: never, key: TKey | symbol) => { + if (typeof key !== 'string') { + return undefined; + } + return this._symbioteSharedPubSub?.read(key); + }, + set: (_target: never, key: TKey | symbol, value: TState[TKey]) => { + if (typeof key !== 'string') { + return true; + } + this._symbioteSharedPubSub?.pub(key, value); + return true; + }, + }, + ) as SymbioteStateBag; + } + + public sub( + key: TKey, + callback: (value: TState[TKey]) => void, + init = true, + ): () => void { + const subscription = this._requireSharedPubSub().sub(key, callback as (value: unknown) => void, init); + if (!subscription || typeof subscription.remove !== 'function') { + return () => {}; + } + + const removeFn = subscription.remove.bind(subscription); + let removed = false; + const trackedRemove = () => { + if (removed) { + return; + } + removed = true; + removeFn(); + this._symbioteSubscriptions.delete(trackedRemove); + }; + this._symbioteSubscriptions.add(trackedRemove); + return trackedRemove; + } + + public pub(key: TKey, value: TState[TKey]): void { + this._requireSharedPubSub().pub(key, value); + } + + public set$(obj: T): void { + for (const [prop, value] of Object.entries(obj) as [keyof TState, TState[keyof TState]][]) { + this.pub(prop, value); + } + } + + public has(key: keyof TState): boolean { + return this._symbioteSharedPubSub?.has(key) ?? false; + } + + public add(key: TKey, val: TState[TKey], rewrite = false) { + const pubsub = this._getSharedPubSub(); + if (!pubsub) { + if (!rewrite && this._pendingSharedAdds.has(key)) { + return; + } + this._pendingSharedAdds.set(key, { value: val, rewrite }); + return; + } + this._pendingSharedAdds.delete(key); + pubsub.add(key, val, rewrite); + } + + public add$(obj: T, rewrite = false) { + for (const [prop, value] of Object.entries(obj) as [keyof TState, TState[keyof TState]][]) { + this.add(prop, value, rewrite); + } + } + + public override connectedCallback() { + super.connectedCallback(); + + if (!this._symbioteFirstUpdated) { + if (this.ctxName) { + this._pendingCtxInitOnConnect = false; + this._performInitialization(); + } else if (this._pendingCtxInitOnConnect && this._effectiveCtxName) { + this._pendingCtxInitOnConnect = false; + this._performInitialization(); + } + } else if (this._isInitialized && this._needsReconnectInit) { + this._needsReconnectInit = false; + this.initCallback(); + } + } + + /** + * Perform component initialization + */ + private _performInitialization() { + if (this._symbioteFirstUpdated) return; + this._symbioteFirstUpdated = true; + + // Initialize shared context + this._initSharedContext(); + + // Initialize properties from init$ + const sharedSchema = this.init$; + + if (Object.keys(sharedSchema).length > 0) { + const pubsub = this._requireSharedPubSub(); + for (const [key, defaultValue] of Object.entries(sharedSchema) as [keyof TState, TState[keyof TState]][]) { + // For shared properties, check if value already exists in shared context + const existingValue = pubsub.read(key); + if (existingValue === undefined) { + pubsub.pub(key, defaultValue); + } + + // Set up two-way binding between Lit property and Symbiote data + this.sub( + key, + debounce(async () => { + if (!this.isConnected) return; + await this.updateComplete; + this.requestUpdate(); + }, 0), + false, + ); + } + } + + // Call the user-defined init callback after everything is set up + this.initCallback(); + + this._isInitialized = true; + + // Request update to render with initialized state + this.requestUpdate(); + } + + public override firstUpdated(changedProperties: PropertyValues) { + super.firstUpdated(changedProperties); + // Post-render tasks can go here if needed + } + + public override disconnectedCallback() { + this._cleanupSymbioteSubscriptions(); + super.disconnectedCallback(); + if (this._symbioteFirstUpdated) { + this._needsReconnectInit = true; + } + } + + private _cleanupSymbioteSubscriptions(): void { + if (this._symbioteSubscriptions.size === 0) { + return; + } + for (const unsubscribe of [...this._symbioteSubscriptions]) { + unsubscribe(); + } + this._symbioteSubscriptions.clear(); + } + + public initCallback() {} + } + + return SymbioteMixinClass as TCtor & Constructor>; + }; +} diff --git a/src/lit/TestModeController.ts b/src/lit/TestModeController.ts new file mode 100644 index 000000000..41b2d23b5 --- /dev/null +++ b/src/lit/TestModeController.ts @@ -0,0 +1,98 @@ +import type { LitElement, ReactiveController, ReactiveControllerHost } from 'lit'; +import { sharedConfigKey } from '../abstract/sharedConfigKey'; +import type { LitBlock } from './LitBlock'; + +type TestModeHost = ReactiveControllerHost & LitElement & LitBlock; + +const isCustomElement = (el: Element): boolean => { + return el.tagName?.includes('-') ?? false; +}; + +export class TestModeController implements ReactiveController { + private _trackedElements: Set = new Set(); + private _originalValues: Map = new Map(); + private _enabled = false; + private _unsubscribe?: () => void; + private _host: TestModeHost; + + public constructor(host: TestModeHost) { + this._host = host; + this._host.addController(this); + } + + public hostDisconnected(): void { + this._unsubscribe?.(); + this._unsubscribe = undefined; + this._trackedElements.clear(); + this._originalValues.clear(); + } + + public hostUpdated(): void { + if (!this._unsubscribe && this._host.has(sharedConfigKey('testMode'))) { + const unsubscribe = this._host.subConfigValue('testMode', (isEnabled: boolean) => { + this._enabled = Boolean(isEnabled); + this._applyTestMode(); + }); + this._unsubscribe = unsubscribe as (() => void) | undefined; + } + + this._collectElements(); + this._applyTestMode(); + } + + private _collectElements(): void { + const litHost = this._host as unknown as LitElement; + const root = (litHost.renderRoot ?? litHost) as Element | DocumentFragment; + if (!root) { + return; + } + + const hostElement = this._host as unknown as Element; + const hostTag = hostElement.tagName?.toLowerCase(); + const candidates = Array.from(root.querySelectorAll('[data-testid]')).filter( + (el) => !isCustomElement(el), + ) as Element[]; + + for (const el of candidates) { + if (hostTag && el.closest(hostTag) !== hostElement) { + continue; + } + + if (!this._trackedElements.has(el)) { + const attrValue = el.getAttribute('data-testid'); + if (!attrValue) { + continue; + } + this._trackedElements.add(el); + this._originalValues.set(el, attrValue); + } + } + + for (const el of Array.from(this._trackedElements)) { + if (!el.isConnected || (hostTag && el.closest(hostTag) !== hostElement)) { + this._trackedElements.delete(el); + this._originalValues.delete(el); + } + } + } + + private _applyTestMode(): void { + if (!this._trackedElements.size) { + return; + } + + const prefix = this._host.testId || ''; + for (const el of this._trackedElements) { + const baseValue = this._originalValues.get(el); + if (!baseValue) { + continue; + } + + if (this._enabled) { + el.setAttribute('data-testid', `${prefix}--${baseValue}`); + } else { + el.removeAttribute('data-testid'); + } + } + } +} diff --git a/src/lit/Uid.ts b/src/lit/Uid.ts new file mode 100644 index 000000000..3057ef04a --- /dev/null +++ b/src/lit/Uid.ts @@ -0,0 +1,3 @@ +export type Uid = string & { + __uid: true; +}; diff --git a/src/lit/parseCssPropertyValue.ts b/src/lit/parseCssPropertyValue.ts new file mode 100644 index 000000000..181163601 --- /dev/null +++ b/src/lit/parseCssPropertyValue.ts @@ -0,0 +1,74 @@ +const SINGLE_QUOTE = "'"; +const DOUBLE_QUOTE = '"'; +const ESCAPED_PATTERN = /\\([0-9a-fA-F]{1,6} ?)/g; + +function hasLeadingTrailingQuotes(str: string): boolean { + if (str.length < 2) return false; + return ( + (str[0] === DOUBLE_QUOTE || str[0] === SINGLE_QUOTE) && + (str[str.length - 1] === DOUBLE_QUOTE || str[str.length - 1] === SINGLE_QUOTE) + ); +} + +function trimQuotes(str: string): string { + let result = str; + if (result[0] === DOUBLE_QUOTE || result[0] === SINGLE_QUOTE) { + result = result.slice(1); + } + if (result[result.length - 1] === DOUBLE_QUOTE || result[result.length - 1] === SINGLE_QUOTE) { + result = result.slice(0, -1); + } + return result; +} + +function escapeQuotes(str: string): string { + let result = ''; + let prev = ''; + for (let i = 0; i < str.length; i++) { + const next = str[i + 1]; + if (str[i] === '\\' && next === '"') { + result += '\\"'; + i++; + } else if (str[i] === '"' && prev !== '\\') { + result += '\\"'; + } else { + result += str[i]; + } + prev = str[i] ?? ''; + } + return result; +} + +export function parseCssPropertyValue(input: string): string | number | boolean | null | undefined { + let output = input; + + if (hasLeadingTrailingQuotes(input)) { + output = trimQuotes(output); + + // Unescape CSS unicode sequences + // esbuild (and other bundlers) escapes unicode characters in CSS + // Firefox doesn't unescape them, WebKit browsers do + // see format here https://www.w3.org/International/questions/qa-escapes#nutshell + output = output.replace(ESCAPED_PATTERN, (_match, group) => { + return String.fromCodePoint(parseInt(group.trim(), 16)); + }); + + // Replace escaped CSS new-line separators with JSON escaped ones + // WebKit browsers do that automatically, Firefox doesn't + // see format here https://www.w3.org/TR/CSS22/syndata.html#strings + output = output.replaceAll('\\\n', '\\n'); + + // Escape quotes + // WebKit browsers escapes them, Firefox doesn't + output = escapeQuotes(output); + + // wrap output with trailing and leading double quotes to match JSON spec + output = DOUBLE_QUOTE + output + DOUBLE_QUOTE; + } + + try { + return JSON.parse(output) as string | number | boolean | null | undefined; + } catch (_error) { + return undefined; + } +} diff --git a/src/locales/file-uploader/ar.js b/src/locales/file-uploader/ar.ts similarity index 100% rename from src/locales/file-uploader/ar.js rename to src/locales/file-uploader/ar.ts diff --git a/src/locales/file-uploader/az.js b/src/locales/file-uploader/az.ts similarity index 100% rename from src/locales/file-uploader/az.js rename to src/locales/file-uploader/az.ts diff --git a/src/locales/file-uploader/ca.js b/src/locales/file-uploader/ca.ts similarity index 100% rename from src/locales/file-uploader/ca.js rename to src/locales/file-uploader/ca.ts diff --git a/src/locales/file-uploader/cs.js b/src/locales/file-uploader/cs.ts similarity index 100% rename from src/locales/file-uploader/cs.js rename to src/locales/file-uploader/cs.ts diff --git a/src/locales/file-uploader/da.js b/src/locales/file-uploader/da.ts similarity index 100% rename from src/locales/file-uploader/da.js rename to src/locales/file-uploader/da.ts diff --git a/src/locales/file-uploader/de.js b/src/locales/file-uploader/de.ts similarity index 100% rename from src/locales/file-uploader/de.js rename to src/locales/file-uploader/de.ts diff --git a/src/locales/file-uploader/el.js b/src/locales/file-uploader/el.ts similarity index 100% rename from src/locales/file-uploader/el.js rename to src/locales/file-uploader/el.ts diff --git a/src/locales/file-uploader/en.js b/src/locales/file-uploader/en.ts similarity index 100% rename from src/locales/file-uploader/en.js rename to src/locales/file-uploader/en.ts diff --git a/src/locales/file-uploader/es.js b/src/locales/file-uploader/es.ts similarity index 100% rename from src/locales/file-uploader/es.js rename to src/locales/file-uploader/es.ts diff --git a/src/locales/file-uploader/et.js b/src/locales/file-uploader/et.ts similarity index 100% rename from src/locales/file-uploader/et.js rename to src/locales/file-uploader/et.ts diff --git a/src/locales/file-uploader/fi.js b/src/locales/file-uploader/fi.ts similarity index 100% rename from src/locales/file-uploader/fi.js rename to src/locales/file-uploader/fi.ts diff --git a/src/locales/file-uploader/fr.js b/src/locales/file-uploader/fr.ts similarity index 100% rename from src/locales/file-uploader/fr.js rename to src/locales/file-uploader/fr.ts diff --git a/src/locales/file-uploader/he.js b/src/locales/file-uploader/he.ts similarity index 100% rename from src/locales/file-uploader/he.js rename to src/locales/file-uploader/he.ts diff --git a/src/locales/file-uploader/hy.js b/src/locales/file-uploader/hy.ts similarity index 100% rename from src/locales/file-uploader/hy.js rename to src/locales/file-uploader/hy.ts diff --git a/src/locales/file-uploader/is.js b/src/locales/file-uploader/is.ts similarity index 100% rename from src/locales/file-uploader/is.js rename to src/locales/file-uploader/is.ts diff --git a/src/locales/file-uploader/it.js b/src/locales/file-uploader/it.ts similarity index 100% rename from src/locales/file-uploader/it.js rename to src/locales/file-uploader/it.ts diff --git a/src/locales/file-uploader/ja.js b/src/locales/file-uploader/ja.ts similarity index 100% rename from src/locales/file-uploader/ja.js rename to src/locales/file-uploader/ja.ts diff --git a/src/locales/file-uploader/ka.js b/src/locales/file-uploader/ka.ts similarity index 100% rename from src/locales/file-uploader/ka.js rename to src/locales/file-uploader/ka.ts diff --git a/src/locales/file-uploader/kk.js b/src/locales/file-uploader/kk.ts similarity index 100% rename from src/locales/file-uploader/kk.js rename to src/locales/file-uploader/kk.ts diff --git a/src/locales/file-uploader/ko.js b/src/locales/file-uploader/ko.ts similarity index 100% rename from src/locales/file-uploader/ko.js rename to src/locales/file-uploader/ko.ts diff --git a/src/locales/file-uploader/lv.js b/src/locales/file-uploader/lv.ts similarity index 100% rename from src/locales/file-uploader/lv.js rename to src/locales/file-uploader/lv.ts diff --git a/src/locales/file-uploader/nb.js b/src/locales/file-uploader/nb.ts similarity index 100% rename from src/locales/file-uploader/nb.js rename to src/locales/file-uploader/nb.ts diff --git a/src/locales/file-uploader/nl.js b/src/locales/file-uploader/nl.ts similarity index 100% rename from src/locales/file-uploader/nl.js rename to src/locales/file-uploader/nl.ts diff --git a/src/locales/file-uploader/pl.js b/src/locales/file-uploader/pl.ts similarity index 100% rename from src/locales/file-uploader/pl.js rename to src/locales/file-uploader/pl.ts diff --git a/src/locales/file-uploader/pt.js b/src/locales/file-uploader/pt.ts similarity index 100% rename from src/locales/file-uploader/pt.js rename to src/locales/file-uploader/pt.ts diff --git a/src/locales/file-uploader/ro.js b/src/locales/file-uploader/ro.ts similarity index 100% rename from src/locales/file-uploader/ro.js rename to src/locales/file-uploader/ro.ts diff --git a/src/locales/file-uploader/ru.js b/src/locales/file-uploader/ru.ts similarity index 100% rename from src/locales/file-uploader/ru.js rename to src/locales/file-uploader/ru.ts diff --git a/src/locales/file-uploader/sk.js b/src/locales/file-uploader/sk.ts similarity index 100% rename from src/locales/file-uploader/sk.js rename to src/locales/file-uploader/sk.ts diff --git a/src/locales/file-uploader/sr.js b/src/locales/file-uploader/sr.ts similarity index 100% rename from src/locales/file-uploader/sr.js rename to src/locales/file-uploader/sr.ts diff --git a/src/locales/file-uploader/sv.js b/src/locales/file-uploader/sv.ts similarity index 100% rename from src/locales/file-uploader/sv.js rename to src/locales/file-uploader/sv.ts diff --git a/src/locales/file-uploader/tr.js b/src/locales/file-uploader/tr.ts similarity index 100% rename from src/locales/file-uploader/tr.js rename to src/locales/file-uploader/tr.ts diff --git a/src/locales/file-uploader/uk.js b/src/locales/file-uploader/uk.ts similarity index 100% rename from src/locales/file-uploader/uk.js rename to src/locales/file-uploader/uk.ts diff --git a/src/locales/file-uploader/vi.js b/src/locales/file-uploader/vi.ts similarity index 100% rename from src/locales/file-uploader/vi.js rename to src/locales/file-uploader/vi.ts diff --git a/src/locales/file-uploader/zh-TW.js b/src/locales/file-uploader/zh-TW.ts similarity index 100% rename from src/locales/file-uploader/zh-TW.js rename to src/locales/file-uploader/zh-TW.ts diff --git a/src/locales/file-uploader/zh.js b/src/locales/file-uploader/zh.ts similarity index 100% rename from src/locales/file-uploader/zh.js rename to src/locales/file-uploader/zh.ts diff --git a/src/solutions/cloud-image-editor/CloudImageEditor.ts b/src/solutions/cloud-image-editor/CloudImageEditor.ts index 378e63813..995f98299 100644 --- a/src/solutions/cloud-image-editor/CloudImageEditor.ts +++ b/src/solutions/cloud-image-editor/CloudImageEditor.ts @@ -7,9 +7,9 @@ interface CloudImageEditorInitState extends BaseInitState { } export class CloudImageEditor extends CloudImageEditorBlock { - static override styleAttrs = [...super.styleAttrs, 'uc-wgt-common']; + public static override styleAttrs = [...super.styleAttrs, 'uc-wgt-common']; - constructor() { + public constructor() { super(); this.init$ = { @@ -18,7 +18,7 @@ export class CloudImageEditor extends CloudImageEditorBlock { } as CloudImageEditorInitState; } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.telemetryManager.sendEvent({ diff --git a/src/solutions/file-uploader/inline/FileUploaderInline.ts b/src/solutions/file-uploader/inline/FileUploaderInline.ts index 2b8cc8c55..192ae4ab3 100644 --- a/src/solutions/file-uploader/inline/FileUploaderInline.ts +++ b/src/solutions/file-uploader/inline/FileUploaderInline.ts @@ -1,103 +1,111 @@ +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; import './index.css'; -import { ActivityBlock } from '../../../abstract/ActivityBlock'; -import { SolutionBlock } from '../../../abstract/SolutionBlock'; -import type { UploaderBlock } from '../../../abstract/UploaderBlock'; import { InternalEventType } from '../../../blocks/UploadCtxProvider/EventEmitter'; +import { LitActivityBlock } from '../../../lit/LitActivityBlock'; +import { LitSolutionBlock } from '../../../lit/LitSolutionBlock'; -type BaseInitState = InstanceType['init$']; +type BaseInitState = InstanceType['init$']; -interface FileUploaderInlineInitState extends BaseInitState { - couldCancel: boolean; - cancel: () => void; -} +type FileUploaderInlineInitState = BaseInitState & { + '*solution': string; +}; + +export class FileUploaderInline extends LitSolutionBlock { + public declare propertiesMeta: { + 'ctx-name': string; + }; + public static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-inline']; -export class FileUploaderInline extends SolutionBlock { - static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-inline']; + @state() + private _couldCancel = false; - constructor() { + public constructor() { super(); this.init$ = { ...this.init$, - couldCancel: false, '*solution': this.tagName, - cancel: () => { - if (this.couldHistoryBack) { - const historyBack = this.$['*historyBack'] as (() => void) | undefined; - historyBack?.(); - return; - } - - if (this.couldShowList) { - this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; - } - }, } as FileUploaderInlineInitState; } - get couldHistoryBack(): boolean { + private _handleCancel = (): void => { + if (this._couldHistoryBack) { + const historyBack = this.$['*historyBack'] as (() => void) | undefined; + historyBack?.(); + return; + } + + if (this._couldShowList) { + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; + } + }; + + private get _couldHistoryBack(): boolean { const history = this.$['*history'] as string[] | undefined; if (!history || history.length <= 1) { return false; } - return history[history.length - 1] !== ActivityBlock.activities.START_FROM; + return history[history.length - 1] !== LitActivityBlock.activities.START_FROM; } - get couldShowList(): boolean { + private get _couldShowList(): boolean { const uploadList = this.$['*uploadList'] as unknown[] | undefined; return this.cfg.showEmptyList || (Array.isArray(uploadList) && uploadList.length > 0); } - override initCallback(): void { + private _getInitActivity(): string { + return (this.getCssData('--cfg-init-activity') as string | undefined) || LitActivityBlock.activities.START_FROM; + } + + public override initCallback(): void { super.initCallback(); this.telemetryManager.sendEvent({ eventType: InternalEventType.INIT_SOLUTION, }); - const uBlock = this.ref.uBlock as UploaderBlock | undefined; - if (!uBlock) { - return; - } + const initActivity = this._getInitActivity(); this.sub('*currentActivity', (val: string | null) => { if (!val) { - this.$['*currentActivity'] = uBlock.initActivity || ActivityBlock.activities.START_FROM; + this.$['*currentActivity'] = initActivity; } }); this.sub('*uploadList', (list: unknown) => { - if ( - Array.isArray(list) && - list.length > 0 && - this.$['*currentActivity'] === (uBlock.initActivity || ActivityBlock.activities.START_FROM) - ) { - this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; + if (Array.isArray(list) && list.length > 0 && this.$['*currentActivity'] === initActivity) { + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; } }); this.sub('*history', () => { - this.$.couldCancel = this.couldHistoryBack || this.couldShowList; + this._couldCancel = this._couldHistoryBack || this._couldShowList; }); } -} -FileUploaderInline.template = /* HTML */ ` - - - - - - - - - - - -`; + public override render() { + return html` + ${super.render()} + + + + + + + + + + + + `; + } +} diff --git a/src/solutions/file-uploader/inline/index.css b/src/solutions/file-uploader/inline/index.css index 4691a36f9..bd84a43a0 100644 --- a/src/solutions/file-uploader/inline/index.css +++ b/src/solutions/file-uploader/inline/index.css @@ -30,6 +30,7 @@ @container (min-width: 500px) { [uc-file-uploader-inline] uc-start-from .uc-content { grid-template-columns: 1fr max-content; + grid-template-rows: 1fr max-content; height: 100%; } diff --git a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts index 69bc88fda..d75747bec 100644 --- a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts +++ b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts @@ -1,110 +1,105 @@ -import { ActivityBlock } from '../../../abstract/ActivityBlock'; +import { html } from 'lit'; +import { state } from 'lit/decorators.js'; import type { ModalCb } from '../../../abstract/managers/ModalManager'; import { ModalEvents } from '../../../abstract/managers/ModalManager'; -import { SolutionBlock } from '../../../abstract/SolutionBlock'; -import type { UploaderBlock } from '../../../abstract/UploaderBlock'; import { InternalEventType } from '../../../blocks/UploadCtxProvider/EventEmitter'; +import { LitActivityBlock } from '../../../lit/LitActivityBlock'; +import { LitSolutionBlock } from '../../../lit/LitSolutionBlock'; import './index.css'; const ACTIVE_CLASS = 'active'; const EMPTY_CLASS = ''; -type BaseInitState = InstanceType['init$']; -interface FileUploaderMinimalInitState extends BaseInitState { - singleUpload: boolean; - isHiddenStartFrom: boolean; - classUploadList: string; - classStartFrom: string; -} +type BaseInitState = InstanceType['init$']; +type FileUploaderMinimalInitState = BaseInitState & { + '*solution': string; +}; + +export class FileUploaderMinimal extends LitSolutionBlock { + public declare propertiesMeta: { + 'ctx-name': string; + }; + public static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-minimal']; + + @state() + private _singleUpload = false; + + @state() + private _isHiddenStartFrom = false; -export class FileUploaderMinimal extends SolutionBlock { - static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-minimal']; + @state() + private _classUploadList = EMPTY_CLASS; - private handleModalOpen?: ModalCb; - private handleModalClose?: ModalCb; + @state() + private _classStartFrom = EMPTY_CLASS; - constructor() { + private _getInitActivity(): string { + return (this.getCssData('--cfg-init-activity') as string | undefined) || LitActivityBlock.activities.START_FROM; + } + + public constructor() { super(); this.init$ = { ...this.init$, - singleUpload: false, - isHiddenStartFrom: false, - classUploadList: EMPTY_CLASS, - classStartFrom: EMPTY_CLASS, '*solution': this.tagName, } as FileUploaderMinimalInitState; } - private _handleModalOpen(data: Parameters[0]): void { - if (data.id === ActivityBlock.activities.CLOUD_IMG_EDIT) { - this.set$({ - classUploadList: ACTIVE_CLASS, - }); + private _handleModalOpen = (data: Parameters[0]): void => { + if (data.id === LitActivityBlock.activities.CLOUD_IMG_EDIT) { + this._classUploadList = ACTIVE_CLASS; } - if (this.$['*currentActivity'] === ActivityBlock.activities.UPLOAD_LIST) { - this.set$({ - classUploadList: ACTIVE_CLASS, - isHiddenStartFrom: true, - }); + if (this.$['*currentActivity'] === LitActivityBlock.activities.UPLOAD_LIST) { + this._classUploadList = ACTIVE_CLASS; + this._isHiddenStartFrom = true; } const uploadList = this.$['*uploadList'] as unknown[] | undefined; if (!uploadList || uploadList.length <= 0) { - this.set$({ - classStartFrom: ACTIVE_CLASS, - }); + this._classStartFrom = ACTIVE_CLASS; } - } + }; - private _handleModalClose(data: Parameters[0]): void { + private _handleModalClose = (data: Parameters[0]): void => { if (data.id === this.$['*currentActivity']) { - this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; - this.set$({ - isHiddenStartFrom: false, - }); + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; + this._isHiddenStartFrom = false; } - if (data.id === ActivityBlock.activities.CLOUD_IMG_EDIT) { - this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; + if (data.id === LitActivityBlock.activities.CLOUD_IMG_EDIT) { + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; } - } + }; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.telemetryManager.sendEvent({ eventType: InternalEventType.INIT_SOLUTION, }); - const uBlock = this.ref.uBlock as UploaderBlock | undefined; - if (!uBlock) { - return; - } + const initActivity = this._getInitActivity(); this.sub('*currentActivity', (val: string | null) => { - if (val === ActivityBlock.activities.UPLOAD_LIST) { + if (val === LitActivityBlock.activities.UPLOAD_LIST) { this.modalManager?.closeAll(); } if (!val) { - this.$['*currentActivity'] = uBlock.initActivity || ActivityBlock.activities.START_FROM; + this.$['*currentActivity'] = initActivity; } }); this.sub('*uploadList', (list: unknown) => { if (Array.isArray(list) && list.length > 0) { - this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST; - this.set$({ - classStartFrom: EMPTY_CLASS, - }); + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; + this._classStartFrom = EMPTY_CLASS; } else { - this.set$({ - classUploadList: EMPTY_CLASS, - isHiddenStartFrom: false, - }); - this.$['*currentActivity'] = uBlock.initActivity || ActivityBlock.activities.START_FROM; + this._classUploadList = EMPTY_CLASS; + this._isHiddenStartFrom = false; + this.$['*currentActivity'] = initActivity; } }); @@ -125,60 +120,65 @@ export class FileUploaderMinimal extends SolutionBlock { this.style.setProperty('--uc-grid-col', '1'); } - this.$.singleUpload = !multiple; + this._singleUpload = !multiple; } else { this.style.removeProperty('--uc-grid-col'); - this.$.singleUpload = false; + this._singleUpload = false; } }); }); - this.handleModalOpen = (event) => { - this._handleModalOpen(event); - }; - this.handleModalClose = (event) => { - this._handleModalClose(event); - }; + this.modalManager?.subscribe(ModalEvents.OPEN, this._handleModalOpen); + this.modalManager?.subscribe(ModalEvents.CLOSE, this._handleModalClose); + } - this.modalManager?.subscribe(ModalEvents.OPEN, this.handleModalOpen); - this.modalManager?.subscribe(ModalEvents.CLOSE, this.handleModalClose); + public override disconnectedCallback(): void { + super.disconnectedCallback(); + this.modalManager?.unsubscribe(ModalEvents.OPEN, this._handleModalOpen); + this.modalManager?.unsubscribe(ModalEvents.CLOSE, this._handleModalClose); } - override destroyCallback(): void { - super.destroyCallback(); - this.modalManager?.unsubscribe(ModalEvents.OPEN, this.handleModalOpen); - this.modalManager?.unsubscribe(ModalEvents.CLOSE, this.handleModalClose); + public override render() { + return html` + ${super.render()} + + ${this.l10n('choose-file')} + + + + + + + + + + + + + + + + + + + + + + + + + + + + `; } } - -FileUploaderMinimal.template = /* HTML */ ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; diff --git a/src/solutions/file-uploader/minimal/index.css b/src/solutions/file-uploader/minimal/index.css index 66364c375..8374ef036 100644 --- a/src/solutions/file-uploader/minimal/index.css +++ b/src/solutions/file-uploader/minimal/index.css @@ -102,8 +102,8 @@ } [uc-file-uploader-minimal] uc-file-item uc-progress-bar { - top: 0 !important; - height: 100% !important; + top: 0; + height: 100%; } [uc-file-uploader-minimal] uc-file-item uc-progress-bar .uc-progress { diff --git a/src/solutions/file-uploader/regular/FileUploaderRegular.ts b/src/solutions/file-uploader/regular/FileUploaderRegular.ts index 080dbdf45..279265688 100644 --- a/src/solutions/file-uploader/regular/FileUploaderRegular.ts +++ b/src/solutions/file-uploader/regular/FileUploaderRegular.ts @@ -1,50 +1,51 @@ -import './index.css'; -import { SolutionBlock } from '../../../abstract/SolutionBlock'; -import { asBoolean } from '../../../blocks/Config/validatorsType'; +import { html } from 'lit'; +import { property } from 'lit/decorators.js'; import { InternalEventType } from '../../../blocks/UploadCtxProvider/EventEmitter'; +import { LitSolutionBlock } from '../../../lit/LitSolutionBlock'; +import './index.css'; -type BaseInitState = InstanceType['init$']; +type BaseInitState = InstanceType['init$']; interface FileUploaderRegularInitState extends BaseInitState { - isHidden: boolean; '*solution': string; } -export class FileUploaderRegular extends SolutionBlock { - static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-regular']; +export class FileUploaderRegular extends LitSolutionBlock { + public declare attributesMeta: { + headless?: boolean; + 'ctx-name': string; + }; + public static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-regular']; + + @property({ type: Boolean }) + public headless = false; - constructor() { + public constructor() { super(); - const initialState: FileUploaderRegularInitState = { + this.init$ = { ...this.init$, - isHidden: false, '*solution': this.tagName, - }; - - this.init$ = initialState; + } as FileUploaderRegularInitState; } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.telemetryManager.sendEvent({ eventType: InternalEventType.INIT_SOLUTION, }); - - this.defineAccessor('headless', (value: unknown) => { - this.set$({ isHidden: asBoolean(value) }); - }); } -} -FileUploaderRegular.template = /* HTML */ ` - + public override render() { + return html` + ${super.render()} + - + @@ -69,8 +70,5 @@ FileUploaderRegular.template = /* HTML */ ` `; - -FileUploaderRegular.bindAttributes({ - // @ts-expect-error TODO: fix types inside symbiote - headless: null, -}); + } +} diff --git a/src/types/exported.ts b/src/types/exported.ts index ae879deb9..89709345c 100644 --- a/src/types/exported.ts +++ b/src/types/exported.ts @@ -373,7 +373,7 @@ export type OutputErrorTypePayload = { FORBIDDEN_FILE_TYPE: OutputFileErrorPayload; FILE_SIZE_EXCEEDED: OutputFileErrorPayload; - SOME_FILES_HAS_ERRORS: {}; + SOME_FILES_HAS_ERRORS: { [k: string]: never }; TOO_MANY_FILES: { min: number; max: number; diff --git a/src/utils/UID.ts b/src/utils/UID.ts new file mode 100644 index 000000000..43c8d198c --- /dev/null +++ b/src/utils/UID.ts @@ -0,0 +1,8 @@ +import type { Uid } from '../lit/Uid'; + +// biome-ignore lint/complexity/noStaticOnlyClass: This is defined as class to be compatible with the symbiote's UID type +export class UID { + public static generate(): Uid { + return `uid-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}` as Uid; + } +} diff --git a/src/utils/WindowHeightTracker.ts b/src/utils/WindowHeightTracker.ts index 5e26563a8..6a12da14b 100644 --- a/src/utils/WindowHeightTracker.ts +++ b/src/utils/WindowHeightTracker.ts @@ -1,24 +1,24 @@ -import type { Block } from '../abstract/Block.js'; -import { debounce } from '../utils/debounce.js'; +import type { LitBlock } from '../lit/LitBlock'; +import { debounce } from '../utils/debounce'; const WINDOW_HEIGHT_TRACKER_PROPERTY = '--uploadcare-blocks-window-height'; // biome-ignore lint/complexity/noStaticOnlyClass: This class is static only by design export class WindowHeightTracker { - private static clientsRegistry = new Set(); + private static clientsRegistry = new Set(); private static flush = debounce(() => { document.documentElement.style.setProperty(WINDOW_HEIGHT_TRACKER_PROPERTY, `${window.innerHeight}px`); }, 100); - static registerClient(client: Block): void { + public static registerClient(client: LitBlock): void { if (WindowHeightTracker.clientsRegistry.size === 0) { WindowHeightTracker.attachTracker(); } WindowHeightTracker.clientsRegistry.add(client); } - static unregisterClient(client: Block): void { + public static unregisterClient(client: LitBlock): void { WindowHeightTracker.clientsRegistry.delete(client); if (WindowHeightTracker.clientsRegistry.size === 0) { WindowHeightTracker.detachTracker(); diff --git a/src/utils/applyStyles.ts b/src/utils/applyStyles.ts new file mode 100644 index 000000000..e7971e15b --- /dev/null +++ b/src/utils/applyStyles.ts @@ -0,0 +1,12 @@ +export function applyStyles( + el: T, + styleMap: Record, +): void { + for (const prop in styleMap) { + if (prop.includes('-')) { + el.style.setProperty(prop, String(styleMap[prop])); + } else { + (el.style as CSSStyleDeclaration & Record)[prop] = String(styleMap[prop]); + } + } +} diff --git a/src/utils/waitForAttribute.test.ts b/src/utils/waitForAttribute.test.ts deleted file mode 100644 index e6e054f4c..000000000 --- a/src/utils/waitForAttribute.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { delay } from './delay'; -import { waitForAttribute } from './waitForAttribute'; - -const TEST_ATTRIBUTE = 'test-attribute'; - -describe('waitForAttribute', () => { - it('should call onTimeout callback when timeout is over', async () => { - const element = document.createElement('div'); - const onSuccess = vi.fn(); - const onTimeout = vi.fn(); - waitForAttribute({ - element, - attribute: TEST_ATTRIBUTE, - onSuccess, - onTimeout, - timeout: 10, - }); - await delay(100); - expect(onSuccess).not.toHaveBeenCalled(); - expect(onTimeout).toHaveBeenCalledTimes(1); - }); - it('should call onSuccess callback when attribute is set async', async () => { - const element = document.createElement('div'); - const onSuccess = vi.fn(); - const onTimeout = vi.fn(); - waitForAttribute({ - element, - attribute: TEST_ATTRIBUTE, - onSuccess, - onTimeout, - timeout: 10, - }); - element.setAttribute(TEST_ATTRIBUTE, 'test'); - await delay(100); - expect(onSuccess).toHaveBeenCalledTimes(1); - expect(onSuccess).toHaveBeenCalledWith('test'); - expect(onTimeout).not.toHaveBeenCalled(); - }); - it('should call onSuccess callback when attribute is set sync', async () => { - const element = document.createElement('div'); - element.setAttribute(TEST_ATTRIBUTE, 'test'); - const onSuccess = vi.fn(); - const onTimeout = vi.fn(); - waitForAttribute({ - element, - attribute: TEST_ATTRIBUTE, - onSuccess, - onTimeout, - timeout: 10, - }); - await delay(100); - expect(onSuccess).toHaveBeenCalledTimes(1); - expect(onSuccess).toHaveBeenCalledWith('test'); - expect(onTimeout).not.toHaveBeenCalled(); - }); - - it('should not call onSuccess on the second attribute change', async () => { - const element = document.createElement('div'); - element.setAttribute(TEST_ATTRIBUTE, 'test'); - const onSuccess = vi.fn(); - const onTimeout = vi.fn(); - waitForAttribute({ - element, - attribute: TEST_ATTRIBUTE, - onSuccess, - onTimeout, - timeout: 10, - }); - await delay(100); - element.setAttribute(TEST_ATTRIBUTE, 'tes2'); - await delay(100); - expect(onSuccess).toHaveBeenCalledTimes(1); - expect(onSuccess).toHaveBeenCalledWith('test'); - expect(onTimeout).not.toHaveBeenCalled(); - }); -}); diff --git a/src/utils/waitForAttribute.ts b/src/utils/waitForAttribute.ts deleted file mode 100644 index 3578f830b..000000000 --- a/src/utils/waitForAttribute.ts +++ /dev/null @@ -1,47 +0,0 @@ -type WaitForAttributeOptions = { - element: HTMLElement; - attribute: string; - onSuccess: (value: string) => void; - onTimeout: () => void; - timeout?: number; -}; - -export const waitForAttribute = ({ - element, - attribute, - onSuccess, - onTimeout, - timeout = 300, -}: WaitForAttributeOptions): void => { - const currentAttrValue = element.getAttribute(attribute); - if (currentAttrValue !== null) { - onSuccess(currentAttrValue); - return; - } - - const observer = new MutationObserver((mutations) => { - const mutation = mutations[mutations.length - 1]; - if (mutation) { - handleMutation(mutation); - } - }); - - observer.observe(element, { - attributes: true, - attributeFilter: [attribute], - }); - - const timeoutId = window.setTimeout(() => { - observer.disconnect(); - onTimeout(); - }, timeout); - - const handleMutation = (mutation: MutationRecord): void => { - const attrValue = element.getAttribute(attribute); - if (mutation.type === 'attributes' && mutation.attributeName === attribute && attrValue !== null) { - window.clearTimeout(timeoutId); - observer.disconnect(); - onSuccess(attrValue); - } - }; -}; diff --git a/stylelint-force-app-name-prefix.cjs b/stylelint-force-app-name-prefix.cjs index da94e3508..821e315e3 100644 --- a/stylelint-force-app-name-prefix.cjs +++ b/stylelint-force-app-name-prefix.cjs @@ -16,11 +16,11 @@ var optionsSchema = { }; const messages = stylelint.utils.ruleMessages(ruleName, { - invalid: (selector, appName) => 'Selector "' + selector + '" is out of control, please wrap within .' + appName, + invalid: (selector, appName) => `Selector "${selector}" is out of control, please wrap within .${appName}`, invalidKeyFrames: (keyframesName, appName) => - 'Keyframes name "' + keyframesName + '" is out of control, please prefix with ' + appName + '-', + `Keyframes name "${keyframesName}" is out of control, please prefix with ${appName}-`, invalidFontFace: (fontFamily, appName) => - 'Custom font-family "' + fontFamily + '" is out of control, please prefix with ' + appName + '-', + `Custom font-family "${fontFamily}" is out of control, please prefix with ${appName}-`, }); function findTopParentSelector(node) { @@ -49,12 +49,12 @@ module.exports = stylelint.createPlugin(ruleName, (options) => (root, result) => }); if (!validOptions) return; - const whiteList = ['.' + options.appName, /^:.*/]; + const whiteList = [`.${options.appName}`, /^:.*/]; root.walkAtRules('keyframes', (rule) => { const keyframesName = rule.params; - if (keyframesName.indexOf(options.appName + '-') === -1) { + if (keyframesName.indexOf(`${options.appName}-`) === -1) { stylelint.utils.report({ ruleName: ruleName, result: result, @@ -66,7 +66,7 @@ module.exports = stylelint.createPlugin(ruleName, (options) => (root, result) => root.walkAtRules('font-face', (rule) => { rule.walkDecls('font-family', (decl) => { - if (decl.value.indexOf(options.appName + '-') === -1) { + if (decl.value.indexOf(`${options.appName}-`) === -1) { stylelint.utils.report({ ruleName: ruleName, result: result, @@ -94,8 +94,8 @@ module.exports = stylelint.createPlugin(ruleName, (options) => (root, result) => } if ( - topParentSelector.indexOf('.' + options.appName + '-') === 0 || - topParentSelector.indexOf(options.appName + '-') === 0 + topParentSelector.indexOf(`.${options.appName}-`) === 0 || + topParentSelector.indexOf(`${options.appName}-`) === 0 ) { // good } else { diff --git a/tests/api.e2e.test.tsx b/tests/api.e2e.test.tsx index b6f268d4f..612a0eecf 100644 --- a/tests/api.e2e.test.tsx +++ b/tests/api.e2e.test.tsx @@ -1,5 +1,5 @@ -import { page } from '@vitest/browser/context'; import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; +import { page } from 'vitest/browser'; import type { EventPayload } from '@/index.js'; import '../types/jsx'; // biome-ignore lint/correctness/noUnusedImports: Used in JSX diff --git a/tests/bundles.e2e.test.tsx b/tests/bundles.e2e.test.tsx index 8198311e4..d604bc2b6 100644 --- a/tests/bundles.e2e.test.tsx +++ b/tests/bundles.e2e.test.tsx @@ -1,5 +1,5 @@ -import { page } from '@vitest/browser/context'; import { describe, expect, test } from 'vitest'; +import { page } from 'vitest/browser'; import '../types/jsx'; import { getCtxName } from './utils/getCtxName'; // biome-ignore lint/correctness/noUnusedImports: Used in JSX diff --git a/tests/config.e2e.test.tsx b/tests/config.e2e.test.tsx index 805c4edee..dc4fe1966 100644 --- a/tests/config.e2e.test.tsx +++ b/tests/config.e2e.test.tsx @@ -1,5 +1,5 @@ -import { page } from '@vitest/browser/context'; import { beforeAll, beforeEach, describe, expect, it } from 'vitest'; +import { page } from 'vitest/browser'; import '../types/jsx'; // biome-ignore lint/correctness/noUnusedImports: Used in JSX import { cleanup, getCtxName, renderer } from './utils/test-renderer'; diff --git a/tests/file-uploader-regular.e2e.test.tsx b/tests/file-uploader-regular.e2e.test.tsx index b04a1d038..99a8cc404 100644 --- a/tests/file-uploader-regular.e2e.test.tsx +++ b/tests/file-uploader-regular.e2e.test.tsx @@ -1,5 +1,5 @@ -import { commands, page, userEvent } from '@vitest/browser/context'; import { beforeAll, beforeEach, describe, expect, it, test } from 'vitest'; +import { commands, page, userEvent } from 'vitest/browser'; import '../types/jsx'; // biome-ignore lint/correctness/noUnusedImports: Used in JSX import { renderer } from './utils/test-renderer'; diff --git a/tests/utils/commands.ts b/tests/utils/commands.ts index 6817c0cd0..7cf3f0804 100644 --- a/tests/utils/commands.ts +++ b/tests/utils/commands.ts @@ -17,7 +17,7 @@ export const commands = { waitFileChooserAndUpload, }; -declare module '@vitest/browser/context' { +declare module 'vitest/browser' { interface BrowserCommands { waitFileChooserAndUpload: (relativePaths: string[]) => Promise; } diff --git a/tests/utils/test-renderer.tsx b/tests/utils/test-renderer.tsx index 23fc3dc1a..dbae6459d 100644 --- a/tests/utils/test-renderer.tsx +++ b/tests/utils/test-renderer.tsx @@ -1,6 +1,6 @@ -import { page } from '@vitest/browser/context'; import { CommonDOMRenderer } from 'render-jsx/dom'; import { beforeEach } from 'vitest'; +import { page } from 'vitest/browser'; export const renderer = new CommonDOMRenderer(); @@ -37,7 +37,7 @@ beforeEach(async () => { cleanup(); }); -declare module '@vitest/browser/context' { +declare module 'vitest/browser' { interface BrowserPage { render: typeof render; } diff --git a/tests/validation.e2e.test.tsx b/tests/validation.e2e.test.tsx index 280ab8f1c..c64ab350f 100644 --- a/tests/validation.e2e.test.tsx +++ b/tests/validation.e2e.test.tsx @@ -1,5 +1,5 @@ -import { page } from '@vitest/browser/context'; import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; +import { page } from 'vitest/browser'; import type { Config, FuncFileValidator, OutputErrorCollection, OutputErrorFile, UploadCtxProvider } from '@/index'; import { delay } from '@/utils/delay.js'; import '../types/jsx'; @@ -185,7 +185,7 @@ describe('Custom file validation', () => { api.initFlow(); await expect .poll(() => api.getOutputCollectionState().status, { - timeout: 5000, + timeout: 10000, }) .toBe('success'); expect(customValidator).toHaveBeenCalledTimes(1); @@ -207,7 +207,7 @@ describe('Custom file validation', () => { await page.getByLabelText('Edit', { exact: true }).click(); await page.getByLabelText('Apply mirror operation', { exact: true }).click(); await delay(300); - await page.getByLabelText('apply', { exact: true }).click(); + await page.getByLabelText('Apply', { exact: true }).click(); expect(customValidator).toHaveBeenCalledTimes(1); }); @@ -229,7 +229,7 @@ describe('Custom file validation', () => { api.initFlow(); await expect .poll(() => api.getOutputCollectionState().status, { - timeout: 5000, + timeout: 10000, }) .toBe('success'); await expect.poll(() => customValidator).toHaveBeenCalledTimes(1); @@ -249,11 +249,11 @@ describe('Custom file validation', () => { api.addFileFromObject(IMAGE.SQUARE); api.initFlow(); await page.getByLabelText('Edit', { exact: true }).click({ - timeout: 15000, + timeout: 10000, }); await page.getByLabelText('Apply mirror operation', { exact: true }).click(); await delay(300); - await page.getByLabelText('apply', { exact: true }).click(); + await page.getByLabelText('Apply', { exact: true }).click(); expect(customValidator).toHaveBeenCalledTimes(1); }); @@ -297,7 +297,7 @@ describe('Custom file validation', () => { await page.getByLabelText('Edit', { exact: true }).click(); await page.getByLabelText('Apply mirror operation', { exact: true }).click(); const callsBeforeEdit = customValidator.mock.calls.length; - await page.getByLabelText('apply', { exact: true }).click(); + await page.getByLabelText('Apply', { exact: true }).click(); await expect.poll(() => customValidator.mock.calls.length).toBe(callsBeforeEdit + 1); }); }); @@ -419,7 +419,7 @@ describe('Custom file validation', () => { .toHaveBeenCalledWith(expect.objectContaining({ status: 'idle' }), expect.anything(), expect.anything()); await expect .poll(() => validator, { - timeout: 3000, + timeout: 10000, }) .toHaveBeenCalledWith(expect.objectContaining({ status: 'success' }), expect.anything(), expect.anything()); }); @@ -435,7 +435,7 @@ describe('Custom file validation', () => { await expect .poll(() => validator, { - timeout: 3000, + timeout: 5000, }) .toHaveBeenLastCalledWith( expect.objectContaining({ cdnUrlModifiers: '' }), @@ -444,13 +444,14 @@ describe('Custom file validation', () => { ); await page.getByLabelText('Edit', { exact: true }).click(); + await delay(1000); await page.getByLabelText('Apply mirror operation', { exact: true }).click(); - await delay(300); - await page.getByLabelText('apply', { exact: true }).click(); + await delay(1000); + await page.getByLabelText('Apply', { exact: true }).click(); await expect .poll(() => validator, { - timeout: 3000, + timeout: 5000, }) .toHaveBeenLastCalledWith( expect.objectContaining({ @@ -576,9 +577,10 @@ describe('File errors API', () => { // Apply mirror and check for error await page.getByLabelText('Edit', { exact: true }).click(); + await delay(3000); await page.getByLabelText('Apply mirror operation', { exact: true }).click(); - await delay(300); - await page.getByLabelText('apply', { exact: true }).click(); + await delay(3000); + await page.getByLabelText('Apply', { exact: true }).click(); await expect .poll(() => { @@ -589,9 +591,10 @@ describe('File errors API', () => { // Remove mirror and check for error gone await page.getByLabelText('Edit', { exact: true }).click(); + await delay(3000); await page.getByLabelText('Apply mirror operation', { exact: true }).click(); - await delay(300); - await page.getByLabelText('apply', { exact: true }).click(); + await delay(3000); + await page.getByLabelText('Apply', { exact: true }).click(); await expect .poll(() => { @@ -602,9 +605,10 @@ describe('File errors API', () => { // Apply mirror and check for error again await page.getByLabelText('Edit', { exact: true }).click(); + await delay(3000); await page.getByLabelText('Apply mirror operation', { exact: true }).click(); - await delay(300); - await page.getByLabelText('apply', { exact: true }).click(); + await delay(3000); + await page.getByLabelText('Apply', { exact: true }).click(); await expect .poll(() => { diff --git a/tsconfig.app.json b/tsconfig.app.json index 8c8aa8936..2dba1c141 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -11,12 +11,14 @@ "noImplicitReturns": true, "noImplicitThis": true, "noUncheckedIndexedAccess": true, - "allowJs": true, + "allowJs": false, "strict": true, "skipLibCheck": true, "noEmit": true, "sourceMap": true, - "types": ["@total-typescript/ts-reset", "vite/client"] + "types": ["@total-typescript/ts-reset", "vite/client"], + "experimentalDecorators": true, + "useDefineForClassFields": false }, "include": ["src"], "exclude": ["node_modules", "**/*.test.js"] diff --git a/tsconfig.e2e-test.json b/tsconfig.e2e-test.json index 87a1285f9..8850a2299 100644 --- a/tsconfig.e2e-test.json +++ b/tsconfig.e2e-test.json @@ -4,7 +4,7 @@ "target": "esnext", "module": "esnext", "moduleResolution": "bundler", - "types": ["@total-typescript/ts-reset", "@vitest/browser/providers/playwright", "vite/client"], + "types": ["@total-typescript/ts-reset", "@vitest/browser-playwright", "vite/client"], "jsxFactory": "renderer.create", "jsxFragmentFactory": "renderer.fragment", "allowJs": true, @@ -14,7 +14,9 @@ "paths": { "@/*": ["./src/*"], "~/*": ["./*"] - } + }, + "experimentalDecorators": true, + "useDefineForClassFields": false }, "include": ["src", "tests"], "exclude": ["node_modules", "**/*.test.js"] diff --git a/tsconfig.node.json b/tsconfig.node.json index 75446c972..17d1a0fb8 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -8,8 +8,8 @@ "strict": true, "skipLibCheck": true, "noEmit": true, - "types": ["@total-typescript/ts-reset", "@vitest/browser/providers/playwright"] + "types": ["@total-typescript/ts-reset", "@vitest/browser-playwright"] }, - "include": ["vite.config.js", "test-locales.js", "ship.config.mjs", "scripts"], + "include": ["vite.config.ts", "test-locales.js", "ship.config.mjs", "scripts"], "exclude": ["node_modules", "tests"] } diff --git a/tsconfig.test.json b/tsconfig.test.json index 0ae3a937e..72eb49d8c 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -10,7 +10,9 @@ "strict": true, "skipLibCheck": true, "noEmit": true, - "esModuleInterop": true + "esModuleInterop": true, + "experimentalDecorators": true, + "useDefineForClassFields": false }, "include": ["src", "types/test", "./**/*.test.ts", "./**/*.test-d.tsx"], "exclude": ["node_modules"] diff --git a/types/jsx.d.ts b/types/jsx.d.ts index c8e4d76fd..687e90f27 100644 --- a/types/jsx.d.ts +++ b/types/jsx.d.ts @@ -1,66 +1,93 @@ /// -type ConfigPlainType = import('../dist/index.ts').ConfigPlainType; +type LitElement = import('lit').LitElement; type UploadCtxProvider = import('../dist/index.ts').UploadCtxProvider; type Config = import('../dist/index.ts').Config; type FileUploaderInline = import('../dist/index.ts').FileUploaderInline; type FileUploaderRegular = import('../dist/index.ts').FileUploaderRegular; type FileUploaderMinimal = import('../dist/index.ts').FileUploaderMinimal; +type BtnUi = import('../dist/index.ts').BtnUi; +type LineLoaderUi = import('../dist/index.ts').LineLoaderUi; +type PresenceToggle = import('../dist/index.ts').PresenceToggle; +type SliderUi = import('../dist/index.ts').SliderUi; +type CropFrame = import('../dist/index.ts').CropFrame; +type EditorCropButtonControl = import('../dist/index.ts').EditorCropButtonControl; +type EditorAspectRatioButtonControl = import('../dist/index.ts').EditorAspectRatioButtonControl; +type EditorFreeformButtonControl = import('../dist/index.ts').EditorFreeformButtonControl; +type EditorFilterControl = import('../dist/index.ts').EditorFilterControl; +type EditorOperationControl = import('../dist/index.ts').EditorOperationControl; +type EditorImageCropper = import('../dist/index.ts').EditorImageCropper; +type EditorImageFader = import('../dist/index.ts').EditorImageFader; +type EditorScroller = import('../dist/index.ts').EditorScroller; +type EditorSlider = import('../dist/index.ts').EditorSlider; +type EditorToolbar = import('../dist/index.ts').EditorToolbar; +type Icon = import('../dist/index.ts').Icon; +type Img = import('../dist/index.ts').Img; +type SimpleBtn = import('../dist/index.ts').SimpleBtn; +type StartFrom = import('../dist/index.ts').StartFrom; +type DropArea = import('../dist/index.ts').DropArea; +type SourceBtn = import('../dist/index.ts').SourceBtn; +type SourceList = import('../dist/index.ts').SourceList; +type FileItem = import('../dist/index.ts').FileItem; +type Modal = import('../dist/index.ts').Modal; +type UploadList = import('../dist/index.ts').UploadList; +type UrlSource = import('../dist/index.ts').UrlSource; +type CameraSource = import('../dist/index.ts').CameraSource; +type ProgressBarCommon = import('../dist/index.ts').ProgressBarCommon; +type ProgressBar = import('../dist/index.ts').ProgressBar; +type ExternalSource = import('../dist/index.ts').ExternalSource; +type CloudImageEditorActivity = import('../dist/index.ts').CloudImageEditorActivity; type FormInput = import('../dist/index.ts').FormInput; type CloudImageEditorBlock = import('../dist/index.ts').CloudImageEditorBlock; -type CtxAttributes = { - 'ctx-name': string; - testMode?: boolean; -}; + type CommonHtmlAttributes = Partial< Pick, 'id' | 'children' | 'hidden'> & { class: React.HTMLAttributes['className'] } >; -type CustomElement = React.DetailedHTMLProps, C> & A; +type ReflectAttributes }> = T['attributesMeta']; + +type CustomElement = React.DetailedHTMLProps, C> & ReflectAttributes; declare namespace JSX { interface IntrinsicElements { - 'uc-crop-frame': any; - 'uc-editor-crop-button-control': any; - 'uc-editor-aspect-ratio-button-control': any; - 'uc-editor-freeform-button-control': any; - 'uc-editor-filter-control': any; - 'uc-editor-operation-control': any; - 'uc-editor-image-cropper': any; - 'uc-editor-image-fader': any; - 'uc-editor-scroller': any; - 'uc-editor-slider': any; - 'uc-editor-toolbar': any; - 'uc-btn-ui': any; - 'uc-line-loader-ui': any; - 'uc-presence-toggle': any; - 'uc-slider-ui': any; - 'uc-icon': any; - 'uc-img': any; - 'uc-simple-btn': any; - 'uc-start-from': any; - 'uc-drop-area': any; - 'uc-source-btn': any; - 'uc-source-list': any; - 'uc-file-item': any; - 'uc-modal': any; - 'uc-upload-list': any; - 'uc-url-source': any; - 'uc-camera-source': any; - 'uc-progress-bar-common': any; - 'uc-progress-bar': any; - 'uc-external-source': any; - 'uc-cloud-image-editor-activity': any; - 'uc-cloud-image-editor-block': CustomElement< - CloudImageEditorBlock, - CtxAttributes & ({ uuid: string } | { 'cdn-url': string }) & Partial<{ tabs: string; 'crop-preset': string }> - >; - 'uc-cloud-image-editor': CustomElement; - 'uc-form-input': CustomElement; - 'uc-file-uploader-regular': CustomElement>; - 'uc-file-uploader-minimal': CustomElement; - 'uc-file-uploader-inline': CustomElement; - 'uc-upload-ctx-provider': CustomElement; - 'uc-config': CustomElement>; + 'uc-crop-frame': CustomElement; + 'uc-editor-crop-button-control': CustomElement; + 'uc-editor-aspect-ratio-button-control': CustomElement; + 'uc-editor-freeform-button-control': CustomElement; + 'uc-editor-filter-control': CustomElement; + 'uc-editor-operation-control': CustomElement; + 'uc-editor-image-cropper': CustomElement; + 'uc-editor-image-fader': CustomElement; + 'uc-editor-scroller': CustomElement; + 'uc-editor-slider': CustomElement; + 'uc-editor-toolbar': CustomElement; + 'uc-btn-ui': CustomElement; + 'uc-line-loader-ui': CustomElement; + 'uc-presence-toggle': CustomElement; + 'uc-slider-ui': CustomElement; + 'uc-icon': CustomElement; + 'uc-img': CustomElement & React.DetailedHTMLProps, HTMLImageElement>; + 'uc-simple-btn': CustomElement; + 'uc-start-from': CustomElement; + 'uc-drop-area': CustomElement; + 'uc-source-btn': CustomElement; + 'uc-source-list': CustomElement; + 'uc-file-item': CustomElement; + 'uc-modal': CustomElement; + 'uc-upload-list': CustomElement; + 'uc-url-source': CustomElement; + 'uc-camera-source': CustomElement; + 'uc-progress-bar-common': CustomElement; + 'uc-progress-bar': CustomElement; + 'uc-external-source': CustomElement; + 'uc-cloud-image-editor-activity': CustomElement; + 'uc-cloud-image-editor-block': CustomElement; + 'uc-cloud-image-editor': CustomElement; + 'uc-form-input': CustomElement; + 'uc-file-uploader-regular': CustomElement; + 'uc-file-uploader-minimal': CustomElement; + 'uc-file-uploader-inline': CustomElement; + 'uc-upload-ctx-provider': CustomElement; + 'uc-config': CustomElement; } } diff --git a/types/test/public-upload-api.test-d.tsx b/types/test/public-upload-api.test-d.tsx index ccb6d86de..dfd78c7a4 100644 --- a/types/test/public-upload-api.test-d.tsx +++ b/types/test/public-upload-api.test-d.tsx @@ -30,7 +30,3 @@ api.setCurrentActivity('external', { // @ts-expect-error - should not allow to set activity with invalid params invalidParam: 'value', }); - -// should allow to set some custom activity -api.setCurrentActivity('my-custom-activity'); -api.setCurrentActivity('my-custom-activity', { myCustomParam: 'value' }); diff --git a/types/test/uc-cloud-image-editor.test-d.tsx b/types/test/uc-cloud-image-editor.test-d.tsx index dc061f2a0..22e8b9e4d 100644 --- a/types/test/uc-cloud-image-editor.test-d.tsx +++ b/types/test/uc-cloud-image-editor.test-d.tsx @@ -4,7 +4,7 @@ import React from 'react'; // @ts-expect-error - no props () => ; -// @ts-expect-error - no css-url +// @ts-expect-error - no cdn-url () => ; // @ts-expect-error - no css-src diff --git a/types/test/uc-upload-ctx-provider.test-d.tsx b/types/test/uc-upload-ctx-provider.test-d.tsx index 32be4f730..fd73afb6c 100644 --- a/types/test/uc-upload-ctx-provider.test-d.tsx +++ b/types/test/uc-upload-ctx-provider.test-d.tsx @@ -19,7 +19,6 @@ import { const instance = new UploadCtxProvider(); instance.uploadCollection.size; -instance.setOrAddState('fileId', 'uploading'); const api = instance.getAPI(); api.addFileFromUrl('https://example.com/image.png'); diff --git a/vite.config.js b/vite.config.js deleted file mode 100644 index 496185553..000000000 --- a/vite.config.js +++ /dev/null @@ -1,74 +0,0 @@ -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { defineConfig } from 'vite'; -import { commands } from './tests/utils/commands'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - -const alias = { - '@': resolve(__dirname, 'src'), - '~': __dirname, -}; - -export default defineConfig(({ command }) => { - if (command === 'serve') { - return { - build: { - target: 'esnext', - }, - test: { - coverage: { - provider: 'v8', - reporter: ['text', 'html'], - reportsDirectory: './tests/__coverage__', - }, - projects: [ - { - extends: true, - test: { - name: 'specs', - include: ['./specs/npm/*.test.ts', './**/*.test.{ts,js}'], - environment: 'happy-dom', - }, - }, - { - extends: true, - test: { - name: 'e2e', - include: ['./**/*.e2e.test.ts', './**/*.e2e.test.tsx'], - expect: { - poll: { - timeout: 20_000, - }, - }, - browser: { - enabled: true, - provider: 'playwright', - instances: [ - { - browser: 'chromium', - launch: { - args: [ - '--disable-web-security', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - ], - }, - }, - ], - commands: { - ...commands, - }, - }, - }, - }, - ], - }, - resolve: { - alias, - }, - }; - } - - throw new Error('Not implemented'); -}); diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..c27d0828e --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,25 @@ +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { defineConfig } from 'vite'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const alias = { + '@': resolve(__dirname, 'src'), + '~': __dirname, +}; + +export default defineConfig(({ command }) => { + if (command === 'serve') { + return { + build: { + target: 'esnext', + }, + resolve: { + alias, + }, + }; + } + + throw new Error('Not implemented'); +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 000000000..538291c39 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,67 @@ +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { playwright } from '@vitest/browser-playwright'; +import { defineConfig } from 'vitest/config'; +import { commands } from './tests/utils/commands'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const alias = { + '@': resolve(__dirname, 'src'), + '~': __dirname, +}; + +export default defineConfig({ + resolve: { + alias, + }, + test: { + coverage: { + provider: 'v8', + reporter: ['text', 'html'], + reportsDirectory: './tests/__coverage__', + }, + projects: [ + { + extends: true, + test: { + name: 'specs', + include: ['./specs/npm/*.test.ts', './**/*.test.{ts,js}'], + environment: 'happy-dom', + }, + }, + { + extends: true, + test: { + name: 'e2e', + include: ['./**/*.e2e.test.ts', './**/*.e2e.test.tsx'], + expect: { + poll: { + timeout: 20_000, + }, + }, + browser: { + enabled: true, + provider: playwright({ + launchOptions: { + args: [ + '--disable-web-security', + '--use-fake-ui-for-media-stream', + '--use-fake-device-for-media-stream', + ], + }, + }), + instances: [ + { + browser: 'chromium', + }, + ], + commands: { + ...commands, + }, + }, + }, + }, + ], + }, +});