From 5ab076d75b313666841821b8b204f934d1d194e6 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Wed, 5 Nov 2025 15:14:05 +0300 Subject: [PATCH 01/60] feat: symbiote v2 update --- package-lock.json | 20562 ++++------------ package.json | 45 +- src/abstract/Block.ts | 51 +- src/abstract/SolutionBlock.ts | 3 +- src/abstract/TypedCollection.ts | 8 +- src/abstract/TypedData.ts | 10 +- src/abstract/UploaderBlock.ts | 12 +- src/abstract/UploaderPublicApi.ts | 4 +- .../bindCompatibilityFallbackProcessor.ts | 13 + src/abstract/defineComponents.ts | 5 + src/abstract/l10nProcessor.ts | 6 +- src/blocks/CameraSource/CameraSource.ts | 43 +- src/blocks/CloudImageEditor/src/CropFrame.ts | 4 +- .../src/EditorAspectRatioButtonControl.ts | 7 +- .../src/EditorButtonControl.ts | 7 +- .../src/EditorFilterControl.ts | 5 +- .../src/EditorImageCropper.ts | 3 +- .../CloudImageEditor/src/EditorScroller.ts | 3 +- .../CloudImageEditor/src/EditorSlider.ts | 5 +- .../CloudImageEditor/src/EditorToolbar.ts | 33 +- .../src/elements/button/BtnUi.ts | 7 +- .../src/elements/line-loader/LineLoaderUi.ts | 3 +- .../presence-toggle/PresenceToggle.ts | 3 +- .../src/elements/slider/SliderUi.ts | 5 +- src/blocks/CloudImageEditor/src/template.ts | 9 +- src/blocks/Copyright/Copyright.ts | 3 +- src/blocks/DropArea/DropArea.ts | 10 +- src/blocks/ExternalSource/ExternalSource.ts | 22 +- src/blocks/FileItem/FileItem.ts | 25 +- src/blocks/Icon/Icon.ts | 5 +- src/blocks/Img/ImgConfig.js | 6 +- src/blocks/Modal/Modal.ts | 3 +- src/blocks/ProgressBar/ProgressBar.ts | 3 +- .../ProgressBarCommon/ProgressBarCommon.ts | 3 +- src/blocks/Range/Range.ts | 12 +- src/blocks/Select/Select.ts | 9 +- src/blocks/SimpleBtn/SimpleBtn.ts | 7 +- src/blocks/SourceBtn/SourceBtn.ts | 5 +- src/blocks/SourceList/SourceList.ts | 13 +- src/blocks/Spinner/Spinner.ts | 6 +- src/blocks/StartFrom/StartFrom.ts | 3 +- src/blocks/Thumb/Thumb.ts | 7 +- src/blocks/UploadList/UploadList.ts | 21 +- src/blocks/UrlSource/UrlSource.ts | 11 +- src/index.ts | 2 +- .../inline/FileUploaderInline.ts | 5 +- .../minimal/FileUploaderMinimal.ts | 11 +- .../regular/FileUploaderRegular.ts | 7 +- src/utils/waitForAttribute.test.ts | 57 +- src/utils/waitForAttribute.ts | 44 +- 50 files changed, 5098 insertions(+), 16058 deletions(-) create mode 100644 src/abstract/bindCompatibilityFallbackProcessor.ts diff --git a/package-lock.json b/package-lock.json index 3b73475a8..6fb59d033 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,7 +9,7 @@ "version": "1.24.5", "license": "MIT", "dependencies": { - "@symbiotejs/symbiote": "^1.11.7", + "@symbiotejs/symbiote": "^2.3.3", "@uploadcare/cname-prefix": "^6.18.2", "@uploadcare/image-shrink": "^6.18.2", "@uploadcare/quality-insights": "^6.18.2", @@ -18,56 +18,41 @@ }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.2.5", - "@biomejs/js-api": "^3.0.0", - "@biomejs/wasm-nodejs": "^2.2.5", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@happy-dom/global-registrator": "^16.8.1", + "@biomejs/biome": "2.3.3", + "@biomejs/js-api": "^4.0.0", + "@biomejs/wasm-nodejs": "^2.3.3", + "@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": "^19.2.2", "@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.7", + "@vitest/coverage-v8": "^4.0.7", + "esbuild": "^0.25.12", + "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" + "vitest": "^4.0.7" } }, "node_modules/@andrewbranch/untar.js": { @@ -141,16 +126,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", @@ -204,9 +179,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 +189,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" @@ -240,14 +215,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 +239,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.3.tgz", + "integrity": "sha512-zn/P1pRBCpDdhi+VNSMnpczOz9DnqzOA2c48K8xgxjDODvi5O8gs3a2H233rck/5HXpkFj6TmyoqVvxirZUnvg==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -280,20 +255,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.3", + "@biomejs/cli-darwin-x64": "2.3.3", + "@biomejs/cli-linux-arm64": "2.3.3", + "@biomejs/cli-linux-arm64-musl": "2.3.3", + "@biomejs/cli-linux-x64": "2.3.3", + "@biomejs/cli-linux-x64-musl": "2.3.3", + "@biomejs/cli-win32-arm64": "2.3.3", + "@biomejs/cli-win32-x64": "2.3.3" } }, "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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.3.tgz", + "integrity": "sha512-5+JtW6RKmjqL9un0UtHV0ezOslAyYBzyl5ZhYiu7GHesX2x8NCDl6tXYrenv9m7e1RLbkO5E5Kh04kseMtz6lw==", "cpu": [ "arm64" ], @@ -308,9 +283,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.3.tgz", + "integrity": "sha512-UPmKRalkHicvIpeccuKqq+/gA2HYV8FUnAEDJnqYBlGlycKqe6xrovWqvWTE4TTNpIFf4UQyuaDzLkN6Kz6tbA==", "cpu": [ "x64" ], @@ -325,9 +300,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.3.tgz", + "integrity": "sha512-zeiKwALNB/hax7+LLhCYqhqzlWdTfgE9BGkX2Z8S4VmCYnGFrf2fON/ec6KCos7mra5MDm6fYICsEWN2+HKZhw==", "cpu": [ "arm64" ], @@ -342,9 +317,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.3.tgz", + "integrity": "sha512-KhCDMV+V7Yu72v40ssGJTHuv/j0n7JQ6l0s/c+EMcX5zPYLMLr4XpmI+WXhp4Vfkz0T5Xnh5wbrTBI3f2UTpjQ==", "cpu": [ "arm64" ], @@ -359,9 +334,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.3.tgz", + "integrity": "sha512-05CjPLbvVVU8J6eaO6iSEoA0FXKy2l6ddL+1h/VpiosCmIp3HxRKLOa1hhC1n+D13Z8g9b1DtnglGtM5U3sTag==", "cpu": [ "x64" ], @@ -376,9 +351,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.3.tgz", + "integrity": "sha512-IyqQ+jYzU5MVy9CK5NV0U+NnUMPUAhYMrB/x4QgL/Dl1MqzBVc61bHeyhLnKM6DSEk73/TQYrk/8/QmVHudLdQ==", "cpu": [ "x64" ], @@ -393,9 +368,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.3.tgz", + "integrity": "sha512-NtlLs3pdFqFAQYZjlEHKOwJEn3GEaz7rtR2oCrzaLT2Xt3Cfd55/VvodQ5V+X+KepLa956QJagckJrNL+DmumQ==", "cpu": [ "arm64" ], @@ -410,9 +385,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.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.3.tgz", + "integrity": "sha512-klJKPPQvUk9Rlp0Dd56gQw/+Wt6uUprHdHWtbDC93f3Iv+knA2tLWpcYoOZJgPV+9s+RBmYv0DGy4mUlr20esg==", "cpu": [ "x64" ], @@ -427,15 +402,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 +425,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.6", + "resolved": "https://registry.npmjs.org/@biomejs/wasm-nodejs/-/wasm-nodejs-2.3.6.tgz", + "integrity": "sha512-VjH+usBwEjdmDxqXeEvi9Gy3/dZmKUwE+qb5gr3VkCt0G9zccAhnCuBXqtlbEJEP0wxXBRqk71cLZOBxaHsqcg==", "dev": true, "license": "MIT OR Apache-2.0" }, @@ -463,6 +438,39 @@ "dev": true, "license": "ISC" }, + "node_modules/@cacheable/memoize": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.3.tgz", + "integrity": "sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.0.3" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.4.tgz", + "integrity": "sha512-cCmJKCKlT1t7hNBI1+gFCwmKFd9I4pS3zqBeNGXTSODnpa0EeDmORHY8oEMTuozfdg3cgsVh8ojLaPYb6eC7Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.2.0", + "@keyv/bigmap": "^1.1.0", + "hookified": "^1.12.2", + "keyv": "^5.5.3" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.2.0.tgz", + "integrity": "sha512-7xaQayO3msdVcxXLYcLU5wDqJBNdQcPPPHr6mdTEIQI7N7TbtSVVTpWOTfjyhg0L6AQwQdq7miKdWtTDBoBldQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "keyv": "^5.5.3" + } + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -474,9 +482,9 @@ } }, "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 +498,16 @@ ], "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-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 +521,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": [ { @@ -532,42 +540,15 @@ } ], "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" - } - }, - "node_modules/@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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.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,43 +571,6 @@ "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "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" - } - }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -639,4237 +583,3639 @@ "kuler": "^2.0.0" } }, - "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==", - "cpu": [ - "ppc64" - ], + "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, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/JounQin" } }, - "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==", + "node_modules/@esbuild/darwin-arm64": { + "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": [ - "arm" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { "node": ">=18" } }, - "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==", - "cpu": [ - "arm64" - ], + "node_modules/@happy-dom/global-registrator": { + "version": "20.0.10", + "resolved": "https://registry.npmjs.org/@happy-dom/global-registrator/-/global-registrator-20.0.10.tgz", + "integrity": "sha512-GU0UBt9lJKhZlY/U0Bivj9ZVepDIQoAUupAAl/90THG4/urkzXNglkVYETsnt2pGBDgQ+4vBjMAbLu6XzcKcQA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@types/node": "^20.0.0", + "happy-dom": "^20.0.10" + }, "engines": { - "node": ">=18" + "node": ">=20.0.0" } }, - "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==", - "cpu": [ - "x64" - ], + "node_modules/@happy-dom/global-registrator/node_modules/@types/node": { + "version": "20.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", + "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "dependencies": { + "undici-types": "~6.21.0" } }, - "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==", - "cpu": [ - "arm64" - ], + "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", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "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==", - "cpu": [ - "x64" - ], + "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", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "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==", - "cpu": [ - "arm64" - ], + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": "20 || >=22" } }, - "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==", - "cpu": [ - "x64" - ], + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, "engines": { - "node": ">=18" + "node": "20 || >=22" } }, - "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==", - "cpu": [ - "arm" - ], + "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": "MIT", - "optional": true, - "os": [ - "linux" - ], + "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": ">=18" + "node": ">=12" } }, - "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==", - "cpu": [ - "arm64" - ], + "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", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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==", - "cpu": [ - "ia32" - ], + "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", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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==", - "cpu": [ - "loong64" - ], + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", - "cpu": [ - "mips64el" - ], + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "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==", - "cpu": [ - "ppc64" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "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==", - "cpu": [ - "riscv64" - ], + "node_modules/@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, + "license": "MIT" + }, + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "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==", - "cpu": [ - "s390x" - ], + "node_modules/@keyv/bigmap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.1.0.tgz", + "integrity": "sha512-MX7XIUNwVRK+hjZcAbNJ0Z8DREo+Weu9vinBOjGU1thEi9F6vPhICzBbk4CCf3eEefKRz7n6TfZXwUFZTSgj8Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "hookified": "^1.12.2" + }, "engines": { - "node": ">=18" + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.5.3" } }, - "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==", - "cpu": [ - "x64" - ], + "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, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "license": "MIT" + }, + "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": "ISC", + "dependencies": { + "@braidai/lang": "^1.0.0" } }, - "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==", - "cpu": [ - "arm64" - ], + "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==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "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/@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==", - "cpu": [ - "x64" - ], + "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, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.17.0" } }, - "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==", - "cpu": [ - "arm64" - ], + "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, - "license": "MIT", "optional": true, - "os": [ - "openbsd" - ], + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "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==", - "cpu": [ - "x64" - ], + "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": "MIT", + "license": "ISC", "optional": true, - "os": [ - "openbsd" - ], + "peer": true, + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", - "cpu": [ - "arm64" - ], + "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, - "license": "MIT", "optional": true, - "os": [ - "openharmony" - ], + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "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==", - "cpu": [ - "x64" - ], + "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, - "license": "MIT", "optional": true, - "os": [ - "sunos" - ], + "peer": true, "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "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==", - "cpu": [ - "arm64" - ], + "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, - "license": "MIT", "optional": true, - "os": [ - "win32" - ], + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=18" + "node": ">=14.17" } }, - "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==", - "cpu": [ - "ia32" - ], + "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, - "license": "MIT", "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } + "peer": true }, - "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==", - "cpu": [ - "x64" - ], + "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, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } + "peer": true }, - "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==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "happy-dom": "^16.8.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "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", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=6.9.0" + "@microsoft/tsdoc": "0.15.1", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" } }, - "node_modules/@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==", + "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==", "dev": true, "license": "MIT", "optional": true, "peer": true, - "engines": { - "node": "20 || >=22" + "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" } }, - "node_modules/@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==", + "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, + "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", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/balanced-match": "^4.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": "20 || >=22" + "node": ">= 8" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "ISC", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", "dependencies": { - "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" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">= 18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@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, "license": "MIT", + "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@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" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 18" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@octokit/endpoint": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 18" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@octokit/graphql": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 18" } }, - "node_modules/@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==", + "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==", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } + "peer": true }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@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, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@octokit/types": "^6.40.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" } }, - "node_modules/@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==", + "node_modules/@octokit/plugin-paginate-rest/node_modules/@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, "license": "MIT" }, - "node_modules/@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==", + "node_modules/@octokit/plugin-paginate-rest/node_modules/@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, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@octokit/openapi-types": "^12.11.0" } }, - "node_modules/@loaderkit/resolve": { + "node_modules/@octokit/plugin-request-log": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.4.tgz", - "integrity": "sha512-rJzYKVcV4dxJv+vW6jlvagF8zvGxHJ2+HTr1e2qOejfmGhAApgJHl8Aog4mMszxceTRiKTTbnpgmTO1bEZHV/A==", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "dev": true, - "license": "ISC", - "dependencies": { - "@braidai/lang": "^1.0.0" + "license": "MIT", + "peerDependencies": { + "@octokit/core": ">=3" } }, - "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/@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, "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" + "@octokit/types": "^4.1.6", + "deprecation": "^2.3.1" } }, - "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==", + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", + "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", "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" + "@types/node": ">= 8" } }, - "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==", + "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==", "dev": true, - "optional": true, + "license": "MIT", "peer": true, "dependencies": { - "yallist": "^4.0.0" + "@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" }, "engines": { - "node": ">=10" + "node": ">= 18" } }, - "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==", + "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==", "dev": true, - "license": "ISC", - "optional": true, + "license": "MIT", "peer": true, "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "@octokit/types": "^14.0.0" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 18" } }, - "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==", + "node_modules/@octokit/rest": { + "version": "17.11.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", + "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==", "dev": true, - "optional": true, - "peer": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "@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" } }, - "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==", + "node_modules/@octokit/rest/node_modules/@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, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3" } }, - "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==", + "node_modules/@octokit/rest/node_modules/@octokit/auth-token/node_modules/@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, - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^12.11.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==", + "node_modules/@octokit/rest/node_modules/@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, "license": "MIT", - "optional": true, - "peer": true + "dependencies": { + "@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" + } }, - "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/@octokit/rest/node_modules/@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, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@microsoft/tsdoc": "0.15.1", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.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/@octokit/rest/node_modules/@octokit/endpoint/node_modules/@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, "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" + "@octokit/openapi-types": "^12.11.0" } }, - "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==", + "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "ISC" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@octokit/rest/node_modules/@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, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/@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, "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "@octokit/openapi-types": "^12.11.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@octokit/rest/node_modules/@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, + "license": "MIT" + }, + "node_modules/@octokit/rest/node_modules/@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, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "@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" } }, - "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==", + "node_modules/@octokit/rest/node_modules/@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, "license": "MIT", - "peer": true, - "engines": { - "node": ">= 18" + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" } }, - "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==", + "node_modules/@octokit/rest/node_modules/@octokit/request-error/node_modules/@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, "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", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" + "@octokit/openapi-types": "^12.11.0" } }, - "node_modules/@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/@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, "license": "MIT", - "peer": true, "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" + "@octokit/openapi-types": "^12.11.0" } }, - "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==", + "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "ISC" }, - "node_modules/@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==", + "node_modules/@octokit/rest/node_modules/@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, "license": "MIT", "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" + "@types/node": ">= 8" } }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@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==", + "node_modules/@octokit/rest/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0" }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "node_modules/@octokit/rest/node_modules/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, - "license": "MIT", + "license": "ISC", "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "os-name": "^3.1.0" } }, - "node_modules/@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==", + "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==", "dev": true, "license": "MIT", - "peerDependencies": { - "@octokit/core": ">=3" + "peer": true, + "dependencies": { + "@octokit/openapi-types": "^25.0.0" } }, - "node_modules/@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==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", - "dependencies": { - "@octokit/types": "^4.1.6", - "deprecation": "^2.3.1" + "optional": true, + "engines": { + "node": ">=14" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", - "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", + "node_modules/@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, - "license": "MIT", - "dependencies": { - "@types/node": ">= 8" - } + "license": "MIT" }, - "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==", + "node_modules/@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, "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", - "universal-user-agent": "^7.0.2" - }, "engines": { - "node": ">= 18" + "node": ">=18" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" } }, - "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==", + "node_modules/@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, - "license": "MIT", - "peer": true, - "dependencies": { - "@octokit/types": "^14.0.0" - }, + "license": "MPL-2.0", "engines": { - "node": ">= 18" + "node": ">= 10" + }, + "optionalDependencies": { + "@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" } }, - "node_modules/@octokit/rest": { - "version": "17.11.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", - "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==", + "node_modules/@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==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@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" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@octokit/rest/node_modules/@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==", + "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==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@octokit/rest/node_modules/@octokit/auth-token/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "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 + } } }, - "node_modules/@octokit/rest/node_modules/@octokit/core": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", - "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@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" + "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" } }, - "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "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==", "dev": true, "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "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==", "dev": true, "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "license": "ISC" + "optional": true, + "peer": true }, - "node_modules/@octokit/rest/node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "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==", "dev": true, - "license": "MIT", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "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==", "dev": true, - "license": "MIT", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@octokit/rest/node_modules/@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==", + "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==", "dev": true, - "license": "MIT" + "license": "ISC", + "optional": true, + "peer": true }, - "node_modules/@octokit/rest/node_modules/@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==", + "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==", "dev": true, "license": "MIT", - "dependencies": { - "@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" + "optional": true, + "peer": true, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@octokit/rest/node_modules/@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==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" } }, - "node_modules/@octokit/rest/node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "@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 + } } }, - "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@octokit/rest/node_modules/@octokit/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", - "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@types/node": ">= 8" - } - }, - "node_modules/@octokit/rest/node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@octokit/rest/node_modules/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, - "license": "ISC", - "dependencies": { - "os-name": "^3.1.0" + "@rushstack/terminal": "0.19.1", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" } }, - "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==", + "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==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "dependencies": { - "@octokit/openapi-types": "^25.0.0" + "sprintf-js": "~1.0.2" } }, - "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/@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==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, - "engines": { - "node": ">=14" - } + "peer": true }, - "node_modules/@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==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, "license": "MIT" }, - "node_modules/@publint/pack": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.2.tgz", - "integrity": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==", + "node_modules/@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, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { - "url": "https://bjornlu.com/sponsor" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@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==", + "node_modules/@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, - "license": "MPL-2.0", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "nanoid": "^5.1.0" + }, "engines": { - "node": ">= 10" + "node": "^18.0.0 || >=20.0.0" }, - "optionalDependencies": { - "@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" + "peerDependencies": { + "size-limit": "11.2.0" } }, - "node_modules/@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==", - "cpu": [ - "arm" - ], + "node_modules/@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, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], + "license": "MIT", + "dependencies": { + "esbuild-visualizer": "^0.7.0", + "open": "^10.1.0" + }, "engines": { - "node": ">= 10" + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "size-limit": "11.2.0" } }, - "node_modules/@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==", - "cpu": [ - "arm64" - ], + "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, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, "engines": { - "node": ">= 10" + "node": "^18 || >=20" } }, - "node_modules/@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==", - "cpu": [ - "arm64" - ], + "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": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": ">= 10" + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "size-limit": "11.2.0" } }, - "node_modules/@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==", - "cpu": [ - "x64" - ], + "node_modules/@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, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "license": "MIT", + "dependencies": { + "@size-limit/esbuild": "11.2.0", + "@size-limit/file": "11.2.0", + "size-limit": "11.2.0" + }, + "peerDependencies": { + "size-limit": "11.2.0" } }, - "node_modules/@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==", - "cpu": [ - "arm" - ], + "node_modules/@slack/types": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", + "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 8.9.0", + "npm": ">= 5.5.1" } }, - "node_modules/@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==", - "cpu": [ - "arm64" - ], + "node_modules/@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, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "@slack/types": "^1.2.1", + "@types/node": ">=8.9.0", + "axios": "^0.21.1" + }, "engines": { - "node": ">= 10" + "node": ">= 8.9.0", + "npm": ">= 5.5.1" } }, - "node_modules/@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==", - "cpu": [ - "arm64" - ], + "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": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } + "license": "MIT" }, - "node_modules/@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==", - "cpu": [ - "x64" - ], + "node_modules/@symbiotejs/symbiote": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@symbiotejs/symbiote/-/symbiote-2.3.3.tgz", + "integrity": "sha512-ktq4iH9pHJKj1mxo/gKXMnEKn115RQn+nT+LeO69lu78BCY5DO18/sgC/Lj+fWZEpibvF9TgRqkIfyg/XVJ5PQ==", + "license": "MIT" + }, + "node_modules/@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, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } + "license": "MIT" }, - "node_modules/@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==", - "cpu": [ - "x64" - ], + "node_modules/@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, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", "engines": { - "node": ">= 10" + "node": ">=10.13.0" } }, - "node_modules/@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==", - "cpu": [ - "arm64" - ], + "node_modules/@tsd/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-JSSdNiS0wgd8GHhBwnMAI18Y8XPhLVN+dNelPfZCXFhy9Lb3NbnFyp9JKxxr54jSUkEJPk3cidvCoHducSaRMQ==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=14.17" } }, - "node_modules/@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==", - "cpu": [ - "ia32" - ], + "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==", "dev": true, - "license": "MPL-2.0", + "license": "MIT", "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } + "peer": true }, - "node_modules/@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==", - "cpu": [ - "x64" - ], + "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": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "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" - ], + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "license": "MIT" }, - "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==", - "cpu": [ - "arm64" - ], + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } }, - "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==", - "cpu": [ - "arm64" - ], + "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", - "optional": true, - "os": [ - "darwin" - ] + "license": "MIT" }, - "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==", - "cpu": [ - "x64" - ], + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "license": "MIT" }, - "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" - ], + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } }, - "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==", - "cpu": [ - "x64" - ], + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "license": "MIT" }, - "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==", - "cpu": [ - "arm" - ], + "node_modules/@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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "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==", - "cpu": [ - "arm" - ], + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "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==", - "cpu": [ - "arm64" - ], + "node_modules/@types/node": { + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "undici-types": "~7.16.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==", - "cpu": [ - "arm64" - ], + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "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==", - "cpu": [ - "loong64" - ], + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "csstype": "^3.2.2" + } }, - "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==", - "cpu": [ - "ppc64" - ], + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@types/node": "*", + "@types/vinyl": "*", + "winston": "^3.0.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==", - "cpu": [ - "riscv64" - ], + "node_modules/@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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "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==", - "cpu": [ - "riscv64" - ], + "node_modules/@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, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } }, - "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==", - "cpu": [ - "s390x" - ], + "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", + "integrity": "sha512-5KS7Nt8VRtXa/gHCTcB8+VHcICesXznhjl6cE94D5JkI+Ty1jEK8JlHizE5FcL0f05NVpN8mps/olRSjQv7Pjw==", + "license": "MIT" + }, + "node_modules/@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==", + "license": "MIT" + }, + "node_modules/@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==", + "license": "MIT" + }, + "node_modules/@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==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "form-data": "^4.0.0", + "ws": "^8.2.3" + }, + "engines": { + "node": ">=16" + } }, - "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==", - "cpu": [ - "x64" - ], + "node_modules/@vitest/browser": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.14.tgz", + "integrity": "sha512-vO0uqR8SnPTd8ykp14yaIuUyMZ9HEBYuoZrVdUp7RrEp76VEnkrX9fDkGnK0NyBdfWXB6cqp7BmqVekd8yKHFQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "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==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "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==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "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==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "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==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@vitest/mocker": "4.0.14", + "@vitest/utils": "4.0.14", + "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": { + "vitest": "4.0.14" + } }, - "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/@vitest/browser-playwright": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.14.tgz", + "integrity": "sha512-rUvyz6wX6wDjcYzf/7fgXYfca2bAu0Axoq/v9LYdELzcBSS9UKjnZ7MaMY4UDP78HHHCdmdtceuSao1s51ON8A==", "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" + "@vitest/browser": "4.0.14", + "@vitest/mocker": "4.0.14", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@types/node": "*" + "playwright": "*", + "vitest": "4.0.14" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true + "playwright": { + "optional": false } } }, - "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/@vitest/coverage-v8": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.14.tgz", + "integrity": "sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==", "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" + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.0.14", + "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": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, + "url": "https://opencollective.com/vitest" + }, "peerDependencies": { - "ajv": "^8.5.0" + "@vitest/browser": "4.0.14", + "vitest": "4.0.14" }, "peerDependenciesMeta": { - "ajv": { + "@vitest/browser": { "optional": true } } }, - "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/@vitest/expect": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.14.tgz", + "integrity": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==", "dev": true, "license": "MIT", - "optional": true, - "peer": true - }, - "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==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, "dependencies": { - "yallist": "^4.0.0" + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.14", + "@vitest/utils": "4.0.14", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/mocker": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.14.tgz", + "integrity": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==", "dev": true, - "license": "ISC", - "optional": true, - "peer": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "@vitest/spy": "4.0.14", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "url": "https://opencollective.com/vitest" }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true - }, - "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==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, "peerDependencies": { - "@types/node": "*" + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { - "@types/node": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "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/@vitest/pretty-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.14.tgz", + "integrity": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/runner": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.14.tgz", + "integrity": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==", "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": "*" + "@vitest/utils": "4.0.14", + "pathe": "^2.0.3" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/snapshot": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.14.tgz", + "integrity": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@vitest/pretty-format": "4.0.14", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/spy": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.14.tgz", + "integrity": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==", "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" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/utils": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.14.tgz", + "integrity": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "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==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" + "@vitest/pretty-format": "4.0.14", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@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==", + "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" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node": ">=10.0.0" } }, - "node_modules/@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==", + "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", - "dependencies": { - "esbuild": "^0.25.0", - "nanoid": "^5.1.0" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "size-limit": "11.2.0" + "node": ">=0.4.0" } }, - "node_modules/@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==", + "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==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "esbuild-visualizer": "^0.7.0", - "open": "^10.1.0" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "size-limit": "11.2.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "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==", + "node_modules/ajv-formats/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": "^18 || >=20" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "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/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", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "size-limit": "11.2.0" - } + "optional": true, + "peer": true }, - "node_modules/@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==", + "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": { - "@size-limit/esbuild": "11.2.0", - "@size-limit/file": "11.2.0", - "size-limit": "11.2.0" + "type-fest": "^0.21.3" }, - "peerDependencies": { - "size-limit": "11.2.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@slack/types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", - "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==", + "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.9.0", - "npm": ">= 5.5.1" + "node": ">=8" } }, - "node_modules/@slack/webhook": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-5.0.4.tgz", - "integrity": "sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "@slack/types": "^1.2.1", - "@types/node": ">=8.9.0", - "axios": "^0.21.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 8.9.0", - "npm": ">= 5.5.1" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=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==", + "node_modules/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, "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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "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" - } + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" }, - "node_modules/@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/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">= 0.4" }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@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==", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true, "license": "MIT" }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "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==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, "engines": { - "node": ">=14.17" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" + "engines": { + "node": ">=0.10.0" + } }, - "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/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/ms": "*" + "engines": { + "node": ">=12" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/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==", + "node_modules/ast-v8-to-istanbul": { + "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": { - "@types/estree": "*", - "@types/json-schema": "*" + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/expect": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", - "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "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/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "node_modules/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, "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "engines": { + "node": ">=8" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "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==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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==", + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "follow-redirects": "^1.14.0" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, - "node_modules/@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==", + "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==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "peer": true }, - "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==", + "node_modules/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, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } + "license": "ISC" }, - "node_modules/@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==", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "@types/vinyl": "*", - "winston": "^3.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@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, - "license": "MIT" - }, - "node_modules/@types/vinyl": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", - "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { - "@types/expect": "^1.20.4", - "@types/node": "*" - } - }, - "node_modules/@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==", - "license": "MIT" - }, - "node_modules/@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==", - "license": "MIT" - }, - "node_modules/@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==", - "license": "MIT" - }, - "node_modules/@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==", - "license": "MIT", - "dependencies": { - "form-data": "^4.0.0", - "ws": "^8.2.3" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=16" + "node": ">=8" } }, - "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==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "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" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "run-applescript": "^7.0.0" }, - "peerDependencies": { - "playwright": "*", - "vitest": "3.2.4", - "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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, "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" + "load-tsconfig": "^0.2.3" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "peerDependencies": { - "@vitest/browser": "3.2.4", - "vitest": "3.2.4" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } + "esbuild": ">=0.18" } }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "node_modules/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, "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" + "engines": { + "node": ">= 0.8" } }, - "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==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" + "engines": { + "node": ">=8" } }, - "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/cacheable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.1.1.tgz", + "integrity": "sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "@cacheable/memoize": "^2.0.3", + "@cacheable/memory": "^2.0.3", + "@cacheable/utils": "^2.1.0", + "hookified": "^1.12.2", + "keyv": "^5.5.3", + "qified": "^0.5.0" } }, - "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/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">= 0.4" } }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/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, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "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/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, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "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": ">=10.0.0" + "node": ">=6" } }, - "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/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" } }, - "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==", + "node_modules/chai": { + "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" + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "ajv": "^8.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ajv-formats/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/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, "license": "MIT", - "optional": true, - "peer": true, "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" + "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" } }, - "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==", + "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": "MIT", - "optional": true, - "peer": true + "license": "0BSD" }, - "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==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 14.16.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "node_modules/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, "license": "MIT" }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "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" + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "node_modules/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, - "license": "Python-2.0" + "license": "ISC", + "dependencies": { + "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" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.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==", + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "dequal": "^2.0.3" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "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", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "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/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==", + "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==", "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/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==", + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "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" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/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, "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, "engines": { - "node": ">=12" + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "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==", + "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", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.30", - "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" + "optional": true, + "engines": { + "node": ">=0.1.90" } }, - "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==", + "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/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "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/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "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==", "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "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": { - "possible-typed-array-names": "^1.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "node_modules/cli-truncate/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", - "dependencies": { - "follow-redirects": "^1.14.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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" + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "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": "Apache-2.0", - "peer": true + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "node_modules/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, "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==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/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==", "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { "node": ">=8" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "run-applescript": "^7.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "load-tsconfig": "^0.2.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, - "peerDependencies": { - "esbuild": ">=0.18" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/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==", + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/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, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "node_modules/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, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/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, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/cloneable-readable/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "safe-buffer": "~5.1.0" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, - "node_modules/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==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "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==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/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==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "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" + "color-name": "1.1.3" } }, - "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", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "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==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "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==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } + "license": "MIT" }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "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": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "color": "^3.1.3", + "text-hex": "1.0.x" } }, - "node_modules/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, - "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==", - "dev": true, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/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==", + "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": "ISC", - "dependencies": { - "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" - }, - "bin": { - "highlight": "bin/highlight" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": ">=20" } }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "array-ify": "^1.0.0", + "dot-prop": "^5.1.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==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, - "node_modules/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==", + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.10.0" } }, - "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/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, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" } }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/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, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "compare-func": "^2.0.0", + "q": "^1.5.1" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/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, "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "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" }, "engines": { "node": ">=10" } }, - "node_modules/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==", + "node_modules/conventional-changelog-core/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==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "string-width": "^4.2.0" + "lru-cache": "^6.0.0" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/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" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/conventional-changelog-core/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": "MIT", - "optional": 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": ">=0.1.90" + "node": ">=10" } }, - "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==", + "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": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "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==", + "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", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" } }, - "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/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, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "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" + }, + "bin": { + "conventional-changelog-writer": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "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/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, "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/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, - "license": "ISC" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/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, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "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" + }, + "bin": { + "conventional-commits-parser": "cli.js" }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "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==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, - "node_modules/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/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 8" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "node_modules/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, "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">=12 || >=16" } }, - "node_modules/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==", + "node_modules/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, - "license": "MIT", - "engines": { - "node": ">= 0.10" + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "node_modules/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, "license": "MIT" }, - "node_modules/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==", + "node_modules/css-tree": { + "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": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/cloneable-readable/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cloneable-readable/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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==", "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cloneable-readable/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/cloneable-readable/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/csso/node_modules/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, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/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==", + "node_modules/csso/node_modules/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, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "license": "CC0-1.0" }, - "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==", + "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": "MIT", - "dependencies": { - "color-name": "1.1.3" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "node_modules/csstype": { + "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" }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "node_modules/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, "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "engines": { + "node": ">=8" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": ">=16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true, "license": "MIT", "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": "*" } }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "node_modules/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, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "ms": "^2.1.3" }, "engines": { - "node": ">=10" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" + "node": ">=6.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/conventional-changelog-core/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/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, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/conventional-changelog-core/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==", + "node_modules/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, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "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" + "node": ">=0.10.0" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "node_modules/decamelize-keys/node_modules/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, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", - "dependencies": { - "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" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/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==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", + "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==", "dev": true, "license": "MIT", - "dependencies": { - "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" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "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" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { - "node": ">=12 || >=16" + "node": ">=0.4.0" } }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/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, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } + "license": "ISC" }, - "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==", + "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": "BSD-2-Clause", + "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">=8" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { - "css-tree": "^1.1.2" + "path-type": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/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, "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/csso/node_modules/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==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "license": "CC0-1.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" }, - "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==", + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "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==", + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "is-obj": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" + "node": ">=10" } }, - "node_modules/data-view-byte-offset": { + "node_modules/dunder-proto": { "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, + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "gopd": "^1.2.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "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", - "engines": { - "node": "*" - } + "license": "MIT" }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ms": "^2.1.3" + "jake": "^10.8.5" }, - "engines": { - "node": ">=6.0" + "bin": { + "ejs": "bin/cli.js" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/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, + "license": "MIT" + }, + "node_modules/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, + "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==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "once": "^1.4.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==", + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/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": ">=0.10.0" + "node": ">=6" } }, - "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==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, "engines": { "node": ">=18" }, @@ -4877,29 +4223,74 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/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, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.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", - "gopd": "^1.0.1" + "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" }, "engines": { "node": ">= 0.4" @@ -4908,1219 +4299,824 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "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, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/esbuild": { + "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", - "dependencies": { - "path-type": "^4.0.0" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "optionalDependencies": { + "@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/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, - "license": "MIT" - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/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, "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "open": "^8.4.0", + "picomatch": "^4.0.0", + "yargs": "^17.6.2" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "bin": { + "esbuild-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/esbuild-visualizer/node_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/esbuild-visualizer/node_modules/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, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">= 4" + "node": ">=12" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "engines": { + "node": ">=6" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/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, "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" + "@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" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "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": "BSD-2-Clause", + "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": ">=10" + "node": ">=8" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "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==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "node_modules/eslint-formatter-pretty/node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "node_modules/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, "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==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { - "once": "^1.4.0" + "@types/estree": "^1.0.0" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "license": "MIT" }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, - "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==", + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" } }, - "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==", + "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==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", - "dependencies": { - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "peer": true }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, - "node_modules/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==", + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 0.4" + "node": ">=8.6.0" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", + "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": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 6" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "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==", "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "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" + "node": ">= 4.9.1" } }, - "node_modules/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==", + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "open": "^8.4.0", - "picomatch": "^4.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "esbuild-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=18" + "reusify": "^1.0.4" } }, - "node_modules/esbuild-visualizer/node_modules/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==", + "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/esbuild-visualizer/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "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==", + "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==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.8.0" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/file-entry-cache": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz", + "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "flat-cache": "^6.1.13" } }, - "node_modules/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, - "license": "MIT", + "node_modules/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, + "license": "Apache-2.0", "dependencies": { - "@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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "minimatch": "^5.0.1" } }, - "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==", + "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==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "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/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/eslint-formatter-pretty/node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/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, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "node_modules/flat-cache": { + "version": "6.1.18", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.18.tgz", + "integrity": "sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "cacheable": "^2.1.0", + "flatted": "^3.3.3", + "hookified": "^1.12.0" + } }, - "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==", + "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": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } + "license": "ISC" }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/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, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "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==", + "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==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" } ], "license": "MIT", - "peer": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "is-callable": "^1.2.7" }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/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": { - "is-glob": "^4.0.1" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, + "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==", "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">= 4.9.1" + "node": ">= 6" } }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/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": "ISC", + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "reusify": "^1.0.4" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "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==", - "dev": true, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "engines": { - "node": ">=0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "minimatch": "^5.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/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", - "dependencies": { - "to-regex-range": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/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, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=6.9.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/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", "dependencies": { - "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" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "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", + "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", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "license": "ISC", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "lru-cache": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=10" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "node_modules/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": "ISC" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/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==", + "node_modules/get-pkg-repo/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, - "node_modules/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==", + "node_modules/get-pkg-repo/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, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "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", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/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", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "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", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -6233,19 +5229,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -6533,19 +5516,37 @@ } }, "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.10", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.10.tgz", + "integrity": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==", "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.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", + "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", + "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", @@ -6668,6 +5669,13 @@ "node": "*" } }, + "node_modules/hookified": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.2.tgz", + "integrity": "sha512-aokUX1VdTpI0DUsndvW+OiwmBpKCu/NgRsSSkuSY0zq8PY6Q6a+lmOfAFDXAAOtBqJELvcWY9L1EVtzjbQcMdg==", + "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 +5704,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" @@ -6757,6 +5765,8 @@ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -7098,13 +6108,16 @@ } }, "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" @@ -7499,9 +6512,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": { @@ -7657,13 +6670,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", @@ -7743,13 +6749,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.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", + "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/kind-of": { @@ -7763,9 +6769,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" }, @@ -7808,28 +6814,6 @@ "lightningcss-win32-x64-msvc": "1.30.2" } }, - "node_modules/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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lightningcss-darwin-arm64": { "version": "1.30.2", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", @@ -7852,600 +6836,490 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/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==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/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==", - "cpu": [ - "x64" - ], + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "MIT" }, - "node_modules/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==", - "cpu": [ - "arm" - ], + "node_modules/lint-staged": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.6.tgz", + "integrity": "sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==", "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "commander": "^14.0.1", + "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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" + "bin": { + "lint-staged": "bin/lint-staged.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/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==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, "engines": { - "node": ">= 12.0.0" + "node": ">=20.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/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==", - "cpu": [ - "x64" - ], + "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": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" + "license": "MIT", + "dependencies": { + "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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/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==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=20.0.0" } }, - "node_modules/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==", - "cpu": [ - "arm64" - ], + "node_modules/listr2/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": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/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==", - "cpu": [ - "x64" - ], + "node_modules/listr2/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, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "node_modules/listr2/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/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==", + "node_modules/listr2/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": { - "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" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/lint-staged" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/listr2/node_modules/strip-ansi": { + "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": "^6.0.1" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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/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, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/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, "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" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=4" } }, - "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==", + "node_modules/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, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=14.18.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.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==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.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, + "license": "MIT" + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/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", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "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==", + "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": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "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": ">=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" + "node": ">=18" }, "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==", + "node_modules/log-update/node_modules/ansi-escapes": { + "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": { - "path-key": "^4.0.0" + "environment": "^1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "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==", + "node_modules/log-update/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", - "dependencies": { - "mimic-fn": "^4.0.0" - }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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==", + "node_modules/log-update/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, "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "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==", + "node_modules/log-update/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": "ISC", - "engines": { - "node": ">= 14" - } + "license": "MIT" }, - "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==", + "node_modules/log-update/node_modules/onetime": { + "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": { - "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" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" + "node": ">=18" }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^1.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "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==", + "node_modules/log-update/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": "MIT", + "license": "ISC", "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/log-update/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": { - "restore-cursor": "^4.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/log-update/node_modules/strip-ansi": { + "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-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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==", + "node_modules/log-update/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, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/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, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@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" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 12.0.0" } }, - "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==", + "node_modules/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, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "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": ">=10" + "node": "20 || >=22" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", + "node_modules/magic-string": { + "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": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "semver": "^7.5.3" }, "engines": { "node": ">=10" @@ -8454,165 +7328,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/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, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/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", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "@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" - }, - "engines": { - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "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==", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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==", + "node_modules/make-dir/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": { @@ -8733,9 +7452,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" }, @@ -9008,13 +7727,6 @@ "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", @@ -9070,6 +7782,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", @@ -9236,6 +7961,19 @@ "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", @@ -9652,6 +8390,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", @@ -9759,38 +8508,6 @@ "node": ">=4" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -9983,16 +8700,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", @@ -10046,14 +8753,27 @@ "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/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.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -10066,9 +8786,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.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10094,6 +8814,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", @@ -10141,26 +8871,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.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, "license": "MIT", "dependencies": { @@ -10172,9 +8912,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,34 +8928,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/prettysize": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-2.0.0.tgz", @@ -10230,9 +8942,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": { @@ -10284,10 +8996,23 @@ "teleport": ">=0.2.0" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/qified": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.1.tgz", + "integrity": "sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.12.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -10325,13 +9050,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT" - }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -10664,17 +9382,94 @@ "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.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.0.tgz", + "integrity": "sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^10.3.7" + "glob": "^11.0.3", + "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/rimraf/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -11312,9 +10107,9 @@ "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": { @@ -11385,26 +10180,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": { @@ -11520,9 +10315,9 @@ "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" }, @@ -11779,113 +10574,116 @@ "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.25.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.25.0.tgz", + "integrity": "sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==", "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-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": "^10.1.4", "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 +10700,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,38 +10723,6 @@ "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -11961,315 +10730,95 @@ "dev": true, "license": "MIT" }, - "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/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", - "dependencies": { - "flat-cache": "^3.2.0" - }, "engines": { - "node": ">=12.0.0" + "node": ">= 4" } }, - "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/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==", "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "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/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", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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/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/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": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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==", + "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": { - "@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" + "@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" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "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==", + "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": "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" - }, + "license": "MIT", "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": ">= 6" } }, "node_modules/supports-color": { @@ -12596,47 +11145,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", @@ -12756,30 +11264,10 @@ "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": { @@ -12860,13 +11348,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", @@ -13099,10052 +11587,63 @@ "semver": "bin/semver" } }, - "node_modules/tsd/node_modules/read-pkg/node_modules/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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "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==", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "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" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "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" - } - ], - "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/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "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, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "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": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "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": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "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": { - "tslib": "^2.0.3" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/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", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "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": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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", - "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" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", - "dev": 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" - }, - "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/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "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, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^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_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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "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" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "execa": "^1.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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/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==", - "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/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/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_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/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/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/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==", - "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/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "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 - } - } - }, - "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, - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xpath": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", - "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.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==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/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/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "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" - } - }, - "@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==", - "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" - }, - "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" - }, - "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 - }, - "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": 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": {} - }, - "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 + "node_modules/tsd/node_modules/read-pkg/node_modules/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, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } }, - "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 + "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" + } }, - "tsd": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.32.0.tgz", - "integrity": "sha512-R5lBZCbxGBowOcW0gpQaiIjGYrG5NmU+PfFDKcc3zbtzWjML1o/zAwzdDnS2ZheSlPu9GW51azpFqEPUBq9DoQ==", + "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, - "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" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, - "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 - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "tslib": { + "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==", - "dev": true + "dev": true, + "license": "0BSD" }, - "tsup": { + "node_modules/tsup": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz", "integrity": "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", @@ -23163,121 +11662,233 @@ "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 + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": 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" - } + "postcss": { + "optional": true }, - "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 + "typescript": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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/" }, - "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" - } + { + "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 }, - "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" - } + "postcss": { + "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 + "tsx": { + "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" - } + "yaml": { + "optional": true } } }, - "tsx": { + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/tsx": { "version": "4.20.6", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "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, - "optional": true - } + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "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, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "type-fest": { + "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 + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "typed-array-buffer": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" } }, - "typed-array-byte-length": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "typed-array-byte-offset": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -23285,289 +11896,479 @@ "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "typed-array-length": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "typescript": { + "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "ufo": { + "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 }, - "uglify-js": { + "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, - "optional": true + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } }, - "unbox-primitive": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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 + "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" }, - "unicode-emoji-modifier-base": { + "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "universal-user-agent": { + "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 }, - "universalify": { + "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "optional": true, - "peer": true + "peer": true, + "engines": { + "node": ">= 10.0.0" + } }, - "upper-case": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "tslib": "^2.0.3" } }, - "upper-case-first": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "tslib": "^2.0.3" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "optional": true, "peer": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "util-deprecate": { + "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 + "dev": true, + "license": "MIT" }, - "uuid": { + "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "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", + "bin": { + "uuid": "bin/uuid" + } }, - "validate-npm-package-license": { + "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, - "requires": { + "license": "Apache-2.0", + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "validate-npm-package-name": { + "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 + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "vinyl": { + "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, - "requires": { + "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" + }, + "engines": { + "node": ">= 0.10" } }, - "vite": { + "node_modules/vite": { "version": "7.1.9", "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", "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" }, + "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/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.14.tgz", + "integrity": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==", + "dev": true, + "license": "MIT", "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": {} + "@vitest/expect": "4.0.14", + "@vitest/mocker": "4.0.14", + "@vitest/pretty-format": "4.0.14", + "@vitest/runner": "4.0.14", + "@vitest/snapshot": "4.0.14", + "@vitest/spy": "4.0.14", + "@vitest/utils": "4.0.14", + "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": "^0.3.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.14", + "@vitest/browser-preview": "4.0.14", + "@vitest/browser-webdriverio": "4.0.14", + "@vitest/ui": "4.0.14", + "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 }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, + "happy-dom": { "optional": true }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true + "jsdom": { + "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==", - "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" - } - }, - "vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "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==", "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" + "license": "MIT", + "engines": { + "node": ">=12" }, - "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 - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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": { + "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "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 +12382,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,123 +12423,182 @@ "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" }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", "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" - } - } + "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/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==", + "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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "winston": { + "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==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", @@ -23736,177 +12610,281 @@ "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" } }, - "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": { + "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "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 - }, - "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" - } - } + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": { - "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": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "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" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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" + } + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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" }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", "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" - } - } + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "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/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, - "optional": true, - "peer": true + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } }, - "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 +12893,61 @@ "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/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/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/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/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..82eeab437 100644 --- a/package.json +++ b/package.json @@ -110,47 +110,46 @@ }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.2.5", - "@biomejs/js-api": "^3.0.0", - "@biomejs/wasm-nodejs": "^2.2.5", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@happy-dom/global-registrator": "^16.8.1", + "@biomejs/biome": "2.3.3", + "@biomejs/js-api": "^4.0.0", + "@biomejs/wasm-nodejs": "^2.3.3", + "@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": "^19.2.2", "@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.7", + "@vitest/coverage-v8": "^4.0.7", + "esbuild": "^0.25.12", + "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" + "vitest": "^4.0.7" }, "author": "Uploadcare Inc.", "license": "MIT", "dependencies": { - "@symbiotejs/symbiote": "^1.11.7", + "@symbiotejs/symbiote": "^2.3.3", "@uploadcare/cname-prefix": "^6.18.2", "@uploadcare/image-shrink": "^6.18.2", "@uploadcare/quality-insights": "^6.18.2", diff --git a/src/abstract/Block.ts b/src/abstract/Block.ts index 58897ea5f..61a6e6012 100644 --- a/src/abstract/Block.ts +++ b/src/abstract/Block.ts @@ -1,4 +1,5 @@ -import { BaseComponent, Data } from '@symbiotejs/symbiote'; +import { DICT, PubSub, Symbiote } from '@symbiotejs/symbiote'; +import { slotProcessor } from '@symbiotejs/symbiote/core/slotProcessor.js'; import { initialConfig } from '../blocks/Config/initialConfig'; import { EventEmitter } from '../blocks/UploadCtxProvider/EventEmitter'; import type { ConfigType } from '../types'; @@ -9,6 +10,7 @@ import { applyTemplateData, getPluralObjects } from '../utils/template-utils'; import { WindowHeightTracker } from '../utils/WindowHeightTracker'; import { waitForAttribute } from '../utils/waitForAttribute'; import type { ActivityType } from './ActivityBlock'; +import { bindCompatibilityFallbackProcessor } from './bindCompatibilityFallbackProcessor'; import { blockCtx } from './CTX'; import { l10nProcessor } from './l10nProcessor'; import { A11y } from './managers/a11y'; @@ -19,8 +21,9 @@ import { sharedConfigKey } from './sharedConfigKey'; import { testModeProcessor } from './testModeProcessor'; const TAG_PREFIX = 'uc-'; +const CTX_NAME_FALLBACK_ATTR = 'ctx-name'; -export class Block extends BaseComponent { +export class Block extends Symbiote { private __cfgProxy?: any; protected l10nProcessorSubs: Map void }>> = new Map(); static StateConsumerScope: string | null = null; @@ -61,12 +64,12 @@ export class Block extends BaseComponent { constructor() { super(); + this.addTemplateProcessor(bindCompatibilityFallbackProcessor); + this.addTemplateProcessor(l10nProcessor as (fr: DocumentFragment | Symbiote, fnCtx: Symbiote) => void); this.addTemplateProcessor( - l10nProcessor as (fr: DocumentFragment | BaseComponent, fnCtx: BaseComponent) => void, - ); - this.addTemplateProcessor( - testModeProcessor as (fr: DocumentFragment | BaseComponent, fnCtx: BaseComponent) => void, + testModeProcessor as (fr: DocumentFragment | Symbiote, fnCtx: Symbiote) => void, ); + this.addTemplateProcessor(slotProcessor as (fr: DocumentFragment | Symbiote, fnCtx: Symbiote) => void); } emit( @@ -117,17 +120,29 @@ export class Block extends BaseComponent { 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 + Promise.race([ + waitForAttribute({ + element: this, + attribute: DICT.CTX_NAME_ATTR, + }), + waitForAttribute({ + element: this, + attribute: CTX_NAME_FALLBACK_ATTR, + }), + ]).then((result) => { + if (result.success) { + if (result.attribute === CTX_NAME_FALLBACK_ATTR) { + const ctxName = result.value; + this.style.setProperty(DICT.CSS_CTX_PROP, `'${ctxName}'`); + } + // async wait for ctx 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 { + console.error( + `Attribute "${DICT.CTX_NAME_ATTR}" or "${CTX_NAME_FALLBACK_ATTR}" is required and it is not set.`, + ); + } }); } else { super.connectedCallback(); @@ -228,7 +243,7 @@ export class Block extends BaseComponent { // Destroy local context // TODO: this should be done inside symbiote - Data.deleteCtx(this); + PubSub.deleteCtx(this.localCtx.uid); if (blocksRegistry?.size === 0) { setTimeout(() => { @@ -242,7 +257,7 @@ export class Block extends BaseComponent { * 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); + PubSub.deleteCtx(this.ctxName); this.localeManager?.destroy(); @@ -339,4 +354,4 @@ export class Block extends BaseComponent { } } -export { BaseComponent }; +export { Symbiote }; diff --git a/src/abstract/SolutionBlock.ts b/src/abstract/SolutionBlock.ts index 753aa923c..bdf4b38af 100644 --- a/src/abstract/SolutionBlock.ts +++ b/src/abstract/SolutionBlock.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import svgIconsSprite from '../blocks/themes/uc-basic/svg-sprite'; import { Block } from './Block'; import { solutionBlockCtx } from './CTX'; @@ -14,7 +15,7 @@ export class SolutionBlock extends Block { } static override set template(value: string) { - this._template = /* html */ `${svgIconsSprite + value}`; + this._template = html`${svgIconsSprite + value}`; } static override get template(): string { diff --git a/src/abstract/TypedCollection.ts b/src/abstract/TypedCollection.ts index a2c694943..b9179714e 100644 --- a/src/abstract/TypedCollection.ts +++ b/src/abstract/TypedCollection.ts @@ -1,4 +1,4 @@ -import { Data, UID } from '@symbiotejs/symbiote'; +import { PubSub, UID } from '@symbiotejs/symbiote'; import type { ExtractDataFromSchema, ExtractKeysFromSchema, TypedSchema } from './TypedData'; import { TypedData } from './TypedData'; @@ -22,7 +22,7 @@ type TypedCollectionOptions = { export class TypedCollection { private __typedSchema: T; private __ctxId: string; - private __data: ReturnType; + private __data: ReturnType; private __watchList: ExtractKeysFromSchema[]; private __subsMap: Record[]> = Object.create(null) as Record[]>; private __propertyObservers = new Set>(); @@ -37,7 +37,7 @@ export class TypedCollection { constructor(options: TypedCollectionOptions) { this.__typedSchema = options.typedSchema; this.__ctxId = options.ctxName || UID.generate(); - this.__data = Data.registerCtx({}, this.__ctxId); + this.__data = PubSub.registerCtx({}, this.__ctxId); this.__watchList = options.watchList || []; let changeMap = Object.create(null) as ChangeMap; @@ -196,7 +196,7 @@ export class TypedCollection { } destroy(): void { - Data.deleteCtx(this.__ctxId); + PubSub.deleteCtx(this.__ctxId); this.__propertyObservers = new Set(); this.__collectionObservers = new Set(); for (const id in this.__subsMap) { diff --git a/src/abstract/TypedData.ts b/src/abstract/TypedData.ts index d858e7b2f..313ca6e55 100644 --- a/src/abstract/TypedData.ts +++ b/src/abstract/TypedData.ts @@ -1,4 +1,4 @@ -import { Data, UID } from '@symbiotejs/symbiote'; +import { PubSub, UID } from '@symbiotejs/symbiote'; const MSG_NAME = '[Typed State] Wrong property name: '; const MSG_TYPE = '[Typed State] Wrong property type: '; @@ -29,7 +29,7 @@ export class TypedData { private __typedSchema: T; private __ctxId: string; private __schema: ExtractDataFromSchema; - private __data: Data; + private __data: PubSub>; constructor(typedSchema: T, ctxName?: string) { this.__typedSchema = typedSchema; @@ -44,7 +44,7 @@ export class TypedData { }, {} as ExtractDataFromSchema, ); - this.__data = Data.registerCtx(this.__schema, this.__ctxId); + this.__data = PubSub.registerCtx(this.__schema, this.__ctxId); } get uid(): string { @@ -83,10 +83,10 @@ export class TypedData { } subscribe>(prop: K, handler: (newVal: ExtractDataFromSchema[K]) => void) { - return this.__data.sub(prop, handler); + return this.__data.sub(prop, handler as (val: unknown) => void); } remove(): void { - Data.deleteCtx(this.__ctxId); + PubSub.deleteCtx(this.__ctxId); } } diff --git a/src/abstract/UploaderBlock.ts b/src/abstract/UploaderBlock.ts index 47715ef87..324992e94 100644 --- a/src/abstract/UploaderBlock.ts +++ b/src/abstract/UploaderBlock.ts @@ -1,6 +1,6 @@ // @ts-check -import { Data } from '@symbiotejs/symbiote'; +import { PubSub } from '@symbiotejs/symbiote'; import { type FileFromOptions, uploadFileGroup } from '@uploadcare/upload-client'; import { calculateMaxCenteredCropFrame } from '../blocks/CloudImageEditor/src/crop-utils'; import { parseCropPreset } from '../blocks/CloudImageEditor/src/lib/parseCropPreset'; @@ -261,7 +261,7 @@ export class UploaderBlock extends ActivityBlock { setTimeout(() => { // 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 +271,7 @@ export class UploaderBlock extends ActivityBlock { if (changeMap.uploadProgress) { for (const entryId of changeMap.uploadProgress) { - const { isUploading, silent } = Data.getCtx(entryId).store; + const { isUploading, silent } = PubSub.getCtx(entryId).store; if (isUploading && !silent) { this.emit(EventType.FILE_UPLOAD_PROGRESS, this.api.getOutputItem(entryId)); } @@ -281,7 +281,7 @@ export class UploaderBlock extends ActivityBlock { } if (changeMap.isUploading) { for (const entryId of changeMap.isUploading) { - const { isUploading, silent } = Data.getCtx(entryId).store; + const { isUploading, silent } = PubSub.getCtx(entryId).store; if (isUploading && !silent) { this.emit(EventType.FILE_UPLOAD_START, this.api.getOutputItem(entryId)); } @@ -289,7 +289,7 @@ export class UploaderBlock extends ActivityBlock { } if (changeMap.fileInfo) { for (const entryId of changeMap.fileInfo) { - const { fileInfo, silent } = Data.getCtx(entryId).store; + const { fileInfo, silent } = PubSub.getCtx(entryId).store; if (fileInfo && !silent) { this.emit(EventType.FILE_UPLOAD_SUCCESS, this.api.getOutputItem(entryId)); } @@ -306,7 +306,7 @@ export class UploaderBlock extends ActivityBlock { this.validationManager.runCollectionValidators(); for (const entryId of changeMap.errors) { - const { errors } = Data.getCtx(entryId).store; + const { errors } = PubSub.getCtx(entryId).store; if (errors.length > 0) { this.emit(EventType.FILE_UPLOAD_FAILED, this.api.getOutputItem(entryId)); this.emit( diff --git a/src/abstract/UploaderPublicApi.ts b/src/abstract/UploaderPublicApi.ts index 9deb97ace..c7a2cec9c 100644 --- a/src/abstract/UploaderPublicApi.ts +++ b/src/abstract/UploaderPublicApi.ts @@ -1,6 +1,6 @@ // @ts-check -import { applyStyles, Data } from '@symbiotejs/symbiote'; +import { applyStyles, PubSub } from '@symbiotejs/symbiote'; import { calcCameraModes } from '../blocks/CameraSource/calcCameraModes'; import { CameraSourceTypes, type ModeCameraType } from '../blocks/CameraSource/constants'; import type { SourceBtn } from '../blocks/SourceBtn/SourceBtn'; @@ -234,7 +234,7 @@ export class UploaderPublicApi { }; getOutputItem(entryId: string): OutputFileEntry { - const uploadEntryData = Data.getCtx(entryId).store as UploadEntryData; + const uploadEntryData = PubSub.getCtx(entryId).store as UploadEntryData; const fileInfo = uploadEntryData.fileInfo as UploadcareFile | null; diff --git a/src/abstract/bindCompatibilityFallbackProcessor.ts b/src/abstract/bindCompatibilityFallbackProcessor.ts new file mode 100644 index 000000000..3efd7bb3d --- /dev/null +++ b/src/abstract/bindCompatibilityFallbackProcessor.ts @@ -0,0 +1,13 @@ +import { DICT, type Symbiote } from '@symbiotejs/symbiote'; + +const FALLBACK_BIND_ATTR = 'set'; + +export function bindCompatibilityFallbackProcessor(fr: DocumentFragment | Symbiote): void { + [...fr.querySelectorAll(`[${FALLBACK_BIND_ATTR}]`)].forEach((el) => { + const setAttrValue = el.getAttribute(FALLBACK_BIND_ATTR); + if (setAttrValue) { + el.removeAttribute(FALLBACK_BIND_ATTR); + el.setAttribute(DICT.BIND_ATTR, setAttrValue); + } + }); +} diff --git a/src/abstract/defineComponents.ts b/src/abstract/defineComponents.ts index 115ca6b9e..d28768ada 100644 --- a/src/abstract/defineComponents.ts +++ b/src/abstract/defineComponents.ts @@ -1,6 +1,11 @@ +const EXCLUDE_COMPONENTS = ['Symbiote', 'BaseComponent', 'UploaderBlock', 'ActivityBlock', 'Block', 'SolutionBlock']; + // biome-ignore lint/suspicious/noExplicitAny: Type is used to represent any class 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 index 5f53a54e7..8adb7ba63 100644 --- a/src/abstract/l10nProcessor.ts +++ b/src/abstract/l10nProcessor.ts @@ -53,11 +53,11 @@ const locale = (el: Element, key: string, fnCtx: any): void => { // 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); + if (!fnCtx.sharedCtx.has(nodeStateKey)) { + fnCtx.sharedCtx.add(nodeStateKey, mappedKey); } // Subscribe on the global l10n key change - const sub = fnCtx.nodeCtx.sub(nodeStateKey, () => { + const sub = fnCtx.sharedCtx.sub(nodeStateKey, () => { (el as any)[elProp as 'textContent'] = fnCtx.l10n(mappedKey); }); keySubs?.add(sub); diff --git a/src/blocks/CameraSource/CameraSource.ts b/src/blocks/CameraSource/CameraSource.ts index 758855a69..1abdc7ae7 100644 --- a/src/blocks/CameraSource/CameraSource.ts +++ b/src/blocks/CameraSource/CameraSource.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { ActivityBlock } from '../../abstract/ActivityBlock'; import { UploaderBlock } from '../../abstract/UploaderBlock'; import { canUsePermissionsApi } from '../../utils/abilities'; @@ -975,29 +976,29 @@ export class CameraSource extends UploaderBlock { } } -CameraSource.template = /* HTML */ ` +CameraSource.template = html` -
+
-
+
@@ -1035,7 +1036,7 @@ CameraSource.template = /* HTML */ ` data-id="video" type="button" class="uc-switch uc-mini-btn" - set="onclick: onClickTab; @hidden: tabVideoHidden" + bind="onclick: onClickTab; @hidden: tabVideoHidden" > @@ -1043,24 +1044,24 @@ CameraSource.template = /* HTML */ `
-
diff --git a/src/blocks/CloudImageEditor/src/CropFrame.ts b/src/blocks/CloudImageEditor/src/CropFrame.ts index 7c6b1d333..1f61ab8d1 100644 --- a/src/blocks/CloudImageEditor/src/CropFrame.ts +++ b/src/blocks/CloudImageEditor/src/CropFrame.ts @@ -1,4 +1,4 @@ -import { UID } from '@symbiotejs/symbiote'; +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../abstract/Block'; import { clamp, @@ -550,4 +550,4 @@ export class CropFrame extends Block { } } -CropFrame.template = /* HTML */ ` `; +CropFrame.template = html` `; diff --git a/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts b/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts index 77830d9e1..c9789523a 100644 --- a/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { createSvgNode } from './crop-utils.js'; import { EditorButtonControl } from './EditorButtonControl.js'; import type { CropAspectRatio } from './types'; @@ -42,10 +43,10 @@ export class EditorFreeformButtonControl extends EditorButtonControl { } } -EditorFreeformButtonControl.template = /* html */ ` - `; diff --git a/src/blocks/CloudImageEditor/src/EditorButtonControl.ts b/src/blocks/CloudImageEditor/src/EditorButtonControl.ts index 3e55d9743..7c45b2961 100644 --- a/src/blocks/CloudImageEditor/src/EditorButtonControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorButtonControl.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../abstract/Block'; import { classNames } from './lib/classNames.js'; @@ -48,9 +49,9 @@ export class EditorButtonControl extends Block { } } -EditorButtonControl.template = /* HTML */ ` - `; diff --git a/src/blocks/CloudImageEditor/src/EditorFilterControl.ts b/src/blocks/CloudImageEditor/src/EditorFilterControl.ts index c2a1a3b46..adc968cf4 100644 --- a/src/blocks/CloudImageEditor/src/EditorFilterControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorFilterControl.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { createCdnUrl, createCdnUrlModifiers } from '../../../utils/cdn-utils.js'; import { preloadImage } from '../../../utils/preloadImage.js'; import { EditorButtonControl } from './EditorButtonControl.js'; @@ -168,9 +169,9 @@ export class EditorFilterControl extends EditorButtonControl { } } -EditorFilterControl.template = /* HTML */ ` +EditorFilterControl.template = html` `; diff --git a/src/blocks/CloudImageEditor/src/EditorImageCropper.ts b/src/blocks/CloudImageEditor/src/EditorImageCropper.ts index 6fd709e42..ea44606b1 100644 --- a/src/blocks/CloudImageEditor/src/EditorImageCropper.ts +++ b/src/blocks/CloudImageEditor/src/EditorImageCropper.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../abstract/Block'; import { debounce } from '../../../utils/debounce.js'; import { preloadImage } from '../../../utils/preloadImage.js'; @@ -509,7 +510,7 @@ export class EditorImageCropper extends Block { } } -EditorImageCropper.template = /* HTML */ ` +EditorImageCropper.template = html` `; diff --git a/src/blocks/CloudImageEditor/src/EditorScroller.ts b/src/blocks/CloudImageEditor/src/EditorScroller.ts index 613840d27..238249b22 100644 --- a/src/blocks/CloudImageEditor/src/EditorScroller.ts +++ b/src/blocks/CloudImageEditor/src/EditorScroller.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../abstract/Block'; const X_THRESHOLD = 1; @@ -30,4 +31,4 @@ export class EditorScroller extends Block { } } -EditorScroller.template = /* HTML */ ` `; +EditorScroller.template = html` `; diff --git a/src/blocks/CloudImageEditor/src/EditorSlider.ts b/src/blocks/CloudImageEditor/src/EditorSlider.ts index f8771c685..bfed68574 100644 --- a/src/blocks/CloudImageEditor/src/EditorSlider.ts +++ b/src/blocks/CloudImageEditor/src/EditorSlider.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../abstract/Block'; import type { EditorImageFader } from './EditorImageFader'; import type { ColorOperation, FilterId } from './toolbar-constants'; @@ -117,9 +118,9 @@ export class EditorSlider extends Block { } } -EditorSlider.template = /* HTML */ ` +EditorSlider.template = html` `; diff --git a/src/blocks/CloudImageEditor/src/EditorToolbar.ts b/src/blocks/CloudImageEditor/src/EditorToolbar.ts index ed9da17cd..7f3af740b 100644 --- a/src/blocks/CloudImageEditor/src/EditorToolbar.ts +++ b/src/blocks/CloudImageEditor/src/EditorToolbar.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../abstract/Block'; import { debounce } from '../../../utils/debounce'; import { batchPreloadImages } from '../../../utils/preloadImage'; @@ -24,17 +25,17 @@ import { parseFilterValue } from './utils/parseFilterValue'; type TabIdValue = (typeof TabId)[keyof typeof TabId]; function renderTabToggle(id: TabIdValue): string { - return /* HTML */ ` + return html` @@ -42,11 +43,11 @@ function renderTabToggle(id: TabIdValue): string { } function renderTabContent(id: TabIdValue): string { - return /* HTML */ ` + return html`
@@ -462,8 +463,8 @@ export class EditorToolbar extends Block { } } -EditorToolbar.template = /* HTML */ ` - +EditorToolbar.template = html` +
{{*operationTooltip}}
@@ -473,36 +474,36 @@ EditorToolbar.template = /* HTML */ `
${ALL_TABS.map(renderTabContent).join('')}
${ALL_TABS.map(renderTabToggle).join('')}
- + - +
-
+
-
+
- - + +
diff --git a/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts b/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts index 8c0cd39a6..9d69460ed 100644 --- a/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../../../abstract/Block'; import { classNames } from '../../lib/classNames'; @@ -89,13 +90,13 @@ export class BtnUi extends Block { BtnUi.bindAttributes({ text: 'text', icon: 'icon', reverse: 'reverse', theme: 'theme' }); -BtnUi.template = /* HTML */ ` +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..2271969ef 100644 --- a/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../../../abstract/Block'; export class LineLoaderUi extends Block { @@ -44,7 +45,7 @@ export class LineLoaderUi extends Block { } } -LineLoaderUi.template = /* HTML */ ` +LineLoaderUi.template = 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..9fd8b8cf6 100644 --- a/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts +++ b/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../../../abstract/Block'; import { applyClassNames } from '../../lib/classNames'; @@ -66,4 +67,4 @@ export class PresenceToggle extends Block { }, 0); } } -PresenceToggle.template = /* HTML */ ` `; +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..ec5e206b8 100644 --- a/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../../../../abstract/Block'; type SliderHandler = (value: number) => void; @@ -191,13 +192,13 @@ export class SliderUi extends Block { this._observer?.disconnect(); } } -SliderUi.template = /* HTML */ ` +SliderUi.template = html`
`; diff --git a/src/blocks/CloudImageEditor/src/template.ts b/src/blocks/CloudImageEditor/src/template.ts index 1f09e09dd..a90bd6a5a 100644 --- a/src/blocks/CloudImageEditor/src/template.ts +++ b/src/blocks/CloudImageEditor/src/template.ts @@ -1,10 +1,11 @@ +import { html } from '@symbiotejs/symbiote'; import { TRANSPARENT_PIXEL_SRC } from '../../../utils/transparentPixelSrc'; import svgIconsSprite from './svg-sprite'; -export const TEMPLATE = /* HTML */ ` +export const TEMPLATE = html` ${svgIconsSprite}
- +
@@ -12,7 +13,7 @@ export const TEMPLATE = /* HTML */ `
Network error
@@ -27,7 +28,7 @@ export const TEMPLATE = /* HTML */ `
{{msg}}
- +
diff --git a/src/blocks/Copyright/Copyright.ts b/src/blocks/Copyright/Copyright.ts index 1834359e8..ebd34328f 100644 --- a/src/blocks/Copyright/Copyright.ts +++ b/src/blocks/Copyright/Copyright.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../abstract/Block'; import './copyright.css'; @@ -10,7 +11,7 @@ export class Copyright extends Block { }); } - static override template = /* HTML */ ` + static override template = html` -
-
+
+
diff --git a/src/blocks/ExternalSource/ExternalSource.ts b/src/blocks/ExternalSource/ExternalSource.ts index 9982f7723..b92be119c 100644 --- a/src/blocks/ExternalSource/ExternalSource.ts +++ b/src/blocks/ExternalSource/ExternalSource.ts @@ -1,4 +1,4 @@ -import { create } from '@symbiotejs/symbiote'; +import { create, html } from '@symbiotejs/symbiote'; import { ActivityBlock } from '../../abstract/ActivityBlock'; import { UploaderBlock } from '../../abstract/UploaderBlock'; import { getTopLevelOrigin } from '../../utils/get-top-level-origin'; @@ -292,12 +292,12 @@ export class ExternalSource extends UploaderBlock { } } -ExternalSource.template = /* HTML */ ` +ExternalSource.template = html` -
+
+ +
{{counterText}} - - + +
diff --git a/src/blocks/FileItem/FileItem.ts b/src/blocks/FileItem/FileItem.ts index 399223ab9..c45f42d79 100644 --- a/src/blocks/FileItem/FileItem.ts +++ b/src/blocks/FileItem/FileItem.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { shrinkFile } from '@uploadcare/image-shrink'; import { CancelError, @@ -143,7 +144,7 @@ export class FileItem extends FileItemConfig { 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; @@ -463,21 +464,21 @@ export class FileItem extends FileItemConfig { } }); - static override template = /* HTML */ ` -
- + static override template = html` +
+ -
- {{itemName}} - {{errorText}} - {{hint}} +
+ {{itemName}} + {{errorText}} + {{hint}}
@@ -485,17 +486,17 @@ export class FileItem extends FileItemConfig { type="button" l10n="@title:file-item-remove-button;@aria-label:file-item-remove-button" class="uc-remove-btn uc-mini-btn" - set="onclick: onRemove;" + bind="onclick: onRemove;" > -
diff --git a/src/blocks/Icon/Icon.ts b/src/blocks/Icon/Icon.ts index feef2cd1e..602f28dc9 100644 --- a/src/blocks/Icon/Icon.ts +++ b/src/blocks/Icon/Icon.ts @@ -1,4 +1,5 @@ import './icon.css'; +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../abstract/Block'; import type { IconHrefResolver } from '../../types/index'; @@ -33,9 +34,9 @@ export class Icon extends Block { } } -Icon.template = /* HTML */ ` +Icon.template = html` - + `; diff --git a/src/blocks/Img/ImgConfig.js b/src/blocks/Img/ImgConfig.js index e6c708426..2bdcde4b4 100644 --- a/src/blocks/Img/ImgConfig.js +++ b/src/blocks/Img/ImgConfig.js @@ -1,4 +1,4 @@ -import { BaseComponent, Data } from '@symbiotejs/symbiote'; +import { PubSub, Symbiote } from '@symbiotejs/symbiote'; import { PACKAGE_NAME, PACKAGE_VERSION } from '../../env.ts'; import { CSS_PREF } from './configurations.js'; import { PROPS_MAP } from './props-map.js'; @@ -8,7 +8,7 @@ for (const prop in PROPS_MAP) { CSS_PROPS[CSS_PREF + prop] = PROPS_MAP[prop]?.default || ''; } -export class ImgConfig extends BaseComponent { +export class ImgConfig extends Symbiote { cssInit$ = CSS_PROPS; /** @@ -87,7 +87,7 @@ export class ImgConfig extends BaseComponent { }); this._isnObserver = null; } - Data.deleteCtx(this); + PubSub.deleteCtx(this); } static get observedAttributes() { diff --git a/src/blocks/Modal/Modal.ts b/src/blocks/Modal/Modal.ts index 303e52feb..d76be0b6d 100644 --- a/src/blocks/Modal/Modal.ts +++ b/src/blocks/Modal/Modal.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../abstract/Block'; import type { ModalCb, ModalId } from '../../abstract/managers/ModalManager'; import { ModalEvents } from '../../abstract/managers/ModalManager'; @@ -154,7 +155,7 @@ export class Modal extends Block { } } -Modal.template = /* HTML */ ` +Modal.template = html` diff --git a/src/blocks/ProgressBar/ProgressBar.ts b/src/blocks/ProgressBar/ProgressBar.ts index bb9cc9621..acd428a5a 100644 --- a/src/blocks/ProgressBar/ProgressBar.ts +++ b/src/blocks/ProgressBar/ProgressBar.ts @@ -1,4 +1,5 @@ import './progress-bar.css'; +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../abstract/Block'; export class ProgressBar extends Block { @@ -44,7 +45,7 @@ export class ProgressBar extends Block { } } -ProgressBar.template = /* HTML */ ` +ProgressBar.template = html`
`; diff --git a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts index 0573b946d..04269a078 100644 --- a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts +++ b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts @@ -1,4 +1,5 @@ import './progress-bar-common.css'; +import { html } from '@symbiotejs/symbiote'; import { UploaderBlock } from '../../abstract/UploaderBlock'; type BaseInitState = InstanceType['init$']; @@ -54,4 +55,4 @@ export class ProgressBarCommon extends UploaderBlock { } } -ProgressBarCommon.template = /* HTML */ ` `; +ProgressBarCommon.template = html` `; diff --git a/src/blocks/Range/Range.ts b/src/blocks/Range/Range.ts index 9b7b3214d..4f4520dbe 100644 --- a/src/blocks/Range/Range.ts +++ b/src/blocks/Range/Range.ts @@ -1,4 +1,4 @@ -import { BaseComponent } from '@symbiotejs/symbiote'; +import { html, Symbiote } from '@symbiotejs/symbiote'; interface RangeInitState { cssLeft: string; @@ -7,7 +7,7 @@ interface RangeInitState { onChange: (e: Event) => void; } -export class Range extends BaseComponent { +export class Range extends Symbiote { private _range!: HTMLInputElement; constructor() { @@ -45,12 +45,12 @@ export class Range extends BaseComponent { } } -Range.template = /* HTML */ ` +Range.template = html`
-
-
+
+
- + `; diff --git a/src/blocks/Select/Select.ts b/src/blocks/Select/Select.ts index ec90403f0..4b5ed7770 100644 --- a/src/blocks/Select/Select.ts +++ b/src/blocks/Select/Select.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../abstract/Block'; import './select.css'; @@ -45,13 +46,13 @@ export class Select extends Block { this.sub('options', (options: SelectOption[]) => { this.$.currentText = options?.[0]?.text || ''; - let html = ''; + let htmlContent = ''; options?.forEach((option) => { - html += /* HTML */ ``; + htmlContent += html``; }); - this.$.selectHtml = html; + this.$.selectHtml = htmlContent; }); } } -Select.template = /* HTML */ ` `; +Select.template = html` `; diff --git a/src/blocks/SimpleBtn/SimpleBtn.ts b/src/blocks/SimpleBtn/SimpleBtn.ts index caa5f57e4..700a23f47 100644 --- a/src/blocks/SimpleBtn/SimpleBtn.ts +++ b/src/blocks/SimpleBtn/SimpleBtn.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import './simple-btn.css'; import { UploaderBlock } from '../../abstract/UploaderBlock'; import { asBoolean } from '../Config/validatorsType'; @@ -41,9 +42,9 @@ export class SimpleBtn extends UploaderBlock { } } -SimpleBtn.template = /* HTML */ ` - - `; diff --git a/src/blocks/SourceList/SourceList.ts b/src/blocks/SourceList/SourceList.ts index 871349e0b..764db1da9 100644 --- a/src/blocks/SourceList/SourceList.ts +++ b/src/blocks/SourceList/SourceList.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { Block } from '../../abstract/Block'; import { browserFeatures } from '../../utils/browser-info'; import { deserializeCsv } from '../../utils/comma-separated'; @@ -9,7 +10,7 @@ export class SourceList extends Block { this.subConfigValue('sourceList', (val: string) => { const list = stringToArray(val); - let html = ''; + let htmlContent = ''; list.forEach((srcName) => { if (srcName === 'instagram') { @@ -26,24 +27,24 @@ export class SourceList extends Block { const cameraModes = deserializeCsv(cameraModesValue); cameraModes.forEach((mode) => { - html += /* HTML */ ``; + htmlContent += html``; }); if (cameraModes.length === 0) { - html += /* HTML */ ``; + htmlContent += html``; } }); return; } - html += /* HTML */ ``; + htmlContent += html``; }); if (this.cfg.sourceListWrap) { - this.innerHTML = html; + this.innerHTML = htmlContent; } else { - this.outerHTML = html; + this.outerHTML = htmlContent; } }); } diff --git a/src/blocks/Spinner/Spinner.ts b/src/blocks/Spinner/Spinner.ts index 18959aa08..9ec08728b 100644 --- a/src/blocks/Spinner/Spinner.ts +++ b/src/blocks/Spinner/Spinner.ts @@ -1,6 +1,6 @@ -import { BaseComponent } from '@symbiotejs/symbiote'; +import { html, Symbiote } from '@symbiotejs/symbiote'; import './spinner.css'; -export class Spinner extends BaseComponent {} +export class Spinner extends Symbiote {} -Spinner.template = /* HTML */ `
`; +Spinner.template = html`
`; diff --git a/src/blocks/StartFrom/StartFrom.ts b/src/blocks/StartFrom/StartFrom.ts index 23b373539..9728b843f 100644 --- a/src/blocks/StartFrom/StartFrom.ts +++ b/src/blocks/StartFrom/StartFrom.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import type { ActivityType } from '../../abstract/ActivityBlock'; import { ActivityBlock } from '../../abstract/ActivityBlock'; import './start-from.css'; @@ -12,4 +13,4 @@ export class StartFrom extends ActivityBlock { } } -StartFrom.template = /* HTML */ `
`; +StartFrom.template = html`
`; diff --git a/src/blocks/Thumb/Thumb.ts b/src/blocks/Thumb/Thumb.ts index 83d1c3dcf..93378cb7c 100644 --- a/src/blocks/Thumb/Thumb.ts +++ b/src/blocks/Thumb/Thumb.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { createCdnUrl, createCdnUrlModifiers, createOriginalUrl } from '../../utils/cdn-utils'; import { debounce } from '../../utils/debounce'; import { preloadImage } from '../../utils/preloadImage'; @@ -213,10 +214,10 @@ export class Thumb extends FileItemConfig { } } -Thumb.template = /* html */ ` -
+Thumb.template = html` +
- +
`; diff --git a/src/blocks/UploadList/UploadList.ts b/src/blocks/UploadList/UploadList.ts index dec9e5df6..5a6ed3677 100644 --- a/src/blocks/UploadList/UploadList.ts +++ b/src/blocks/UploadList/UploadList.ts @@ -1,4 +1,5 @@ // @ts-check +import { html } from '@symbiotejs/symbiote'; import { ActivityBlock } from '../../abstract/ActivityBlock'; import { UploaderBlock } from '../../abstract/UploaderBlock'; import type { OutputCollectionErrorType, OutputError } from '../../types'; @@ -210,56 +211,56 @@ export class UploadList extends UploaderBlock { } } -UploadList.template = /* HTML */ ` +UploadList.template = html` {{headerText}} -
+
-
+
-
+
- +
diff --git a/src/blocks/UrlSource/UrlSource.ts b/src/blocks/UrlSource/UrlSource.ts index 4aae34424..eef4324fc 100644 --- a/src/blocks/UrlSource/UrlSource.ts +++ b/src/blocks/UrlSource/UrlSource.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import type { ActivityType } from '../../abstract/ActivityBlock'; import { ActivityBlock } from '../../abstract/ActivityBlock'; import { UploaderBlock } from '../../abstract/UploaderBlock'; @@ -63,9 +64,9 @@ export class UrlSource extends UploaderBlock { } } -UrlSource.template = /* HTML */ ` +UrlSource.template = html` -
@@ -75,7 +76,7 @@ UrlSource.template = /* HTML */ ` diff --git a/src/index.ts b/src/index.ts index 8cfb95e35..48dd08fcd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import './blocks/themes/uc-basic/index.css'; // Symbiote.js -export { BaseComponent, Data, UID } from '@symbiotejs/symbiote'; +export { PubSub, PubSub as Data, Symbiote, Symbiote as BaseComponent, UID } from '@symbiotejs/symbiote'; export { ActivityBlock } from './abstract/ActivityBlock'; // Abstract: diff --git a/src/solutions/file-uploader/inline/FileUploaderInline.ts b/src/solutions/file-uploader/inline/FileUploaderInline.ts index 2b8cc8c55..7411cd8ae 100644 --- a/src/solutions/file-uploader/inline/FileUploaderInline.ts +++ b/src/solutions/file-uploader/inline/FileUploaderInline.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import './index.css'; import { ActivityBlock } from '../../../abstract/ActivityBlock'; @@ -83,7 +84,7 @@ export class FileUploaderInline extends SolutionBlock { } } -FileUploaderInline.template = /* HTML */ ` +FileUploaderInline.template = html` @@ -91,7 +92,7 @@ FileUploaderInline.template = /* HTML */ ` type="button" l10n="start-from-cancel" class="uc-cancel-btn uc-secondary-btn" - set="onclick: cancel; @hidden: !couldCancel" + bind="onclick: cancel; @hidden: !couldCancel" > diff --git a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts index 69bc88fda..f3fee9fd6 100644 --- a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts +++ b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import { ActivityBlock } from '../../../abstract/ActivityBlock'; import type { ModalCb } from '../../../abstract/managers/ModalManager'; import { ModalEvents } from '../../../abstract/managers/ModalManager'; @@ -151,18 +152,18 @@ export class FileUploaderMinimal extends SolutionBlock { } } -FileUploaderMinimal.template = /* HTML */ ` - - +FileUploaderMinimal.template = html` + + - + - + diff --git a/src/solutions/file-uploader/regular/FileUploaderRegular.ts b/src/solutions/file-uploader/regular/FileUploaderRegular.ts index 080dbdf45..379b1fc6a 100644 --- a/src/solutions/file-uploader/regular/FileUploaderRegular.ts +++ b/src/solutions/file-uploader/regular/FileUploaderRegular.ts @@ -1,3 +1,4 @@ +import { html } from '@symbiotejs/symbiote'; import './index.css'; import { SolutionBlock } from '../../../abstract/SolutionBlock'; import { asBoolean } from '../../../blocks/Config/validatorsType'; @@ -37,14 +38,14 @@ export class FileUploaderRegular extends SolutionBlock { } } -FileUploaderRegular.template = /* HTML */ ` - +FileUploaderRegular.template = html` + - + diff --git a/src/utils/waitForAttribute.test.ts b/src/utils/waitForAttribute.test.ts index e6e054f4c..89e8020f6 100644 --- a/src/utils/waitForAttribute.test.ts +++ b/src/utils/waitForAttribute.test.ts @@ -1,77 +1,40 @@ -import { describe, expect, it, vi } from 'vitest'; +import { describe, expect, it } 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 () => { + it('should resolve success false when timeout is over', async () => { const element = document.createElement('div'); - const onSuccess = vi.fn(); - const onTimeout = vi.fn(); - waitForAttribute({ + const promise = waitForAttribute({ element, attribute: TEST_ATTRIBUTE, - onSuccess, - onTimeout, timeout: 10, }); await delay(100); - expect(onSuccess).not.toHaveBeenCalled(); - expect(onTimeout).toHaveBeenCalledTimes(1); + expect(await promise).to.be.eql({ success: false, attribute: TEST_ATTRIBUTE }); }); - it('should call onSuccess callback when attribute is set async', async () => { + it('should resolve success true when attribute is set async', async () => { const element = document.createElement('div'); - const onSuccess = vi.fn(); - const onTimeout = vi.fn(); - waitForAttribute({ + const promise = 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(); + expect(await promise).to.be.eql({ success: true, attribute: TEST_ATTRIBUTE, value: 'test' }); }); - it('should call onSuccess callback when attribute is set sync', async () => { + it('should resolve success true 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({ + const promise = 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(); + expect(await promise).to.be.eql({ success: true, attribute: TEST_ATTRIBUTE, value: 'test' }); }); }); diff --git a/src/utils/waitForAttribute.ts b/src/utils/waitForAttribute.ts index 3578f830b..1361f04d3 100644 --- a/src/utils/waitForAttribute.ts +++ b/src/utils/waitForAttribute.ts @@ -1,22 +1,37 @@ +import { withResolvers } from './withResolvers'; + type WaitForAttributeOptions = { element: HTMLElement; attribute: string; - onSuccess: (value: string) => void; - onTimeout: () => void; timeout?: number; }; -export const waitForAttribute = ({ +type ResolvedValue = + | { + success: true; + value: string; + attribute: string; + } + | { + success: false; + attribute: string; + }; + +export const waitForAttribute = async ({ element, attribute, - onSuccess, - onTimeout, timeout = 300, -}: WaitForAttributeOptions): void => { +}: WaitForAttributeOptions): Promise => { + const { promise, resolve } = withResolvers(); + const currentAttrValue = element.getAttribute(attribute); if (currentAttrValue !== null) { - onSuccess(currentAttrValue); - return; + resolve({ + success: true, + value: currentAttrValue, + attribute, + }); + return promise; } const observer = new MutationObserver((mutations) => { @@ -33,7 +48,10 @@ export const waitForAttribute = ({ const timeoutId = window.setTimeout(() => { observer.disconnect(); - onTimeout(); + resolve({ + success: false, + attribute, + }); }, timeout); const handleMutation = (mutation: MutationRecord): void => { @@ -41,7 +59,13 @@ export const waitForAttribute = ({ if (mutation.type === 'attributes' && mutation.attributeName === attribute && attrValue !== null) { window.clearTimeout(timeoutId); observer.disconnect(); - onSuccess(attrValue); + resolve({ + success: true, + value: attrValue, + attribute, + }); } }; + + return promise; }; From d7691fcc0cd1829f9f0c04d6e532a85329236739 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Wed, 5 Nov 2025 15:26:43 +0300 Subject: [PATCH 02/60] chore: fix symbiote state type warnings --- src/blocks/CloudImageEditor/src/EditorFilterControl.ts | 4 ++-- src/blocks/CloudImageEditor/src/EditorToolbar.ts | 2 +- src/blocks/ExternalSource/ExternalSource.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/blocks/CloudImageEditor/src/EditorFilterControl.ts b/src/blocks/CloudImageEditor/src/EditorFilterControl.ts index adc968cf4..2dfc51d14 100644 --- a/src/blocks/CloudImageEditor/src/EditorFilterControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorFilterControl.ts @@ -23,7 +23,7 @@ export class EditorFilterControl extends EditorButtonControl { title: '', icon: '', isOriginal: false, - iconSize: '20', + iconSize: 20, 'on.click': null, }; } @@ -128,7 +128,7 @@ export class EditorFilterControl extends EditorButtonControl { } this.sub('*currentFilter', (currentFilter: string) => { - this.$.active = currentFilter && currentFilter === this._filter; + this.$.active = !!(currentFilter && currentFilter === this._filter); }); this.sub('isOriginal', (isOriginal: boolean) => { diff --git a/src/blocks/CloudImageEditor/src/EditorToolbar.ts b/src/blocks/CloudImageEditor/src/EditorToolbar.ts index 7f3af740b..cb512a0a2 100644 --- a/src/blocks/CloudImageEditor/src/EditorToolbar.ts +++ b/src/blocks/CloudImageEditor/src/EditorToolbar.ts @@ -384,7 +384,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 ?? ''; } }); diff --git a/src/blocks/ExternalSource/ExternalSource.ts b/src/blocks/ExternalSource/ExternalSource.ts index b92be119c..899595dcc 100644 --- a/src/blocks/ExternalSource/ExternalSource.ts +++ b/src/blocks/ExternalSource/ExternalSource.ts @@ -190,7 +190,7 @@ export class ExternalSource extends UploaderBlock { showSelectionStatus: message.isMultipleMode && message.total > 0, couldSelectAll: message.selectedCount < message.total, couldDeselectAll: message.selectedCount === message.total, - selectedList: message.selectedFiles, + selectedList: message.selectedFiles ?? [], showDoneBtn: message.total > 0, }); } From 2fd35a66e598218f6a6d69b0a81e7f5288244f9d Mon Sep 17 00:00:00 2001 From: nd0ut Date: Wed, 5 Nov 2025 15:27:12 +0300 Subject: [PATCH 03/60] fix: use `inert` instead of `aria-hidden` to supress focus catch --- .../src/elements/presence-toggle/PresenceToggle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts b/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts index 9fd8b8cf6..1ddd86154 100644 --- a/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts +++ b/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts @@ -49,7 +49,7 @@ 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); } override initCallback(): void { From 7f3993ca1ee7a0197efe57bc1747eacc0954132f Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:52:06 +0300 Subject: [PATCH 04/60] feat(lit): add core Lit infrastructure and compatibility mixins - Add SymbioteCompatMixin for Symbiote.js compatibility layer - Add LightDomMixin for light DOM rendering support - Add CssDataMixin for CSS custom properties support - Add RegisterableElementMixin for custom element registration - Add parseCssPropertyValue utility for CSS property parsing - Add Constructor type helper --- src/lit/Constructor.ts | 1 + src/lit/CssDataMixin.ts | 35 +++ src/lit/LightDomMixin.ts | 137 +++++++++ src/lit/RegisterableElementMixin.ts | 32 ++ src/lit/SymbioteCompatMixin.ts | 443 ++++++++++++++++++++++++++++ src/lit/parseCssPropertyValue.ts | 74 +++++ 6 files changed, 722 insertions(+) create mode 100644 src/lit/Constructor.ts create mode 100644 src/lit/CssDataMixin.ts create mode 100644 src/lit/LightDomMixin.ts create mode 100644 src/lit/RegisterableElementMixin.ts create mode 100644 src/lit/SymbioteCompatMixin.ts create mode 100644 src/lit/parseCssPropertyValue.ts diff --git a/src/lit/Constructor.ts b/src/lit/Constructor.ts new file mode 100644 index 000000000..a644d42ea --- /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..48102accf --- /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 { + 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; + + 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..62000201b --- /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 { + yield(slot: string, defaultContent?: unknown): unknown; +} + +export function LightDomMixin>(ctor: T): T & Constructor { + abstract class LightDomMixinClass extends ctor { + __slots: Record = {}; + + // Set this to true to adopt children before the first update when multiple slots are expected. + __willYield = true; + + __initialLightDomChildren: AdoptedNode[] | null = null; + __hasAdoptedChildren = false; + + override createRenderRoot(): HTMLElement | ShadowRoot { + return this; + } + + override connectedCallback(): void { + if (!this.__initialLightDomChildren) { + this.__initialLightDomChildren = Array.from(this.childNodes) as AdoptedNode[]; + } + super.connectedCallback(); + } + + __adoptChildren(): void { + if (this.__hasAdoptedChildren) { + return; + } + + this.__hasAdoptedChildren = true; + this.__slots = {}; + + 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.__slots[slotName] ?? []; + + if (child instanceof Element) { + child.removeAttribute('slot'); + child.removeAttribute('content-for'); + } + + slotContent.push(child); + this.__slots[slotName] = slotContent; + } + + this.__initialLightDomChildren = null; + } + + __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 ''; + } + + __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. + __isSlotEmpty(slot: string): boolean { + const content = this.__slots[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. + override update(changedProperties: PropertyValues) { + if (!this.hasUpdated && this.__willYield) { + this.__adoptChildren(); + } + + super.update(changedProperties); + } + + yield(slot: string, defaultContent?: unknown) { + if (slot === '' && !this.__slots[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.__slots[slot] = slotContent; + this.__hasAdoptedChildren = true; + this.__initialLightDomChildren = null; + } + + const slotContent = this.__slots[slot]; + + return html` + ${slotContent} + ${this.__isSlotEmpty(slot) ? defaultContent : undefined} + `; + } + } + + return LightDomMixinClass as unknown as Constructor & T; +} diff --git a/src/lit/RegisterableElementMixin.ts b/src/lit/RegisterableElementMixin.ts new file mode 100644 index 000000000..728ec328f --- /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 { + 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/SymbioteCompatMixin.ts b/src/lit/SymbioteCompatMixin.ts new file mode 100644 index 000000000..9151c9735 --- /dev/null +++ b/src/lit/SymbioteCompatMixin.ts @@ -0,0 +1,443 @@ +import { ContextConsumer, ContextProvider, createContext } from '@lit/context'; +import { PubSub } from '@symbiotejs/symbiote'; +import type { LitElement, PropertyValues } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { debounce } from '../utils/debounce'; +import type { Constructor } from './Constructor'; + +// biome-ignore lint/suspicious/noExplicitAny: Shared state bag mirrors Symbiote's dynamic shape and can contain arbitrary user values +type SymbioteStateBag = Record; + +// Context for providing ctxName across component tree +export const ctxNameContext = createContext('ctx-name-context'); + +/** + * Interface for components using SymbioteMixin + */ +declare class SymbioteComponent { + $: SymbioteStateBag; + sub(key: string, callback: (value: T) => void, init?: boolean): () => void; + pub(key: string, value: unknown): void; + set$(obj: SymbioteStateBag): void; + has(key: string): boolean; + add(key: string, val: unknown, rewrite?: boolean): void; + add$(obj: SymbioteStateBag, rewrite?: boolean): void; + initCallback(): void; + sharedCtx: PubSub>; + ctxName: string; +} + +/** + * 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: + * @SymbioteMixin + * class MyComponent extends LitElement { ... } + */ +export function SymbioteMixin>(ctor: T): T & 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 _warnedAboutLocalState = false; + private _pendingSharedAdds: Map = new Map(); + + // Symbiote-style initial values declaration + protected init$: Record = {}; + protected ctxOwner = false; + + private _ctxNameAttr: string | undefined = undefined; + + private _pendingCtxInitOnConnect = false; + + @property({ type: String, attribute: 'ctx-name', noAccessor: true }) + get ctxNameAttr(): string | undefined { + return this._ctxNameAttr; + } + + set ctxNameAttr(value: string | undefined) { + const normalizedValue = value ?? undefined; + const oldValue = this._ctxNameAttr; + if (oldValue === normalizedValue) { + return; + } + this._ctxNameAttr = normalizedValue; + this._handleCtxNameSourceChange(); + } + + @state() + _ctxNameFromContext: string | undefined; + + @state() + ctxName: string | undefined = this.effectiveCtxName; + + @state() + private isInitialized = false; + + protected override shouldUpdate(_changedProperties: PropertyValues): boolean { + if (!this.isInitialized) { + return false; + } + return super.shouldUpdate(_changedProperties); + } + + // biome-ignore lint/suspicious/noExplicitAny: mixin constructors must accept arbitrary arguments to satisfy Lit types + constructor(...args: any[]) { + super(...args); + + // Consume ctxName from parent context + this._ctxNameAttr = 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 _getSharedInitEntries(): Array<[string, unknown]> { + const entries = Object.entries(this.init$ || {}); + const sharedEntries: Array<[string, unknown]> = []; + const localKeys: string[] = []; + + for (const [key, value] of entries) { + if (key.startsWith('*')) { + sharedEntries.push([key, value]); + } else { + localKeys.push(key); + } + } + + if (localKeys.length > 0 && !this._warnedAboutLocalState) { + console.warn('SymbioteMixin: Local state entries are no longer supported and will be ignored:', localKeys); + this._warnedAboutLocalState = true; + } + + return sharedEntries; + } + + private _getSharedInitSchema(): Record { + return Object.fromEntries(this._getSharedInitEntries()); + } + + private _ensureSharedSchema(): void { + if (!Object.hasOwn(this, '_sharedSchema')) { + const sharedSchema = Object.fromEntries( + this._getSharedInitEntries().map(([key, value]) => [key.slice(1), value]), + ); + Object.defineProperty(this, '_sharedSchema', { + value: sharedSchema, + writable: true, + configurable: true, + }); + } + } + + private _getSharedSchemaRecord(): Record { + this._ensureSharedSchema(); + const sharedSchema = (this as { _sharedSchema?: Record })._sharedSchema; + return sharedSchema ?? {}; + } + + private _requireSharedKey(key: string): string { + if (!key.startsWith('*')) { + throw new Error( + `SymbioteMixin: Local state key "${key}" is no longer supported. Use shared keys prefixed with "*".`, + ); + } + return key.slice(1); + } + + 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 sharedSchema = this._getSharedSchemaRecord(); + const ctxName = this.effectiveCtxName; + + if (!ctxName) { + console.error('SymbioteMixin: ctx-name is required for components with shared properties (*)'); + return; + } + + if (!this._symbioteSharedPubSub) { + // Try to get existing context + this._symbioteSharedPubSub = PubSub.getCtx(ctxName, false); + + // If context doesn't exist, create it + if (!this._symbioteSharedPubSub) { + this._symbioteSharedPubSub = PubSub.registerCtx(sharedSchema, ctxName); + } + + for (const [key, defaultValue] of Object.entries(sharedSchema)) { + this._symbioteSharedPubSub.add(key, defaultValue, this.ctxOwner); + } + + this._applyPendingSharedAdds(); + } + } + + get sharedCtx(): PubSub> { + return this._requireSharedPubSub(); + } + + /** + * Proxy for getting/setting values in the shared Symbiote data store. + * Keys must start with '*' as local state support has been removed. + */ + get $(): SymbioteStateBag { + if (this.effectiveCtxName) { + this._initSharedContext(); + } + return new Proxy( + {}, + { + get: (_target, key: string | symbol) => { + if (typeof key !== 'string') { + return undefined; + } + const sharedKey = this._requireSharedKey(key); + return this._symbioteSharedPubSub?.read(sharedKey); + }, + set: (_target, key: string | symbol, value: unknown) => { + if (typeof key !== 'string') { + return true; + } + const sharedKey = this._requireSharedKey(key); + this._symbioteSharedPubSub?.pub(sharedKey, value); + return true; + }, + }, + ); + } + + sub(key: string, callback: (value: T) => void, init = true): () => void { + const sharedKey = this._requireSharedKey(key); + const subscription = this._requireSharedPubSub().sub(sharedKey, callback as (value: unknown) => void, init); + return subscription ? subscription.remove : () => {}; + } + + pub(key: string, value: unknown): void { + const sharedKey = this._requireSharedKey(key); + this._requireSharedPubSub().pub(sharedKey, value); + } + + set$(obj: SymbioteStateBag): void { + for (const [prop, value] of Object.entries(obj)) { + this.pub(prop, value); + } + } + + has(key: string): boolean { + const sharedKey = this._requireSharedKey(key); + return this._symbioteSharedPubSub?.has(sharedKey) ?? false; + } + + add(key: string, val: unknown, rewrite = false) { + const sharedKey = this._requireSharedKey(key); + const pubsub = this._getSharedPubSub(); + if (!pubsub) { + if (!rewrite && this._pendingSharedAdds.has(sharedKey)) { + return; + } + this._pendingSharedAdds.set(sharedKey, { value: val, rewrite }); + return; + } + this._pendingSharedAdds.delete(sharedKey); + pubsub.add(sharedKey, val, rewrite); + } + + add$(obj: SymbioteStateBag, rewrite = false) { + for (const [prop, value] of Object.entries(obj)) { + this.add(prop, value, rewrite); + } + } + + 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._getSharedInitSchema(); + + if (Object.keys(sharedSchema).length > 0) { + const pubsub = this._requireSharedPubSub(); + for (const [key, defaultValue] of Object.entries(sharedSchema)) { + const propKey = this._requireSharedKey(key); + + // For shared properties, check if value already exists in shared context + const existingValue = pubsub.read(propKey); + if (existingValue === undefined) { + pubsub.pub(propKey, defaultValue); + } + + // Set up two-way binding between Lit property and Symbiote data + this.sub( + key, + debounce(async () => { + 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(); + } + + override firstUpdated(changedProperties: Map) { + super.firstUpdated(changedProperties); + // Post-render tasks can go here if needed + } + + override updated(changedProperties: Map) { + super.updated(changedProperties); + + // Sync changed properties to Symbiote data store + const sharedSchema = this._getSharedInitSchema(); + + if (Object.keys(sharedSchema).length > 0) { + changedProperties.forEach((_oldValue, propName) => { + if (typeof propName !== 'string') { + return; + } + if (Object.hasOwn(sharedSchema, propName)) { + const sharedKey = this._requireSharedKey(propName); + const newValue = (this as Record)[propName]; + const pubsub = this._symbioteSharedPubSub; + if (pubsub && pubsub.read(sharedKey) !== newValue) { + pubsub.pub(sharedKey, newValue); + } + } + }); + } + } + + override disconnectedCallback() { + super.disconnectedCallback(); + if (this._symbioteFirstUpdated) { + this._needsReconnectInit = true; + } + // Clean up is handled automatically by PubSub + } + + initCallback() {} + } + + return SymbioteMixinClass as T & Constructor; +} 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; + } +} From 6a08b8286c142bed89cbb6b8eb3af88f8ae53daa Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:52:27 +0300 Subject: [PATCH 05/60] feat(lit): add LitBlock, LitActivityBlock, and LitUploaderBlock base classes - Add LitBlock as the base class for all Lit-based blocks - Add LitActivityBlock for activity-based UI components - Add LitUploaderBlock with file upload management capabilities - Add LitSolutionBlock for solution wrapper components - Add TestModeController for test mode handling --- src/lit/LitActivityBlock.ts | 214 +++++++++++++++ src/lit/LitBlock.ts | 291 ++++++++++++++++++++ src/lit/LitSolutionBlock.ts | 19 ++ src/lit/LitUploaderBlock.ts | 502 ++++++++++++++++++++++++++++++++++ src/lit/TestModeController.ts | 96 +++++++ 5 files changed, 1122 insertions(+) create mode 100644 src/lit/LitActivityBlock.ts create mode 100644 src/lit/LitBlock.ts create mode 100644 src/lit/LitSolutionBlock.ts create mode 100644 src/lit/LitUploaderBlock.ts create mode 100644 src/lit/TestModeController.ts diff --git a/src/lit/LitActivityBlock.ts b/src/lit/LitActivityBlock.ts new file mode 100644 index 000000000..44444c43c --- /dev/null +++ b/src/lit/LitActivityBlock.ts @@ -0,0 +1,214 @@ +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 { LitBlock } from './LitBlock'; + +const ACTIVE_ATTR = 'active'; +const ACTIVE_PROP = '___ACTIVITY_IS_ACTIVE___'; + +export type ActivityParamsMap = { + 'cloud-image-edit': CloudImageEditorActivityParams; + external: ExternalSourceActivityParams; +}; + +export class LitActivityBlock extends LitBlock { + protected historyTracked = false; + + // biome-ignore lint/correctness/noUnusedPrivateClassMembers: accessed via computed property symbol + private [ACTIVE_PROP]?: boolean; + + override init$ = activityBlockCtx(this); + + _debouncedHistoryFlush = debounce(this._historyFlush.bind(this), 10); + + private _deactivate(): void { + const actDesc = LitActivityBlock._activityCallbacks.get(this); + this[ACTIVE_PROP] = false; + this.removeAttribute(ACTIVE_ATTR); + actDesc?.deactivateCallback?.(); + } + + private _activate(): void { + const actDesc = LitActivityBlock._activityCallbacks.get(this); + this.$['*historyBack'] = this.historyBack.bind(this); + this[ACTIVE_PROP] = true; + this.setAttribute(ACTIVE_ATTR, ''); + actDesc?.activateCallback?.(); + + this._debouncedHistoryFlush(); + + this.emit(EventType.ACTIVITY_CHANGE, { + activity: this.activityType, + }); + } + + // must match visibility of base class + override initCallback(): void { + super.initCallback(); + + // TODO: rename activityType to activityId + if (this.activityType) { + if (!this.hasAttribute('activity')) { + this.setAttribute('activity', this.activityType); + } + this.sub('*currentActivity', (val: string | null) => { + try { + if (this.activityType !== val && this[ACTIVE_PROP]) { + this._deactivate(); + } else if (this.activityType === val && !this[ACTIVE_PROP]) { + this._activate(); + } + } catch (err) { + this.telemetryManager.sendEventError(err, `activity "${this.activityType}"`); + console.error(`Error in activity "${this.activityType}". `, err); + this.$['*currentActivity'] = this.$['*history'][this.$['*history'].length - 1] ?? null; + } + + if (!val) { + this.$['*history'] = []; + } + }); + } + } + + // biome-ignore lint/correctness/noUnusedPrivateClassMembers: invoked via the debounced history flush helper + private _historyFlush(): void { + let history = this.$['*history']; + if (history) { + if (history.length > 10) { + history = history.slice(history.length - 11, history.length - 1); + } + if (this.historyTracked && history[history.length - 1] !== this.activityType) { + history.push(this.activityType); + } + this.$['*history'] = history; + } + } + + private _isActivityRegistered(): boolean { + return !!this.activityType && LitActivityBlock._activityCallbacks.has(this); + } + + // biome-ignore lint/correctness/noUnusedPrivateClassMembers: accessed through registerActivity/unregisterActivity + private static _activityCallbacks: Map< + LitActivityBlock, + { + activateCallback?: (() => void) | undefined; + deactivateCallback?: (() => void) | undefined; + } + > = new Map(); + + // declare static activities to satisfy type references below + static activities: Readonly<{ + START_FROM: 'start-from'; + CAMERA: 'camera'; + DRAW: 'draw'; + UPLOAD_LIST: 'upload-list'; + URL: 'url'; + CLOUD_IMG_EDIT: 'cloud-image-edit'; + EXTERNAL: 'external'; + }>; + + get isActivityActive(): boolean { + return !!this[ACTIVE_PROP]; + } + + get couldOpenActivity(): boolean { + return true; + } + + /** TODO: remove name argument */ + registerActivity(_name: string, options: { onActivate?: () => void; onDeactivate?: () => void } = {}): void { + const { onActivate, onDeactivate } = options; + LitActivityBlock._activityCallbacks.set(this, { + activateCallback: onActivate, + deactivateCallback: onDeactivate, + }); + } + + unregisterActivity(): void { + if (this.isActivityActive) { + this._deactivate(); + } + LitActivityBlock._activityCallbacks.delete(this); + } + + override disconnectedCallback(): void { + super.disconnectedCallback(); + this._isActivityRegistered() && this.unregisterActivity(); + + const currentActivity = this.$['*currentActivity'] as string | null; + + if (this.blocksRegistry) { + const hasCurrentActivityInCtx = !![...this.blocksRegistry].find( + (block) => block instanceof LitActivityBlock && block.activityType === currentActivity, + ); + + if (!hasCurrentActivityInCtx) { + this.$['*currentActivity'] = null; + this.modalManager?.closeAll(); + } + } + } + + get activityKey(): string { + return this.ctxName + this.activityType; + } + + get activityParams(): ActivityParamsMap[keyof ActivityParamsMap] { + return this.$['*currentActivityParams'] as ActivityParamsMap[keyof ActivityParamsMap]; + } + + get initActivity(): string | null { + return (this.getCssData('--cfg-init-activity') as string | null) ?? null; + } + + get doneActivity(): string | null { + return (this.getCssData('--cfg-done-activity') as string | null) ?? null; + } + + historyBack(): void { + const history = this.$['*history'] as string[]; + + if (history) { + let nextActivity = history.pop(); + + while (nextActivity === this.activityType) { + nextActivity = history.pop(); + } + + let couldOpenActivity = !!nextActivity; + if (nextActivity) { + 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 ?? null; + this.$['*history'] = history; + + if (!nextActivity) { + this.modalManager?.closeAll(); + } + } + } +} + +LitActivityBlock.activities = Object.freeze({ + START_FROM: 'start-from', + CAMERA: 'camera', + DRAW: 'draw', + UPLOAD_LIST: 'upload-list', + URL: 'url', + CLOUD_IMG_EDIT: 'cloud-image-edit', + EXTERNAL: 'external', +}); + +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..161650383 --- /dev/null +++ b/src/lit/LitBlock.ts @@ -0,0 +1,291 @@ +import { PubSub } from '@symbiotejs/symbiote'; +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 { 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 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 { SymbioteMixin } from './SymbioteCompatMixin'; +import { TestModeController } from './TestModeController'; + +const LitBlockBase = RegisterableElementMixin(SymbioteMixin(CssDataMixin(LightDomMixin(LitElement)))); + +export class LitBlock extends LitBlockBase { + private __cfgProxy!: ConfigType; + + static styleAttrs: string[] = []; + + public activityType: ActivityType = null; + + init$ = blockCtx(); + + constructor() { + super(); + new TestModeController(this); + } + + 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}`); + } + + 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, + }); + } + + hasBlockInCtx(callback: (block: LitBlock) => boolean): boolean { + for (const block of this.blocksRegistry) { + if (callback(block)) { + return true; + } + } + return false; + } + + setOrAddState(prop: string, newVal: unknown): void { + this.add$( + { + [prop]: newVal, + }, + true, + ); + } + + override connectedCallback(): void { + const styleAttrs = (this.constructor as typeof LitBlock).styleAttrs; + styleAttrs.forEach((attr: string) => { + this.setAttribute(attr, ''); + }); + + super.connectedCallback(); + + WindowHeightTracker.registerClient(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.requestUpdate(); + }); + + 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 disconnectedCallback(): void { + super.disconnectedCallback(); + WindowHeightTracker.unregisterClient(this); + + const blocksRegistry = this.blocksRegistry; + blocksRegistry?.delete(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 { + PubSub.deleteCtx(this.ctxName); + + 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 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; + } + + subConfigValue(key: T, callback: (value: ConfigType[T]) => void): () => void { + const sharedKey = sharedConfigKey(key); + if (!this.has(sharedKey)) { + this.add(sharedKey, initialConfig[key]); + } + return 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); + } +} diff --git a/src/lit/LitSolutionBlock.ts b/src/lit/LitSolutionBlock.ts new file mode 100644 index 000000000..3fc960f01 --- /dev/null +++ b/src/lit/LitSolutionBlock.ts @@ -0,0 +1,19 @@ +import { html } from 'lit'; +import { unsafeHTML } from 'lit/directives/unsafe-html.js'; +import { solutionBlockCtx } from '../abstract/CTX'; +import svgIconsSprite from '../blocks/themes/uc-basic/svg-sprite'; +import { LitBlock } from './LitBlock'; + +export class LitSolutionBlock extends LitBlock { + static override styleAttrs = ['uc-wgt-common']; + override init$ = solutionBlockCtx(this); + + override initCallback(): void { + super.initCallback(); + this.a11y?.registerBlock(this); + } + + override render() { + return html`${unsafeHTML(svgIconsSprite)}`; + } +} diff --git a/src/lit/LitUploaderBlock.ts b/src/lit/LitUploaderBlock.ts new file mode 100644 index 000000000..cb0256af1 --- /dev/null +++ b/src/lit/LitUploaderBlock.ts @@ -0,0 +1,502 @@ +// @ts-check + +import { PubSub } 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 { type UploadEntryData, uploadEntrySchema } 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'; +import type { OutputCollectionState, OutputFileEntry } from '../types/index'; +import { createCdnUrl, createCdnUrlModifiers } from '../utils/cdn-utils'; +import { debounce } from '../utils/debounce'; +import { ExternalUploadSource, UploadSource } from '../utils/UploadSource'; +import { customUserAgent } from '../utils/userAgent'; +import { LitActivityBlock } from './LitActivityBlock'; + +export class LitUploaderBlock extends LitActivityBlock { + static extSrcList: Readonly; + static sourceTypes: Readonly; + protected couldBeCtxOwner = false; + + private isCtxOwner = false; + + private _unobserveCollection?: () => void; + private _unobserveCollectionProperties?: () => void; + + override init$ = uploaderBlockCtx(this); + + private get hasCtxOwner(): boolean { + return this.hasBlockInCtx((block) => { + if (block instanceof LitUploaderBlock) { + return block.isCtxOwner && block.isConnected && block !== this; + } + return false; + }); + } + + 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)); + } + + if (!this.has('*validationManager')) { + this.add('*validationManager', new ValidationManager(this)); + } + + 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']; + } + + get api(): UploaderPublicApi { + if (!this.has('*publicApi')) { + throw new Error('Unexpected error: UploaderPublicApi is not initialized'); + } + return this.$['*publicApi']; + } + + getAPI(): UploaderPublicApi { + return this.api; + } + + get uploadCollection(): TypedCollection { + if (!this.has('*uploadCollection')) { + throw new Error('Unexpected error: TypedCollection is not initialized'); + } + return this.$['*uploadCollection']; + } + + override destroyCtxCallback(): void { + this.uploadCollection.destroy(); + this.$['*uploadCollection'] = null; + + super.destroyCtxCallback(); + } + + override disconnectedCallback(): void { + super.disconnectedCallback(); + + if (this.isCtxOwner) { + this._unobserveUploadCollection(); + } + + this._flushOutputItems.cancel(); + } + + override connectedCallback(): void { + super.connectedCallback(); + + if (this.isCtxOwner) { + this._observeUploadCollection(); + } + } + + private _initCtxOwner(): void { + 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 { + this._unobserveUploadCollection(); + + this._unobserveCollection = this.uploadCollection.observeCollection(this._handleCollectionUpdate); + + this._unobserveCollectionProperties = this.uploadCollection.observeProperties( + this._handleCollectionPropertiesUpdate, + ); + } + + private _unobserveUploadCollection(): void { + this._unobserveCollectionProperties?.(); + this._unobserveCollection?.(); + + this._unobserveCollectionProperties = undefined; + this._unobserveCollection = undefined; + } + + // biome-ignore lint/correctness/noUnusedPrivateClassMembers: invoked within _flushOutputItems when grouping outputs + private async _createGroup(collectionState: OutputCollectionState): Promise { + const uploadClientOptions = await this.getUploadClientOptions(); + const uuidList = collectionState.allEntries.map((entry) => { + return entry.uuid + (entry.cdnUrlModifiers ? `/${entry.cdnUrlModifiers}` : ''); + }); + const abortController = new AbortController(); + const resp = await uploadFileGroup(uuidList, { + ...uploadClientOptions, + signal: abortController.signal, + }); + if (this.$['*collectionState'] !== collectionState) { + abortController.abort(); + return; + } + this.$['*groupInfo'] = resp; + const collectionStateWithGroup = this.api.getOutputCollectionState() as OutputCollectionState< + 'success', + 'has-group' + >; + this.emit(EventType.GROUP_CREATED, collectionStateWithGroup); + this.emit(EventType.CHANGE, () => this.api.getOutputCollectionState(), { + debounce: true, + }); + this.$['*collectionState'] = collectionStateWithGroup; + } + + private _flushOutputItems = debounce(async () => { + const data = this.getOutputData(); + if (data.length !== this.uploadCollection.size) { + return; + } + const collectionState = this.api.getOutputCollectionState(); + this.$['*collectionState'] = collectionState; + this.emit(EventType.CHANGE, () => this.api.getOutputCollectionState(), { + debounce: true, + }); + + if (this.cfg.groupOutput && collectionState.totalCount > 0 && collectionState.status === 'success') { + this._createGroup(collectionState); + } + }, 300); + + private _handleCollectionUpdate: TypedCollectionObserverHandler = ( + entries, + added, + removed, + ) => { + if (added.size || removed.size) { + this.$['*groupInfo'] = null; + } + + this.validationManager.runFileValidators( + 'add', + [...added].map((e) => e.uid), + ); + + for (const entry of added) { + if (!entry.getValue('silent')) { + this.emit(EventType.FILE_ADDED, this.api.getOutputItem(entry.uid)); + } + } + + this.validationManager.runCollectionValidators(); + + for (const entry of removed) { + (this.$['*uploadTrigger'] as Set).delete(entry.uid); + + this.validationManager.cleanupValidationForEntry(entry); + entry.getValue('abortController')?.abort(); + entry.setMultipleValues({ + isRemoved: true, + abortController: null, + isUploading: false, + uploadProgress: 0, + }); + const thumbUrl = entry?.getValue('thumbUrl'); + thumbUrl && URL.revokeObjectURL(thumbUrl); + this.emit(EventType.FILE_REMOVED, this.api.getOutputItem(entry.uid)); + } + + this.$['*uploadList'] = entries.map((uid) => { + return { uid }; + }); + + this._flushCommonUploadProgress(); + this._flushOutputItems(); + }; + + private _handleCollectionPropertiesUpdate = (changeMap: Record>): void => { + this._flushOutputItems(); + + const uploadCollection = this.uploadCollection; + const entriesToRunValidation = [ + ...new Set( + Object.entries(changeMap) + .filter(([key]) => ['uploadError', 'fileInfo', 'cdnUrl', 'cdnUrlModifiers'].includes(key)) + .flatMap(([, ids]) => [...ids]), + ), + ]; + + entriesToRunValidation.length > 0 && + setTimeout(() => { + // 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) && !!PubSub.getCtx(entryId).store.fileInfo, + ); + if (entriesToRunOnUpload.length > 0) { + this.validationManager.runFileValidators('upload', entriesToRunOnUpload); + } + this.validationManager.runFileValidators('change', entriesToRunValidation); + }); + + if (changeMap.uploadProgress) { + for (const entryId of changeMap.uploadProgress) { + const { isUploading, silent } = PubSub.getCtx(entryId).store; + if (isUploading && !silent) { + this.emit(EventType.FILE_UPLOAD_PROGRESS, this.api.getOutputItem(entryId)); + } + } + + this._flushCommonUploadProgress(); + } + if (changeMap.isUploading) { + for (const entryId of changeMap.isUploading) { + const { isUploading, silent } = PubSub.getCtx(entryId).store; + if (isUploading && !silent) { + this.emit(EventType.FILE_UPLOAD_START, this.api.getOutputItem(entryId)); + } + } + } + if (changeMap.fileInfo) { + for (const entryId of changeMap.fileInfo) { + const { fileInfo, silent } = PubSub.getCtx(entryId).store; + if (fileInfo && !silent) { + this.emit(EventType.FILE_UPLOAD_SUCCESS, this.api.getOutputItem(entryId)); + } + } + if (this.cfg.cropPreset) { + this.setInitialCrop(); + } + + if (this.cfg.cloudImageEditorAutoOpen) { + this.openCloudImageEditor(); + } + } + if (changeMap.errors) { + this.validationManager.runCollectionValidators(); + + for (const entryId of changeMap.errors) { + const { errors } = PubSub.getCtx(entryId).store; + if (errors.length > 0) { + this.emit(EventType.FILE_UPLOAD_FAILED, this.api.getOutputItem(entryId)); + this.emit( + EventType.COMMON_UPLOAD_FAILED, + () => this.api.getOutputCollectionState() as OutputCollectionState<'failed'>, + { debounce: true }, + ); + } + } + const loadedItems = uploadCollection.findItems((entry) => { + return !!entry.getValue('fileInfo'); + }); + const errorItems = uploadCollection.findItems((entry) => { + return entry.getValue('errors').length > 0; + }); + if ( + uploadCollection.size > 0 && + errorItems.length === 0 && + uploadCollection.size === loadedItems.length && + this.$['*collectionErrors'].length === 0 + ) { + this.emit( + EventType.COMMON_UPLOAD_SUCCESS, + this.api.getOutputCollectionState() as OutputCollectionState<'success'>, + ); + } + } + if (changeMap.cdnUrl) { + const uids = [...changeMap.cdnUrl].filter((uid) => { + return !!this.uploadCollection.read(uid)?.getValue('cdnUrl'); + }); + uids.forEach((uid) => { + this.emit(EventType.FILE_URL_CHANGED, this.api.getOutputItem(uid)); + }); + + this.$['*groupInfo'] = null; + } + }; + + private _flushCommonUploadProgress = (): void => { + let commonProgress = 0; + const uploadTrigger: Set = this.$['*uploadTrigger']; + const items = [...uploadTrigger].filter((id) => !!this.uploadCollection.read(id)); + items.forEach((id) => { + const uploadProgress = this.uploadCollection.readProp(id, 'uploadProgress'); + if (typeof uploadProgress === 'number') { + commonProgress += uploadProgress; + } + }); + const progress = items.length ? Math.round(commonProgress / items.length) : 0; + + if (this.$['*commonProgress'] === progress) { + return; + } + + this.$['*commonProgress'] = progress; + this.emit( + EventType.COMMON_UPLOAD_PROGRESS, + this.api.getOutputCollectionState() as OutputCollectionState<'uploading'>, + ); + }; + + openCloudImageEditor(): void { + const [entry] = this.uploadCollection + .findItems((entry) => !!entry.getValue('fileInfo') && entry.getValue('isImage')) + .map((id) => this.uploadCollection.read(id)); + + if ( + entry && + this.uploadCollection.size === 1 && + this.cfg.useCloudImageEditor && + this.hasBlockInCtx((block) => block.activityType === LitActivityBlock.activities.CLOUD_IMG_EDIT) + ) { + this.$['*currentActivityParams'] = { + internalId: entry.uid, + }; + this.$['*currentActivity'] = LitActivityBlock.activities.CLOUD_IMG_EDIT; + this.modalManager?.open(LitActivityBlock.activities.CLOUD_IMG_EDIT); + } + } + + private setInitialCrop(): void { + const cropPreset = parseCropPreset(this.cfg.cropPreset); + if (cropPreset) { + const [aspectRatioPreset] = cropPreset; + + const entries = this.uploadCollection + .findItems( + (entry) => + !!entry.getValue('fileInfo') && + entry.getValue('isImage') && + !entry.getValue('cdnUrlModifiers')?.includes('/crop/'), + ) + .map((id) => this.uploadCollection.read(id)) + .filter(Boolean); + + for (const entry of entries) { + const fileInfo = entry.getValue('fileInfo'); + if (!fileInfo || !fileInfo.imageInfo) { + console.warn('Failed to get image info for entry', entry.uid); + continue; + } + const { width, height } = fileInfo.imageInfo; + const expectedAspectRatio = + typeof aspectRatioPreset?.width === 'number' && + typeof aspectRatioPreset?.height === 'number' && + aspectRatioPreset.width > 0 && + aspectRatioPreset.height > 0 + ? aspectRatioPreset.width / aspectRatioPreset.height + : 1; + + const crop = calculateMaxCenteredCropFrame(width, height, expectedAspectRatio); + const cdnUrlModifiers = createCdnUrlModifiers( + `crop/${crop.width}x${crop.height}/${crop.x},${crop.y}`, + 'preview', + ); + const cdnUrl = entry.getValue('cdnUrl'); + if (!cdnUrl) { + console.warn('Failed to get cdnUrl for entry', entry.uid); + continue; + } + entry.setMultipleValues({ + cdnUrlModifiers, + cdnUrl: createCdnUrl(cdnUrl, cdnUrlModifiers), + }); + if ( + this.uploadCollection.size === 1 && + this.cfg.useCloudImageEditor && + this.hasBlockInCtx((block) => block.activityType === LitActivityBlock.activities.CLOUD_IMG_EDIT) + ) { + this.$['*currentActivityParams'] = { + internalId: entry.uid, + }; + this.$['*currentActivity'] = LitActivityBlock.activities.CLOUD_IMG_EDIT; + this.modalManager?.open(LitActivityBlock.activities.CLOUD_IMG_EDIT); + } + } + } + } + + protected async getMetadataFor(entryId: string) { + const configValue = this.cfg.metadata || undefined; + if (typeof configValue === 'function') { + const outputFileEntry = this.api.getOutputItem(entryId); + const metadata = await configValue(outputFileEntry); + return metadata; + } + return configValue; + } + + protected async getUploadClientOptions(): Promise { + const secureUploadsManager: SecureUploadsManager = this.$['*secureUploadsManager']; + const secureToken = await secureUploadsManager.getSecureToken().catch(() => null); + + const options = { + store: this.cfg.store, + publicKey: this.cfg.pubkey, + baseCDN: this.cfg.cdnCname, + baseURL: this.cfg.baseUrl, + userAgent: customUserAgent, + integration: this.cfg.userAgentIntegration, + secureSignature: secureToken?.secureSignature, + secureExpire: secureToken?.secureExpire, + retryThrottledRequestMaxTimes: this.cfg.retryThrottledRequestMaxTimes, + retryNetworkErrorMaxTimes: this.cfg.retryNetworkErrorMaxTimes, + multipartMinFileSize: this.cfg.multipartMinFileSize, + multipartChunkSize: this.cfg.multipartChunkSize, + maxConcurrentRequests: this.cfg.multipartMaxConcurrentRequests, + multipartMaxAttempts: this.cfg.multipartMaxAttempts, + checkForUrlDuplicates: !!this.cfg.checkForUrlDuplicates, + saveUrlForRecurrentUploads: !!this.cfg.saveUrlForRecurrentUploads, + }; + + return options; + } + + getOutputData(): OutputFileEntry[] { + const entriesIds = this.uploadCollection.items(); + const data = entriesIds.map((itemId) => this.api.getOutputItem(itemId)); + return data; + } +} + +/** + * @deprecated Use list sources ExternalUploadSource from from blocks/utils/UploadSource.js + */ +LitUploaderBlock.extSrcList = Object.freeze({ + ...ExternalUploadSource, +}); + +/** + * @deprecated Use list sources UploadSource from from blocks/utils/UploadSource.js + */ +LitUploaderBlock.sourceTypes = Object.freeze({ + ...UploadSource, +}); diff --git a/src/lit/TestModeController.ts b/src/lit/TestModeController.ts new file mode 100644 index 000000000..52126bcb9 --- /dev/null +++ b/src/lit/TestModeController.ts @@ -0,0 +1,96 @@ +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; + + constructor(private host: TestModeHost) { + this.host.addController(this); + } + + hostDisconnected(): void { + this.unsubscribe?.(); + this.unsubscribe = undefined; + this.trackedElements.clear(); + this.originalValues.clear(); + } + + 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'); + } + } + } +} From 3a1de48225f1d66a270938253deea45ebbcb9285 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:53:04 +0300 Subject: [PATCH 06/60] chore: remove deprecated Block.ts and old processors - Remove Block.ts (replaced by LitBlock) - Remove ActivityBlock.ts (replaced by LitActivityBlock) - Remove UploaderBlock.ts (replaced by LitUploaderBlock) - Remove SolutionBlock.ts (replaced by LitSolutionBlock) - Remove l10nProcessor.ts (l10n now handled in Lit templates) - Remove testModeProcessor.ts (replaced by TestModeController) - Remove bindCompatibilityFallbackProcessor.ts - Remove Range component (unused) --- src/abstract/ActivityBlock.ts | 208 -------- src/abstract/Block.ts | 357 ------------- src/abstract/SolutionBlock.ts | 24 - src/abstract/UploaderBlock.ts | 505 ------------------ .../bindCompatibilityFallbackProcessor.ts | 13 - src/abstract/l10nProcessor.ts | 83 --- src/abstract/testModeProcessor.ts | 34 -- src/blocks/Range/Range.ts | 56 -- src/blocks/Range/range.css | 67 --- 9 files changed, 1347 deletions(-) delete mode 100644 src/abstract/ActivityBlock.ts delete mode 100644 src/abstract/Block.ts delete mode 100644 src/abstract/SolutionBlock.ts delete mode 100644 src/abstract/UploaderBlock.ts delete mode 100644 src/abstract/bindCompatibilityFallbackProcessor.ts delete mode 100644 src/abstract/l10nProcessor.ts delete mode 100644 src/abstract/testModeProcessor.ts delete mode 100644 src/blocks/Range/Range.ts delete mode 100644 src/blocks/Range/range.css diff --git a/src/abstract/ActivityBlock.ts b/src/abstract/ActivityBlock.ts deleted file mode 100644 index 6b73532fb..000000000 --- a/src/abstract/ActivityBlock.ts +++ /dev/null @@ -1,208 +0,0 @@ -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'; - -const ACTIVE_ATTR = 'active'; -const ACTIVE_PROP = '___ACTIVITY_IS_ACTIVE___'; - -export type ActivityParamsMap = { - 'cloud-image-edit': CloudImageEditorActivityParams; - external: ExternalSourceActivityParams; -}; - -export class ActivityBlock extends Block { - protected historyTracked = false; - - private [ACTIVE_PROP]?: boolean; - - override init$ = activityBlockCtx(this); - - _debouncedHistoryFlush = debounce(this._historyFlush.bind(this), 10); - - private _deactivate(): void { - const actDesc = ActivityBlock._activityCallbacks.get(this); - this[ACTIVE_PROP] = false; - this.removeAttribute(ACTIVE_ATTR); - actDesc?.deactivateCallback?.(); - } - - private _activate(): void { - const actDesc = ActivityBlock._activityCallbacks.get(this); - this.$['*historyBack'] = this.historyBack.bind(this); - this[ACTIVE_PROP] = true; - this.setAttribute(ACTIVE_ATTR, ''); - actDesc?.activateCallback?.(); - - this._debouncedHistoryFlush(); - - this.emit(EventType.ACTIVITY_CHANGE, { - activity: this.activityType, - }); - } - - // must match visibility of base class - override initCallback(): void { - super.initCallback(); - - // TODO: rename activityType to activityId - if (this.activityType) { - if (!this.hasAttribute('activity')) { - this.setAttribute('activity', this.activityType); - } - this.sub('*currentActivity', (val: string | null) => { - try { - if (this.activityType !== val && this[ACTIVE_PROP]) { - this._deactivate(); - } else if (this.activityType === val && !this[ACTIVE_PROP]) { - this._activate(); - } - } catch (err) { - this.telemetryManager.sendEventError(err, `activity "${this.activityType}"`); - console.error(`Error in activity "${this.activityType}". `, err); - this.$['*currentActivity'] = this.$['*history'][this.$['*history'].length - 1] ?? null; - } - - if (!val) { - this.$['*history'] = []; - } - }); - } - } - - private _historyFlush(): void { - let history = this.$['*history']; - if (history) { - if (history.length > 10) { - history = history.slice(history.length - 11, history.length - 1); - } - if (this.historyTracked && history[history.length - 1] !== this.activityType) { - history.push(this.activityType); - } - this.$['*history'] = history; - } - } - - private _isActivityRegistered(): boolean { - return !!this.activityType && ActivityBlock._activityCallbacks.has(this); - } - - private static _activityCallbacks: Map< - ActivityBlock, - { - activateCallback?: (() => void) | undefined; - deactivateCallback?: (() => void) | undefined; - } - > = new Map(); - - // declare static activities to satisfy type references below - static activities: Readonly<{ - START_FROM: 'start-from'; - CAMERA: 'camera'; - DRAW: 'draw'; - UPLOAD_LIST: 'upload-list'; - URL: 'url'; - CLOUD_IMG_EDIT: 'cloud-image-edit'; - EXTERNAL: 'external'; - }>; - - get isActivityActive(): boolean { - return !!this[ACTIVE_PROP]; - } - - get couldOpenActivity(): boolean { - return true; - } - - /** TODO: remove name argument */ - registerActivity(_name: string, options: { onActivate?: () => void; onDeactivate?: () => void } = {}): void { - const { onActivate, onDeactivate } = options; - ActivityBlock._activityCallbacks.set(this, { - activateCallback: onActivate, - deactivateCallback: onDeactivate, - }); - } - - unregisterActivity(): void { - if (this.isActivityActive) { - this._deactivate(); - } - ActivityBlock._activityCallbacks.delete(this); - } - - override destroyCallback(): void { - super.destroyCallback(); - this._isActivityRegistered() && this.unregisterActivity(); - - const currentActivity = this.$['*currentActivity'] as string | null; - - const hasCurrentActivityInCtx = !![...this.blocksRegistry].find( - (block) => block instanceof ActivityBlock && block.activityType === currentActivity, - ); - - if (!hasCurrentActivityInCtx) { - this.$['*currentActivity'] = null; - this.modalManager?.closeAll(); - } - } - - get activityKey(): string { - return this.ctxName + this.activityType; - } - - get activityParams(): ActivityParamsMap[keyof ActivityParamsMap] { - return this.$['*currentActivityParams'] as ActivityParamsMap[keyof ActivityParamsMap]; - } - - get initActivity(): string { - return this.getCssData('--cfg-init-activity'); - } - - get doneActivity(): string { - return this.getCssData('--cfg-done-activity'); - } - - historyBack(): void { - const history = this.$['*history'] as string[]; - - if (history) { - let nextActivity = history.pop(); - - while (nextActivity === this.activityType) { - nextActivity = history.pop(); - } - - let couldOpenActivity = !!nextActivity; - if (nextActivity) { - const nextActivityBlock = [...this.blocksRegistry].find((block) => block.activityType === nextActivity); - couldOpenActivity = (nextActivityBlock as ActivityBlock | undefined)?.couldOpenActivity ?? false; - } - - nextActivity = couldOpenActivity ? nextActivity : undefined; - - if (nextActivity) this.modalManager?.open(nextActivity); - - this.$['*currentActivity'] = nextActivity; - this.$['*history'] = history; - - if (!nextActivity) { - this.modalManager?.closeAll(); - } - } - } -} - -ActivityBlock.activities = Object.freeze({ - START_FROM: 'start-from', - CAMERA: 'camera', - DRAW: 'draw', - UPLOAD_LIST: 'upload-list', - URL: 'url', - CLOUD_IMG_EDIT: 'cloud-image-edit', - EXTERNAL: 'external', -}); - -export type RegisteredActivityType = (typeof ActivityBlock)['activities'][keyof (typeof ActivityBlock)['activities']]; -export type ActivityType = RegisteredActivityType | (string & {}) | null; diff --git a/src/abstract/Block.ts b/src/abstract/Block.ts deleted file mode 100644 index 61a6e6012..000000000 --- a/src/abstract/Block.ts +++ /dev/null @@ -1,357 +0,0 @@ -import { DICT, PubSub, Symbiote } from '@symbiotejs/symbiote'; -import { slotProcessor } from '@symbiotejs/symbiote/core/slotProcessor.js'; -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 { bindCompatibilityFallbackProcessor } from './bindCompatibilityFallbackProcessor'; -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-'; -const CTX_NAME_FALLBACK_ATTR = 'ctx-name'; - -export class Block extends Symbiote { - 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(bindCompatibilityFallbackProcessor); - this.addTemplateProcessor(l10nProcessor as (fr: DocumentFragment | Symbiote, fnCtx: Symbiote) => void); - this.addTemplateProcessor( - testModeProcessor as (fr: DocumentFragment | Symbiote, fnCtx: Symbiote) => void, - ); - this.addTemplateProcessor(slotProcessor as (fr: DocumentFragment | Symbiote, fnCtx: Symbiote) => 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) { - Promise.race([ - waitForAttribute({ - element: this, - attribute: DICT.CTX_NAME_ATTR, - }), - waitForAttribute({ - element: this, - attribute: CTX_NAME_FALLBACK_ATTR, - }), - ]).then((result) => { - if (result.success) { - if (result.attribute === CTX_NAME_FALLBACK_ATTR) { - const ctxName = result.value; - this.style.setProperty(DICT.CSS_CTX_PROP, `'${ctxName}'`); - } - // async wait for ctx attribute to be set, needed for Angular because it sets attributes after mount - // TODO: should be moved to the symbiote core - super.connectedCallback(); - } else { - console.error( - `Attribute "${DICT.CTX_NAME_ATTR}" or "${CTX_NAME_FALLBACK_ATTR}" 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 - PubSub.deleteCtx(this.localCtx.uid); - - 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 { - PubSub.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 { Symbiote }; diff --git a/src/abstract/SolutionBlock.ts b/src/abstract/SolutionBlock.ts deleted file mode 100644 index bdf4b38af..000000000 --- a/src/abstract/SolutionBlock.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { html } from '@symbiotejs/symbiote'; -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/UploaderBlock.ts b/src/abstract/UploaderBlock.ts deleted file mode 100644 index 324992e94..000000000 --- a/src/abstract/UploaderBlock.ts +++ /dev/null @@ -1,505 +0,0 @@ -// @ts-check - -import { PubSub } from '@symbiotejs/symbiote'; -import { type FileFromOptions, uploadFileGroup } from '@uploadcare/upload-client'; -import { calculateMaxCenteredCropFrame } from '../blocks/CloudImageEditor/src/crop-utils'; -import { parseCropPreset } from '../blocks/CloudImageEditor/src/lib/parseCropPreset'; -import { EventType } from '../blocks/UploadCtxProvider/EventEmitter'; -import type { OutputCollectionState, OutputFileEntry } from '../types/index'; -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; - protected couldBeCtxOwner = false; - - private isCtxOwner = false; - - private _unobserveCollection?: () => void; - private _unobserveCollectionProperties?: () => void; - - override init$ = uploaderBlockCtx(this); - - private get hasCtxOwner(): boolean { - return this.hasBlockInCtx((block) => { - if (block instanceof UploaderBlock) { - return block.isCtxOwner && block.isConnected && block !== this; - } - return false; - }); - } - - 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)); - } - - if (!this.has('*validationManager')) { - this.add('*validationManager', new ValidationManager(this)); - } - - 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']; - } - - get api(): UploaderPublicApi { - if (!this.has('*publicApi')) { - throw new Error('Unexpected error: UploaderPublicApi is not initialized'); - } - return this.$['*publicApi']; - } - - getAPI(): UploaderPublicApi { - return this.api; - } - - get uploadCollection(): TypedCollection { - if (!this.has('*uploadCollection')) { - throw new Error('Unexpected error: TypedCollection is not initialized'); - } - return this.$['*uploadCollection']; - } - - override destroyCtxCallback(): void { - this.uploadCollection.destroy(); - this.$['*uploadCollection'] = null; - - super.destroyCtxCallback(); - } - - override disconnectedCallback(): void { - super.disconnectedCallback(); - - if (this.isCtxOwner) { - this._unobserveUploadCollection(); - } - } - - override connectedCallback(): void { - super.connectedCallback(); - - if (this.isCtxOwner) { - this._observeUploadCollection(); - } - } - - override destroyCallback(): void { - super.destroyCallback(); - - this._flushOutputItems.cancel(); - } - - private _initCtxOwner(): void { - 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 { - this._unobserveUploadCollection(); - - this._unobserveCollection = this.uploadCollection.observeCollection(this._handleCollectionUpdate); - - this._unobserveCollectionProperties = this.uploadCollection.observeProperties( - this._handleCollectionPropertiesUpdate, - ); - } - - private _unobserveUploadCollection(): void { - this._unobserveCollectionProperties?.(); - this._unobserveCollection?.(); - - this._unobserveCollectionProperties = undefined; - this._unobserveCollection = undefined; - } - - private async _createGroup(collectionState: OutputCollectionState): Promise { - const uploadClientOptions = await this.getUploadClientOptions(); - const uuidList = collectionState.allEntries.map((entry) => { - return entry.uuid + (entry.cdnUrlModifiers ? `/${entry.cdnUrlModifiers}` : ''); - }); - const abortController = new AbortController(); - const resp = await uploadFileGroup(uuidList, { - ...uploadClientOptions, - signal: abortController.signal, - }); - if (this.$['*collectionState'] !== collectionState) { - abortController.abort(); - return; - } - this.$['*groupInfo'] = resp; - const collectionStateWithGroup = this.api.getOutputCollectionState() as OutputCollectionState< - 'success', - 'has-group' - >; - this.emit(EventType.GROUP_CREATED, collectionStateWithGroup); - this.emit(EventType.CHANGE, () => this.api.getOutputCollectionState(), { - debounce: true, - }); - this.$['*collectionState'] = collectionStateWithGroup; - } - - private _flushOutputItems = debounce(async () => { - const data = this.getOutputData(); - if (data.length !== this.uploadCollection.size) { - return; - } - const collectionState = this.api.getOutputCollectionState(); - this.$['*collectionState'] = collectionState; - this.emit(EventType.CHANGE, () => this.api.getOutputCollectionState(), { - debounce: true, - }); - - if (this.cfg.groupOutput && collectionState.totalCount > 0 && collectionState.status === 'success') { - this._createGroup(collectionState); - } - }, 300); - - private _handleCollectionUpdate: TypedCollectionObserverHandler = ( - entries, - added, - removed, - ) => { - if (added.size || removed.size) { - this.$['*groupInfo'] = null; - } - - this.validationManager.runFileValidators( - 'add', - [...added].map((e) => e.uid), - ); - - for (const entry of added) { - if (!entry.getValue('silent')) { - this.emit(EventType.FILE_ADDED, this.api.getOutputItem(entry.uid)); - } - } - - this.validationManager.runCollectionValidators(); - - for (const entry of removed) { - (this.$['*uploadTrigger'] as Set).delete(entry.uid); - - this.validationManager.cleanupValidationForEntry(entry); - entry.getValue('abortController')?.abort(); - entry.setMultipleValues({ - isRemoved: true, - abortController: null, - isUploading: false, - uploadProgress: 0, - }); - const thumbUrl = entry?.getValue('thumbUrl'); - thumbUrl && URL.revokeObjectURL(thumbUrl); - this.emit(EventType.FILE_REMOVED, this.api.getOutputItem(entry.uid)); - } - - this.$['*uploadList'] = entries.map((uid) => { - return { uid }; - }); - - this._flushCommonUploadProgress(); - this._flushOutputItems(); - }; - - private _handleCollectionPropertiesUpdate = (changeMap: Record>): void => { - this._flushOutputItems(); - - const uploadCollection = this.uploadCollection; - const entriesToRunValidation = [ - ...new Set( - Object.entries(changeMap) - .filter(([key]) => ['uploadError', 'fileInfo', 'cdnUrl', 'cdnUrlModifiers'].includes(key)) - .flatMap(([, ids]) => [...ids]), - ), - ]; - - entriesToRunValidation.length > 0 && - setTimeout(() => { - // 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) && !!PubSub.getCtx(entryId).store.fileInfo, - ); - if (entriesToRunOnUpload.length > 0) { - this.validationManager.runFileValidators('upload', entriesToRunOnUpload); - } - this.validationManager.runFileValidators('change', entriesToRunValidation); - }); - - if (changeMap.uploadProgress) { - for (const entryId of changeMap.uploadProgress) { - const { isUploading, silent } = PubSub.getCtx(entryId).store; - if (isUploading && !silent) { - this.emit(EventType.FILE_UPLOAD_PROGRESS, this.api.getOutputItem(entryId)); - } - } - - this._flushCommonUploadProgress(); - } - if (changeMap.isUploading) { - for (const entryId of changeMap.isUploading) { - const { isUploading, silent } = PubSub.getCtx(entryId).store; - if (isUploading && !silent) { - this.emit(EventType.FILE_UPLOAD_START, this.api.getOutputItem(entryId)); - } - } - } - if (changeMap.fileInfo) { - for (const entryId of changeMap.fileInfo) { - const { fileInfo, silent } = PubSub.getCtx(entryId).store; - if (fileInfo && !silent) { - this.emit(EventType.FILE_UPLOAD_SUCCESS, this.api.getOutputItem(entryId)); - } - } - if (this.cfg.cropPreset) { - this.setInitialCrop(); - } - - if (this.cfg.cloudImageEditorAutoOpen) { - this.openCloudImageEditor(); - } - } - if (changeMap.errors) { - this.validationManager.runCollectionValidators(); - - for (const entryId of changeMap.errors) { - const { errors } = PubSub.getCtx(entryId).store; - if (errors.length > 0) { - this.emit(EventType.FILE_UPLOAD_FAILED, this.api.getOutputItem(entryId)); - this.emit( - EventType.COMMON_UPLOAD_FAILED, - () => this.api.getOutputCollectionState() as OutputCollectionState<'failed'>, - { debounce: true }, - ); - } - } - const loadedItems = uploadCollection.findItems((entry) => { - return !!entry.getValue('fileInfo'); - }); - const errorItems = uploadCollection.findItems((entry) => { - return entry.getValue('errors').length > 0; - }); - if ( - uploadCollection.size > 0 && - errorItems.length === 0 && - uploadCollection.size === loadedItems.length && - this.$['*collectionErrors'].length === 0 - ) { - this.emit( - EventType.COMMON_UPLOAD_SUCCESS, - this.api.getOutputCollectionState() as OutputCollectionState<'success'>, - ); - } - } - if (changeMap.cdnUrl) { - const uids = [...changeMap.cdnUrl].filter((uid) => { - return !!this.uploadCollection.read(uid)?.getValue('cdnUrl'); - }); - uids.forEach((uid) => { - this.emit(EventType.FILE_URL_CHANGED, this.api.getOutputItem(uid)); - }); - - this.$['*groupInfo'] = null; - } - }; - - private _flushCommonUploadProgress = (): void => { - let commonProgress = 0; - const uploadTrigger: Set = this.$['*uploadTrigger']; - const items = [...uploadTrigger].filter((id) => !!this.uploadCollection.read(id)); - items.forEach((id) => { - const uploadProgress = this.uploadCollection.readProp(id, 'uploadProgress'); - if (typeof uploadProgress === 'number') { - commonProgress += uploadProgress; - } - }); - const progress = items.length ? Math.round(commonProgress / items.length) : 0; - - if (this.$['*commonProgress'] === progress) { - return; - } - - this.$['*commonProgress'] = progress; - this.emit( - EventType.COMMON_UPLOAD_PROGRESS, - this.api.getOutputCollectionState() as OutputCollectionState<'uploading'>, - ); - }; - - openCloudImageEditor(): void { - const [entry] = this.uploadCollection - .findItems((entry) => !!entry.getValue('fileInfo') && entry.getValue('isImage')) - .map((id) => this.uploadCollection.read(id)); - - if ( - entry && - this.uploadCollection.size === 1 && - this.cfg.useCloudImageEditor && - this.hasBlockInCtx((block) => block.activityType === ActivityBlock.activities.CLOUD_IMG_EDIT) - ) { - this.$['*currentActivityParams'] = { - internalId: entry.uid, - }; - this.$['*currentActivity'] = ActivityBlock.activities.CLOUD_IMG_EDIT; - this.modalManager?.open(ActivityBlock.activities.CLOUD_IMG_EDIT); - } - } - - private setInitialCrop(): void { - const cropPreset = parseCropPreset(this.cfg.cropPreset); - if (cropPreset) { - const [aspectRatioPreset] = cropPreset; - - const entries = this.uploadCollection - .findItems( - (entry) => - !!entry.getValue('fileInfo') && - entry.getValue('isImage') && - !entry.getValue('cdnUrlModifiers')?.includes('/crop/'), - ) - .map((id) => this.uploadCollection.read(id)) - .filter(Boolean); - - for (const entry of entries) { - const fileInfo = entry.getValue('fileInfo'); - if (!fileInfo || !fileInfo.imageInfo) { - console.warn('Failed to get image info for entry', entry.uid); - continue; - } - const { width, height } = fileInfo.imageInfo; - const expectedAspectRatio = - typeof aspectRatioPreset?.width === 'number' && - typeof aspectRatioPreset?.height === 'number' && - aspectRatioPreset.width > 0 && - aspectRatioPreset.height > 0 - ? aspectRatioPreset.width / aspectRatioPreset.height - : 1; - - const crop = calculateMaxCenteredCropFrame(width, height, expectedAspectRatio); - const cdnUrlModifiers = createCdnUrlModifiers( - `crop/${crop.width}x${crop.height}/${crop.x},${crop.y}`, - 'preview', - ); - const cdnUrl = entry.getValue('cdnUrl'); - if (!cdnUrl) { - console.warn('Failed to get cdnUrl for entry', entry.uid); - continue; - } - entry.setMultipleValues({ - cdnUrlModifiers, - cdnUrl: createCdnUrl(cdnUrl, cdnUrlModifiers), - }); - if ( - this.uploadCollection.size === 1 && - this.cfg.useCloudImageEditor && - this.hasBlockInCtx((block) => block.activityType === ActivityBlock.activities.CLOUD_IMG_EDIT) - ) { - this.$['*currentActivityParams'] = { - internalId: entry.uid, - }; - this.$['*currentActivity'] = ActivityBlock.activities.CLOUD_IMG_EDIT; - this.modalManager?.open(ActivityBlock.activities.CLOUD_IMG_EDIT); - } - } - } - } - - protected async getMetadataFor(entryId: string) { - const configValue = this.cfg.metadata || undefined; - if (typeof configValue === 'function') { - const outputFileEntry = this.api.getOutputItem(entryId); - const metadata = await configValue(outputFileEntry); - return metadata; - } - return configValue; - } - - protected async getUploadClientOptions(): Promise { - const secureUploadsManager: SecureUploadsManager = this.$['*secureUploadsManager']; - const secureToken = await secureUploadsManager.getSecureToken().catch(() => null); - - const options = { - store: this.cfg.store, - publicKey: this.cfg.pubkey, - baseCDN: this.cfg.cdnCname, - baseURL: this.cfg.baseUrl, - userAgent: customUserAgent, - integration: this.cfg.userAgentIntegration, - secureSignature: secureToken?.secureSignature, - secureExpire: secureToken?.secureExpire, - retryThrottledRequestMaxTimes: this.cfg.retryThrottledRequestMaxTimes, - retryNetworkErrorMaxTimes: this.cfg.retryNetworkErrorMaxTimes, - multipartMinFileSize: this.cfg.multipartMinFileSize, - multipartChunkSize: this.cfg.multipartChunkSize, - maxConcurrentRequests: this.cfg.multipartMaxConcurrentRequests, - multipartMaxAttempts: this.cfg.multipartMaxAttempts, - checkForUrlDuplicates: !!this.cfg.checkForUrlDuplicates, - saveUrlForRecurrentUploads: !!this.cfg.saveUrlForRecurrentUploads, - }; - - return options; - } - - getOutputData(): OutputFileEntry[] { - const entriesIds = this.uploadCollection.items(); - const data = entriesIds.map((itemId) => this.api.getOutputItem(itemId)); - return data; - } -} - -/** - * @deprecated Use list sources ExternalUploadSource from from blocks/utils/UploadSource.js - */ -UploaderBlock.extSrcList = Object.freeze({ - ...ExternalUploadSource, -}); - -/** - * @deprecated Use list sources UploadSource from from blocks/utils/UploadSource.js - */ -UploaderBlock.sourceTypes = Object.freeze({ - ...UploadSource, -}); diff --git a/src/abstract/bindCompatibilityFallbackProcessor.ts b/src/abstract/bindCompatibilityFallbackProcessor.ts deleted file mode 100644 index 3efd7bb3d..000000000 --- a/src/abstract/bindCompatibilityFallbackProcessor.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DICT, type Symbiote } from '@symbiotejs/symbiote'; - -const FALLBACK_BIND_ATTR = 'set'; - -export function bindCompatibilityFallbackProcessor(fr: DocumentFragment | Symbiote): void { - [...fr.querySelectorAll(`[${FALLBACK_BIND_ATTR}]`)].forEach((el) => { - const setAttrValue = el.getAttribute(FALLBACK_BIND_ATTR); - if (setAttrValue) { - el.removeAttribute(FALLBACK_BIND_ATTR); - el.setAttribute(DICT.BIND_ATTR, setAttrValue); - } - }); -} diff --git a/src/abstract/l10nProcessor.ts b/src/abstract/l10nProcessor.ts deleted file mode 100644 index 8adb7ba63..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.sharedCtx.has(nodeStateKey)) { - fnCtx.sharedCtx.add(nodeStateKey, mappedKey); - } - // Subscribe on the global l10n key change - const sub = fnCtx.sharedCtx.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/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/blocks/Range/Range.ts b/src/blocks/Range/Range.ts deleted file mode 100644 index 4f4520dbe..000000000 --- a/src/blocks/Range/Range.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { html, Symbiote } from '@symbiotejs/symbiote'; - -interface RangeInitState { - cssLeft: string; - barActive: boolean; - value: number; - onChange: (e: Event) => void; -} - -export class Range extends Symbiote { - 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; - } -} From 02dd5f5389118d61f44d4306475bb89716d0c2c7 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:53:26 +0300 Subject: [PATCH 07/60] refactor(blocks): migrate core uploader blocks to Lit - Migrate CameraSource to Lit with reactive properties - Migrate ExternalSource to Lit - Migrate FileItem to Lit with improved rendering - Migrate UploadList to Lit - Migrate Modal to Lit - Migrate DropArea to Lit - Migrate SimpleBtn, SourceBtn, SourceList to Lit - Migrate Thumb to Lit with async image loading - Migrate ProgressBar, ProgressBarCommon to Lit - Migrate UrlSource to Lit - Migrate Select, Spinner, ActivityHeader, Config - Migrate StartFrom, Copyright, Icon, FormInput - Migrate UploadCtxProvider and EventEmitter --- src/blocks/ActivityHeader/ActivityHeader.ts | 4 +- src/blocks/CameraSource/CameraSource.ts | 658 +++++++++--------- src/blocks/Config/Config.ts | 39 +- src/blocks/Copyright/Copyright.ts | 26 +- src/blocks/DropArea/DropArea.ts | 288 ++++---- src/blocks/ExternalSource/ExternalSource.ts | 296 ++++---- src/blocks/FileItem/FileItem.ts | 348 +++++---- src/blocks/FileItem/FileItemConfig.ts | 4 +- src/blocks/FormInput/FormInput.ts | 6 +- src/blocks/Icon/Icon.ts | 77 +- src/blocks/Modal/Modal.ts | 54 +- src/blocks/ProgressBar/ProgressBar.ts | 120 +++- src/blocks/ProgressBar/progress-bar.css | 1 + .../ProgressBarCommon/ProgressBarCommon.ts | 50 +- src/blocks/Select/Select.ts | 81 +-- src/blocks/SimpleBtn/SimpleBtn.ts | 65 +- src/blocks/SourceBtn/SourceBtn.ts | 89 ++- src/blocks/SourceList/SourceList.ts | 101 +-- src/blocks/Spinner/Spinner.ts | 11 +- src/blocks/StartFrom/StartFrom.ts | 15 +- src/blocks/Thumb/Thumb.ts | 273 ++++++-- src/blocks/Thumb/thumb.css | 14 + src/blocks/UploadCtxProvider/EventEmitter.ts | 10 +- .../UploadCtxProvider/UploadCtxProvider.ts | 12 +- src/blocks/UploadList/UploadList.ts | 228 +++--- src/blocks/UrlSource/UrlSource.ts | 165 ++--- 26 files changed, 1600 insertions(+), 1435 deletions(-) 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 1abdc7ae7..34cafb7d2 100644 --- a/src/blocks/CameraSource/CameraSource.ts +++ b/src/blocks/CameraSource/CameraSource.ts @@ -1,6 +1,7 @@ -import { html } from '@symbiotejs/symbiote'; -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 { canUsePermissionsApi } from '../../utils/abilities'; import { deserializeCsv } from '../../utils/comma-separated'; import { debounce } from '../../utils/debounce'; @@ -8,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, @@ -86,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 { +export class CameraSource extends LitUploaderBlock { override couldBeCtxOwner = true; - override activityType = ActivityBlock.activities.CAMERA; + override activityType = LitActivityBlock.activities.CAMERA; private _unsubPermissions: (() => void) | null = null; @@ -112,148 +72,88 @@ export class CameraSource extends UploaderBlock { private _audioDevices: AudioDeviceOption[] = []; private _permissionResponses: Partial> = {}; - constructor() { - super(); + private timerRef = createRef(); + private lineRef = createRef(); + private videoRef = createRef(); + private switcherRef = createRef(); + private _startTime = 0; + private _elapsedTime = 0; - this.init$ = { - ...this.init$, - video: null, - videoTransformCss: null, + @state() + protected video: MediaStream | null = null; - videoHidden: true, - messageHidden: true, - requestBtnHidden: canUsePermissionsApi(), - cameraSelectOptions: null, - cameraSelectHidden: true, - l10nMessage: '', + @state() + protected videoTransformCss: string | null = null; - // This is refs - switcher: null, - panels: null, - timer: null, + @state() + protected videoHidden = true; - timerHidden: true, - cameraHidden: true, - cameraActionsHidden: true, + @state() + protected messageHidden = true; - audioSelectOptions: null, - audioSelectHidden: true, - audioSelectDisabled: true, - audioToggleMicrophoneHidden: true, + @state() + protected requestBtnHidden = canUsePermissionsApi(); - tabCameraHidden: true, - tabVideoHidden: true, + @state() + protected cameraSelectOptions: CameraDeviceOption[] = []; - currentIcon: 'camera-full', - currentTimelineIcon: 'play', - toggleMicrophoneIcon: 'microphone', + @state() + protected cameraSelectHidden = true; - _startTime: 0, - _elapsedTime: 0, - _animationFrameId: null, + @state() + protected l10nMessage = ''; - mutableClassButton: 'uc-shot-btn uc-camera-action', + @state() + protected timerHidden = true; - onCameraSelectChange: (event: Event) => { - const target = event.target as HTMLSelectElement | null; - if (!target) { - return; - } - this._selectedCameraId = target.value; - this._capture(); - }, + @state() + protected cameraHidden = true; - onAudioSelectChange: (event: Event) => { - const target = event.target as HTMLSelectElement | null; - if (!target) { - return; - } - this._selectedAudioId = target.value; - this._capture(); - }, + @state() + protected cameraActionsHidden = true; - onCancel: () => { - this.historyBack(); - }, + @state() + protected audioSelectOptions: AudioDeviceOption[] = []; - onShot: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'shot-camera', - node: this.tagName, - tabId: this._activeTab, - }, - }, - }); - this._shot(); - }, + @state() + protected audioSelectHidden = true; - 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() + protected audioSelectDisabled = true; - onStartRecording: () => this._startRecording(), + @state() + protected audioToggleMicrophoneHidden = true; - onStopRecording: () => this._stopRecording(), + @state() + protected tabCameraHidden = true; - onToggleRecording: () => this._toggleRecording(), + @state() + protected tabVideoHidden = true; - onToggleAudio: () => this._toggleEnableAudio(), + @state() + protected currentIcon = 'camera-full'; - onRetake: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'retake-camera', - node: this.tagName, - tabId: this._activeTab, - }, - }, - }); - this._retake(); - }, + @state() + protected currentTimelineIcon = 'play'; - onAccept: () => { - this.telemetryManager.sendEvent({ - eventType: InternalEventType.ACTION_EVENT, - payload: { - metadata: { - event: 'accept-camera', - node: this.tagName, - tabId: this._activeTab, - }, - }, - }); - this._accept(); - }, + @state() + protected toggleMicrophoneIcon = 'microphone'; - onClickTab: (event: MouseEvent) => { - const target = event.currentTarget as HTMLElement | null; - const id = target?.getAttribute('data-id'); - if (id) { - this._handleActiveTab(id as CameraMode); - } - }, - } as CameraSourceInitState; - } + @state() + protected mutableClassButton = 'uc-shot-btn uc-camera-action'; _chooseActionWithCamera = () => { + this.telemetryManager.sendEvent({ + eventType: InternalEventType.ACTION_EVENT, + payload: { + metadata: { + event: 'start-camera', + node: this.tagName, + tabId: this._activeTab, + }, + }, + }); + if (this._activeTab === CameraSourceTypes.PHOTO) { this._shot(); } @@ -268,14 +168,94 @@ export class CameraSource extends UploaderBlock { } }; + 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); + } + }; + _updateTimer = (): void => { - const currentTime = Math.floor((performance.now() - this.$._startTime + this.$._elapsedTime) / 1000); + 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); } @@ -283,12 +263,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); } @@ -298,8 +278,8 @@ export class CameraSource extends UploaderBlock { }; _startTimer = (): void => { - this.$._startTime = performance.now(); - this.$._elapsedTime = 0; + this._startTime = performance.now(); + this._elapsedTime = 0; this._updateTimer(); }; @@ -309,18 +289,18 @@ export class CameraSource extends UploaderBlock { }; _startTimeline = (): void => { - const video = this.ref.video as HTMLVideoElement | undefined; + 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); } @@ -397,10 +377,12 @@ export class CameraSource extends UploaderBlock { _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(); } }; @@ -408,8 +390,8 @@ export class CameraSource extends UploaderBlock { 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; }); }; @@ -424,27 +406,23 @@ 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.video = null; videoElement.src = videoURL; videoElement.addEventListener('play', () => { this._startTimeline(); - this.set$({ - currentTimelineIcon: 'pause', - }); + this.currentTimelineIcon = 'pause'; }); videoElement.addEventListener('pause', () => { - this.set$({ - currentTimelineIcon: 'play', - }); + this.currentTimelineIcon = 'play'; this._stopTimeline(); }); } catch (error) { @@ -458,14 +436,14 @@ export class CameraSource extends UploaderBlock { /** Reset video */ if (this._activeTab === CameraSourceTypes.VIDEO) { - this.$.video = this._stream; - const videoElement = this.ref.video as HTMLVideoElement | undefined; + this.video = 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 => { @@ -495,64 +473,51 @@ export class CameraSource extends UploaderBlock { _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 => { 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; } }; @@ -586,41 +551,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({ @@ -688,9 +652,9 @@ export class CameraSource extends UploaderBlock { _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[] { @@ -706,43 +670,31 @@ 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(); } @@ -766,10 +718,12 @@ export class CameraSource extends UploaderBlock { _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.video?.getTracks?.(); tracks?.[0]?.stop(); - this.$.video = null; + this.video = null; this._makeStreamInactive(); this._stopTimer(); @@ -801,8 +755,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 { @@ -813,7 +767,7 @@ export class CameraSource extends UploaderBlock { this._setPermissionsState('denied'); }); - this.$.video = this._stream; + this.video = this._stream; this._capturing = true; this._setPermissionsState('granted'); } catch (error) { @@ -881,20 +835,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'); @@ -925,8 +871,8 @@ export class CameraSource extends UploaderBlock { }; _handleCameraModes = (cameraModes: CameraMode[]): void => { - this.$.tabVideoHidden = !cameraModes.includes(CameraSourceTypes.VIDEO); - this.$.tabCameraHidden = !cameraModes.includes(CameraSourceTypes.PHOTO); + this.tabVideoHidden = !cameraModes.includes(CameraSourceTypes.VIDEO); + this.tabCameraHidden = !cameraModes.includes(CameraSourceTypes.PHOTO); const defaultTab = cameraModes[0]; if (defaultTab && (!this._activeTab || !cameraModes.includes(this._activeTab))) { @@ -936,18 +882,19 @@ export class CameraSource extends UploaderBlock { 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) => { @@ -969,37 +916,40 @@ export class CameraSource extends UploaderBlock { navigator.mediaDevices?.removeEventListener('devicechange', this._getDevices); } - override async destroyCallback(): Promise { - super.destroyCallback(); + override disconnectedCallback(): void { + super.disconnectedCallback(); this._destroy(); } -} -CameraSource.template = html` + override render() { + return html` -
+
- + ${this.l10n('caption-camera')}
@@ -1009,26 +959,31 @@ CameraSource.template = html` muted autoplay playsinline - bind="srcObject: video; style.transform: videoTransformCss; @hidden: videoHidden" - ref="video" + .srcObject=${this.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')}
-
+
@@ -1036,7 +991,8 @@ CameraSource.template = html` data-id="video" type="button" class="uc-switch uc-mini-btn" - bind="onclick: onClickTab; @hidden: tabVideoHidden" + @click=${this._handleClickTab} + ?hidden=${this.tabVideoHidden} > @@ -1044,24 +1000,25 @@ CameraSource.template = html`
-
`; + } +} diff --git a/src/blocks/Config/Config.ts b/src/blocks/Config/Config.ts index b87491462..dc5f5afa2 100644 --- a/src/blocks/Config/Config.ts +++ b/src/blocks/Config/Config.ts @@ -1,10 +1,11 @@ // @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 { LitElement } from 'lit'; +import { LitBlock } from '../../lit/LitBlock'; import { computeProperty } from './computed-properties'; import { initialConfig } from './initialConfig'; import { normalizeConfigValue } from './normalizeConfigValue'; @@ -52,20 +53,15 @@ 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 { + 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)) { @@ -189,6 +185,8 @@ export class Config extends Block { } 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 +199,18 @@ export class Config extends Block { if (key) { anyThis[key] = newVal; } + + if (attrStateMapping[name]) { + (this as any)[name] = newVal; + } } - get computationControllers() { - return this.$.computationControllers; + 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/Copyright/Copyright.ts b/src/blocks/Copyright/Copyright.ts index ebd34328f..a18ad4e2c 100644 --- a/src/blocks/Copyright/Copyright.ts +++ b/src/blocks/Copyright/Copyright.ts @@ -1,9 +1,9 @@ -import { html } from '@symbiotejs/symbiote'; -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 { + override initCallback(): void { super.initCallback(); this.subConfigValue('removeCopyright', (value) => { @@ -11,12 +11,14 @@ export class Copyright extends Block { }); } - static override template = html` - Powered by Uploadcare - `; + override render() { + return html` +
Powered by Uploadcare + `; + } } diff --git a/src/blocks/DropArea/DropArea.ts b/src/blocks/DropArea/DropArea.ts index f1c11456e..66dd2471b 100644 --- a/src/blocks/DropArea/DropArea.ts +++ b/src/blocks/DropArea/DropArea.ts @@ -1,54 +1,75 @@ -import { html, PubSub } 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`; - -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 UploaderBlock { +const dropAreaRegistry = new Set(); + +export class DropArea extends LitUploaderBlock { static override styleAttrs = [...super.styleAttrs, 'uc-drop-area']; + @property({ type: Boolean, reflect: true }) + disabled = false; + + @property({ type: Boolean, reflect: true }) + clickable = false; + + @property({ type: Boolean, attribute: 'with-icon', reflect: true }) + withIcon = false; + + @property({ type: Boolean, reflect: true }) + fullscreen = false; + + @property({ type: Boolean, reflect: true }) + initflow = false; + + @property({ type: String }) + 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; + } + + if (this.initflow) { + this.api.initFlow(); + return; + } + + this.api.openSystemDialog(); + }; + private sourceListAllowsLocal = true; + private clickableListenersAttached = false; isActive(): boolean { - if (!this.$.isEnabled) { + if (!this.isEnabled) { return false; } const bounds = this.getBoundingClientRect(); @@ -68,40 +89,17 @@ export class DropArea extends UploaderBlock { override initCallback() { 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) { - PubSub.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; + } + } + + 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` - - -
-
+ 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 899595dcc..b07762ee4 100644 --- a/src/blocks/ExternalSource/ExternalSource.ts +++ b/src/blocks/ExternalSource/ExternalSource.ts @@ -1,12 +1,14 @@ -import { create, html } 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,79 +19,51 @@ 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 { + override couldBeCtxOwner = true; + 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 { @@ -113,15 +87,10 @@ export class ExternalSource extends UploaderBlock { return; } - this.set$({ - activityCaption: `${externalSourceType[0]?.toUpperCase()}${externalSourceType?.slice(1)}`, - activityIcon: externalSourceType, - }); - this.mountIframe(); }, }); - this.sub('*currentActivityParams', (val) => { + this.sub('*currentActivityParams', () => { if (!this.isActivityActive) { return; } @@ -134,10 +103,10 @@ export class ExternalSource extends UploaderBlock { } }); this.subConfigValue('multiple', (multiple) => { - this.$.showSelectionStatus = multiple; + this.showSelectionStatus = multiple; }); - this.subConfigValue('localeName', (val) => { + this.subConfigValue('localeName', () => { this.setupL10n(); }); @@ -165,9 +134,7 @@ export class ExternalSource extends UploaderBlock { } private handleToolbarStateChange(message: InputMessageMap['toolbar-state-change']): void { - this.set$({ - toolbarVisible: message.isVisible, - }); + this.toolbarVisible = message.isVisible; } private async handleSelectedFilesChange(message: InputMessageMap['selected-files-change']) { @@ -176,23 +143,16 @@ export class ExternalSource extends UploaderBlock { 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 { @@ -242,21 +202,52 @@ export class ExternalSource extends UploaderBlock { return url.toString(); } + 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 }; + } + private mountIframe(): void { - const iframe = create({ - tag: 'iframe', - attributes: { - src: this.remoteUrl(), - marginheight: 0, - marginwidth: 0, - frameborder: 0, - allowTransparency: true, - }, - }) as unknown as HTMLIFrameElement; + 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)); - this.ref.iframeWrapper.innerHTML = ''; - this.ref.iframeWrapper.appendChild(iframe); + iframe.addEventListener('load', this.handleIframeLoad.bind(this)); + + if (this.iframeRef.value) { + this.iframeRef.value.innerHTML = ''; + this.iframeRef.value.appendChild(iframe); + } if (!iframe.contentWindow) { return; @@ -274,52 +265,59 @@ export class ExternalSource extends UploaderBlock { private unmountIframe(): void { this._messageBridge?.destroy(); this._messageBridge = undefined; - this.ref.iframeWrapper.innerHTML = ''; + if (this.iframeRef.value) { + this.iframeRef.value.innerHTML = ''; + } this.resetSelectionStatus(); } private resetSelectionStatus(): void { - this.set$({ - selectedList: [], - total: 0, - isDoneBtnEnabled: false, - couldSelectAll: false, - couldDeselectAll: false, - showSelectionStatus: false, - showDoneBtn: false, - }); + 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}} - - -
- -
-
-`; + override render() { + return html` + + + +
+
+
+ +
+ ${this.counterText} + + +
+ +
+
+ `; + } +} diff --git a/src/blocks/FileItem/FileItem.ts b/src/blocks/FileItem/FileItem.ts index c45f42d79..8b94c187c 100644 --- a/src/blocks/FileItem/FileItem.ts +++ b/src/blocks/FileItem/FileItem.ts @@ -1,4 +1,3 @@ -import { html } from '@symbiotejs/symbiote'; import { shrinkFile } from '@uploadcare/image-shrink'; import { CancelError, @@ -7,8 +6,10 @@ 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'; @@ -31,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; + pauseRender = true; + + @property({ type: String, attribute: false }) + uid = ''; + + @state() + protected itemName = ''; + + @state() + protected errorText = ''; + + @state() + protected hint = ''; + + @state() + protected progressValue = 0; + + @state() + protected progressVisible = false; + + @state() + protected badgeIcon = ''; + + @state() + protected isFinished = false; + + @state() + protected isFailed = false; + + @state() + protected isUploading = false; + + @state() + protected isFocused = false; + + @state() + protected isEditable = false; + + @state() + protected showFileNames = false; + + @state() + protected 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) { @@ -137,10 +140,10 @@ 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( throttle((entry: UploadEntryTypedData, state?: FileItemStateValue) => { @@ -161,41 +164,38 @@ 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(); @@ -212,7 +212,7 @@ export class FileItem extends FileItemConfig { this._thumbRect = entry.boundingClientRect; if (entry.isIntersecting && !this._renderedOnce) { - this.render(); + this.pauseRender = false; this._renderedOnce = true; } } @@ -244,12 +244,12 @@ export class FileItem extends FileItemConfig { }); this._subEntry('fileName', (name) => { - this.$.itemName = name || entry.getValue('externalUrl') || this.l10n('file-no-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.itemName = entry.getValue('fileName') || externalUrl || this.l10n('file-no-name'); }); this._subEntry('fileInfo', () => { @@ -261,28 +261,32 @@ export class FileItem extends FileItemConfig { 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; + } + + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + + if (changedProperties.has('uid')) { + this._handleEntryId(this.uid); + } } override initCallback(): void { super.initCallback(); - this.sub('uid', (uid: string) => { - this._handleEntryId(uid); - }); - - this.sub('state', (state: FileItemStateValue) => { - this._handleState(state); - }); + this._handleEntryId(this.uid); this.subConfigValue('useCloudImageEditor', () => this._debouncedCalculateState()); @@ -315,14 +319,6 @@ export class FileItem extends FileItemConfig { FileItem.activeInstances.add(this); } - override destroyCallback(): void { - super.destroyCallback(); - - FileItem.activeInstances.delete(this); - - this._reset(); - } - override connectedCallback(): void { super.connectedCallback(); @@ -336,19 +332,10 @@ export class FileItem extends FileItemConfig { 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) => { @@ -386,7 +373,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 } @@ -464,43 +456,49 @@ export class FileItem extends FileItemConfig { } }); - static override template = html` -
- - -
- {{itemName}} - {{errorText}} - {{hint}} -
-
- - - -
- - -
-`; - static activeInstances: Set = new Set(); + + protected override shouldUpdate(_changedProperties: PropertyValues): boolean { + return this.pauseRender === false; + } + + 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..da9789617 100644 --- a/src/blocks/FileItem/FileItemConfig.ts +++ b/src/blocks/FileItem/FileItemConfig.ts @@ -1,9 +1,9 @@ -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 { +export class FileItemConfig extends LitUploaderBlock { protected _entrySubs: Set = new Set(); protected _entry: UploadEntryTypedData | null = null; diff --git a/src/blocks/FormInput/FormInput.ts b/src/blocks/FormInput/FormInput.ts index 4d94e82cf..0f592bfb8 100644 --- a/src/blocks/FormInput/FormInput.ts +++ b/src/blocks/FormInput/FormInput.ts @@ -1,10 +1,8 @@ import { applyStyles } from '@symbiotejs/symbiote'; -import { UploaderBlock } from '../../abstract/UploaderBlock'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import type { OutputCollectionState } from '../../types/index'; -export class FormInput extends UploaderBlock { - override requireCtxName = true; - +export class FormInput extends LitUploaderBlock { _validationInputElement: HTMLInputElement | null = null; _dynamicInputsContainer: HTMLDivElement | null = null; diff --git a/src/blocks/Icon/Icon.ts b/src/blocks/Icon/Icon.ts index 602f28dc9..fdb1397b9 100644 --- a/src/blocks/Icon/Icon.ts +++ b/src/blocks/Icon/Icon.ts @@ -1,45 +1,54 @@ -import './icon.css'; -import { html } from '@symbiotejs/symbiote'; -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 }) + name = ''; - this.init$ = { - ...this.init$, - name: '', - href: '', - }; - } + @state() + private resolvedHref = ''; + + private iconHrefResolver: IconHrefResolver | null = null; 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', -}); + override render() { + return html` + ${this.yield( + '', + html``, + )} + `; + } +} diff --git a/src/blocks/Modal/Modal.ts b/src/blocks/Modal/Modal.ts index d76be0b6d..89d3a9f28 100644 --- a/src/blocks/Modal/Modal.ts +++ b/src/blocks/Modal/Modal.ts @@ -1,30 +1,23 @@ -import { html } from '@symbiotejs/symbiote'; -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 { +export class Modal extends LitBlock { static override styleAttrs = [...super.styleAttrs, 'uc-modal']; - static override StateConsumerScope = '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(); }; @@ -47,13 +40,13 @@ export class Modal extends Block { _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 & { + const dialog = this.dialogEl.value as HTMLDialogElement & { showModal?: () => void; }; if (typeof dialog.showModal === 'function') { @@ -69,7 +62,7 @@ export class Modal extends Block { } hide(): void { - const dialog = this.ref.dialog as HTMLDialogElement & { + const dialog = this.dialogEl.value as HTMLDialogElement & { close?: () => void; }; if (typeof dialog.close === 'function') { @@ -118,11 +111,6 @@ export class Modal extends Block { 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', ''); @@ -140,23 +128,29 @@ export class Modal extends Block { this.modalManager?.subscribe(ModalEvents.CLOSE_ALL, this.handleModalCloseAll); } - override destroyCallback(): void { - super.destroyCallback(); + 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); } -} -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); + } + + override render() { + return html` + + ${this.yield('')} `; + } +} diff --git a/src/blocks/ProgressBar/ProgressBar.ts b/src/blocks/ProgressBar/ProgressBar.ts index acd428a5a..0f54f3906 100644 --- a/src/blocks/ProgressBar/ProgressBar.ts +++ b/src/blocks/ProgressBar/ProgressBar.ts @@ -1,51 +1,95 @@ import './progress-bar.css'; -import { html } from '@symbiotejs/symbiote'; -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 }) + value = 0; - private _visible = true; + @property({ type: Boolean, reflect: true }) + 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); + 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` -
-
-`; + override render() { + return html` +
+
+ `; + } +} diff --git a/src/blocks/ProgressBar/progress-bar.css b/src/blocks/ProgressBar/progress-bar.css index a9864b3d0..5eb63b4af 100644 --- a/src/blocks/ProgressBar/progress-bar.css +++ b/src/blocks/ProgressBar/progress-bar.css @@ -32,6 +32,7 @@ uc-progress-bar .uc-progress--hidden { opacity: 0; + transition: opacity 0.3s; } uc-progress-bar .uc-fake-progress { diff --git a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts index 04269a078..c5a46ad78 100644 --- a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts +++ b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts @@ -1,25 +1,27 @@ +import { html, type PropertyValues } from 'lit'; +import { state } from 'lit/decorators.js'; +import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import './progress-bar-common.css'; -import { html } from '@symbiotejs/symbiote'; -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; + @state() + protected visible = false; + + @state() + protected value = 0; + constructor() { super(); this.init$ = { ...this.init$, - visible: false, - value: 0, - '*commonProgress': 0, } as ProgressBarCommonInitState; } @@ -32,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(); + override disconnectedCallback(): void { + super.disconnectedCallback(); this._unobserveCollectionCb?.(); this._unobserveCollectionCb = undefined; } -} -ProgressBarCommon.template = html` `; + override render() { + return html` `; + } +} diff --git a/src/blocks/Select/Select.ts b/src/blocks/Select/Select.ts index 4b5ed7770..200e35211 100644 --- a/src/blocks/Select/Select.ts +++ b/src/blocks/Select/Select.ts @@ -1,5 +1,6 @@ -import { html } from '@symbiotejs/symbiote'; -import { Block } from '../../abstract/Block'; +import { html } from 'lit'; +import { property, state } from 'lit/decorators.js'; +import { LitBlock } from '../../lit/LitBlock'; import './select.css'; type SelectOption = { @@ -7,52 +8,40 @@ type SelectOption = { value: string; }; -type BaseInitState = InstanceType['init$']; +export class Select extends LitBlock { + @property({ type: String, attribute: false }) + value = ''; -interface SelectInitState extends BaseInitState { - currentText: string; - options: SelectOption[]; - selectHtml: string; - onSelect: (event: Event) => void; -} + @property({ type: Boolean, reflect: true }) + 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 }) + options: SelectOption[] = []; - override initCallback(): void { - super.initCallback(); - - this.sub('options', (options: SelectOption[]) => { - this.$.currentText = options?.[0]?.text || ''; - let htmlContent = ''; - options?.forEach((option) => { - htmlContent += html``; - }); - this.$.selectHtml = htmlContent; - }); + 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 700a23f47..25a920fd2 100644 --- a/src/blocks/SimpleBtn/SimpleBtn.ts +++ b/src/blocks/SimpleBtn/SimpleBtn.ts @@ -1,59 +1,40 @@ -import { html } from '@symbiotejs/symbiote'; +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 UploaderBlock { +export class SimpleBtn extends LitUploaderBlock { static override styleAttrs = [...super.styleAttrs, 'uc-simple-btn']; override couldBeCtxOwner = true; - constructor() { - super(); + @property({ attribute: 'dropzone', type: Boolean }) + dropzone = true; - this.init$ = { - ...this.init$, - withDropZone: true, - onClick: () => { - this.api.initFlow(); - }, - 'button-text': '', - } as SimpleBtnInitState; - } + @state() + private buttonTextKey = 'upload-file'; + + private readonly handleClick = () => { + this.api.initFlow(); + }; 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 f2cd7de33..beb3ed487 100644 --- a/src/blocks/SourceBtn/SourceBtn.ts +++ b/src/blocks/SourceBtn/SourceBtn.ts @@ -1,7 +1,7 @@ -import { html } from '@symbiotejs/symbiote'; -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'; @@ -18,26 +18,18 @@ type SourceTypeConfig = { activityParams?: Record; }; -type BaseInitState = InstanceType['init$']; -interface SourceBtnInitState extends BaseInitState { - iconName: string; - 'src-type': string; -} - -export class SourceBtn extends UploaderBlock { +export class SourceBtn extends LitUploaderBlock { override couldBeCtxOwner = true; - private type: string | undefined = undefined; private _registeredTypes: Record = {}; - constructor() { - super(); + @property({ type: String }) + type?: string; - this.init$ = { - ...this.init$, - iconName: 'default', - 'src-type': '', - } as SourceBtnInitState; - } + @state() + private iconName = 'default'; + + @state() + private srcTypeKey = ''; initTypes(): void { this.registerType({ @@ -49,12 +41,12 @@ export class SourceBtn extends UploaderBlock { }); this.registerType({ type: UploadSource.URL, - activity: ActivityBlock.activities.URL, + activity: LitActivityBlock.activities.URL, textKey: 'from-url', }); this.registerType({ type: UploadSource.CAMERA, - activity: ActivityBlock.activities.CAMERA, + activity: LitActivityBlock.activities.CAMERA, activate: () => { const supportsCapture = browserFeatures.htmlMediaCapture; @@ -67,14 +59,14 @@ export class SourceBtn extends UploaderBlock { this.registerType({ type: 'draw', - activity: ActivityBlock.activities.DRAW, + activity: LitActivityBlock.activities.DRAW, icon: 'edit-draw', }); for (const mobileSourceType of Object.values(UploadSourceMobile)) { this.registerType({ type: mobileSourceType, - activity: ActivityBlock.activities.CAMERA, + activity: LitActivityBlock.activities.CAMERA, activate: () => { const supportsCapture = browserFeatures.htmlMediaCapture; if (supportsCapture) { @@ -92,7 +84,7 @@ export class SourceBtn extends UploaderBlock { for (const externalSourceType of Object.values(ExternalUploadSource)) { this.registerType({ type: externalSourceType, - activity: ActivityBlock.activities.EXTERNAL, + activity: LitActivityBlock.activities.EXTERNAL, activityParams: { externalSourceType: externalSourceType, }, @@ -104,12 +96,9 @@ export class SourceBtn extends UploaderBlock { super.initCallback(); this.initTypes(); - this.defineAccessor('type', (val: string) => { - if (!val) { - return; - } - this.applyType(val); - }); + if (this.type) { + this.applyType(this.type); + } } registerType(typeConfig: SourceTypeConfig): void { @@ -151,21 +140,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; } -} -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 764db1da9..b93bb4383 100644 --- a/src/blocks/SourceList/SourceList.ts +++ b/src/blocks/SourceList/SourceList.ts @@ -1,51 +1,72 @@ -import { html } from '@symbiotejs/symbiote'; -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 { +export class SourceList extends LitBlock { + private _rawSourceList: string[] = []; + private _cameraModes: string[] = []; + private _resolvedSources: string[] = []; + override initCallback(): void { super.initCallback(); this.subConfigValue('sourceList', (val: string) => { - const list = stringToArray(val); - let htmlContent = ''; - - 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) => { - htmlContent += html``; - }); - - if (cameraModes.length === 0) { - htmlContent += html``; - } - }); - - return; - } - - htmlContent += html``; - }); - - if (this.cfg.sourceListWrap) { - this.innerHTML = htmlContent; - } else { - this.outerHTML = htmlContent; - } + 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() + sources: string[] = []; + + override render() { + return html`${this.sources.map((type) => html``)}`; } } diff --git a/src/blocks/Spinner/Spinner.ts b/src/blocks/Spinner/Spinner.ts index 9ec08728b..b3defbe2f 100644 --- a/src/blocks/Spinner/Spinner.ts +++ b/src/blocks/Spinner/Spinner.ts @@ -1,6 +1,9 @@ -import { html, Symbiote } from '@symbiotejs/symbiote'; +import { html } from 'lit'; +import { LitBlock } from '../../lit/LitBlock'; import './spinner.css'; -export class Spinner extends Symbiote {} - -Spinner.template = html`
`; +export class Spinner extends LitBlock { + override render() { + return html`
`; + } +} diff --git a/src/blocks/StartFrom/StartFrom.ts b/src/blocks/StartFrom/StartFrom.ts index 9728b843f..56e4f3265 100644 --- a/src/blocks/StartFrom/StartFrom.ts +++ b/src/blocks/StartFrom/StartFrom.ts @@ -1,16 +1,17 @@ -import { html } from '@symbiotejs/symbiote'; -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 { +export class StartFrom extends LitActivityBlock { override historyTracked = true; - override activityType: ActivityType = ActivityBlock.activities.START_FROM; + override activityType: ActivityType = LitActivityBlock.activities.START_FROM; override initCallback(): void { super.initCallback(); this.registerActivity(this.activityType ?? ''); } -} -StartFrom.template = html`
`; + override render() { + return html`
${this.yield('')}
`; + } +} diff --git a/src/blocks/Thumb/Thumb.ts b/src/blocks/Thumb/Thumb.ts index 93378cb7c..e79479164 100644 --- a/src/blocks/Thumb/Thumb.ts +++ b/src/blocks/Thumb/Thumb.ts @@ -1,4 +1,5 @@ -import { html } from '@symbiotejs/symbiote'; +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'; @@ -9,36 +10,42 @@ import './thumb.css'; const CDN_MAX_OUTPUT_DIMENSION = 3000; +type PendingThumbUpdate = { + controller: AbortController; + rafId?: number; + cancel: () => void; +}; + export class Thumb extends FileItemConfig { - private _renderedGridOnce = false; + @property({ type: String }) + badgeIcon = ''; - private _thumbRect: IntersectionObserverEntry['boundingClientRect'] | null = null; + @property({ type: String }) + uid = ''; - private _isIntersecting = false; + @state() + private thumbUrl = ''; - private _firstViewMode = this.cfg.filesViewMode; + private renderedGridOnce = false; - private _observer?: IntersectionObserver; + private thumbRect: IntersectionObserverEntry['boundingClientRect'] | null = null; - constructor() { - super(); + private isIntersecting = false; - this.init$ = { - ...this.init$, - thumbUrl: '', - badgeIcon: '', - uid: '', - } as typeof this.init$ & { thumbUrl: string; badgeIcon: string; uid: string }; - } + private firstViewMode = this.cfg.filesViewMode; + + private observer?: IntersectionObserver; - private _calculateThumbSize(force = false): number { + private pendingThumbUpdate?: PendingThumbUpdate; + + private calculateThumbSize(force = false): number { if (force) { - this._thumbRect = this.getBoundingClientRect(); + this.thumbRect = this.getBoundingClientRect(); } let size = Math.max( - parseInt(String(this?._thumbRect?.height || 0), 10), - parseInt(String(this?._thumbRect?.width || 0), 10), + parseInt(String(this?.thumbRect?.height || 0), 10), + parseInt(String(this?.thumbRect?.width || 0), 10), this.cfg.thumbSize, ); @@ -50,13 +57,13 @@ 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'); const currentThumbUrl = entry.getValue('thumbUrl'); - const size = this._calculateThumbSize(force); + const size = this.calculateThumbSize(force); if (fileInfo && isImage && uuid) { const thumbUrl = await this.proxyUrl( @@ -114,83 +121,200 @@ export class Thumb extends FileItemConfig { } }); - private _debouncedGenerateThumb = debounce(this._generateThumbnail.bind(this), 100); + 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) { return; } - this._isIntersecting = entry.isIntersecting; + this.isIntersecting = entry.isIntersecting; if (entry.isIntersecting) { - this._thumbRect = entry.boundingClientRect; - this._debouncedGenerateThumb(); - this._observer?.disconnect(); + this.thumbRect = entry.boundingClientRect; + this.requestThumbGeneration(); + this.observer?.disconnect(); } if (entry.intersectionRatio === 0) { - this._debouncedGenerateThumb.cancel(); + this.debouncedGenerateThumb.cancel(); } } protected override _reset(): void { super._reset(); - this._debouncedGenerateThumb.cancel(); + 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(); + 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._reset(); + this._entry = entry; + + const requestThumb = () => { + this.requestThumbGeneration(); + }; + this._subEntry('fileInfo', (fileInfo) => { - if (fileInfo?.isImage && this._isIntersecting) { - this._debouncedGenerateThumb(); + if (fileInfo?.isImage) { + requestThumb(); } }); this._subEntry('thumbUrl', (thumbUrl) => { - this.$.thumbUrl = thumbUrl ? `url(${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 { 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); + if (viewMode === 'grid' && !this.renderedGridOnce) { + if (this.firstViewMode === 'list') { + this.requestThumbGeneration(true); } - this._renderedGridOnce = true; + this.renderedGridOnce = true; } }); @@ -200,31 +324,28 @@ export class Thumb extends FileItemConfig { override connectedCallback(): void { super.connectedCallback(); - this._observer = new window.IntersectionObserver(this._observerCallback.bind(this), { threshold: 0.1 }); + this.observer?.disconnect(); + this.observer = new window.IntersectionObserver(this._observerCallback.bind(this), { threshold: 0.1 }); - this._observer.observe(this); + this.observer.observe(this); } override disconnectedCallback(): void { super.disconnectedCallback(); - this._entrySubs = new Set(); - this._debouncedGenerateThumb.cancel(); - this._observer?.disconnect(); + this.debouncedGenerateThumb.cancel(); + this.cancelPendingThumbUpdate(); + this.observer?.disconnect(); } -} -Thumb.template = html` -
+ 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..1a8f0c1cd 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,18 +68,18 @@ 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) { this._debugPrint = debugPrint; } - bindTarget(target: Block): void { + bindTarget(target: LitBlock): void { this._targets.add(target); } - unbindTarget(target: Block): void { + unbindTarget(target: LitBlock): void { this._targets.delete(target); } diff --git a/src/blocks/UploadCtxProvider/UploadCtxProvider.ts b/src/blocks/UploadCtxProvider/UploadCtxProvider.ts index 5f3618584..a057c746e 100644 --- a/src/blocks/UploadCtxProvider/UploadCtxProvider.ts +++ b/src/blocks/UploadCtxProvider/UploadCtxProvider.ts @@ -1,23 +1,21 @@ // @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 { +export class UploadCtxProvider extends LitUploaderBlock { static override styleAttrs = ['uc-wgt-common']; static EventType = EventType; - override requireCtxName = true; - override initCallback() { super.initCallback(); this.$['*eventEmitter'].bindTarget(this); } - override destroyCallback() { - super.destroyCallback(); + override disconnectedCallback(): void { + super.disconnectedCallback(); this.$['*eventEmitter'].unbindTarget(this); } @@ -27,7 +25,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 5a6ed3677..ad7941a0c 100644 --- a/src/blocks/UploadList/UploadList.ts +++ b/src/blocks/UploadList/UploadList.ts @@ -1,11 +1,12 @@ -// @ts-check -import { html } from '@symbiotejs/symbiote'; -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'; @@ -17,63 +18,77 @@ 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 +export class UploadList extends LitUploaderBlock { 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(); + 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; + + private _latestSummary: Summary | null = null; + protected 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) { @@ -90,7 +105,7 @@ export class UploadList extends UploaderBlock { } }, 300); - private _updateUploadsState(): void { + protected _updateUploadsState(): void { const collectionState = this.api.getOutputCollectionState(); const summary: Summary = { total: collectionState.totalCount, @@ -119,19 +134,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 { @@ -193,77 +203,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); + override disconnectedCallback(): void { + super.disconnectedCallback(); + if (this.has('*uploadCollection')) { + this.uploadCollection.unobserveProperties(this._throttledHandleCollectionUpdate); + this.uploadCollection.unobserveCollection(this._throttledHandleCollectionUpdate); + } } -} -UploadList.template = html` + 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 eef4324fc..d702dcef9 100644 --- a/src/blocks/UrlSource/UrlSource.ts +++ b/src/blocks/UrlSource/UrlSource.ts @@ -1,96 +1,103 @@ -import { html } from '@symbiotejs/symbiote'; -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 { +export class UrlSource extends LitUploaderBlock { override couldBeCtxOwner = true; - override activityType: ActivityType = ActivityBlock.activities.URL; - - constructor() { - super(); + 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 { 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; + }; + + override render() { + return html` + + +
+ + ${this.l10n('caption-from-url')} +
+ +
+
+ + +
+ `; + } +} From 5dfb7b5f2b152fd5856f45e636d3d211ddbfb20d Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:53:41 +0300 Subject: [PATCH 08/60] refactor(cloud-image-editor): migrate editor components to Lit - Migrate CloudImageEditorBlock to Lit - Migrate EditorToolbar with Lit templating - Migrate EditorFilterControl, EditorOperationControl - Migrate EditorSlider, EditorImageCropper, EditorImageFader - Migrate CropFrame with reactive properties - Migrate UI elements: BtnUi, SliderUi, LineLoaderUi, PresenceToggle - Migrate EditorAspectRatioButtonControl, EditorCropButtonControl - Migrate EditorButtonControl, EditorScroller - Remove deprecated template.ts --- .../src/CloudImageEditorBlock.ts | 355 ++++++-- src/blocks/CloudImageEditor/src/CropFrame.ts | 183 ++-- .../src/EditorAspectRatioButtonControl.ts | 211 +++-- .../src/EditorButtonControl.ts | 113 +-- .../src/EditorCropButtonControl.ts | 66 +- .../src/EditorFilterControl.ts | 340 +++++--- .../src/EditorImageCropper.ts | 95 ++- .../CloudImageEditor/src/EditorImageFader.ts | 171 ++-- .../src/EditorOperationControl.ts | 74 +- .../CloudImageEditor/src/EditorScroller.ts | 49 +- .../CloudImageEditor/src/EditorSlider.ts | 117 +-- .../CloudImageEditor/src/EditorToolbar.ts | 796 ++++++++++-------- .../CloudImageEditor/src/css/common.css | 10 +- .../src/elements/button/BtnUi.ts | 164 ++-- .../src/elements/line-loader/LineLoaderUi.ts | 97 ++- .../presence-toggle/PresenceToggle.ts | 59 +- .../src/elements/slider/SliderUi.ts | 265 +++--- src/blocks/CloudImageEditor/src/state.ts | 24 +- src/blocks/CloudImageEditor/src/template.ts | 37 - 19 files changed, 1939 insertions(+), 1287 deletions(-) delete mode 100644 src/blocks/CloudImageEditor/src/template.ts diff --git a/src/blocks/CloudImageEditor/src/CloudImageEditorBlock.ts b/src/blocks/CloudImageEditor/src/CloudImageEditorBlock.ts index a2fb02baa..019e3c417 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,169 @@ 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; +export class CloudImageEditorBlock extends LitBlock { + ctxOwner = true; static override styleAttrs = ['uc-cloud-image-editor']; - private _debouncedShowLoader = debounce(this._showLoader.bind(this), 300); + @property({ attribute: false }) + entry: unknown = null; - constructor() { - super(); + @property({ attribute: false }) + extension: string | null = null; - this.init$ = { - ...this.init$, - ...initState(this), - } as CloudImageEditorBlockState; + @property({ type: Boolean, attribute: false }) + editorMode = false; + + @property({ type: String, attribute: false }) + modalCaption = ''; + + @property({ type: Boolean, attribute: false }) + isImage = false; + + @property({ type: String, attribute: false }) + msg = ''; + + @property({ type: String, attribute: false }) + src = TRANSPARENT_PIXEL_SRC; + + @property({ type: String, attribute: false }) + fileType = ''; + + @property({ type: Boolean, attribute: false }) + showLoader = false; + + @property({ type: String, reflect: true }) + uuid: string | null = null; + + @property({ type: String, attribute: 'cdn-url', reflect: true }) + cdnUrl: string | null = null; + + @property({ type: String, attribute: 'crop-preset', reflect: true }) + cropPreset = ''; + + @property({ type: String, reflect: true }) + tabs: string | null = DEFAULT_TABS; + + @property({ type: Boolean, attribute: false }) + presenceNetworkProblems = false; + + @property({ type: Boolean, attribute: false }) + presenceModalCaption = true; + + @property({ type: Boolean, attribute: false }) + presenceEditorToolbar = false; + + @property({ type: Boolean, attribute: false }) + presenceViewerToolbar = true; + + @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.src !== 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; + }); + } + + override init$ = { + ...this.init$, + ...initState(this), + } as ReturnType; + + override initCallback(): void { + super.initCallback(); + + this.syncTabListFromProp(); + this.syncCropPresetState(); } - private _showLoader(show: boolean): void { - this.$.showLoader = show; + 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,14 +210,107 @@ export class CloudImageEditorBlock extends Block { }); } - override initCallback(): void { - super.initCallback(); + override firstUpdated(_changedProperties: Map): void { + super.firstUpdated(_changedProperties); + this.assignSharedElements(); + this.attachImageListeners(); + void this.initEditor(); + + const hasInitialSource = Boolean(this.uuid || this.cdnUrl); + const alreadyRequested = _changedProperties.has('uuid') || _changedProperties.has('cdnUrl'); + if (hasInitialSource && !alreadyRequested) { + void this.updateImage(); + } + } + + override disconnectedCallback(): void { + this.detachImageListeners(); + super.disconnectedCallback(); + } + + override render() { + const fileType = this.fileType ?? ''; + const message = this.msg ?? ''; + const src = this.src || TRANSPARENT_PIXEL_SRC; + const showLoader = this.showLoader; + const showNetworkProblems = this.presenceNetworkProblems; + + 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(); + } - this.$['*faderEl'] = this.ref['fader-el']; - this.$['*cropperEl'] = this.ref['cropper-el']; - this.$['*imgContainerEl'] = this.ref['img-container-el']; + 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.initEditor(); + this.$['*cropPresetList'] = list; + this.$['*currentAspectRatio'] = closest ?? list?.[0] ?? null; } async updateImage(): Promise { @@ -82,8 +319,8 @@ export class CloudImageEditorBlock extends Block { } 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 +330,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,6 +366,8 @@ export class CloudImageEditorBlock extends Block { console.error('Failed to load image info', err); } } + + this.scheduleInitialization(); } async initEditor(): Promise { @@ -142,43 +381,12 @@ 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.presenceNetworkProblems = hasIssues; + this.presenceModalCaption = !hasIssues; }); this.sub( @@ -207,34 +415,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 1f61ab8d1..49cd75165 100644 --- a/src/blocks/CloudImageEditor/src/CropFrame.ts +++ b/src/blocks/CloudImageEditor/src/CropFrame.ts @@ -1,5 +1,8 @@ -import { html } 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 _dragging = 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._dragging; + } - this._handlePointerMove = this._handlePointerMove_.bind(this); + private set dragging(value: boolean) { + if (this._dragging === value) { + return; + } + this._dragging = 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._dragging, + 'uc-guides--semi-hidden': !this._guidesHidden && !this._dragging, + }), + ); } 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,6 +511,9 @@ export class CropFrame extends Block { } private _render(): void { + if (!this._svgReady) { + return; + } this._updateBackdrop(); this._updateFrame(); this._updateMask(); @@ -493,14 +536,14 @@ export class CropFrame extends Block { } } - override initCallback() { + 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(); + } + + 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` `; + override render(): TemplateResult { + return html``; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts b/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts index c9789523a..e78e8d7f5 100644 --- a/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorAspectRatioButtonControl.ts @@ -1,5 +1,7 @@ -import { html } from '@symbiotejs/symbiote'; -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'; @@ -26,85 +28,85 @@ export class EditorFreeformButtonControl extends EditorButtonControl { 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); + const title = this.computeTitle(opt); + this.title = title; + this.titleProp = title; }); } - handleClick(): void { + override onClick(): void { this.$['*showListAspectRatio'] = true; } -} -EditorFreeformButtonControl.template = html` - -`; + private computeTitle(aspectRatio?: CropAspectRatio): 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); + 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; - this.init$ = { - ...this.init$, - active: false, - once: false, - }; + @property({ attribute: false }) + get aspectRatio(): CropAspectRatio | undefined { + 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', ''); - } + set aspectRatio(value: CropAspectRatio | undefined) { + 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; + 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.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 { + override onClick(): void { const currentAspectRatio = this.$['*currentAspectRatio'] as CropAspectRatio | undefined; if (currentAspectRatio?.id === this._aspectRatio?.id) { return; @@ -113,28 +115,81 @@ 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; + }; - const svgEl = this.ref['icon-el']?.ref?.svg; + resolveTitle(); + resolveTitleProp(); - if (!svgEl) return; - svgEl.innerHTML = ''; - svgEl.appendChild(rect); + if (!isFreeform) { + this.requestUpdate(); + } } - private _aspectRatio?: CropAspectRatio; + private renderIcon() { + const ratio = this._aspectRatio; + if (!ratio || ratio.hasFreeform) { + return html``; + } + + const { width, height } = getAdjustResolutions(ratio); + const x = (SIZE_SVG_WRAPPER - width) / 2; + const y = (SIZE_SVG_WRAPPER - height) / 2; + + return html` + + `; + } + + 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 7c45b2961..70eeac81c 100644 --- a/src/blocks/CloudImageEditor/src/EditorButtonControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorButtonControl.ts @@ -1,57 +1,66 @@ -import { html } from '@symbiotejs/symbiote'; -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 { + @state() + active = false; + + @state() + override title = ''; + + @state() + 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() + 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 {} + + override connectedCallback(): void { + super.connectedCallback(); + this.updateHostStateClasses(); + } + + protected override updated(changedProperties: PropertyValues): void { + super.updated(changedProperties); + if (changedProperties.has('active')) { + this.updateHostStateClasses(); + } + } + + 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..7753daf22 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 }) + 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; - } + 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 2dfc51d14..04050a704 100644 --- a/src/blocks/CloudImageEditor/src/EditorFilterControl.ts +++ b/src/blocks/CloudImageEditor/src/EditorFilterControl.ts @@ -1,4 +1,8 @@ -import { html } from '@symbiotejs/symbiote'; +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'; @@ -13,23 +17,63 @@ 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; + + @property({ type: Boolean, reflect: true }) + isOriginal = false; + + @property({ type: Number }) + iconSize = 20; + + @property({ type: String }) + get filter(): string { + return this._filter; + } + + 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); + } + + 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'; @@ -44,7 +88,6 @@ export class EditorFilterControl extends EditorButtonControl { amount: filterValue, } : undefined; - return createCdnUrl( this._originalUrl, createCdnUrlModifiers( @@ -59,21 +102,7 @@ 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?.(); } @@ -82,96 +111,209 @@ export class EditorFilterControl extends EditorButtonControl { 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) => { + 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; + 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); + } + + 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 ea44606b1..f53e2092e 100644 --- a/src/blocks/CloudImageEditor/src/EditorImageCropper.ts +++ b/src/blocks/CloudImageEditor/src/EditorImageCropper.ts @@ -1,8 +1,12 @@ -import { html } 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 { 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, @@ -37,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 { + ctxOwner = true; private _commitDebounced: ReturnType; private _handleResizeThrottled: ReturnType; @@ -47,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() { super(); this.init$ = { ...this.init$, - image: null, '*padding': CROP_PADDING, '*operations': { rotate: 0, @@ -77,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 { @@ -102,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; @@ -119,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; @@ -216,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; @@ -230,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; @@ -242,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({ @@ -349,14 +365,17 @@ export class EditorImageCropper extends Block { 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 }); @@ -369,7 +388,7 @@ 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(); } }); @@ -390,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(); } @@ -420,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 { @@ -484,7 +502,7 @@ export class EditorImageCropper extends Block { }); this.sub('*cropBox', () => { - if (this.$.image) { + if (this._image) { this._commitDebounced(); } }); @@ -496,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 }); } } @@ -504,13 +522,18 @@ export class EditorImageCropper extends Block { }, 0); } - override destroyCallback(): void { - super.destroyCallback(); + override disconnectedCallback(): void { + super.disconnectedCallback(); this._observer?.disconnect(); + if (this._image) { + this._image = null; + } } -} -EditorImageCropper.template = html` - - -`; + override render(): TemplateResult { + return html` + + + `; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorImageFader.ts b/src/blocks/CloudImageEditor/src/EditorImageFader.ts index f0edaf80e..e2362ec09 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() { 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,55 +240,6 @@ 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 { const numericValue = typeof value === 'string' ? parseInt(value, 10) : value; if (!isOperationKey(this._operation) || !Number.isFinite(numericValue)) { @@ -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,9 +315,8 @@ 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(); } } @@ -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) { @@ -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') { @@ -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(); + } + + override render(): TemplateResult { + return html` +
+
+ `; + } } diff --git a/src/blocks/CloudImageEditor/src/EditorOperationControl.ts b/src/blocks/CloudImageEditor/src/EditorOperationControl.ts index 0798f502a..905c207de 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 }) + get operation(): ColorOperation | '' { + return this._operation; + } + + 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(); + } + + 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; + }); + } + 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 238249b22..a70afc660 100644 --- a/src/blocks/CloudImageEditor/src/EditorScroller.ts +++ b/src/blocks/CloudImageEditor/src/EditorScroller.ts @@ -1,34 +1,29 @@ -import { html } from '@symbiotejs/symbiote'; -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, - }, - ); + 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, - }); + 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 bfed68574..0968afb51 100644 --- a/src/blocks/CloudImageEditor/src/EditorSlider.ts +++ b/src/blocks/CloudImageEditor/src/EditorSlider.ts @@ -1,5 +1,6 @@ -import { html } from '@symbiotejs/symbiote'; -import { Block } from '../../../abstract/Block'; +import { html } 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'; @@ -10,57 +11,51 @@ 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 { + @state() + private state = { + operation: 'filter' as SliderOperation, + filter: undefined as SliderFilter | undefined, + originalUrl: '', + disabled: false, + min: 0, + max: 100, + value: 0, + defaultValue: 0, + zero: 0, + }; + + 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]; @@ -70,30 +65,28 @@ 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 { 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; @@ -105,22 +98,30 @@ export class EditorSlider extends Block { } override initCallback(): void { - super.initCallback(); - this.sub('*originalUrl', (originalUrl: string) => { - this._originalUrl = originalUrl; + this.state = { ...this.state, originalUrl }; }); + } + + protected override updated(changedProperties: Map): 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` - -`; + override render() { + return html` + + `; + } +} diff --git a/src/blocks/CloudImageEditor/src/EditorToolbar.ts b/src/blocks/CloudImageEditor/src/EditorToolbar.ts index cb512a0a2..e77658813 100644 --- a/src/blocks/CloudImageEditor/src/EditorToolbar.ts +++ b/src/blocks/CloudImageEditor/src/EditorToolbar.ts @@ -1,13 +1,14 @@ -import { html } from '@symbiotejs/symbiote'; -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, @@ -24,270 +25,157 @@ 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` - - -
-
-
-
-
- `; -} + @state() + private 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); - } + @state() + private 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); - } - } + @state() + private tabList: TabIdValue[] = [...ALL_TABS]; - private _createOperationControl(operation: string): EditorOperationControl { - const el = new EditorOperationControl(); - (el as unknown as { operation: string }).operation = operation; - return el; - } + @state() + private 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', + }; + + 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, @@ -298,31 +186,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 { @@ -338,40 +308,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 { 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) { @@ -396,7 +340,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(); }); @@ -426,85 +371,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.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 { + override connectedCallback(): void { + super.connectedCallback(); + window.addEventListener('resize', this.handleWindowResize); + } + + 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(); + } + } + + 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 handleCancel = (e: MouseEvent): void => { + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + action: 'cancel', + }); + this._cancelPreload?.(); + const onCancel = this.$['*on.cancel'] as (() => void) | undefined; + onCancel?.(); + }; + + private 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 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 handleCancelSlider = (e: MouseEvent): void => { + this.telemetryManager.sendEventCloudImageEditor(e, this.$['*tabId'], { + action: 'cancel-slider', + }); + const slider = this.sliderRef.value; + slider?.cancel(); + this._onSliderClose(); + }; + + private 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} +
+
+
+
+ `; + } + + 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..62d0d54c1 100644 --- a/src/blocks/CloudImageEditor/src/css/common.css +++ b/src/blocks/CloudImageEditor/src/css/common.css @@ -6,7 +6,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); @@ -723,7 +723,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 +862,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 +882,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 9d69460ed..17b3a5382 100644 --- a/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/button/BtnUi.ts @@ -1,102 +1,100 @@ -import { html } from '@symbiotejs/symbiote'; -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 }) + text = ''; - this.defineAccessor('active', (active: boolean) => { - if (active) { - this.setAttribute('active', ''); - } else { - this.removeAttribute('active'); - } - }); - } + @property({ type: String }) + icon = ''; + + @property({ type: Boolean, reflect: true }) + active = false; + + @property({ type: Boolean, reflect: true }) + reverse = false; + + @property({ type: String, reflect: true }) + 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' }) + ariaRole = ''; + + @property({ attribute: 'aria-controls' }) + ariaControls = ''; + + @property({ attribute: 'title-prop' }) + 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 = ''; - } + 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 2271969ef..e20345fe2 100644 --- a/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/line-loader/LineLoaderUi.ts @@ -1,52 +1,83 @@ -import { html } from '@symbiotejs/symbiote'; -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 }) + active = 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) { - this._start(); + private readonly lineRef = createRef(); + private _isAnimating = false; + + private readonly handleTransitionEndRight = (): void => { + 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) { - this._start(); + 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(); + this.stop(); } - }); + } } - private _start(): void { - this._active = true; + private start(): void { + 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)`; - lineEl.addEventListener('transitionend', this._handleTransitionEndRight, { + lineEl.addEventListener('transitionend', this.handleTransitionEndRight, { once: true, }); } - private _stop(): void { - this._active = false; + private stop(): void { + 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%)'; + } + + 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 1ddd86154..d2e2fd09e 100644 --- a/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts +++ b/src/blocks/CloudImageEditor/src/elements/presence-toggle/PresenceToggle.ts @@ -1,5 +1,5 @@ -import { html } from '@symbiotejs/symbiote'; -import { Block } from '../../../../../abstract/Block'; +import { property } from 'lit/decorators.js'; +import { LitBlock } from '../../../../../lit/LitBlock'; import { applyClassNames } from '../../lib/classNames'; type PresenceToggleStyle = { @@ -14,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 }) + set visible(value: boolean) { + this._visible = value; + this._handleVisible(); + } - this.defineAccessor('visible', (visible?: boolean) => { - if (typeof visible !== 'boolean') { - return; - } + get visible(): boolean { + return this._visible; + } - this._visible = visible; - this._handleVisible(); - }); + @property({ attribute: false }) + set styles(styles: PresenceToggleStyle) { + this._styles = styles; + this._externalTransitions = true; + this._visibleStyle = styles.visible ?? DEFAULT_STYLE.visible; + this._hiddenStyle = styles.hidden ?? DEFAULT_STYLE.hidden; + } + get styles(): PresenceToggleStyle { + return this._styles; } private _handleVisible(): void { @@ -52,6 +53,20 @@ export class PresenceToggle extends Block { 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 { super.initCallback(); @@ -64,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 ec5e206b8..7ac9f6daf 100644 --- a/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts +++ b/src/blocks/CloudImageEditor/src/elements/slider/SliderUi.ts @@ -1,136 +1,135 @@ -import { html } from '@symbiotejs/symbiote'; -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 }) + 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 }) + min = 0; - this.setAttribute('with-effects', ''); - } + @property({ type: Number }) + max = 100; - override initCallback(): void { - super.initCallback(); + @property({ type: Number, attribute: false }) + defaultValue = 0; - this.defineAccessor('disabled', (disabled: boolean) => { - this.$.disabled = disabled; - }); + @property({ type: Number }) + zero = 0; - this.defineAccessor('min', (min: number) => { - this.$.min = min; - }); + @state() + private _currentValue = 0; - this.defineAccessor('max', (max: number) => { - this.$.max = max; - }); + 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: Map): 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); + } + + const boundsChanged = changedProperties.has('min') || changedProperties.has('max'); + if (boundsChanged && this.hasUpdated) { + this._updateSteps(); + this._updateValue(this._currentValue); + } - private _stepsEl(): HTMLElement { - return this.ref['steps-el'] as HTMLElement; + 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)`; + } }); } @@ -138,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) { @@ -152,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; @@ -187,18 +193,57 @@ export class SliderUi extends Block { this._stepsCount = count; } - override destroyCallback(): void { - super.destroyCallback(); + 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; + } + + override render() { + return html` +
+
+ + `; } } -SliderUi.template = html` -
-
- -`; diff --git a/src/blocks/CloudImageEditor/src/state.ts b/src/blocks/CloudImageEditor/src/state.ts index ebaabf73b..9d5df234b 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'); diff --git a/src/blocks/CloudImageEditor/src/template.ts b/src/blocks/CloudImageEditor/src/template.ts deleted file mode 100644 index a90bd6a5a..000000000 --- a/src/blocks/CloudImageEditor/src/template.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { html } from '@symbiotejs/symbiote'; -import { TRANSPARENT_PIXEL_SRC } from '../../../utils/transparentPixelSrc'; -import svgIconsSprite from './svg-sprite'; - -export const TEMPLATE = html` - ${svgIconsSprite} -
- -
-
- -
-
Network error
-
- -
-
-
-
{{fileType}}
-
-
- - - -
-
{{msg}}
-
-
- -
- -
-
-
-`; From f1e671f9edb0ea01abcd5a526c61a7bd6d8f7a6d Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:54:00 +0300 Subject: [PATCH 09/60] refactor(cloud-image-editor): migrate CloudImageEditorActivity to Lit --- .../CloudImageEditorActivity.ts | 125 +++++++++++------- 1 file changed, 78 insertions(+), 47 deletions(-) diff --git a/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts b/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts index f5c493ab7..5f275f1f0 100644 --- a/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts +++ b/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts @@ -1,19 +1,29 @@ -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'; export type ActivityParams = { internalId: string }; -export class CloudImageEditorActivity extends UploaderBlock { +type EditorTemplateConfig = { + cdnUrl: string; + cropPreset?: string; + tabs?: string; +}; + +export class CloudImageEditorActivity extends LitUploaderBlock { override couldBeCtxOwner = true; - override activityType = ActivityBlock.activities.CLOUD_IMG_EDIT; + override activityType = LitActivityBlock.activities.CLOUD_IMG_EDIT; private _entry?: TypedData; - private _instance?: CloudImageEditorBlock; + + @state() + private editorConfig: EditorTemplateConfig | null = null; override get activityParams(): ActivityParams { const params = super.activityParams; @@ -32,15 +42,31 @@ export class CloudImageEditorActivity extends UploaderBlock { }); 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, + }; }); } @@ -48,20 +74,27 @@ export class CloudImageEditorActivity extends UploaderBlock { 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); + 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(); } + handleChange(event: CustomEvent): void { + this.debugPrint(`editor event "change"`, event.detail); + } + mountEditor(): void { const { internalId } = this.activityParams; const entry = this.uploadCollection.read(internalId); @@ -73,45 +106,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; + unmountEditor(): void { + this._entry = undefined; + this.editorConfig = null; + } - instance.setAttribute('ctx-name', this.ctxName); - instance.setAttribute('cdn-url', cdnUrl); + 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; } } From 78a53ad11540d1681a200394204d3c6e034d7ecc Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:54:16 +0300 Subject: [PATCH 10/60] refactor(solutions): migrate file uploader solutions to Lit - Migrate FileUploaderInline to Lit - Migrate FileUploaderMinimal to Lit - Migrate FileUploaderRegular to Lit --- .../inline/FileUploaderInline.ts | 112 +++++------ .../minimal/FileUploaderMinimal.ts | 175 +++++++++--------- .../regular/FileUploaderRegular.ts | 43 ++--- 3 files changed, 166 insertions(+), 164 deletions(-) diff --git a/src/solutions/file-uploader/inline/FileUploaderInline.ts b/src/solutions/file-uploader/inline/FileUploaderInline.ts index 7411cd8ae..6ccfb3a45 100644 --- a/src/solutions/file-uploader/inline/FileUploaderInline.ts +++ b/src/solutions/file-uploader/inline/FileUploaderInline.ts @@ -1,48 +1,50 @@ -import { html } from '@symbiotejs/symbiote'; +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 SolutionBlock { +export class FileUploaderInline extends LitSolutionBlock { static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-inline']; + @state() + private couldCancel = false; + 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; } + private _handleCancel = (): void => { + if (this.couldHistoryBack) { + const historyBack = this.$['*historyBack'] as (() => void) | undefined; + historyBack?.(); + return; + } + + if (this.couldShowList) { + this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; + } + }; + 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 { @@ -50,6 +52,10 @@ export class FileUploaderInline extends SolutionBlock { return this.cfg.showEmptyList || (Array.isArray(uploadList) && uploadList.length > 0); } + private _getInitActivity(): string { + return (this.getCssData('--cfg-init-activity') as string | undefined) || LitActivityBlock.activities.START_FROM; + } + override initCallback(): void { super.initCallback(); @@ -57,48 +63,46 @@ export class FileUploaderInline extends SolutionBlock { 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` - - - - - - - - - - - -`; + override render() { + return html` + ${super.render()} + + + + + + + + + + + + `; + } +} diff --git a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts index f3fee9fd6..f5879a260 100644 --- a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts +++ b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts @@ -1,74 +1,74 @@ -import { html } from '@symbiotejs/symbiote'; -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 SolutionBlock { +export class FileUploaderMinimal extends LitSolutionBlock { static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-minimal']; + @state() + protected singleUpload = false; + + @state() + protected isHiddenStartFrom = false; + + @state() + protected classUploadList = EMPTY_CLASS; + + @state() + protected classStartFrom = EMPTY_CLASS; + private handleModalOpen?: ModalCb; private handleModalClose?: ModalCb; + private _getInitActivity(): string { + return (this.getCssData('--cfg-init-activity') as string | undefined) || LitActivityBlock.activities.START_FROM; + } 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, - }); + 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 { 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; } } @@ -79,33 +79,26 @@ export class FileUploaderMinimal extends SolutionBlock { 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; } }); @@ -126,10 +119,10 @@ 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; } }); }); @@ -145,41 +138,53 @@ export class FileUploaderMinimal extends SolutionBlock { this.modalManager?.subscribe(ModalEvents.CLOSE, this.handleModalClose); } - override destroyCallback(): void { - super.destroyCallback(); + override disconnectedCallback(): void { + super.disconnectedCallback(); this.modalManager?.unsubscribe(ModalEvents.OPEN, this.handleModalOpen); this.modalManager?.unsubscribe(ModalEvents.CLOSE, this.handleModalClose); } -} -FileUploaderMinimal.template = html` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; + override render() { + return html` + ${super.render()} + + ${this.l10n('choose-file')} + + + + + + + + + + + + + + + + + + + + + + + + + + + + `; + } +} diff --git a/src/solutions/file-uploader/regular/FileUploaderRegular.ts b/src/solutions/file-uploader/regular/FileUploaderRegular.ts index 379b1fc6a..ebc0221d5 100644 --- a/src/solutions/file-uploader/regular/FileUploaderRegular.ts +++ b/src/solutions/file-uploader/regular/FileUploaderRegular.ts @@ -1,28 +1,27 @@ -import { html } from '@symbiotejs/symbiote'; -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 { +export class FileUploaderRegular extends LitSolutionBlock { static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-regular']; + @property({ type: Boolean }) + headless = false; + constructor() { super(); - const initialState: FileUploaderRegularInitState = { + this.init$ = { ...this.init$, - isHidden: false, '*solution': this.tagName, - }; - - this.init$ = initialState; + } as FileUploaderRegularInitState; } override initCallback(): void { @@ -31,21 +30,18 @@ export class FileUploaderRegular extends SolutionBlock { this.telemetryManager.sendEvent({ eventType: InternalEventType.INIT_SOLUTION, }); - - this.defineAccessor('headless', (value: unknown) => { - this.set$({ isHidden: asBoolean(value) }); - }); } -} -FileUploaderRegular.template = html` - + override render() { + return html` + ${super.render()} + - + @@ -70,8 +66,5 @@ FileUploaderRegular.template = html` `; - -FileUploaderRegular.bindAttributes({ - // @ts-expect-error TODO: fix types inside symbiote - headless: null, -}); + } +} From f8fda7115ac0c728885d2ea3e4dc7e4abc33126c Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:54:34 +0300 Subject: [PATCH 11/60] refactor(img): rewrite uc-img components to TypeScript - Convert Img.js to Img.ts - Convert ImgBase.js to ImgBase.ts with proper typing - Convert ImgConfig.js to ImgConfig.ts - Add demo/img.html demo page --- demo/img.html | 27 ++ src/blocks/Img/{Img.js => Img.ts} | 6 +- src/blocks/Img/ImgBase.js | 408 -------------------- src/blocks/Img/ImgBase.ts | 386 ++++++++++++++++++ src/blocks/Img/ImgConfig.js | 102 ----- src/blocks/Img/ImgConfig.ts | 137 +++++++ src/blocks/Img/test.css | 16 - src/blocks/Img/utils/parseObjectToString.ts | 2 +- 8 files changed, 554 insertions(+), 530 deletions(-) create mode 100644 demo/img.html rename src/blocks/Img/{Img.js => Img.ts} (72%) delete mode 100644 src/blocks/Img/ImgBase.js create mode 100644 src/blocks/Img/ImgBase.ts delete mode 100644 src/blocks/Img/ImgConfig.js create mode 100644 src/blocks/Img/ImgConfig.ts delete mode 100644 src/blocks/Img/test.css diff --git a/demo/img.html b/demo/img.html new file mode 100644 index 000000000..ff8571d25 --- /dev/null +++ b/demo/img.html @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/src/blocks/Img/Img.js b/src/blocks/Img/Img.ts similarity index 72% rename from src/blocks/Img/Img.js rename to src/blocks/Img/Img.ts index 6251a06fb..ff1863801 100644 --- a/src/blocks/Img/Img.js +++ b/src/blocks/Img/Img.ts @@ -1,8 +1,8 @@ import { ImgBase } from './ImgBase.js'; export class Img extends ImgBase { - initCallback() { - super.initCallback(); + override connectedCallback(): void { + super.connectedCallback(); this.sub$$('src', () => { this.init(); @@ -12,7 +12,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..8c1fada55 --- /dev/null +++ b/src/blocks/Img/ImgBase.ts @@ -0,0 +1,386 @@ +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 { + protected _img: HTMLImageElement = new Image(); + protected _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?.trim() !== '') { + const ensuredSize = size as string; + const numericPart = ensuredSize.match(/\d+/)![0]; + const alphabeticPart = ensuredSize.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; + } + + 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); + } + } + + get img(): HTMLImageElement { + if (!this.hasPreviewImage) { + this._setupConfigForImage({ elNode: this._img }); + this.appendChild(this._img); + } + return this._img; + } + + get currentImg(): CurrentImg { + return this.hasPreviewImage + ? { + type: ImgTypeEnum.PREVIEW as ImgType, + img: this._imgPreview, + } + : { + type: ImgTypeEnum.MAIN as ImgType, + img: this.img, + }; + } + + get hasPreviewImage(): string | number | boolean | undefined { + return this.$$('is-preview-blur') as string | number | boolean | undefined; + } + + get bgSelector(): string | undefined { + return this.$$('is-background-for') as string | undefined; + } + + 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; + } + } + + get hasFormatJPG(): boolean { + return (this.$$('format') as string).toLowerCase() === 'jpeg'; + } + + 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); + } + + 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(); + } + + getSrc(): string | undefined { + return this._getUrlBase(); + } + + get srcUrlPreview(): string | undefined { + return this._getUrlBase('100x', '100'); + } + + 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); + } + + 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, + }); + }); + } + + 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 (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(): 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 2bdcde4b4..000000000 --- a/src/blocks/Img/ImgConfig.js +++ /dev/null @@ -1,102 +0,0 @@ -import { PubSub, Symbiote } 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 Symbiote { - 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; - } - PubSub.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..7d95d3e87 --- /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; + + override createRenderRoot(): HTMLElement | ShadowRoot { + return this; + } + + 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 || ''; + } + } + + $$(key: string): unknown { + return this._state[CSS_PREF + key]; + } + + 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); + } + } + + 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); + }); + } + } + + analyticsParams(): string { + return `-/@clib/${PACKAGE_NAME}/${PACKAGE_VERSION}/uc-img/`; + } + + 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); + } + }); + } + + 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); + } + + 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; + } + } + } + + override disconnectedCallback(): void { + super.disconnectedCallback(); + if (this._isnObserver) { + this._observed?.forEach((el) => { + this._isnObserver?.unobserve(el); + }); + this._isnObserver = null; + } + this._subscribers.clear(); + } + + static override get observedAttributes(): string[] { + return Object.keys(PROPS_MAP); + } + + 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) From 5942e622fa7100ad76cb778560e6bd6c17268d84 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:54:55 +0300 Subject: [PATCH 12/60] chore(locales): convert locale files from JS to TS - Rename all locale files from .js to .ts --- src/locales/file-uploader/{ar.js => ar.ts} | 0 src/locales/file-uploader/{az.js => az.ts} | 0 src/locales/file-uploader/{ca.js => ca.ts} | 0 src/locales/file-uploader/{cs.js => cs.ts} | 0 src/locales/file-uploader/{da.js => da.ts} | 0 src/locales/file-uploader/{de.js => de.ts} | 0 src/locales/file-uploader/{el.js => el.ts} | 0 src/locales/file-uploader/{en.js => en.ts} | 0 src/locales/file-uploader/{es.js => es.ts} | 0 src/locales/file-uploader/{et.js => et.ts} | 0 src/locales/file-uploader/{fi.js => fi.ts} | 0 src/locales/file-uploader/{fr.js => fr.ts} | 0 src/locales/file-uploader/{he.js => he.ts} | 0 src/locales/file-uploader/{hy.js => hy.ts} | 0 src/locales/file-uploader/{is.js => is.ts} | 0 src/locales/file-uploader/{it.js => it.ts} | 0 src/locales/file-uploader/{ja.js => ja.ts} | 0 src/locales/file-uploader/{ka.js => ka.ts} | 0 src/locales/file-uploader/{kk.js => kk.ts} | 0 src/locales/file-uploader/{ko.js => ko.ts} | 0 src/locales/file-uploader/{lv.js => lv.ts} | 0 src/locales/file-uploader/{nb.js => nb.ts} | 0 src/locales/file-uploader/{nl.js => nl.ts} | 0 src/locales/file-uploader/{pl.js => pl.ts} | 0 src/locales/file-uploader/{pt.js => pt.ts} | 0 src/locales/file-uploader/{ro.js => ro.ts} | 0 src/locales/file-uploader/{ru.js => ru.ts} | 0 src/locales/file-uploader/{sk.js => sk.ts} | 0 src/locales/file-uploader/{sr.js => sr.ts} | 0 src/locales/file-uploader/{sv.js => sv.ts} | 0 src/locales/file-uploader/{tr.js => tr.ts} | 0 src/locales/file-uploader/{uk.js => uk.ts} | 0 src/locales/file-uploader/{vi.js => vi.ts} | 0 src/locales/file-uploader/{zh-TW.js => zh-TW.ts} | 0 src/locales/file-uploader/{zh.js => zh.ts} | 0 35 files changed, 0 insertions(+), 0 deletions(-) rename src/locales/file-uploader/{ar.js => ar.ts} (100%) rename src/locales/file-uploader/{az.js => az.ts} (100%) rename src/locales/file-uploader/{ca.js => ca.ts} (100%) rename src/locales/file-uploader/{cs.js => cs.ts} (100%) rename src/locales/file-uploader/{da.js => da.ts} (100%) rename src/locales/file-uploader/{de.js => de.ts} (100%) rename src/locales/file-uploader/{el.js => el.ts} (100%) rename src/locales/file-uploader/{en.js => en.ts} (100%) rename src/locales/file-uploader/{es.js => es.ts} (100%) rename src/locales/file-uploader/{et.js => et.ts} (100%) rename src/locales/file-uploader/{fi.js => fi.ts} (100%) rename src/locales/file-uploader/{fr.js => fr.ts} (100%) rename src/locales/file-uploader/{he.js => he.ts} (100%) rename src/locales/file-uploader/{hy.js => hy.ts} (100%) rename src/locales/file-uploader/{is.js => is.ts} (100%) rename src/locales/file-uploader/{it.js => it.ts} (100%) rename src/locales/file-uploader/{ja.js => ja.ts} (100%) rename src/locales/file-uploader/{ka.js => ka.ts} (100%) rename src/locales/file-uploader/{kk.js => kk.ts} (100%) rename src/locales/file-uploader/{ko.js => ko.ts} (100%) rename src/locales/file-uploader/{lv.js => lv.ts} (100%) rename src/locales/file-uploader/{nb.js => nb.ts} (100%) rename src/locales/file-uploader/{nl.js => nl.ts} (100%) rename src/locales/file-uploader/{pl.js => pl.ts} (100%) rename src/locales/file-uploader/{pt.js => pt.ts} (100%) rename src/locales/file-uploader/{ro.js => ro.ts} (100%) rename src/locales/file-uploader/{ru.js => ru.ts} (100%) rename src/locales/file-uploader/{sk.js => sk.ts} (100%) rename src/locales/file-uploader/{sr.js => sr.ts} (100%) rename src/locales/file-uploader/{sv.js => sv.ts} (100%) rename src/locales/file-uploader/{tr.js => tr.ts} (100%) rename src/locales/file-uploader/{uk.js => uk.ts} (100%) rename src/locales/file-uploader/{vi.js => vi.ts} (100%) rename src/locales/file-uploader/{zh-TW.js => zh-TW.ts} (100%) rename src/locales/file-uploader/{zh.js => zh.ts} (100%) 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 From fb9edc483337f0bbdcb68eb28cc06b8405a8615b Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:55:22 +0300 Subject: [PATCH 13/60] refactor(abstract): update managers and utilities for Lit compatibility - Update CTX for Lit integration - Update TypedData change detection - Update UploaderPublicApi for Lit components - Update LocaleManager for Lit template binding - Update ModalManager, SecureUploadsManager, TelemetryManager - Update ValidationManager - Update a11y utilities - Update WindowHeightTracker --- src/abstract/CTX.ts | 8 +-- src/abstract/TypedData.ts | 6 +- src/abstract/UploaderPublicApi.ts | 36 ++++++------ src/abstract/buildOutputCollectionState.ts | 4 +- src/abstract/defineComponents.ts | 2 +- src/abstract/managers/LocaleManager.ts | 56 +------------------ src/abstract/managers/ModalManager.ts | 8 +-- src/abstract/managers/SecureUploadsManager.ts | 6 +- src/abstract/managers/TelemetryManager.ts | 6 +- src/abstract/managers/ValidationManager.ts | 10 ++-- src/abstract/managers/a11y.ts | 4 +- src/utils/WindowHeightTracker.ts | 10 ++-- 12 files changed, 56 insertions(+), 100 deletions(-) diff --git a/src/abstract/CTX.ts b/src/abstract/CTX.ts index 91bbdd4ec..cdd90be69 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': {}, @@ -22,7 +22,7 @@ export const activityBlockCtx = (fnCtx: Block) => ({ }, }); -export const uploaderBlockCtx = (fnCtx: Block) => ({ +export const uploaderBlockCtx = (fnCtx: LitBlock) => ({ ...activityBlockCtx(fnCtx), '*commonProgress': 0, '*uploadList': [], @@ -34,7 +34,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/TypedData.ts b/src/abstract/TypedData.ts index 313ca6e55..be961fce0 100644 --- a/src/abstract/TypedData.ts +++ b/src/abstract/TypedData.ts @@ -58,15 +58,17 @@ export class TypedData { } const pDesc = this.__typedSchema[prop]; + const isChanged = this.__data.read(prop) !== value; 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) { + if (isChanged && (isMatchConstructorType || isMatchInstanceType || isMatchNullable)) { this.__data.pub(prop, value); return; + } else if (isChanged) { + console.warn(MSG_TYPE + prop); } - console.warn(MSG_TYPE + prop); } setMultipleValues(updObj: Partial>): void { diff --git a/src/abstract/UploaderPublicApi.ts b/src/abstract/UploaderPublicApi.ts index c7a2cec9c..39559ac4a 100644 --- a/src/abstract/UploaderPublicApi.ts +++ b/src/abstract/UploaderPublicApi.ts @@ -5,6 +5,14 @@ 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 type { OutputCollectionState, OutputCollectionStatus, @@ -24,10 +32,7 @@ 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 = { @@ -37,9 +42,9 @@ export type ApiAddFileCommonOptions = { }; export class UploaderPublicApi { - private _ctx: UploaderBlock; + private _ctx: LitUploaderBlock; - constructor(ctx: UploaderBlock) { + constructor(ctx: LitUploaderBlock) { this._ctx = ctx; } @@ -212,8 +217,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(); }, { @@ -235,7 +240,6 @@ export class UploaderPublicApi { getOutputItem(entryId: string): OutputFileEntry { const uploadEntryData = PubSub.getCtx(entryId).store as UploadEntryData; - const fileInfo = uploadEntryData.fileInfo as UploadcareFile | null; const status: OutputFileEntry['status'] = uploadEntryData.isRemoved @@ -282,9 +286,9 @@ export class UploaderPublicApi { initFlow = (force = false): void => { if (this._uploadCollection.size > 0 && !force) { - this._ctx.modalManager?.open(ActivityBlock.activities.UPLOAD_LIST); + this._ctx.modalManager?.open(LitActivityBlock.activities.UPLOAD_LIST); this._ctx.set$({ - '*currentActivity': ActivityBlock.activities.UPLOAD_LIST, + '*currentActivity': LitActivityBlock.activities.UPLOAD_LIST, }); } else { if (this._sourceList?.length === 1) { @@ -292,7 +296,7 @@ export class UploaderPublicApi { // 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; } @@ -302,7 +306,7 @@ export class UploaderPublicApi { if (isPhotoEnabled && isVideoRecordingEnabled) { this._ctx.set$({ - '*currentActivity': ActivityBlock.activities.START_FROM, + '*currentActivity': LitActivityBlock.activities.START_FROM, }); return; } else if (isPhotoEnabled || isVideoRecordingEnabled) { @@ -319,8 +323,8 @@ export class UploaderPublicApi { } } - const blocksRegistry = this._ctx.$['*blocksRegistry'] as Set; - const isSourceBtn = (block: Block): block is SourceBtn => + const blocksRegistry = this._ctx.$['*blocksRegistry'] as Set; + 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,9 +335,9 @@ export class UploaderPublicApi { } } else { // Multiple sources case: - this._ctx.modalManager?.open(ActivityBlock.activities.START_FROM); + this._ctx.modalManager?.open(LitActivityBlock.activities.START_FROM); this._ctx.set$({ - '*currentActivity': ActivityBlock.activities.START_FROM, + '*currentActivity': LitActivityBlock.activities.START_FROM, }); } } diff --git a/src/abstract/buildOutputCollectionState.ts b/src/abstract/buildOutputCollectionState.ts index 0f7ae0352..bfb8b622b 100644 --- a/src/abstract/buildOutputCollectionState.ts +++ b/src/abstract/buildOutputCollectionState.ts @@ -1,3 +1,4 @@ +import type { LitUploaderBlock } from '../lit/LitUploaderBlock'; import type { GroupFlag, OutputCollectionState, @@ -8,7 +9,6 @@ import type { } 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,7 +31,7 @@ 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 = { diff --git a/src/abstract/defineComponents.ts b/src/abstract/defineComponents.ts index d28768ada..210db35a0 100644 --- a/src/abstract/defineComponents.ts +++ b/src/abstract/defineComponents.ts @@ -1,4 +1,4 @@ -const EXCLUDE_COMPONENTS = ['Symbiote', 'BaseComponent', 'UploaderBlock', 'ActivityBlock', 'Block', 'SolutionBlock']; +const EXCLUDE_COMPONENTS = ['UploaderBlock', 'ActivityBlock', 'Block', 'SolutionBlock']; // biome-ignore lint/suspicious/noExplicitAny: Type is used to represent any class export function defineComponents(blockExports: Record) { diff --git a/src/abstract/managers/LocaleManager.ts b/src/abstract/managers/LocaleManager.ts index 7c0bee448..787e6350b 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 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) { + 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..5c4dd43e6 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) { + constructor(block: LitBlock) { this._block = block; } diff --git a/src/abstract/managers/SecureUploadsManager.ts b/src/abstract/managers/SecureUploadsManager.ts index 6f32a9690..95bf45493 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) { + constructor(block: LitUploaderBlock) { this._block = block; } diff --git a/src/abstract/managers/TelemetryManager.ts b/src/abstract/managers/TelemetryManager.ts index fe338c7ba..1fbd05982 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; @@ -22,13 +22,13 @@ type TelemetryEventBody = Partial> & export class TelemetryManager { 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) { + constructor(block: LitBlock) { this._block = block; this._telemetryInstance = new TelemetryAPIService(); this._queue = new Queue(10); diff --git a/src/abstract/managers/ValidationManager.ts b/src/abstract/managers/ValidationManager.ts index 4c522cfee..073d1e482 100644 --- a/src/abstract/managers/ValidationManager.ts +++ b/src/abstract/managers/ValidationManager.ts @@ -1,5 +1,6 @@ import { Queue } from '@uploadcare/upload-client'; import { EventType } from '../../blocks/UploadCtxProvider/EventEmitter'; +import type { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import type { OutputCollectionErrorType, OutputCollectionState, @@ -23,7 +24,6 @@ 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'; export type FuncFileValidator = ( @@ -59,7 +59,7 @@ const getValidatorDescriptor = (validator: FileValidator): FileValidatorDescript }; export class ValidationManager { - private _blockInstance: UploaderBlock; + private _blockInstance: LitUploaderBlock; private _uploadCollection: TypedCollection; @@ -87,15 +87,15 @@ export class ValidationManager { } > = new Map(); - constructor(blockInstance: UploaderBlock) { + constructor(blockInstance: LitUploaderBlock) { this._blockInstance = blockInstance; this._uploadCollection = this._blockInstance.uploadCollection; - const runAllValidators = () => { + const runAllValidators = debounce(() => { this.runFileValidators('change'); this.runCollectionValidators(); - }; + }, 0); this._blockInstance.subConfigValue('maxLocalFileSizeBytes', runAllValidators); this._blockInstance.subConfigValue('multipleMin', runAllValidators); diff --git a/src/abstract/managers/a11y.ts b/src/abstract/managers/a11y.ts index b19a740d4..7acc6a622 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. @@ -78,7 +78,7 @@ export class A11y { ]); } - registerBlock(scope: Block): void { + registerBlock(scope: LitBlock): void { this._scopedWindow.registerScope(scope); } diff --git a/src/utils/WindowHeightTracker.ts b/src/utils/WindowHeightTracker.ts index 5e26563a8..ebbd63708 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 { + static registerClient(client: LitBlock): void { if (WindowHeightTracker.clientsRegistry.size === 0) { WindowHeightTracker.attachTracker(); } WindowHeightTracker.clientsRegistry.add(client); } - static unregisterClient(client: Block): void { + static unregisterClient(client: LitBlock): void { WindowHeightTracker.clientsRegistry.delete(client); if (WindowHeightTracker.clientsRegistry.size === 0) { WindowHeightTracker.detachTracker(); From f9c7b88892b5bd088a43d37b4530a2db97b78a77 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:55:44 +0300 Subject: [PATCH 14/60] refactor: update exports and imports for Lit migration - Update src/index.ts with new Lit-based exports - Update adaptive-image solution imports --- src/index.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/index.ts b/src/index.ts index 48dd08fcd..87e396b51 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,19 +1,12 @@ import './blocks/themes/uc-basic/index.css'; // Symbiote.js -export { PubSub, PubSub as Data, Symbiote, Symbiote as BaseComponent, UID } from '@symbiotejs/symbiote'; -export { ActivityBlock } from './abstract/ActivityBlock'; - -// Abstract: -export { Block } from './abstract/Block'; - +export { PubSub as Data, PubSub, UID } from '@symbiotejs/symbiote'; // 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'; @@ -42,6 +35,11 @@ export { UploadList } from './blocks/UploadList/UploadList'; export { UrlSource } from './blocks/UrlSource/UrlSource'; // Other export * from './env'; +export { LitActivityBlock as ActivityBlock } from './lit/LitActivityBlock'; +// Abstract: +export { LitBlock as Block } from './lit/LitBlock'; +export { LitSolutionBlock as SolutionBlock } from './lit/LitSolutionBlock'; +export { LitUploaderBlock as UploaderBlock } from './lit/LitUploaderBlock'; export { CloudImageEditor } from './solutions/cloud-image-editor/CloudImageEditor'; export { FileUploaderInline } from './solutions/file-uploader/inline/FileUploaderInline'; export { FileUploaderMinimal } from './solutions/file-uploader/minimal/FileUploaderMinimal'; From 9ec479935c5ddb6e60bafd8e8bd528a1a194368d Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:56:29 +0300 Subject: [PATCH 15/60] chore: update dependencies and build config for Lit - Add Lit dependencies to package.json - Update biome.json configuration - Update tsconfig files for TypeScript locale files - Update vite.config.js --- biome.json | 10 +- package-lock.json | 256 ++++++++++++++++++----------------------- package.json | 18 +-- tsconfig.app.json | 6 +- tsconfig.e2e-test.json | 6 +- tsconfig.test.json | 4 +- vite.config.js | 3 +- 7 files changed, 143 insertions(+), 160 deletions(-) diff --git a/biome.json b/biome.json index 6b39fed7f..3cbb5b2f2 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.6/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -55,5 +55,11 @@ } } } - ] + ], + "html": { + "experimentalFullSupportEnabled": true, + "formatter": { + "enabled": true + } + } } diff --git a/package-lock.json b/package-lock.json index 6fb59d033..d0c7a12fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,27 +9,30 @@ "version": "1.24.5", "license": "MIT", "dependencies": { + "@lit/context": "^1.1.6", "@symbiotejs/symbiote": "^2.3.3", "@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" }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.3.3", + "@biomejs/biome": "2.3.6", "@biomejs/js-api": "^4.0.0", - "@biomejs/wasm-nodejs": "^2.3.3", + "@biomejs/wasm-nodejs": "^2.3.6", "@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": "^24", - "@types/react": "^19.2.2", + "@types/react": "^18.0.0", "@types/svg-sprite": "^0.0.39", - "@vitest/browser": "^4.0.7", - "@vitest/coverage-v8": "^4.0.7", + "@vitest/browser": "^4.0.14", + "@vitest/browser-playwright": "^4.0.14", + "@vitest/coverage-v8": "^4.0.14", "esbuild": "^0.25.12", "husky": "^9.1.7", "lint-staged": "^16.2.6", @@ -52,7 +55,8 @@ "tsx": "^4.20.6", "typescript": "^5.9.3", "vite": "npm:rolldown-vite@latest", - "vitest": "^4.0.7" + "vitest": "^4.0.14", + "vitest-browser-lit": "^1.0.1" } }, "node_modules/@andrewbranch/untar.js": { @@ -239,9 +243,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.3.tgz", - "integrity": "sha512-zn/P1pRBCpDdhi+VNSMnpczOz9DnqzOA2c48K8xgxjDODvi5O8gs3a2H233rck/5HXpkFj6TmyoqVvxirZUnvg==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.6.tgz", + "integrity": "sha512-oqUhWyU6tae0MFsr/7iLe++QWRg+6jtUhlx9/0GmCWDYFFrK366sBLamNM7D9Y+c7YSynUFKr8lpEp1r6Sk7eA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -255,20 +259,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.3", - "@biomejs/cli-darwin-x64": "2.3.3", - "@biomejs/cli-linux-arm64": "2.3.3", - "@biomejs/cli-linux-arm64-musl": "2.3.3", - "@biomejs/cli-linux-x64": "2.3.3", - "@biomejs/cli-linux-x64-musl": "2.3.3", - "@biomejs/cli-win32-arm64": "2.3.3", - "@biomejs/cli-win32-x64": "2.3.3" + "@biomejs/cli-darwin-arm64": "2.3.6", + "@biomejs/cli-darwin-x64": "2.3.6", + "@biomejs/cli-linux-arm64": "2.3.6", + "@biomejs/cli-linux-arm64-musl": "2.3.6", + "@biomejs/cli-linux-x64": "2.3.6", + "@biomejs/cli-linux-x64-musl": "2.3.6", + "@biomejs/cli-win32-arm64": "2.3.6", + "@biomejs/cli-win32-x64": "2.3.6" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.3.tgz", - "integrity": "sha512-5+JtW6RKmjqL9un0UtHV0ezOslAyYBzyl5ZhYiu7GHesX2x8NCDl6tXYrenv9m7e1RLbkO5E5Kh04kseMtz6lw==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.6.tgz", + "integrity": "sha512-P4JWE5d8UayBxYe197QJwyW4ZHp0B+zvRIGCusOm1WbxmlhpAQA1zEqQuunHgSIzvyEEp4TVxiKGXNFZPg7r9Q==", "cpu": [ "arm64" ], @@ -282,125 +286,6 @@ "node": ">=14.21.3" } }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.3.tgz", - "integrity": "sha512-UPmKRalkHicvIpeccuKqq+/gA2HYV8FUnAEDJnqYBlGlycKqe6xrovWqvWTE4TTNpIFf4UQyuaDzLkN6Kz6tbA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.3.tgz", - "integrity": "sha512-zeiKwALNB/hax7+LLhCYqhqzlWdTfgE9BGkX2Z8S4VmCYnGFrf2fON/ec6KCos7mra5MDm6fYICsEWN2+HKZhw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.3.tgz", - "integrity": "sha512-KhCDMV+V7Yu72v40ssGJTHuv/j0n7JQ6l0s/c+EMcX5zPYLMLr4XpmI+WXhp4Vfkz0T5Xnh5wbrTBI3f2UTpjQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.3.tgz", - "integrity": "sha512-05CjPLbvVVU8J6eaO6iSEoA0FXKy2l6ddL+1h/VpiosCmIp3HxRKLOa1hhC1n+D13Z8g9b1DtnglGtM5U3sTag==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.3.tgz", - "integrity": "sha512-IyqQ+jYzU5MVy9CK5NV0U+NnUMPUAhYMrB/x4QgL/Dl1MqzBVc61bHeyhLnKM6DSEk73/TQYrk/8/QmVHudLdQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.3.tgz", - "integrity": "sha512-NtlLs3pdFqFAQYZjlEHKOwJEn3GEaz7rtR2oCrzaLT2Xt3Cfd55/VvodQ5V+X+KepLa956QJagckJrNL+DmumQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.3.tgz", - "integrity": "sha512-klJKPPQvUk9Rlp0Dd56gQw/+Wt6uUprHdHWtbDC93f3Iv+knA2tLWpcYoOZJgPV+9s+RBmYv0DGy4mUlr20esg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, "node_modules/@biomejs/js-api": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@biomejs/js-api/-/js-api-4.0.0.tgz", @@ -797,6 +682,30 @@ "dev": true, "license": "MIT" }, + "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/@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": { + "@lit/reactive-element": "^1.6.2 || ^2.1.0" + } + }, + "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": { + "@lit-labs/ssr-dom-shim": "^1.4.0" + } + }, "node_modules/@loaderkit/resolve": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@loaderkit/resolve/-/resolve-1.0.4.tgz", @@ -1964,13 +1873,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/prop-types": { + "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": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "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.2.2" } }, @@ -1993,6 +1910,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", @@ -2071,8 +1994,6 @@ "integrity": "sha512-rUvyz6wX6wDjcYzf/7fgXYfca2bAu0Axoq/v9LYdELzcBSS9UKjnZ7MaMY4UDP78HHHCdmdtceuSao1s51ON8A==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@vitest/browser": "4.0.14", "@vitest/mocker": "4.0.14", @@ -6971,6 +6892,37 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "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": { + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" + } + }, + "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": { + "@lit-labs/ssr-dom-shim": "^1.4.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" + } + }, + "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": { + "@types/trusted-types": "^2.0.2" + } + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -12303,6 +12255,20 @@ } } }, + "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, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "lit": ">3.0.0", + "vitest": ">=4.0.0" + } + }, "node_modules/vitest/node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", diff --git a/package.json b/package.json index 82eeab437..749a5df7d 100644 --- a/package.json +++ b/package.json @@ -110,18 +110,19 @@ }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.3.3", + "@biomejs/biome": "2.3.6", "@biomejs/js-api": "^4.0.0", - "@biomejs/wasm-nodejs": "^2.3.3", + "@biomejs/wasm-nodejs": "^2.3.6", "@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": "^24", - "@types/react": "^19.2.2", + "@types/react": "^18.0.0", "@types/svg-sprite": "^0.0.39", - "@vitest/browser": "^4.0.7", - "@vitest/coverage-v8": "^4.0.7", + "@vitest/browser": "^4.0.14", + "@vitest/browser-playwright": "^4.0.14", + "@vitest/coverage-v8": "^4.0.14", "esbuild": "^0.25.12", "husky": "^9.1.7", "lint-staged": "^16.2.6", @@ -144,17 +145,20 @@ "tsx": "^4.20.6", "typescript": "^5.9.3", "vite": "npm:rolldown-vite@latest", - "vitest": "^4.0.7" + "vitest": "^4.0.14", + "vitest-browser-lit": "^1.0.1" }, "author": "Uploadcare Inc.", "license": "MIT", "dependencies": { + "@lit/context": "^1.1.6", "@symbiotejs/symbiote": "^2.3.3", "@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" }, "size-limit": [ { 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.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/vite.config.js b/vite.config.js index 496185553..5fbd1ef87 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,5 +1,6 @@ import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; +import { playwright } from '@vitest/browser-playwright'; import { defineConfig } from 'vite'; import { commands } from './tests/utils/commands'; @@ -43,7 +44,7 @@ export default defineConfig(({ command }) => { }, browser: { enabled: true, - provider: 'playwright', + provider: playwright(), instances: [ { browser: 'chromium', From 53c6dc76761030b55275aced9bf135483794b9b0 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:56:53 +0300 Subject: [PATCH 16/60] test: update test files for Lit migration - Update e2e tests for Lit-based components - Update test utilities - Update test-locales script for .ts locale files --- scripts/test-locales.ts | 4 +-- tests/api.e2e.test.tsx | 2 +- tests/bundles.e2e.test.tsx | 2 +- tests/config.e2e.test.tsx | 2 +- tests/file-uploader-regular.e2e.test.tsx | 2 +- tests/utils/commands.ts | 2 +- tests/utils/test-renderer.tsx | 4 +-- tests/validation.e2e.test.tsx | 42 +++++++++++++----------- 8 files changed, 32 insertions(+), 28 deletions(-) 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/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..5f16dabda 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({ @@ -554,7 +555,7 @@ describe('File errors API', () => { .toEqual(expect.arrayContaining([expect.objectContaining>({ type: 'UPLOAD_ERROR' })])); }); - it('should toggle errors in the `errors` property of the file on file change', async () => { + it.only('should toggle errors in the `errors` property of the file on file change', async () => { const config = page.getByTestId('uc-config').query()! as Config; const customValidator = vi.fn((entry) => { if (entry.cdnUrlModifiers?.includes('mirror')) { @@ -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(() => { From 74f17181e667a1feb210a2fc89da3a1e2dd6275a Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 17:57:15 +0300 Subject: [PATCH 17/60] chore(demo): update demo files for Lit migration - Update cloud-image-editor.html demo - Update locales.html demo - Update raw-regular.html demo - Update validators.html demo --- demo/cloud-image-editor.html | 4 ++-- demo/locales.html | 2 +- demo/raw-regular.html | 2 +- demo/validators.html | 11 ++--------- 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/demo/cloud-image-editor.html b/demo/cloud-image-editor.html index e940af5ea..6b51d338c 100644 --- a/demo/cloud-image-editor.html +++ b/demo/cloud-image-editor.html @@ -19,11 +19,11 @@ - + diff --git a/demo/locales.html b/demo/locales.html index 408bc7bc3..562f97503 100644 --- a/demo/locales.html +++ b/demo/locales.html @@ -22,7 +22,7 @@ import '@/solutions/file-uploader/minimal/index.css'; import * as UC from '@/index.js'; - const locales = import.meta.glob('@/locales/file-uploader/*.js', { + const locales = import.meta.glob('@/locales/file-uploader/*.ts', { eager: true, }); diff --git a/demo/raw-regular.html b/demo/raw-regular.html index 0607ea5a0..d21db1b49 100644 --- a/demo/raw-regular.html +++ b/demo/raw-regular.html @@ -18,5 +18,5 @@ - + diff --git a/demo/validators.html b/demo/validators.html index 3b2bb0f49..b32ee8f5f 100644 --- a/demo/validators.html +++ b/demo/validators.html @@ -26,20 +26,13 @@ - + From 3e0db58d80156f55565fb7b55b98de4018078a8e Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 18:13:52 +0300 Subject: [PATCH 29/60] chore: apply linting fixes and remove unused imports - Update biome.json schema version and add unused import/variable rules - Remove unused imports from Config.ts, computed-properties.ts, Select.ts - Fix unused catch variable in ImgBase.ts - Fix CSS grid-gap to gap in camera-source.css - Apply formatting fixes to demo HTML files --- biome.json | 10 ++- demo/cloud-image-editor.html | 26 +++--- demo/custom-icons.html | 31 ++++--- demo/form.html | 33 ++++--- demo/index.html | 20 ++--- demo/locales.html | 89 +++++++++---------- demo/new-social-sources-test.html | 63 +++++++------ .../secure-delivery-proxy-url-resolver.html | 17 ++-- .../secure-delivery-proxy-url-template.html | 9 +- demo/raw-inline.html | 17 ++-- demo/raw-minimal.html | 17 ++-- demo/raw-regular.html | 17 ++-- demo/secure-uploads.html | 79 ++++++++-------- demo/upload-api.html | 80 ++++++++--------- demo/validators.html | 49 +++++----- index.html | 2 +- src/blocks/CameraSource/camera-source.css | 2 +- src/blocks/Config/Config.ts | 1 - src/blocks/Config/computed-properties.ts | 1 - src/blocks/Img/ImgBase.ts | 4 +- src/blocks/Select/Select.ts | 2 +- 21 files changed, 279 insertions(+), 290 deletions(-) diff --git a/biome.json b/biome.json index 3cbb5b2f2..4ff1201e0 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.3.6/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.8/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -26,6 +26,10 @@ }, "style": { "noInferrableTypes": "error" + }, + "correctness": { + "noUnusedVariables": "error", + "noUnusedImports": "error" } } }, @@ -38,8 +42,8 @@ "enabled": true, "actions": { "source": { - "organizeImports": "on", - "recommended": true + "recommended": true, + "organizeImports": "on" } } }, diff --git a/demo/cloud-image-editor.html b/demo/cloud-image-editor.html index 6b51d338c..1652a9a20 100644 --- a/demo/cloud-image-editor.html +++ b/demo/cloud-image-editor.html @@ -1,21 +1,21 @@ - - + diff --git a/demo/custom-icons.html b/demo/custom-icons.html index f589cf550..96dd6889c 100644 --- a/demo/custom-icons.html +++ b/demo/custom-icons.html @@ -1,27 +1,26 @@ - - - + + diff --git a/demo/form.html b/demo/form.html index 6f18b3a42..95d82ca6b 100644 --- a/demo/form.html +++ b/demo/form.html @@ -1,24 +1,23 @@ - - + @@ -35,10 +34,10 @@

Form Data

-
-
+
+
-
-
+
+
diff --git a/demo/index.html b/demo/index.html index 3aa879f82..7a8ca0568 100644 --- a/demo/index.html +++ b/demo/index.html @@ -1,8 +1,8 @@ diff --git a/demo/locales.html b/demo/locales.html index 562f97503..42d86af2c 100644 --- a/demo/locales.html +++ b/demo/locales.html @@ -1,46 +1,45 @@ - - - - + + + File Uploader locales diff --git a/demo/new-social-sources-test.html b/demo/new-social-sources-test.html index 5742fb267..a97a78892 100644 --- a/demo/new-social-sources-test.html +++ b/demo/new-social-sources-test.html @@ -1,43 +1,42 @@ - - + @@ -53,15 +52,15 @@
Options
diff --git a/demo/preview-proxy/secure-delivery-proxy-url-resolver.html b/demo/preview-proxy/secure-delivery-proxy-url-resolver.html index 9f1ff8284..904bed9bd 100644 --- a/demo/preview-proxy/secure-delivery-proxy-url-resolver.html +++ b/demo/preview-proxy/secure-delivery-proxy-url-resolver.html @@ -1,17 +1,16 @@ - - + diff --git a/demo/preview-proxy/secure-delivery-proxy-url-template.html b/demo/preview-proxy/secure-delivery-proxy-url-template.html index b33993474..292c27ac3 100644 --- a/demo/preview-proxy/secure-delivery-proxy-url-template.html +++ b/demo/preview-proxy/secure-delivery-proxy-url-template.html @@ -1,12 +1,11 @@ - - + diff --git a/demo/raw-inline.html b/demo/raw-inline.html index fd95dac80..9b93e2411 100644 --- a/demo/raw-inline.html +++ b/demo/raw-inline.html @@ -1,19 +1,18 @@ - - + diff --git a/demo/raw-minimal.html b/demo/raw-minimal.html index 533579cd0..f5f049ab7 100644 --- a/demo/raw-minimal.html +++ b/demo/raw-minimal.html @@ -1,19 +1,18 @@ - - + diff --git a/demo/raw-regular.html b/demo/raw-regular.html index d21db1b49..7e3a0b53d 100644 --- a/demo/raw-regular.html +++ b/demo/raw-regular.html @@ -1,19 +1,18 @@ - - + diff --git a/demo/secure-uploads.html b/demo/secure-uploads.html index 2df1c48b2..425037818 100644 --- a/demo/secure-uploads.html +++ b/demo/secure-uploads.html @@ -1,46 +1,45 @@ - - + diff --git a/demo/upload-api.html b/demo/upload-api.html index e10ca3019..9e954ab01 100644 --- a/demo/upload-api.html +++ b/demo/upload-api.html @@ -1,47 +1,45 @@ - - + @@ -52,10 +50,10 @@
Please select behaviour:
- + - +
diff --git a/demo/validators.html b/demo/validators.html index b32ee8f5f..2612e6051 100644 --- a/demo/validators.html +++ b/demo/validators.html @@ -1,27 +1,26 @@ - - + @@ -30,12 +29,12 @@ diff --git a/index.html b/index.html index 19490326e..01d408ee5 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ - + diff --git a/src/blocks/CameraSource/camera-source.css b/src/blocks/CameraSource/camera-source.css index f70837ea8..ce92430dc 100644 --- a/src/blocks/CameraSource/camera-source.css +++ b/src/blocks/CameraSource/camera-source.css @@ -54,7 +54,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; diff --git a/src/blocks/Config/Config.ts b/src/blocks/Config/Config.ts index dc5f5afa2..cc5f2c3b4 100644 --- a/src/blocks/Config/Config.ts +++ b/src/blocks/Config/Config.ts @@ -4,7 +4,6 @@ import type { ConfigComplexType, ConfigPlainType, ConfigType } from '../../types import { toKebabCase } from '../../utils/toKebabCase'; import { runAssertions } from './assertions'; import './config.css'; -import { LitElement } from 'lit'; import { LitBlock } from '../../lit/LitBlock'; import { computeProperty } from './computed-properties'; import { initialConfig } from './initialConfig'; 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/Img/ImgBase.ts b/src/blocks/Img/ImgBase.ts index 8c1fada55..b3941ebf5 100644 --- a/src/blocks/Img/ImgBase.ts +++ b/src/blocks/Img/ImgBase.ts @@ -336,7 +336,7 @@ export class ImgBase extends ImgConfig { } this.appendChild(this._img); - } catch (e) { + } catch { if (this.hasPreviewImage) { await this._imgPreview?.remove(); } @@ -368,7 +368,7 @@ export class ImgBase extends ImgConfig { } this.appendChild(this._img); - } catch (e) { + } catch { if (this.hasPreviewImage) { await this._imgPreview?.remove(); } diff --git a/src/blocks/Select/Select.ts b/src/blocks/Select/Select.ts index 200e35211..e4682b1aa 100644 --- a/src/blocks/Select/Select.ts +++ b/src/blocks/Select/Select.ts @@ -1,5 +1,5 @@ import { html } from 'lit'; -import { property, state } from 'lit/decorators.js'; +import { property } from 'lit/decorators.js'; import { LitBlock } from '../../lit/LitBlock'; import './select.css'; From a463157bcd30196d4a1dca7b9f2c15edc3dc1f63 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Thu, 4 Dec 2025 22:02:36 +0300 Subject: [PATCH 30/60] chore(demo): reorganize demo pages and add bundle demos - Reorganize demos into folders: solutions/, bundles/, features/, external-sources/ - Add new bundle demos that import from pre-built web/ directory - Add Lit Element based demo index with search and folder navigation - Add debug, quality-insights=false, and test-mode to all demo configs - Rename files to be more descriptive (e.g. raw-regular -> regular) --- demo/bundles/cloud-image-editor.html | 34 ++ demo/bundles/iife.html | 27 ++ demo/bundles/img.html | 37 ++ demo/bundles/inline.html | 33 ++ demo/bundles/minimal.html | 25 ++ demo/bundles/regular.html | 26 ++ .../secure-delivery-proxy-url-resolver.html | 2 +- .../secure-delivery-proxy-url-template.html | 3 + .../preview-proxy/secure-delivery-proxy.js | 0 .../secure-uploads.html | 2 +- .../social-sources.html} | 3 + demo/{ => features}/custom-icons.html | 2 +- .../form-integration.html} | 3 + demo/{ => features}/locales.html | 2 +- demo/{ => features}/upload-api.html | 2 +- demo/{ => features}/validators.html | 2 +- demo/index.html | 415 ++++++++++++++++-- demo/{ => solutions}/cloud-image-editor.html | 2 +- demo/{ => solutions}/img.html | 0 .../inline.html} | 3 + .../minimal.html} | 2 +- .../regular.html} | 2 +- 22 files changed, 592 insertions(+), 35 deletions(-) create mode 100644 demo/bundles/cloud-image-editor.html create mode 100644 demo/bundles/iife.html create mode 100644 demo/bundles/img.html create mode 100644 demo/bundles/inline.html create mode 100644 demo/bundles/minimal.html create mode 100644 demo/bundles/regular.html rename demo/{ => external-sources}/preview-proxy/secure-delivery-proxy-url-resolver.html (84%) rename demo/{ => external-sources}/preview-proxy/secure-delivery-proxy-url-template.html (92%) rename demo/{ => external-sources}/preview-proxy/secure-delivery-proxy.js (100%) rename demo/{ => external-sources}/secure-uploads.html (94%) rename demo/{new-social-sources-test.html => external-sources/social-sources.html} (97%) rename demo/{ => features}/custom-icons.html (87%) rename demo/{form.html => features/form-integration.html} (95%) rename demo/{ => features}/locales.html (96%) rename demo/{ => features}/upload-api.html (94%) rename demo/{ => features}/validators.html (94%) rename demo/{ => solutions}/cloud-image-editor.html (80%) rename demo/{ => solutions}/img.html (100%) rename demo/{raw-inline.html => solutions/inline.html} (92%) rename demo/{raw-minimal.html => solutions/minimal.html} (88%) rename demo/{raw-regular.html => solutions/regular.html} (82%) diff --git a/demo/bundles/cloud-image-editor.html b/demo/bundles/cloud-image-editor.html new file mode 100644 index 000000000..4161486f6 --- /dev/null +++ b/demo/bundles/cloud-image-editor.html @@ -0,0 +1,34 @@ + + + + + + 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..f60f6ff6a --- /dev/null +++ b/demo/bundles/minimal.html @@ -0,0 +1,25 @@ + + + + + + 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/preview-proxy/secure-delivery-proxy-url-resolver.html b/demo/external-sources/preview-proxy/secure-delivery-proxy-url-resolver.html similarity index 84% rename from demo/preview-proxy/secure-delivery-proxy-url-resolver.html rename to demo/external-sources/preview-proxy/secure-delivery-proxy-url-resolver.html index 904bed9bd..6888d0473 100644 --- a/demo/preview-proxy/secure-delivery-proxy-url-resolver.html +++ b/demo/external-sources/preview-proxy/secure-delivery-proxy-url-resolver.html @@ -15,5 +15,5 @@ - + 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 92% 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 292c27ac3..7f1a3a903 100644 --- a/demo/preview-proxy/secure-delivery-proxy-url-template.html +++ b/demo/external-sources/preview-proxy/secure-delivery-proxy-url-template.html @@ -14,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/secure-uploads.html b/demo/external-sources/secure-uploads.html similarity index 94% rename from demo/secure-uploads.html rename to demo/external-sources/secure-uploads.html index 425037818..c65e978dc 100644 --- a/demo/secure-uploads.html +++ b/demo/external-sources/secure-uploads.html @@ -44,5 +44,5 @@ - + diff --git a/demo/new-social-sources-test.html b/demo/external-sources/social-sources.html similarity index 97% rename from demo/new-social-sources-test.html rename to demo/external-sources/social-sources.html index a97a78892..39bf33040 100644 --- a/demo/new-social-sources-test.html +++ b/demo/external-sources/social-sources.html @@ -46,6 +46,9 @@ pubkey="demopublickey" source-list="dropbox, gphotos, gdrive" multiple="true" + debug + quality-insights="false" + test-mode > diff --git a/demo/custom-icons.html b/demo/features/custom-icons.html similarity index 87% rename from demo/custom-icons.html rename to demo/features/custom-icons.html index 96dd6889c..e32afce07 100644 --- a/demo/custom-icons.html +++ b/demo/features/custom-icons.html @@ -25,5 +25,5 @@ - + diff --git a/demo/form.html b/demo/features/form-integration.html similarity index 95% rename from demo/form.html rename to demo/features/form-integration.html index 95d82ca6b..a51d4747d 100644 --- a/demo/form.html +++ b/demo/features/form-integration.html @@ -28,6 +28,9 @@

Form Data

multiple-max="10" img-only group-output + debug + quality-insights="false" + test-mode >
diff --git a/demo/locales.html b/demo/features/locales.html similarity index 96% rename from demo/locales.html rename to demo/features/locales.html index 42d86af2c..5e3526f33 100644 --- a/demo/locales.html +++ b/demo/features/locales.html @@ -97,7 +97,7 @@ setMode('regular'); - +
diff --git a/demo/upload-api.html b/demo/features/upload-api.html similarity index 94% rename from demo/upload-api.html rename to demo/features/upload-api.html index 9e954ab01..b362f7334 100644 --- a/demo/upload-api.html +++ b/demo/features/upload-api.html @@ -44,7 +44,7 @@ - +
diff --git a/demo/validators.html b/demo/features/validators.html similarity index 94% rename from demo/validators.html rename to demo/features/validators.html index 2612e6051..10b41ebe4 100644 --- a/demo/validators.html +++ b/demo/features/validators.html @@ -25,7 +25,7 @@ - + + + + + + + Blocks Demo + + + + + + + diff --git a/demo/cloud-image-editor.html b/demo/solutions/cloud-image-editor.html similarity index 80% rename from demo/cloud-image-editor.html rename to demo/solutions/cloud-image-editor.html index 1652a9a20..ccca81ae2 100644 --- a/demo/cloud-image-editor.html +++ b/demo/solutions/cloud-image-editor.html @@ -19,7 +19,7 @@ - + diff --git a/demo/raw-minimal.html b/demo/solutions/minimal.html similarity index 88% rename from demo/raw-minimal.html rename to demo/solutions/minimal.html index f5f049ab7..55b912f8c 100644 --- a/demo/raw-minimal.html +++ b/demo/solutions/minimal.html @@ -17,4 +17,4 @@ - + diff --git a/demo/raw-regular.html b/demo/solutions/regular.html similarity index 82% rename from demo/raw-regular.html rename to demo/solutions/regular.html index 7e3a0b53d..289c842a1 100644 --- a/demo/raw-regular.html +++ b/demo/solutions/regular.html @@ -17,5 +17,5 @@ - + From cbc98e17369a69508d6c4fbcf3f1271603ee2b9e Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 11:51:40 +0300 Subject: [PATCH 31/60] chore: reorganize exports in index.ts and update version --- package.json | 2 +- src/index.ts | 42 +++++++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index ce714321d..438bdf9dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@uploadcare/file-uploader", - "version": "1.25.0-alpha.1", + "version": "1.24.5", "description": "Building blocks for Uploadcare products integration", "keywords": [ "web components", diff --git a/src/index.ts b/src/index.ts index 87e396b51..e71bc23ae 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,22 +1,16 @@ +/** biome-ignore-all assist/source/organizeImports: Order should be pretty */ import './blocks/themes/uc-basic/index.css'; // Symbiote.js export { PubSub as Data, PubSub, UID } from '@symbiotejs/symbiote'; + // 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 { 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'; +export { toKebabCase } from './utils/toKebabCase'; + // Blocks: export { Icon } from './blocks/Icon/Icon'; export { Img } from './blocks/Img/Img'; @@ -33,18 +27,32 @@ export { Thumb } from './blocks/Thumb/Thumb'; export { UploadCtxProvider } from './blocks/UploadCtxProvider/UploadCtxProvider'; export { UploadList } from './blocks/UploadList/UploadList'; export { UrlSource } from './blocks/UrlSource/UrlSource'; -// Other -export * from './env'; -export { LitActivityBlock as ActivityBlock } from './lit/LitActivityBlock'; +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'; +export { ExternalUploadSource, UploadSource } from './utils/UploadSource'; + // 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'; From 58829eb97b0ac3a01fc5398d72e8cc49215e2835 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 16:14:47 +0300 Subject: [PATCH 32/60] chore: update tsconfig.node.json types --- tsconfig.node.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.node.json b/tsconfig.node.json index 75446c972..f67bb03b4 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -8,7 +8,7 @@ "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"], "exclude": ["node_modules", "tests"] From fcfb9132fae3733398e0a88ded6b06cb2fdd7f75 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 16:16:42 +0300 Subject: [PATCH 33/60] fix: use unsafeSVG instead of unsafeHTML for SVG sprite --- src/lit/LitSolutionBlock.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lit/LitSolutionBlock.ts b/src/lit/LitSolutionBlock.ts index 3fc960f01..7bf035044 100644 --- a/src/lit/LitSolutionBlock.ts +++ b/src/lit/LitSolutionBlock.ts @@ -1,5 +1,5 @@ import { html } from 'lit'; -import { unsafeHTML } from 'lit/directives/unsafe-html.js'; +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'; @@ -14,6 +14,6 @@ export class LitSolutionBlock extends LitBlock { } override render() { - return html`${unsafeHTML(svgIconsSprite)}`; + return html`${unsafeSVG(svgIconsSprite)}`; } } From 2ee2cce6d531a3a433e6d2bc36f0712e7936f1fb Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 16:17:29 +0300 Subject: [PATCH 34/60] chore: add linked legal comments and include txt files in package --- package.json | 2 +- scripts/build.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 438bdf9dc..7eabd6be1 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" ], diff --git a/scripts/build.ts b/scripts/build.ts index 6d562c684..c834ca61f 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -70,6 +70,7 @@ async function build(buildItem: BuildItem) { options.conditions = ['browser']; options.mainFields = ['exports']; options.platform = 'browser'; + options.legalComments = 'linked'; }, noExternal: buildItem.bundleExternalDependencies ? Object.keys(dependencies) : undefined, globalName: buildItem.format === 'iife' ? 'UC' : undefined, From ce2b8f79c574e1427937c668431d1258d7f3d81e Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 16:18:02 +0300 Subject: [PATCH 35/60] chore: enable minification for dist build --- scripts/build-items.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-items.ts b/scripts/build-items.ts index d1dc4180d..4c5c2d43c 100644 --- a/scripts/build-items.ts +++ b/scripts/build-items.ts @@ -33,7 +33,7 @@ export const buildItems: BuildItem[] = [ ], outDir: outPath('./dist/'), format: 'esm', - minify: false, + minify: true, bundleExternalDependencies: false, }, // uc-blocks From 78729ed3882e8801f59ea47783d83649b64dc854 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 16:18:56 +0300 Subject: [PATCH 36/60] chore: add NODE_ENV=production for Lit production mode and bundle lit packages --- scripts/build.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/build.ts b/scripts/build.ts index c834ca61f..9446274f4 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -72,12 +72,15 @@ async function build(buildItem: BuildItem) { options.platform = 'browser'; options.legalComments = 'linked'; }, - noExternal: buildItem.bundleExternalDependencies ? Object.keys(dependencies) : undefined, + noExternal: buildItem.bundleExternalDependencies ? [...Object.keys(dependencies), /lit/] : undefined, globalName: buildItem.format === 'iife' ? 'UC' : undefined, keepNames: buildItem.format === 'iife' ? true : undefined, splitting: false, shims: false, dts: true, + env: { + NODE_ENV: 'production', + }, plugins: [ { name: 'minify-html-templates', From 6cd314646a252f538a286eaeedb6d9e4d5e8aefc Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 16:38:12 +0300 Subject: [PATCH 37/60] chore: use esbuild-minify-templates for HTML template minification --- package-lock.json | 62 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + scripts/build.ts | 41 +++---------------------------- 3 files changed, 67 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index e19efa3c1..4450fb3fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,7 @@ "@vitest/browser-playwright": "^4.0.14", "@vitest/coverage-v8": "^4.0.14", "esbuild": "^0.25.12", + "esbuild-minify-templates": "^0.13.1", "husky": "^9.1.7", "lint-staged": "^16.2.6", "node-watch": "^0.7.4", @@ -659,6 +660,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", @@ -2429,6 +2441,27 @@ "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/astray/node_modules/@types/estree": { + "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", + "optional": true + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -4360,6 +4393,25 @@ "@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": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/esbuild-visualizer/-/esbuild-visualizer-0.7.0.tgz", @@ -7717,6 +7769,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", diff --git a/package.json b/package.json index 7eabd6be1..5a79364c3 100644 --- a/package.json +++ b/package.json @@ -125,6 +125,7 @@ "@vitest/browser-playwright": "^4.0.14", "@vitest/coverage-v8": "^4.0.14", "esbuild": "^0.25.12", + "esbuild-minify-templates": "^0.13.1", "husky": "^9.1.7", "lint-staged": "^16.2.6", "node-watch": "^0.7.4", diff --git a/scripts/build.ts b/scripts/build.ts index 9446274f4..ca43a1733 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -2,9 +2,9 @@ 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 { type BuildItem, buildItems } from './build-items'; const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -26,32 +26,6 @@ function jsBanner() { ); } -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(`'`); - - return result; -} - async function build(buildItem: BuildItem) { await tsupBuild({ tsconfig: TSCONFIG_PATH, @@ -72,25 +46,18 @@ async function build(buildItem: BuildItem) { options.platform = 'browser'; options.legalComments = 'linked'; }, - noExternal: buildItem.bundleExternalDependencies ? [...Object.keys(dependencies), /lit/] : 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) { From f70d366c0ba2311a8047c8bf8295990fd1c383c0 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Fri, 5 Dec 2025 16:44:17 +0300 Subject: [PATCH 38/60] fix: remove non-existent jsx.ts entry from build items --- scripts/build-items.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/build-items.ts b/scripts/build-items.ts index 4c5c2d43c..5a0702dab 100644 --- a/scripts/build-items.ts +++ b/scripts/build-items.ts @@ -28,7 +28,6 @@ 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/'), From 3efb4a1ccd4a35c71f6055d58d8961c0e9213781 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sat, 6 Dec 2025 00:14:58 +0300 Subject: [PATCH 39/60] chore: update biome config and fix test --- biome.json | 7 +++++-- tests/validation.e2e.test.tsx | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/biome.json b/biome.json index 4ff1201e0..b0c9e0e37 100644 --- a/biome.json +++ b/biome.json @@ -19,7 +19,8 @@ "recommended": true, "suspicious": { "noDuplicateProperties": "off", - "noExplicitAny": "warn" + "noExplicitAny": "warn", + "noFocusedTests": "error" }, "complexity": { "noThisInStatic": "off" @@ -49,7 +50,9 @@ }, "overrides": [ { - "includes": ["**/*.test-d.tsx"], + "includes": [ + "**/*.test-d.tsx" + ], "linter": { "rules": { "correctness": { diff --git a/tests/validation.e2e.test.tsx b/tests/validation.e2e.test.tsx index 5f16dabda..c64ab350f 100644 --- a/tests/validation.e2e.test.tsx +++ b/tests/validation.e2e.test.tsx @@ -555,7 +555,7 @@ describe('File errors API', () => { .toEqual(expect.arrayContaining([expect.objectContaining>({ type: 'UPLOAD_ERROR' })])); }); - it.only('should toggle errors in the `errors` property of the file on file change', async () => { + it('should toggle errors in the `errors` property of the file on file change', async () => { const config = page.getByTestId('uc-config').query()! as Config; const customValidator = vi.fn((entry) => { if (entry.cdnUrlModifiers?.includes('mirror')) { From 01c0c1a5059a9f02fa4546f5c0b960e1768e7b7e Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sat, 6 Dec 2025 00:16:42 +0300 Subject: [PATCH 40/60] chore: upgrade biome to 2.3.8 --- package-lock.json | 157 ++++++++++++++++++++++++++++++++++++++++------ package.json | 4 +- 2 files changed, 140 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4450fb3fb..ef8efdcaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,9 +20,9 @@ }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.3.6", + "@biomejs/biome": "2.3.8", "@biomejs/js-api": "^4.0.0", - "@biomejs/wasm-nodejs": "^2.3.6", + "@biomejs/wasm-nodejs": "^2.3.8", "@csstools/postcss-cascade-layers": "^5.0.2", "@happy-dom/global-registrator": "^20.0.10", "@size-limit/esbuild-why": "^11.2.0", @@ -245,9 +245,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.6.tgz", - "integrity": "sha512-oqUhWyU6tae0MFsr/7iLe++QWRg+6jtUhlx9/0GmCWDYFFrK366sBLamNM7D9Y+c7YSynUFKr8lpEp1r6Sk7eA==", + "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": { @@ -261,20 +261,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.6", - "@biomejs/cli-darwin-x64": "2.3.6", - "@biomejs/cli-linux-arm64": "2.3.6", - "@biomejs/cli-linux-arm64-musl": "2.3.6", - "@biomejs/cli-linux-x64": "2.3.6", - "@biomejs/cli-linux-x64-musl": "2.3.6", - "@biomejs/cli-win32-arm64": "2.3.6", - "@biomejs/cli-win32-x64": "2.3.6" + "@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.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.6.tgz", - "integrity": "sha512-P4JWE5d8UayBxYe197QJwyW4ZHp0B+zvRIGCusOm1WbxmlhpAQA1zEqQuunHgSIzvyEEp4TVxiKGXNFZPg7r9Q==", + "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" ], @@ -288,6 +288,125 @@ "node": ">=14.21.3" } }, + "node_modules/@biomejs/cli-darwin-x64": { + "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" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "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" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "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" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "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" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "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" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "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" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "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" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@biomejs/js-api": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@biomejs/js-api/-/js-api-4.0.0.tgz", @@ -312,9 +431,9 @@ } }, "node_modules/@biomejs/wasm-nodejs": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/wasm-nodejs/-/wasm-nodejs-2.3.6.tgz", - "integrity": "sha512-VjH+usBwEjdmDxqXeEvi9Gy3/dZmKUwE+qb5gr3VkCt0G9zccAhnCuBXqtlbEJEP0wxXBRqk71cLZOBxaHsqcg==", + "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" }, diff --git a/package.json b/package.json index 5a79364c3..9300cf25a 100644 --- a/package.json +++ b/package.json @@ -110,9 +110,9 @@ }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", - "@biomejs/biome": "2.3.6", + "@biomejs/biome": "2.3.8", "@biomejs/js-api": "^4.0.0", - "@biomejs/wasm-nodejs": "^2.3.6", + "@biomejs/wasm-nodejs": "^2.3.8", "@csstools/postcss-cascade-layers": "^5.0.2", "@happy-dom/global-registrator": "^20.0.10", "@size-limit/esbuild-why": "^11.2.0", From 6633021a3826e89cafba8d60458617192e833b31 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sat, 6 Dec 2025 01:35:45 +0300 Subject: [PATCH 41/60] chore(biome): enable useConsistentMemberAccessibility rule --- biome.json | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/biome.json b/biome.json index b0c9e0e37..b6a66fe37 100644 --- a/biome.json +++ b/biome.json @@ -26,7 +26,13 @@ "noThisInStatic": "off" }, "style": { - "noInferrableTypes": "error" + "noInferrableTypes": "error", + "useConsistentMemberAccessibility": { + "level": "error", + "options": { + "accessibility": "explicit" + } + } }, "correctness": { "noUnusedVariables": "error", @@ -50,9 +56,7 @@ }, "overrides": [ { - "includes": [ - "**/*.test-d.tsx" - ], + "includes": ["**/*.test-d.tsx"], "linter": { "rules": { "correctness": { @@ -61,6 +65,16 @@ } } } + }, + { + "includes": ["demo/**/*.html"], + "linter": { + "rules": { + "style": { + "useConsistentMemberAccessibility": "off" + } + } + } } ], "html": { From c900d719f1908235cb4e9f96260cc80e427dae4a Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sat, 6 Dec 2025 10:24:14 +0300 Subject: [PATCH 42/60] refactor: enforce TS access modifiers --- src/abstract/TypedCollection.ts | 166 +++++++++--------- src/abstract/TypedData.ts | 51 +++--- src/abstract/UploaderPublicApi.ts | 36 ++-- src/abstract/managers/LocaleManager.ts | 2 +- src/abstract/managers/ModalManager.ts | 24 +-- src/abstract/managers/SecureUploadsManager.ts | 4 +- src/abstract/managers/TelemetryManager.ts | 8 +- src/abstract/managers/ValidationManager.ts | 8 +- src/abstract/managers/a11y.ts | 20 +-- src/blocks/CameraSource/CameraSource.ts | 112 ++++++------ .../src/CloudImageEditorBlock.ts | 97 ++++------ src/blocks/CloudImageEditor/src/CropFrame.ts | 8 +- .../src/EditorAspectRatioButtonControl.ts | 16 +- .../src/EditorButtonControl.ts | 16 +- .../src/EditorCropButtonControl.ts | 8 +- .../src/EditorFilterControl.ts | 21 +-- .../src/EditorImageCropper.ts | 22 +-- .../CloudImageEditor/src/EditorImageFader.ts | 14 +- .../src/EditorOperationControl.ts | 8 +- .../CloudImageEditor/src/EditorScroller.ts | 4 +- .../CloudImageEditor/src/EditorSlider.ts | 17 +- .../CloudImageEditor/src/EditorToolbar.ts | 28 +-- .../src/elements/button/BtnUi.ts | 18 +- .../src/elements/line-loader/LineLoaderUi.ts | 4 +- .../presence-toggle/PresenceToggle.ts | 10 +- .../src/elements/slider/SliderUi.ts | 18 +- .../CloudImageEditorActivity.ts | 28 +-- src/blocks/Config/Config.ts | 10 +- src/blocks/Copyright/Copyright.ts | 4 +- src/blocks/DropArea/DropArea.ts | 22 +-- src/blocks/ExternalSource/ExternalSource.ts | 12 +- src/blocks/ExternalSource/MessageBridge.ts | 10 +- src/blocks/FileItem/FileItem.ts | 149 ++++++++-------- src/blocks/FileItem/FileItemConfig.ts | 26 +-- src/blocks/FormInput/FormInput.ts | 8 +- src/blocks/Icon/Icon.ts | 6 +- src/blocks/Img/Img.ts | 2 +- src/blocks/Img/ImgBase.ts | 36 ++-- src/blocks/Img/ImgConfig.ts | 24 +-- src/blocks/Modal/Modal.ts | 62 +++---- src/blocks/ProgressBar/ProgressBar.ts | 8 +- .../ProgressBarCommon/ProgressBarCommon.ts | 8 +- src/blocks/Select/Select.ts | 8 +- src/blocks/SimpleBtn/SimpleBtn.ts | 10 +- src/blocks/SourceBtn/SourceBtn.ts | 20 +-- src/blocks/SourceList/SourceList.ts | 8 +- src/blocks/Spinner/Spinner.ts | 2 +- src/blocks/StartFrom/StartFrom.ts | 8 +- src/blocks/Thumb/Thumb.ts | 36 ++-- src/blocks/UploadCtxProvider/EventEmitter.ts | 8 +- .../UploadCtxProvider/UploadCtxProvider.ts | 8 +- src/blocks/UploadList/UploadList.ts | 14 +- src/blocks/UrlSource/UrlSource.ts | 8 +- src/lit/CssDataMixin.ts | 4 +- src/lit/LightDomMixin.ts | 72 ++++---- src/lit/LitActivityBlock.ts | 38 ++-- src/lit/LitBlock.ts | 32 ++-- src/lit/LitSolutionBlock.ts | 8 +- src/lit/LitUploaderBlock.ts | 24 +-- src/lit/RegisterableElementMixin.ts | 2 +- src/lit/SymbioteCompatMixin.ts | 68 ++++--- src/lit/TestModeController.ts | 6 +- .../cloud-image-editor/CloudImageEditor.ts | 6 +- .../inline/FileUploaderInline.ts | 12 +- .../minimal/FileUploaderMinimal.ts | 27 +-- .../regular/FileUploaderRegular.ts | 10 +- src/utils/WindowHeightTracker.ts | 4 +- 67 files changed, 779 insertions(+), 819 deletions(-) diff --git a/src/abstract/TypedCollection.ts b/src/abstract/TypedCollection.ts index b9179714e..a9b1580f1 100644 --- a/src/abstract/TypedCollection.ts +++ b/src/abstract/TypedCollection.ts @@ -20,41 +20,41 @@ type TypedCollectionOptions = { }; 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 = PubSub.registerCtx({}, this.__ctxId); - this.__watchList = options.watchList || []; + 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; + + public constructor(options: TypedCollectionOptions) { + this._typedSchema = options.typedSchema; + this._ctxId = options.ctxName || 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: string) => { + 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 +66,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,12 +93,12 @@ 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); + public add(init: Partial>): string { + const item = new TypedData(this._typedSchema); for (const [prop, value] of Object.entries(init) as [ ExtractKeysFromSchema, ExtractDataFromSchema[ExtractKeysFromSchema], @@ -107,29 +107,29 @@ export class TypedCollection { 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: string): TypedData | null { + return this._data.read(id); } - readProp>(id: string, propName: K): ExtractDataFromSchema[K] | null { + public readProp>(id: string, propName: K): ExtractDataFromSchema[K] | null { const item = this.read(id); if (!item) { console.warn(`Item with id ${id} not found`); @@ -138,7 +138,11 @@ export class TypedCollection { return item.getValue(propName); } - publishProp>(id: string, propName: K, value: ExtractDataFromSchema[K]): void { + public publishProp>( + id: string, + propName: K, + value: ExtractDataFromSchema[K], + ): void { const item = this.read(id); if (!item) { console.warn(`Item with id ${id} not found`); @@ -147,38 +151,38 @@ export class TypedCollection { item.setValue(propName, value); } - remove(id: string): void { + public remove(id: string): 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, null); + 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[] { + public findItems(checkFn: (item: TypedData) => boolean): string[] { const result: string[] = []; - this.__items.forEach((id) => { + this._items.forEach((id) => { const item = this.read(id); if (item && checkFn(item)) { result.push(id); @@ -187,23 +191,23 @@ export class TypedCollection { return result; } - items(): string[] { - return [...this.__items]; + public items(): string[] { + return [...this._items]; } - get size(): number { - return this.__items.size; + public get size(): number { + return this._items.size; } - destroy(): void { - PubSub.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 in this._subsMap) { + 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 be961fce0..416bf3023 100644 --- a/src/abstract/TypedData.ts +++ b/src/abstract/TypedData.ts @@ -26,16 +26,16 @@ export type ExtractDataFromSchema = { export type ExtractKeysFromSchema = Extract; export class TypedData { - private __typedSchema: T; - private __ctxId: string; - private __schema: ExtractDataFromSchema; - private __data: PubSub>; + private typedSchema: T; + private ctxId: string; + private schema: ExtractDataFromSchema; + private data: PubSub>; - constructor(typedSchema: T, ctxName?: string) { - this.__typedSchema = typedSchema; - this.__ctxId = ctxName || UID.generate(); + public constructor(typedSchema: T, ctxName?: string) { + this.typedSchema = typedSchema; + this.ctxId = ctxName || UID.generate(); - this.__schema = Object.keys(typedSchema).reduce( + this.schema = Object.keys(typedSchema).reduce( (acc, key) => { if (typedSchema[key]) { (acc as Record)[key] = typedSchema[key].value; @@ -44,51 +44,54 @@ export class TypedData { }, {} as ExtractDataFromSchema, ); - this.__data = PubSub.registerCtx(this.__schema, this.__ctxId); + this.data = PubSub.registerCtx(this.schema, this.ctxId); } - get uid(): string { - return this.__ctxId; + public get uid(): string { + return this.ctxId; } - setValue>(prop: K, value: ExtractDataFromSchema[K]): void { - if (!Object.hasOwn(this.__typedSchema, prop) || !this.__typedSchema[prop]) { + public setValue>(prop: K, value: ExtractDataFromSchema[K]): void { + if (!Object.hasOwn(this.typedSchema, prop) || !this.typedSchema[prop]) { console.warn(MSG_NAME + prop); return; } - const pDesc = this.__typedSchema[prop]; + const pDesc = this.typedSchema[prop]; - const isChanged = this.__data.read(prop) !== value; + const isChanged = this.data.read(prop) !== value; const isMatchConstructorType = value?.constructor === pDesc.type; const isMatchInstanceType = (value as object) instanceof (pDesc.type as Constructor); const isMatchNullable = pDesc.nullable && value === null; if (isChanged && (isMatchConstructorType || isMatchInstanceType || isMatchNullable)) { - this.__data.pub(prop, value); + this.data.pub(prop, value); return; } else if (isChanged) { 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); } } - getValue>(prop: K): ExtractDataFromSchema[K] { - if (!Object.hasOwn(this.__typedSchema, prop)) { + public getValue>(prop: K): ExtractDataFromSchema[K] { + if (!Object.hasOwn(this.typedSchema, prop)) { console.warn(MSG_NAME + 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 as (val: unknown) => void); + public subscribe>( + prop: K, + handler: (newVal: ExtractDataFromSchema[K]) => void, + ) { + return this.data.sub(prop, handler as (val: unknown) => void); } - remove(): void { - PubSub.deleteCtx(this.__ctxId); + public remove(): void { + PubSub.deleteCtx(this.ctxId); } } diff --git a/src/abstract/UploaderPublicApi.ts b/src/abstract/UploaderPublicApi.ts index 39559ac4a..afefcee13 100644 --- a/src/abstract/UploaderPublicApi.ts +++ b/src/abstract/UploaderPublicApi.ts @@ -44,7 +44,7 @@ export type ApiAddFileCommonOptions = { export class UploaderPublicApi { private _ctx: LitUploaderBlock; - constructor(ctx: LitUploaderBlock) { + public constructor(ctx: LitUploaderBlock) { this._ctx = ctx; } @@ -52,18 +52,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'> => { @@ -76,7 +76,7 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - addFileFromUuid = ( + public addFileFromUuid = ( uuid: string, { silent, fileName, source }: ApiAddFileCommonOptions = {}, ): OutputFileEntry<'idle'> => { @@ -89,7 +89,7 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - addFileFromCdnUrl = ( + public addFileFromCdnUrl = ( cdnUrl: string, { silent, fileName, source }: ApiAddFileCommonOptions = {}, ): OutputFileEntry<'idle'> => { @@ -111,7 +111,7 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - addFileFromObject = ( + public addFileFromObject = ( file: File, { silent, @@ -135,18 +135,18 @@ export class UploaderPublicApi { return this.getOutputItem(internalId); }; - removeFileByInternalId = (internalId: string): void => { + public removeFileByInternalId = (internalId: string): void => { if (!this._uploadCollection.read(internalId)) { throw new Error(`File with internalId ${internalId} not found`); } this._uploadCollection.remove(internalId); }; - 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; @@ -171,7 +171,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 : [])]), ); @@ -238,7 +238,7 @@ export class UploaderPublicApi { fileInput.dispatchEvent(new MouseEvent('click')); }; - getOutputItem(entryId: string): OutputFileEntry { + public getOutputItem(entryId: string): OutputFileEntry { const uploadEntryData = PubSub.getCtx(entryId).store as UploadEntryData; const fileInfo = uploadEntryData.fileInfo as UploadcareFile | null; @@ -280,11 +280,11 @@ 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(LitActivityBlock.activities.UPLOAD_LIST); this._ctx.set$({ @@ -343,7 +343,7 @@ export class UploaderPublicApi { } }; - doneFlow = (): void => { + public doneFlow = (): void => { this._ctx.set$({ '*currentActivity': this._ctx.doneActivity, '*history': this._ctx.doneActivity ? [this._ctx.doneActivity] : [], @@ -353,7 +353,7 @@ export class UploaderPublicApi { } }; - setCurrentActivity = ( + public setCurrentActivity = ( activityType: T, ...params: T extends keyof ActivityParamsMap ? [ActivityParamsMap[T]] @@ -371,11 +371,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/managers/LocaleManager.ts b/src/abstract/managers/LocaleManager.ts index 787e6350b..53aa2fc08 100644 --- a/src/abstract/managers/LocaleManager.ts +++ b/src/abstract/managers/LocaleManager.ts @@ -9,7 +9,7 @@ export class LocaleManager { private _blockInstance: LitBlock | null = null; private _localeName = ''; - constructor(blockInstance: LitBlock) { + public constructor(blockInstance: LitBlock) { this._blockInstance = blockInstance; for (const [key, value] of Object.entries(en)) { diff --git a/src/abstract/managers/ModalManager.ts b/src/abstract/managers/ModalManager.ts index 5c4dd43e6..b05ac7198 100644 --- a/src/abstract/managers/ModalManager.ts +++ b/src/abstract/managers/ModalManager.ts @@ -21,7 +21,7 @@ export class ModalManager { private _subscribers: Map> = new Map(); private _block: LitBlock; - constructor(block: LitBlock) { + public constructor(block: LitBlock) { this._block = block; } @@ -34,13 +34,13 @@ 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 { + public deleteModal(id: ModalId): boolean { if (!this._modals.has(id)) return false; const modal = this._modals.get(id)!; @@ -51,7 +51,7 @@ export class ModalManager { } /** Open a modal by its ID. */ - open(id: ModalId): boolean { + public open(id: ModalId): boolean { if (!this._modals.has(id)) { this._debugPrint(`Modal with ID "${id}" not found`); return false; @@ -65,7 +65,7 @@ export class ModalManager { } /** Close a specific modal by ID. */ - close(id: ModalId): boolean { + public close(id: ModalId): boolean { if (!this._modals.has(id) || !this._activeModals.has(id)) { this._debugPrint(`Modal with ID "${id}" not found or not active`); return false; @@ -82,7 +82,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 +96,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 +113,7 @@ export class ModalManager { } /** Close all open modals. */ - closeAll(): number { + public closeAll(): number { const count = this._activeModals.size; this._activeModals.clear(); @@ -125,7 +125,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 +135,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 +164,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 95bf45493..5c8e5a2be 100644 --- a/src/abstract/managers/SecureUploadsManager.ts +++ b/src/abstract/managers/SecureUploadsManager.ts @@ -6,7 +6,7 @@ export class SecureUploadsManager { private readonly _block: LitUploaderBlock; private _secureToken: SecureUploadsSignatureAndExpire | null = null; - constructor(block: LitUploaderBlock) { + 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 1fbd05982..17cb47d7c 100644 --- a/src/abstract/managers/TelemetryManager.ts +++ b/src/abstract/managers/TelemetryManager.ts @@ -28,7 +28,7 @@ export class TelemetryManager { private _lastPayload: TelemetryState | null = null; private readonly _queue: Queue; - constructor(block: LitBlock) { + public constructor(block: LitBlock) { this._block = block; this._telemetryInstance = new TelemetryAPIService(); this._queue = new Queue(10); @@ -111,7 +111,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 +136,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 +152,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 073d1e482..24a070de0 100644 --- a/src/abstract/managers/ValidationManager.ts +++ b/src/abstract/managers/ValidationManager.ts @@ -87,7 +87,7 @@ export class ValidationManager { } > = new Map(); - constructor(blockInstance: LitUploaderBlock) { + public constructor(blockInstance: LitUploaderBlock) { this._blockInstance = blockInstance; this._uploadCollection = this._blockInstance.uploadCollection; @@ -109,7 +109,7 @@ export class ValidationManager { }); } - runFileValidators(runOn: FileValidatorDescriptor['runOn'], entryIds?: string[]): void { + public runFileValidators(runOn: FileValidatorDescriptor['runOn'], entryIds?: string[]): void { const ids = entryIds ?? this._uploadCollection.items(); for (const id of ids) { const entry = this._uploadCollection.read(id); @@ -119,7 +119,7 @@ export class ValidationManager { } } - runCollectionValidators(): void { + public runCollectionValidators(): void { const collection = this._blockInstance.api.getOutputCollectionState(); const errors: Array = []; @@ -152,7 +152,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(); diff --git a/src/abstract/managers/a11y.ts b/src/abstract/managers/a11y.ts index 7acc6a622..e4202b526 100644 --- a/src/abstract/managers/a11y.ts +++ b/src/abstract/managers/a11y.ts @@ -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: LitBlock): void { + public registerBlock(scope: LitBlock): void { this._scopedWindow.registerScope(scope); } - destroy(): void { + public destroy(): void { this._destroyKeyUX?.(); this._scopedWindow.destroy(); } diff --git a/src/blocks/CameraSource/CameraSource.ts b/src/blocks/CameraSource/CameraSource.ts index 32938ec67..8f7e1cfb2 100644 --- a/src/blocks/CameraSource/CameraSource.ts +++ b/src/blocks/CameraSource/CameraSource.ts @@ -1,4 +1,4 @@ -import { html } from 'lit'; +import { html, type PropertyValues } from 'lit'; import { state } from 'lit/decorators.js'; import { LitActivityBlock } from '../../lit/LitActivityBlock'; import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; @@ -47,8 +47,8 @@ export type CameraMode = 'photo' | 'video'; export type CameraStatus = 'shot' | 'retake' | 'accept' | 'play' | 'stop' | 'pause' | 'resume'; export class CameraSource extends LitUploaderBlock { - override couldBeCtxOwner = true; - override activityType = LitActivityBlock.activities.CAMERA; + public override couldBeCtxOwner = true; + public override activityType = LitActivityBlock.activities.CAMERA; private _unsubPermissions: (() => void) | null = null; @@ -92,66 +92,66 @@ export class CameraSource extends LitUploaderBlock { private _elapsedTime = 0; @state() - protected videoTransformCss: string | null = null; + private videoTransformCss: string | null = null; @state() - protected videoHidden = true; + private videoHidden = true; @state() - protected messageHidden = true; + private messageHidden = true; @state() - protected requestBtnHidden = canUsePermissionsApi(); + private requestBtnHidden = canUsePermissionsApi(); @state() - protected cameraSelectOptions: CameraDeviceOption[] = []; + private cameraSelectOptions: CameraDeviceOption[] = []; @state() - protected cameraSelectHidden = true; + private cameraSelectHidden = true; @state() - protected l10nMessage = ''; + private l10nMessage = ''; @state() - protected timerHidden = true; + private timerHidden = true; @state() - protected cameraHidden = true; + private cameraHidden = true; @state() - protected cameraActionsHidden = true; + private cameraActionsHidden = true; @state() - protected audioSelectOptions: AudioDeviceOption[] = []; + private audioSelectOptions: AudioDeviceOption[] = []; @state() - protected audioSelectHidden = true; + private audioSelectHidden = true; @state() - protected audioSelectDisabled = true; + private audioSelectDisabled = true; @state() - protected audioToggleMicrophoneHidden = true; + private audioToggleMicrophoneHidden = true; @state() - protected tabCameraHidden = true; + private tabCameraHidden = true; @state() - protected tabVideoHidden = true; + private tabVideoHidden = true; @state() - protected currentIcon = 'camera-full'; + private currentIcon = 'camera-full'; @state() - protected currentTimelineIcon = 'play'; + private currentTimelineIcon = 'play'; @state() - protected toggleMicrophoneIcon = 'microphone'; + private toggleMicrophoneIcon = 'microphone'; @state() - protected mutableClassButton = 'uc-shot-btn uc-camera-action'; + private mutableClassButton = 'uc-shot-btn uc-camera-action'; - _chooseActionWithCamera = () => { + private _chooseActionWithCamera = () => { this.telemetryManager.sendEvent({ eventType: InternalEventType.ACTION_EVENT, payload: { @@ -257,7 +257,7 @@ export class CameraSource extends LitUploaderBlock { } }; - _updateTimer = (): void => { + private _updateTimer = (): void => { const currentTime = Math.floor((performance.now() - this._startTime + this._elapsedTime) / 1000); if (typeof this.cfg.maxVideoRecordingDuration === 'number' && this.cfg.maxVideoRecordingDuration > 0) { @@ -286,18 +286,18 @@ export class CameraSource extends LitUploaderBlock { this._animationFrameId = requestAnimationFrame(this._updateTimer); }; - _startTimer = (): void => { + 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 => { + private _startTimeline = (): void => { const video = this.videoRef.value as HTMLVideoElement | undefined; if (!video) { return; @@ -316,13 +316,13 @@ export class CameraSource extends LitUploaderBlock { 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 = { @@ -383,7 +383,7 @@ export class CameraSource extends LitUploaderBlock { }; /** This method is used to toggle recording pause/resume */ - _toggleRecording = (): void => { + private _toggleRecording = (): void => { if (this._mediaRecorder?.state === 'recording') return; const videoEl = this.videoRef.value; @@ -395,7 +395,7 @@ export class CameraSource extends LitUploaderBlock { } }; - _toggleEnableAudio = (): void => { + private _toggleEnableAudio = (): void => { this._stream?.getAudioTracks().forEach((track) => { track.enabled = !track.enabled; @@ -466,7 +466,7 @@ export class CameraSource extends LitUploaderBlock { } } - _retake = (): void => { + private _retake = (): void => { this._setCameraState(CameraSourceEvents.RETAKE); /** Reset video */ @@ -481,7 +481,7 @@ export class CameraSource extends LitUploaderBlock { void this.videoRef.value?.play?.(); }; - _accept = (): void => { + private _accept = (): void => { this._setCameraState(CameraSourceEvents.ACCEPT); if (this._activeTab === CameraSourceTypes.PHOTO) { @@ -506,7 +506,7 @@ export class CameraSource extends LitUploaderBlock { this._chunks = []; }; - _handlePhoto = (status: CameraStatus): void => { + private _handlePhoto = (status: CameraStatus): void => { if (status === CameraSourceEvents.SHOT) { this.tabVideoHidden = true; this.cameraHidden = true; @@ -524,7 +524,7 @@ export class CameraSource extends LitUploaderBlock { } }; - _handleVideo = (status: CameraStatus): void => { + private _handleVideo = (status: CameraStatus): void => { if (status === CameraSourceEvents.PLAY) { this.timerHidden = false; this.tabCameraHidden = true; @@ -648,7 +648,7 @@ export class CameraSource extends LitUploaderBlock { return file; }; - _guessExtensionByMime(mime: string | undefined): string { + private _guessExtensionByMime(mime: string | undefined): string { const knownContainers = { mp4: 'mp4', ogg: 'ogg', @@ -684,7 +684,7 @@ export class CameraSource extends LitUploaderBlock { /** * 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': LitActivityBlock.activities.UPLOAD_LIST, @@ -735,7 +735,7 @@ export class CameraSource extends LitUploaderBlock { } }, 300); - _makeStreamInactive = (): boolean => { + private _makeStreamInactive = (): boolean => { if (!this._stream) return false; const audioTracks = this._stream?.getAudioTracks(); @@ -751,7 +751,7 @@ export class CameraSource extends LitUploaderBlock { return true; }; - _stopCapture = (): void => { + private _stopCapture = (): void => { if (this._capturing) { if (this.videoRef.value) { this.videoRef.value.volume = 0; @@ -768,7 +768,7 @@ export class CameraSource extends LitUploaderBlock { } }; - _capture = async (): Promise => { + private _capture = async (): Promise => { const constraints: MediaStreamConstraints = { video: { ...DEFAULT_VIDEO_CONFIG }, audio: this.cfg.enableAudioRecording ? ({} as MediaTrackConstraints) : false, @@ -813,11 +813,11 @@ export class CameraSource extends LitUploaderBlock { } }; - _handlePermissionsChange = (): void => { + private _handlePermissionsChange = (): void => { this._capture(); }; - _permissionAccess = async (): Promise => { + private _permissionAccess = async (): Promise => { try { this._teardownPermissionListeners(); for (const permission of DEFAULT_PERMISSIONS) { @@ -853,9 +853,9 @@ export class CameraSource extends LitUploaderBlock { this._unsubPermissions = null; } - _getPermission = (): void => {}; + private _getPermission = (): void => {}; - _requestDeviceAccess = async (): Promise => { + private _requestDeviceAccess = async (): Promise => { try { await navigator.mediaDevices.getUserMedia({ video: true, @@ -870,7 +870,7 @@ export class CameraSource extends LitUploaderBlock { } }; - _getDevices = async (): Promise => { + private _getDevices = async (): Promise => { try { const devices = await navigator.mediaDevices.enumerateDevices(); @@ -903,7 +903,7 @@ export class CameraSource extends LitUploaderBlock { } }; - _onActivate = async (): Promise => { + private _onActivate = async (): Promise => { await this._permissionAccess(); await this._requestDeviceAccess(); await this._capture(); @@ -911,7 +911,7 @@ export class CameraSource extends LitUploaderBlock { this._handleCameraModes(this._cameraModes); }; - _onDeactivate = async (): Promise => { + private _onDeactivate = async (): Promise => { if (this._unsubPermissions) { this._unsubPermissions(); } @@ -925,7 +925,7 @@ export class CameraSource extends LitUploaderBlock { this._stopCapture(); }; - _handleCameraModes = (cameraModes: CameraMode[]): void => { + private _handleCameraModes = (cameraModes: CameraMode[]): void => { this.tabVideoHidden = !cameraModes.includes(CameraSourceTypes.VIDEO); this.tabCameraHidden = !cameraModes.includes(CameraSourceTypes.PHOTO); @@ -935,7 +935,7 @@ export class CameraSource extends LitUploaderBlock { } }; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.registerActivity(this.activityType, { @@ -963,30 +963,30 @@ export class CameraSource extends LitUploaderBlock { }); } - protected override firstUpdated(_changedProperties: Map): void { + public override firstUpdated(_changedProperties: PropertyValues): void { super.firstUpdated(_changedProperties); this._applyVideoSource(); } - protected override updated(_changedProperties: Map): void { + public override updated(_changedProperties: PropertyValues): void { super.updated(_changedProperties); this._applyVideoSource(); } - _destroy(): void { + private _destroy(): void { this._teardownPermissionListeners(); navigator.mediaDevices?.removeEventListener('devicechange', this._getDevices); this._detachPreviewListeners(this.videoRef.value); this._setVideoSource(null); } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); this._destroy(); } - override render() { + public override render() { return html` -
diff --git a/src/blocks/FileItem/FileItemConfig.ts b/src/blocks/FileItem/FileItemConfig.ts index da9789617..2d1808235 100644 --- a/src/blocks/FileItem/FileItemConfig.ts +++ b/src/blocks/FileItem/FileItemConfig.ts @@ -4,15 +4,15 @@ import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; type EntrySubscription = ReturnType; export class FileItemConfig extends LitUploaderBlock { - protected _entrySubs: Set = new Set(); + protected 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,28 +21,28 @@ export class FileItemConfig extends LitUploaderBlock { }; } - 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); } }); - this._entrySubs.add(sub); + this.entrySubs.add(sub); })(prop, handler); } - protected _reset(): void { - for (const sub of this._entrySubs) { + protected reset(): void { + for (const sub of this.entrySubs) { sub.remove(); } - this._entrySubs = new Set(); - this._entry = null; + this.entrySubs = new Set(); + this.entry = null; } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); - this._entrySubs = new Set(); + this.entrySubs = new Set(); } } diff --git a/src/blocks/FormInput/FormInput.ts b/src/blocks/FormInput/FormInput.ts index 0f592bfb8..9e24aacde 100644 --- a/src/blocks/FormInput/FormInput.ts +++ b/src/blocks/FormInput/FormInput.ts @@ -3,10 +3,10 @@ import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; import type { OutputCollectionState } from '../../types/index'; export class FormInput extends LitUploaderBlock { - _validationInputElement: HTMLInputElement | null = null; - _dynamicInputsContainer: HTMLDivElement | null = null; + private _validationInputElement: HTMLInputElement | null = null; + private _dynamicInputsContainer: HTMLDivElement | null = null; - _createValidationInput(): HTMLInputElement { + private _createValidationInput(): HTMLInputElement { const validationInput = document.createElement('input'); validationInput.type = 'text'; validationInput.name = this.ctxName; @@ -20,7 +20,7 @@ export class FormInput extends LitUploaderBlock { return validationInput; } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this._validationInputElement = this._createValidationInput(); diff --git a/src/blocks/Icon/Icon.ts b/src/blocks/Icon/Icon.ts index fdb1397b9..beb011b39 100644 --- a/src/blocks/Icon/Icon.ts +++ b/src/blocks/Icon/Icon.ts @@ -6,14 +6,14 @@ import './icon.css'; export class Icon extends LitBlock { @property({ type: String }) - name = ''; + public name = ''; @state() private resolvedHref = ''; private iconHrefResolver: IconHrefResolver | null = null; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.setAttribute('aria-hidden', 'true'); @@ -41,7 +41,7 @@ export class Icon extends LitBlock { this.resolvedHref = customHref ?? defaultHref; } - override render() { + public override render() { return html` ${this.yield( '', diff --git a/src/blocks/Img/Img.ts b/src/blocks/Img/Img.ts index ff1863801..cf8e8944f 100644 --- a/src/blocks/Img/Img.ts +++ b/src/blocks/Img/Img.ts @@ -1,7 +1,7 @@ import { ImgBase } from './ImgBase.js'; export class Img extends ImgBase { - override connectedCallback(): void { + public override connectedCallback(): void { super.connectedCallback(); this.sub$$('src', () => { diff --git a/src/blocks/Img/ImgBase.ts b/src/blocks/Img/ImgBase.ts index b3941ebf5..2e0ba971e 100644 --- a/src/blocks/Img/ImgBase.ts +++ b/src/blocks/Img/ImgBase.ts @@ -168,15 +168,15 @@ export class ImgBase extends ImgConfig { } } - get img(): HTMLImageElement { + protected get img(): HTMLImageElement { if (!this.hasPreviewImage) { - this._setupConfigForImage({ elNode: this._img }); + this.setupConfigForImage({ elNode: this._img }); this.appendChild(this._img); } return this._img; } - get currentImg(): CurrentImg { + private get currentImg(): CurrentImg { return this.hasPreviewImage ? { type: ImgTypeEnum.PREVIEW as ImgType, @@ -188,15 +188,15 @@ export class ImgBase extends ImgConfig { }; } - get hasPreviewImage(): string | number | boolean | undefined { + private get hasPreviewImage(): string | number | boolean | undefined { return this.$$('is-preview-blur') as string | number | boolean | undefined; } - get bgSelector(): string | undefined { + private get bgSelector(): string | undefined { return this.$$('is-background-for') as string | undefined; } - get breakpoints(): number[] | null { + private get breakpoints(): number[] | null { const breakpointsValue = this.$$('breakpoints') as string | undefined; if (breakpointsValue) { const list = stringToArray(breakpointsValue); @@ -206,11 +206,11 @@ export class ImgBase extends ImgConfig { } } - get hasFormatJPG(): boolean { + private get hasFormatJPG(): boolean { return (this.$$('format') as string).toLowerCase() === 'jpeg'; } - renderBg(el: HTMLElement): void { + private renderBg(el: HTMLElement): void { const imgSet = new Set(); imgSet.add(`url("${this._getUrlBase(this._getElSize(el)) as string}") 1x`); @@ -227,7 +227,7 @@ export class ImgBase extends ImgConfig { el.style.setProperty('background-image', '-webkit-' + iSet); } - getSrcset(): string { + private getSrcset(): string { const srcset = new Set(); if (this.breakpoints) { this.breakpoints.forEach((bp) => { @@ -253,15 +253,15 @@ export class ImgBase extends ImgConfig { return [...srcset].join(); } - getSrc(): string | undefined { + private getSrc(): string | undefined { return this._getUrlBase(); } - get srcUrlPreview(): string | undefined { + private get srcUrlPreview(): string | undefined { return this._getUrlBase('100x', '100'); } - renderBackground(): void { + private renderBackground(): void { const selector = this.bgSelector as string; [...document.querySelectorAll(selector)].forEach((el) => { if (this.$$('intersection')) { @@ -284,14 +284,14 @@ export class ImgBase extends ImgConfig { } } - private _setupConfigForImage({ elNode }: ConfigImageParams): void { + private setupConfigForImage({ elNode }: ConfigImageParams): void { this._setupEventProxy(elNode); this.initAttributes(elNode); } - loaderImage({ src, srcset, elNode }: LoaderParams): Promise { + private loaderImage({ src, srcset, elNode }: LoaderParams): Promise { return new Promise((resolve, reject) => { - this._setupConfigForImage({ elNode }); + this.setupConfigForImage({ elNode }); elNode.setAttribute(UNRESOLVED_ATTR, ''); @@ -312,10 +312,10 @@ export class ImgBase extends ImgConfig { }); } - async renderImage(): Promise { + private async renderImage(): Promise { if (this.$$('intersection')) { if (this.hasPreviewImage) { - this._setupConfigForImage({ elNode: this._imgPreview }); + this.setupConfigForImage({ elNode: this._imgPreview }); this.appendChild(this._imgPreview); } @@ -376,7 +376,7 @@ export class ImgBase extends ImgConfig { } } - init(): void { + protected init(): void { if (this.bgSelector) { this.renderBackground(); } else { diff --git a/src/blocks/Img/ImgConfig.ts b/src/blocks/Img/ImgConfig.ts index 7d95d3e87..0bd21cce2 100644 --- a/src/blocks/Img/ImgConfig.ts +++ b/src/blocks/Img/ImgConfig.ts @@ -15,11 +15,11 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) private _isnObserver: IntersectionObserver | null = null; private _observed: Set | null = null; - override createRenderRoot(): HTMLElement | ShadowRoot { + public override createRenderRoot(): HTMLElement | ShadowRoot { return this; } - constructor() { + public constructor() { super(); for (const prop in PROPS_MAP) { const config = PROPS_MAP[prop as keyof typeof PROPS_MAP] as PropConfig | undefined; @@ -27,11 +27,11 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) } } - $$(key: string): unknown { + protected $$(key: string): unknown { return this._state[CSS_PREF + key]; } - set$$(kvObj: Record): void { + protected set$$(kvObj: Record): void { for (const key in kvObj) { const fullKey = CSS_PREF + key; const val = kvObj[key]; @@ -40,7 +40,7 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) } } - sub$$(key: string, kbFn: (val: T) => void): void { + 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()); @@ -64,11 +64,11 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) } } - analyticsParams(): string { + protected analyticsParams(): string { return `-/@clib/${PACKAGE_NAME}/${PACKAGE_VERSION}/uc-img/`; } - initAttributes(el: HTMLElement): void { + 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]) { @@ -77,7 +77,7 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) }); } - initIntersection(el: HTMLElement, cbkFn: () => void): void { + protected initIntersection(el: HTMLElement, cbkFn: () => void): void { const opts: IntersectionObserverInit = { root: null, rootMargin: '0px', @@ -97,7 +97,7 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) this._observed.add(el); } - override connectedCallback(): void { + public override connectedCallback(): void { super.connectedCallback(); this._initCssProperties(); } @@ -112,7 +112,7 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) } } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); if (this._isnObserver) { this._observed?.forEach((el) => { @@ -123,11 +123,11 @@ export class ImgConfig extends CssDataMixin(RegisterableElementMixin(LitElement) this._subscribers.clear(); } - static override get observedAttributes(): string[] { + public static override get observedAttributes(): string[] { return Object.keys(PROPS_MAP); } - override attributeChangedCallback(name: string, _oldVal: string | null, newVal: string | null): void { + public override attributeChangedCallback(name: string, _oldVal: string | null, newVal: string | null): void { window.setTimeout(() => { const fullKey = CSS_PREF + name; this._state[fullKey] = newVal; diff --git a/src/blocks/Modal/Modal.ts b/src/blocks/Modal/Modal.ts index 1e5a1cf00..322184304 100644 --- a/src/blocks/Modal/Modal.ts +++ b/src/blocks/Modal/Modal.ts @@ -9,20 +9,12 @@ import { createRef, ref } from 'lit/directives/ref.js'; let LAST_ACTIVE_MODAL_ID: ModalId | null = null; export class Modal extends LitBlock { - static override styleAttrs = [...super.styleAttrs, 'uc-modal']; + public static override styleAttrs = [...super.styleAttrs, 'uc-modal']; - private _mouseDownTarget: EventTarget | null | undefined; + private mouseDownTarget: EventTarget | null | undefined; protected dialogEl = createRef(); - handleModalOpen!: ModalCb; - handleModalClose!: ModalCb; - handleModalCloseAll!: ModalCb; - - _handleBackdropClick = (): void => { - this._closeDialog(); - }; - - _closeDialog = (): void => { + private closeDialog = (): void => { this.modalManager?.close(this.id); if (!this.modalManager?.hasActiveModals) { @@ -30,22 +22,22 @@ export class Modal extends LitBlock { } }; - _handleDialogClose = (): void => { - this._closeDialog(); + private handleDialogClose = (): void => { + this.closeDialog(); }; - _handleDialogMouseDown = (e: MouseEvent): void => { - this._mouseDownTarget = e.target; + 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.dialogEl.value && target === this._mouseDownTarget) { - this._closeDialog(); + if (target === this.dialogEl.value && target === this.mouseDownTarget) { + this.closeDialog(); } }; - show(): void { + public show(): void { const dialog = this.dialogEl.value as HTMLDialogElement & { showModal?: () => void; }; @@ -61,7 +53,7 @@ export class Modal extends LitBlock { } } - hide(): void { + public hide(): void { const dialog = this.dialogEl.value as HTMLDialogElement & { close?: () => void; }; @@ -73,7 +65,7 @@ export class Modal extends LitBlock { } } - private _handleModalOpen({ id }: Parameters[0]): void { + private handleModalOpen = ({ id }: Parameters[0]): void => { if (id === this.id) { LAST_ACTIVE_MODAL_ID = id; this.show(); @@ -81,9 +73,9 @@ export class Modal extends LitBlock { } else { this.hide(); } - } + }; - private _handleModalClose({ id }: Parameters[0]): void { + private handleModalClose = ({ id }: Parameters[0]): void => { if (id === this.id) { this.hide(); this.emit( @@ -92,9 +84,9 @@ export class Modal extends LitBlock { { debounce: true }, ); } - } + }; - private _handleModalCloseAll(_data: Parameters[0]): void { + private handleModalCloseAll = (_data: Parameters[0]): void => { this.hide(); if (LAST_ACTIVE_MODAL_ID === this.id) { @@ -104,9 +96,9 @@ export class Modal extends LitBlock { { debounce: true }, ); } - } + }; - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this.modalManager?.registerModal(this.id, this); @@ -119,19 +111,15 @@ export class Modal extends LitBlock { } }); - 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); } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); document.body.style.overflow = ''; - this._mouseDownTarget = undefined; + this.mouseDownTarget = undefined; this.modalManager?.unsubscribe(ModalEvents.OPEN, this.handleModalOpen); this.modalManager?.unsubscribe(ModalEvents.CLOSE, this.handleModalClose); @@ -141,12 +129,12 @@ export class Modal extends LitBlock { 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); + this.dialogEl.value?.addEventListener('close', this.handleDialogClose); + this.dialogEl.value?.addEventListener('mousedown', this.handleDialogMouseDown); + this.dialogEl.value?.addEventListener('mouseup', this.handleDialogMouseUp); } - override render() { + public override render() { return html` ${this.yield('')} diff --git a/src/blocks/ProgressBar/ProgressBar.ts b/src/blocks/ProgressBar/ProgressBar.ts index 0f54f3906..9b0a9da54 100644 --- a/src/blocks/ProgressBar/ProgressBar.ts +++ b/src/blocks/ProgressBar/ProgressBar.ts @@ -7,10 +7,10 @@ import { LitBlock } from '../../lit/LitBlock'; export class ProgressBar extends LitBlock { @property({ type: Number }) - value = 0; + public value = 0; @property({ type: Boolean, reflect: true }) - visible = true; + public visible = true; private _progressValue = 0; @@ -67,7 +67,7 @@ export class ProgressBar extends LitBlock { } } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); this.fakeProgressLineRef.value?.removeEventListener('animationiteration', this.handleFakeProgressAnimation); } @@ -86,7 +86,7 @@ export class ProgressBar extends LitBlock { this.style.setProperty('--l-progress-value', this._progressValue.toString()); } - override render() { + public override render() { return html`
diff --git a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts index c5a46ad78..fc59a683f 100644 --- a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts +++ b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts @@ -18,7 +18,7 @@ export class ProgressBarCommon extends LitUploaderBlock { @state() protected value = 0; - constructor() { + public constructor() { super(); this.init$ = { ...this.init$, @@ -26,7 +26,7 @@ export class ProgressBarCommon extends LitUploaderBlock { } as ProgressBarCommonInitState; } - override initCallback(): void { + public override initCallback(): void { super.initCallback(); this._unobserveCollectionCb = this.uploadCollection.observeProperties(() => { const anyUploading = this.uploadCollection.items().some((id) => { @@ -54,13 +54,13 @@ export class ProgressBarCommon extends LitUploaderBlock { } } - override disconnectedCallback(): void { + public override disconnectedCallback(): void { super.disconnectedCallback(); this._unobserveCollectionCb?.(); this._unobserveCollectionCb = undefined; } - override render() { + public override render() { return html` `; } } diff --git a/src/blocks/Select/Select.ts b/src/blocks/Select/Select.ts index e4682b1aa..dbc164d29 100644 --- a/src/blocks/Select/Select.ts +++ b/src/blocks/Select/Select.ts @@ -10,15 +10,15 @@ type SelectOption = { export class Select extends LitBlock { @property({ type: String, attribute: false }) - value = ''; + public value = ''; @property({ type: Boolean, reflect: true }) - disabled = false; + public disabled = false; @property({ type: Array, attribute: false }) - options: SelectOption[] = []; + public options: SelectOption[] = []; - override render() { + public override render() { return html` `; } diff --git a/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts b/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts index 9b23237e7..122805171 100644 --- a/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts +++ b/src/blocks/CloudImageEditorActivity/CloudImageEditorActivity.ts @@ -23,7 +23,7 @@ export class CloudImageEditorActivity extends LitUploaderBlock { private _entry?: TypedData; @state() - private editorConfig: EditorTemplateConfig | null = null; + private _editorConfig: EditorTemplateConfig | null = null; public override get activityParams(): ActivityParams { const params = super.activityParams; @@ -42,29 +42,29 @@ export class CloudImageEditorActivity extends LitUploaderBlock { }); this.subConfigValue('cropPreset', (cropPreset) => { - if (!this.editorConfig) { + if (!this._editorConfig) { return; } const normalized = cropPreset || undefined; - if (this.editorConfig.cropPreset === normalized) { + if (this._editorConfig.cropPreset === normalized) { return; } - this.editorConfig = { - ...this.editorConfig, + this._editorConfig = { + ...this._editorConfig, cropPreset: normalized, }; }); this.subConfigValue('cloudImageEditorTabs', (tabs) => { - if (!this.editorConfig) { + if (!this._editorConfig) { return; } const normalized = tabs || undefined; - if (this.editorConfig.tabs === normalized) { + if (this._editorConfig.tabs === normalized) { return; } - this.editorConfig = { - ...this.editorConfig, + this._editorConfig = { + ...this._editorConfig, tabs: normalized, }; }); @@ -106,20 +106,20 @@ export class CloudImageEditorActivity extends LitUploaderBlock { if (!cdnUrl) { throw new Error(`Entry with internalId "${internalId}" hasn't uploaded yet`); } - this.editorConfig = this._createEditorConfig(cdnUrl); + this._editorConfig = this._createEditorConfig(cdnUrl); } private _unmountEditor(): void { this._entry = undefined; - this.editorConfig = null; + this._editorConfig = null; } public override render() { - if (!this.editorConfig) { + if (!this._editorConfig) { return nothing; } - const { cdnUrl, cropPreset, tabs } = this.editorConfig; + const { cdnUrl, cropPreset, tabs } = this._editorConfig; return html` = new Map(); + private _computationControllers: Map = new Map(); private _flushValueToAttribute(key: keyof ConfigType, value: unknown) { if (!isComplexKey(key)) { @@ -177,7 +177,7 @@ export class Config extends LitBlock { key, setValue: this._setValue.bind(this), getValue: this._getValue.bind(this), - computationControllers: this.computationControllers, + computationControllers: this._computationControllers, }); }); } diff --git a/src/blocks/DropArea/DropArea.ts b/src/blocks/DropArea/DropArea.ts index 61a9dca2e..c271a04a6 100644 --- a/src/blocks/DropArea/DropArea.ts +++ b/src/blocks/DropArea/DropArea.ts @@ -33,12 +33,12 @@ export class DropArea extends LitUploaderBlock { public text?: string; @state() - private isEnabled = true; + private _isEnabled = true; @state() - private isVisible = true; + private _isVisible = true; - private get localizedText() { + private get _localizedText() { const customText = this.text; if (typeof customText === 'string' && customText.length > 0) { return this.l10n(customText) || customText; @@ -48,8 +48,8 @@ export class DropArea extends LitUploaderBlock { private _destroyDropzone: (() => void) | null = null; private _destroyContentWrapperDropzone: (() => void) | null = null; - private contentWrapperRef: Ref = createRef(); - private readonly handleAreaInteraction = (event: Event) => { + private _contentWrapperRef: Ref = createRef(); + private readonly _handleAreaInteraction = (event: Event) => { if (event instanceof KeyboardEvent) { if (event.code !== 'Space' && event.code !== 'Enter') { return; @@ -65,11 +65,11 @@ export class DropArea extends LitUploaderBlock { this.api.openSystemDialog(); }; - private sourceListAllowsLocal = true; - private clickableListenersAttached = false; + private _sourceListAllowsLocal = true; + private _clickableListenersAttached = false; public isActive(): boolean { - if (!this.isEnabled) { + if (!this._isEnabled) { return false; } const bounds = this.getBoundingClientRect(); @@ -90,16 +90,16 @@ export class DropArea extends LitUploaderBlock { super.initCallback(); dropAreaRegistry.add(this); - this.updateIsEnabled(); - this.updateVisibility(); - this.updateClickableListeners(); - this.updateDragStateAttribute(DropzoneState.INACTIVE); + this._updateIsEnabled(); + this._updateVisibility(); + this._updateClickableListeners(); + this._updateDragStateAttribute(DropzoneState.INACTIVE); this._destroyDropzone = addDropzone({ element: this, shouldIgnore: () => this._shouldIgnore(), onChange: (state: DropzoneStateValue) => { - this.updateDragStateAttribute(state); + this._updateDragStateAttribute(state); }, onItems: (items: DropItem[]) => { if (!items.length) { @@ -122,7 +122,7 @@ export class DropArea extends LitUploaderBlock { }, }); - const contentWrapperEl = this.contentWrapperRef.value; + const contentWrapperEl = this._contentWrapperRef.value; if (contentWrapperEl) { this._destroyContentWrapperDropzone = addDropzone({ element: contentWrapperEl, @@ -139,9 +139,9 @@ export class DropArea extends LitUploaderBlock { this.subConfigValue('sourceList', (value: string) => { const list = stringToArray(value); - this.sourceListAllowsLocal = list.includes(UploadSource.LOCAL); - this.updateIsEnabled(); - this.updateVisibility(); + this._sourceListAllowsLocal = list.includes(UploadSource.LOCAL); + this._updateIsEnabled(); + this._updateVisibility(); }); } @@ -149,8 +149,8 @@ export class DropArea extends LitUploaderBlock { super.willUpdate(changedProperties); if (changedProperties.has('disabled')) { - this.updateIsEnabled(); - this.updateVisibility(); + this._updateIsEnabled(); + this._updateVisibility(); } } @@ -158,13 +158,13 @@ export class DropArea extends LitUploaderBlock { super.updated(changedProperties); if (changedProperties.has('clickable')) { - this.updateClickableListeners(); + 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()) { @@ -198,18 +198,18 @@ export class DropArea extends LitUploaderBlock { return true; } - private updateIsEnabled(): void { - const nextIsEnabled = this.sourceListAllowsLocal && !this.disabled; - this.isEnabled = nextIsEnabled; + private _updateIsEnabled(): void { + const nextIsEnabled = this._sourceListAllowsLocal && !this.disabled; + this._isEnabled = nextIsEnabled; } - private updateVisibility(): void { - const shouldBeVisible = this.isEnabled || !this.querySelector('[data-default-slot]'); - this.isVisible = shouldBeVisible; + private _updateVisibility(): void { + const shouldBeVisible = this._isEnabled || !this.querySelector('[data-default-slot]'); + this._isVisible = shouldBeVisible; this.hidden = !shouldBeVisible; } - private updateDragStateAttribute(state: DropzoneStateValue): void { + private _updateDragStateAttribute(state: DropzoneStateValue): void { const stateText = Object.entries(DropzoneState) .find(([, value]) => value === state)?.[0] .toLowerCase(); @@ -218,15 +218,15 @@ export class DropArea extends LitUploaderBlock { } } - 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; + 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; } } @@ -237,10 +237,10 @@ export class DropArea extends LitUploaderBlock { this._destroyDropzone?.(); this._destroyContentWrapperDropzone?.(); - if (this.clickableListenersAttached) { - this.removeEventListener('keydown', this.handleAreaInteraction); - this.removeEventListener('click', this.handleAreaInteraction); - this.clickableListenersAttached = false; + if (this._clickableListenersAttached) { + this.removeEventListener('keydown', this._handleAreaInteraction); + this.removeEventListener('click', this._handleAreaInteraction); + this._clickableListenersAttached = false; } } @@ -249,12 +249,12 @@ export class DropArea extends LitUploaderBlock { ${this.yield( '', html` -
+
- ${this.localizedText} + ${this._localizedText}
`, )} `; diff --git a/src/blocks/ExternalSource/ExternalSource.ts b/src/blocks/ExternalSource/ExternalSource.ts index d27e81ad1..303a2de05 100644 --- a/src/blocks/ExternalSource/ExternalSource.ts +++ b/src/blocks/ExternalSource/ExternalSource.ts @@ -24,37 +24,37 @@ export class ExternalSource extends LitUploaderBlock { public override activityType = LitActivityBlock.activities.EXTERNAL; private _messageBridge?: MessageBridge; - private iframeRef = createRef(); + private _iframeRef = createRef(); private _latestSelectionSummary: { selectedCount: number; total: number } | null = null; @state() - private selectedList: NonNullable = []; + private _selectedList: NonNullable = []; @state() - private isSelectionReady = false; + private _isSelectionReady = false; @state() - private isDoneBtnEnabled = false; + private _isDoneBtnEnabled = false; @state() - private couldSelectAll = false; + private _couldSelectAll = false; @state() - private couldDeselectAll = false; + private _couldDeselectAll = false; @state() - private showSelectionStatus = false; + private _showSelectionStatus = false; @state() - private showDoneBtn = false; + private _showDoneBtn = false; @state() - private doneBtnTextClass = 'uc-hidden'; + private _doneBtnTextClass = 'uc-hidden'; @state() - private toolbarVisible = true; + private _toolbarVisible = true; - private get counterText(): string { + private get _counterText(): string { if (!this._latestSelectionSummary) { return ''; } @@ -87,35 +87,35 @@ export class ExternalSource extends LitUploaderBlock { return; } - this.mountIframe(); + this._mountIframe(); }, }); 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', () => { - this.setupL10n(); + this._setupL10n(); }); this.subConfigValue('externalSourcesEmbedCss', (embedCss) => { - this.applyEmbedCss(embedCss); + this._applyEmbedCss(embedCss); }); } - private extractUrlFromSelectedFile( + private _extractUrlFromSelectedFile( selectedFile: NonNullable[number], ): string { if (selectedFile.alternatives) { @@ -133,11 +133,11 @@ export class ExternalSource extends LitUploaderBlock { return selectedFile.url; } - private handleToolbarStateChange(message: InputMessageMap['toolbar-state-change']): void { - this.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; @@ -145,44 +145,44 @@ export class ExternalSource extends LitUploaderBlock { 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; + 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; @@ -203,8 +203,8 @@ export class ExternalSource extends LitUploaderBlock { } private _handleDone = (): void => { - for (const message of this.selectedList) { - const url = this.extractUrlFromSelectedFile(message); + 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 }); @@ -230,9 +230,9 @@ export class ExternalSource extends LitUploaderBlock { this._latestSelectionSummary = { selectedCount, total }; } - private mountIframe(): void { + private _mountIframe(): void { const iframe = document.createElement('iframe'); - iframe.src = this.remoteUrl(); + iframe.src = this._remoteUrl(); // @ts-expect-error iframe.marginHeight = 0; // @ts-expect-error @@ -240,13 +240,13 @@ export class ExternalSource extends LitUploaderBlock { iframe.frameBorder = '0'; // @ts-expect-error iframe.allowTransparency = true; - iframe.addEventListener('load', this.handleIframeLoad.bind(this)); + iframe.addEventListener('load', this._handleIframeLoad.bind(this)); - 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 (this._iframeRef.value) { + this._iframeRef.value.innerHTML = ''; + this._iframeRef.value.appendChild(iframe); } if (!iframe.contentWindow) { @@ -256,37 +256,37 @@ export class ExternalSource extends LitUploaderBlock { 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; - if (this.iframeRef.value) { - this.iframeRef.value.innerHTML = ''; + if (this._iframeRef.value) { + this._iframeRef.value.innerHTML = ''; } - this.resetSelectionStatus(); + this._resetSelectionStatus(); } - 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'; + 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; } public override disconnectedCallback(): void { super.disconnectedCallback(); - this.unmountIframe(); + this._unmountIframe(); } public override render() { @@ -303,23 +303,23 @@ export class ExternalSource extends LitUploaderBlock {
-
-
+
+
-
- ${this.counterText} - - +
+ ${this._counterText} + +
diff --git a/src/blocks/FileItem/FileItem.ts b/src/blocks/FileItem/FileItem.ts index 824ef64eb..c2579a27e 100644 --- a/src/blocks/FileItem/FileItem.ts +++ b/src/blocks/FileItem/FileItem.ts @@ -35,56 +35,54 @@ export class FileItem extends FileItemConfig { protected override couldBeCtxOwner = true; @state() - private pauseRender = true; + private _pauseRender = true; @property({ type: String, attribute: false }) public uid = ''; @state() - protected itemName = ''; + private _itemName = ''; @state() - protected errorText = ''; + private _errorText = ''; @state() - protected hint = ''; + private _hint = ''; @state() - protected progressValue = 0; + private _progressValue = 0; @state() - protected progressVisible = false; + private _progressVisible = false; @state() - protected badgeIcon = ''; + private _badgeIcon = ''; @state() - protected isFinished = false; + private _isFinished = false; @state() - protected isFailed = false; + private _isFailed = false; @state() - protected isUploading = false; + private _isUploading = false; @state() - protected isFocused = false; + private _isFocused = false; @state() - protected isEditable = false; + private _isEditable = false; @state() - protected showFileNames = false; + private _showFileNames = false; @state() - protected ariaLabelStatusFile = ''; + private _ariaLabelStatusFile = ''; - private renderedOnce = false; - private observer?: IntersectionObserver; - protected isIntersecting = false; - protected thumbRect?: DOMRectReadOnly; + private _renderedOnce = false; + private _observer?: IntersectionObserver; - private handleEdit = this.withEntry((entry) => { + private _handleEdit = this.withEntry((entry) => { this.telemetryManager.sendEvent({ payload: { metadata: { @@ -100,7 +98,7 @@ export class FileItem extends FileItemConfig { this.$['*currentActivity'] = LitActivityBlock.activities.CLOUD_IMG_EDIT; }); - private handleRemove = (): void => { + private _handleRemove = (): void => { this.telemetryManager.sendEvent({ payload: { metadata: { @@ -115,11 +113,11 @@ export class FileItem extends FileItemConfig { } }; - private handleUploadClick = (): void => { - this.upload(); + private _handleUploadClick = (): void => { + this._upload(); }; - private calculateState(): void { + private _calculateState(): void { const entry = this.entry; if (!entry) { return; @@ -141,12 +139,12 @@ export class FileItem extends FileItemConfig { state = FileItemState.FINISHED; } - this.handleState(entry, state); + this._handleState(entry, state); } - private debouncedCalculateState = debounce(() => this.calculateState(), 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 source = entry.getValue('source'); @@ -165,11 +163,11 @@ export class FileItem extends FileItemConfig { hint = this.l10n('waiting-for', { source: this.l10n(`src-type-${source}`) }); } - this.hint = hint; - this.errorText = errorText; - this.progressVisible = isUploading || isQueuedForUploading || isQueuedForValidation || isValidationPending; - this.progressValue = isQueuedForValidation || isValidationPending ? 0 : entry.getValue('uploadProgress'); - this.ariaLabelStatusFile = fileName + 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(), @@ -178,47 +176,44 @@ export class FileItem extends FileItemConfig { }, 100), ); - private handleState(entry: UploadEntryTypedData, state: FileItemStateValue): void { + 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.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._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); + this._updateHintAndProgress(state); } protected override reset(): void { super.reset(); - this.debouncedCalculateState.cancel(); + this._debouncedCalculateState.cancel(); } - private observerCallback(entries: IntersectionObserverEntry[]): void { + private _observerCallback(entries: IntersectionObserverEntry[]): void { const [entry] = entries; if (!entry) { return; } - this.isIntersecting = entry.isIntersecting; - this.thumbRect = entry.boundingClientRect; - - if (entry.isIntersecting && !this.renderedOnce) { - this.pauseRender = false; - this.renderedOnce = true; + if (entry.isIntersecting && !this._renderedOnce) { + this._pauseRender = false; + this._renderedOnce = true; } } - private handleEntryId(id: string): void { + private _handleEntryId(id: string): void { this.reset(); const entry = this.uploadCollection?.read(id); @@ -229,76 +224,76 @@ export class FileItem extends FileItemConfig { } this.subEntry('isQueuedForValidation', () => { - this.debouncedCalculateState(); + this._debouncedCalculateState(); }); this.subEntry('isValidationPending', () => { - this.debouncedCalculateState(); + this._debouncedCalculateState(); }); this.subEntry('uploadProgress', () => { - this.debouncedCalculateState(); + this._debouncedCalculateState(); }); this.subEntry('isQueuedForUploading', () => { - this.debouncedCalculateState(); + this._debouncedCalculateState(); }); this.subEntry('fileName', (name) => { - this.itemName = name || entry.getValue('externalUrl') || this.l10n('file-no-name'); - this.debouncedCalculateState(); + 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._itemName = entry.getValue('fileName') || externalUrl || this.l10n('file-no-name'); }); this.subEntry('fileInfo', () => { - this.debouncedCalculateState(); + 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(); + this._calculateState(); } - private updateShowFileNames(value: boolean): void { + 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; } protected override willUpdate(changedProperties: PropertyValues): void { super.willUpdate(changedProperties); if (changedProperties.has('uid')) { - this.handleEntryId(this.uid); + this._handleEntryId(this.uid); } } public override initCallback(): void { super.initCallback(); - this.handleEntryId(this.uid); + this._handleEntryId(this.uid); - this.subConfigValue('useCloudImageEditor', () => this.debouncedCalculateState()); + this.subConfigValue('useCloudImageEditor', () => this._debouncedCalculateState()); this.subConfigValue('filesViewMode', (mode) => { - this.updateShowFileNames(this.cfg.gridShowFileNames); + this._updateShowFileNames(this.cfg.gridShowFileNames); this.setAttribute('mode', mode); }); this.subConfigValue('gridShowFileNames', (value) => { - this.updateShowFileNames(value); + this._updateShowFileNames(value); }); this.onclick = () => { @@ -315,7 +310,7 @@ export class FileItem extends FileItemConfig { if (this.entry && !itemsToUpload.has(this.entry.uid)) { return; } - setTimeout(() => this.isConnected && this.upload()); + setTimeout(() => this.isConnected && this._upload()); }); FileItem.activeInstances.add(this); } @@ -323,23 +318,23 @@ export class FileItem extends FileItemConfig { public override connectedCallback(): void { super.connectedCallback(); - this.observer = new window.IntersectionObserver(this.observerCallback.bind(this), { + this._observer = new window.IntersectionObserver(this._observerCallback.bind(this), { threshold: [0, 1], }); - this.observer.observe(this); + this._observer.observe(this); } public override disconnectedCallback(): void { super.disconnectedCallback(); - this.observer?.disconnect(); + this._observer?.disconnect(); FileItem.activeInstances.delete(this); this.reset(); } - private upload = this.withEntry(async (entry) => { + private _upload = this.withEntry(async (entry) => { if (!this.uploadCollection.read(entry.uid)) { return; } @@ -363,7 +358,7 @@ export class FileItem extends FileItemConfig { isQueuedForUploading: true, }); - this.debouncedCalculateState(); + this._debouncedCalculateState(); try { const abortController = new AbortController(); @@ -424,7 +419,7 @@ export class FileItem extends FileItemConfig { }); if (entry === this.entry) { - this.debouncedCalculateState(); + this._debouncedCalculateState(); } } catch (cause) { this.telemetryManager.sendEventError(cause, 'file upload. Failed to upload file'); @@ -452,7 +447,7 @@ export class FileItem extends FileItemConfig { } if (entry === this.entry) { - this.debouncedCalculateState(); + this._debouncedCalculateState(); } } }); @@ -460,7 +455,7 @@ export class FileItem extends FileItemConfig { public static activeInstances: Set = new Set(); protected override shouldUpdate(changedProperties: PropertyValues): boolean { - if (this.pauseRender) { + if (this._pauseRender) { return false; } return super.shouldUpdate(changedProperties); @@ -468,19 +463,19 @@ export class FileItem extends FileItemConfig { public override render() { return html` -
- +
+ -
- ${this.itemName} - ${this.errorText} - ${this.hint} +
+ ${this._itemName} + ${this._errorText} + ${this._hint}
-
- +
`; diff --git a/src/blocks/FileItem/FileItemConfig.ts b/src/blocks/FileItem/FileItemConfig.ts index 2d1808235..b95e15137 100644 --- a/src/blocks/FileItem/FileItemConfig.ts +++ b/src/blocks/FileItem/FileItemConfig.ts @@ -4,7 +4,7 @@ import { LitUploaderBlock } from '../../lit/LitUploaderBlock'; type EntrySubscription = ReturnType; export class FileItemConfig extends LitUploaderBlock { - protected entrySubs: Set = new Set(); + private _entrySubs: Set = new Set(); protected entry: UploadEntryTypedData | null = null; @@ -28,21 +28,21 @@ export class FileItemConfig extends LitUploaderBlock { handlerInner(value); } }); - this.entrySubs.add(sub); + this._entrySubs.add(sub); })(prop, handler); } protected reset(): void { - for (const sub of this.entrySubs) { + for (const sub of this._entrySubs) { sub.remove(); } - this.entrySubs = new Set(); + this._entrySubs = new Set(); this.entry = null; } public override disconnectedCallback(): void { super.disconnectedCallback(); - this.entrySubs = new Set(); + this._entrySubs = new Set(); } } diff --git a/src/blocks/Icon/Icon.ts b/src/blocks/Icon/Icon.ts index beb011b39..aa66be89d 100644 --- a/src/blocks/Icon/Icon.ts +++ b/src/blocks/Icon/Icon.ts @@ -9,36 +9,36 @@ export class Icon extends LitBlock { public name = ''; @state() - private resolvedHref = ''; + private _resolvedHref = ''; - private iconHrefResolver: IconHrefResolver | null = null; + private _iconHrefResolver: IconHrefResolver | null = null; public override initCallback(): void { super.initCallback(); this.setAttribute('aria-hidden', 'true'); this.subConfigValue('iconHrefResolver', (resolver: IconHrefResolver | null) => { - this.iconHrefResolver = resolver; - this.updateResolvedHref(); + this._iconHrefResolver = resolver; + this._updateResolvedHref(); }); } protected override willUpdate(changedProperties: PropertyValues): void { super.willUpdate(changedProperties); if (changedProperties.has('name')) { - this.updateResolvedHref(); + this._updateResolvedHref(); } } - private updateResolvedHref(): void { + private _updateResolvedHref(): void { if (!this.name) { - this.resolvedHref = ''; + this._resolvedHref = ''; return; } const defaultHref = `#uc-icon-${this.name}`; - const customHref = this.iconHrefResolver?.(this.name); - this.resolvedHref = customHref ?? defaultHref; + const customHref = this._iconHrefResolver?.(this.name); + this._resolvedHref = customHref ?? defaultHref; } public override render() { @@ -46,7 +46,7 @@ export class Icon extends LitBlock { ${this.yield( '', html``, )} `; diff --git a/src/blocks/Img/ImgBase.ts b/src/blocks/Img/ImgBase.ts index 2e0ba971e..48d2a2af1 100644 --- a/src/blocks/Img/ImgBase.ts +++ b/src/blocks/Img/ImgBase.ts @@ -38,8 +38,8 @@ type CurrentImg = { }; export class ImgBase extends ImgConfig { - protected _img: HTMLImageElement = new Image(); - protected _imgPreview: HTMLImageElement = new Image(); + private _img: HTMLImageElement = new Image(); + private _imgPreview: HTMLImageElement = new Image(); private _fmtAbs(src: string): string { const isRel = !src.includes('//'); @@ -57,9 +57,9 @@ export class ImgBase extends ImgConfig { const bp = parseInt(numericPart, 10); - if (Number(bp) > MAX_WIDTH_JPG && this.hasFormatJPG) { + if (Number(bp) > MAX_WIDTH_JPG && this._hasFormatJPG) { return MAX_WIDTH_JPG + alphabeticPart; - } else if (Number(bp) > MAX_WIDTH && !this.hasFormatJPG) { + } else if (Number(bp) > MAX_WIDTH && !this._hasFormatJPG) { return MAX_WIDTH + alphabeticPart; } } @@ -169,15 +169,15 @@ export class ImgBase extends ImgConfig { } protected get img(): HTMLImageElement { - if (!this.hasPreviewImage) { - this.setupConfigForImage({ elNode: this._img }); + if (!this._hasPreviewImage) { + this._setupConfigForImage({ elNode: this._img }); this.appendChild(this._img); } return this._img; } - private get currentImg(): CurrentImg { - return this.hasPreviewImage + private get _currentImg(): CurrentImg { + return this._hasPreviewImage ? { type: ImgTypeEnum.PREVIEW as ImgType, img: this._imgPreview, @@ -188,15 +188,15 @@ export class ImgBase extends ImgConfig { }; } - private get hasPreviewImage(): string | number | boolean | undefined { + private get _hasPreviewImage(): string | number | boolean | undefined { return this.$$('is-preview-blur') as string | number | boolean | undefined; } - private get bgSelector(): string | undefined { + private get _bgSelector(): string | undefined { return this.$$('is-background-for') as string | undefined; } - private get breakpoints(): number[] | null { + private get _breakpoints(): number[] | null { const breakpointsValue = this.$$('breakpoints') as string | undefined; if (breakpointsValue) { const list = stringToArray(breakpointsValue); @@ -206,11 +206,11 @@ export class ImgBase extends ImgConfig { } } - private get hasFormatJPG(): boolean { + private get _hasFormatJPG(): boolean { return (this.$$('format') as string).toLowerCase() === 'jpeg'; } - private renderBg(el: HTMLElement): void { + private _renderBg(el: HTMLElement): void { const imgSet = new Set(); imgSet.add(`url("${this._getUrlBase(this._getElSize(el)) as string}") 1x`); @@ -227,10 +227,10 @@ export class ImgBase extends ImgConfig { el.style.setProperty('background-image', '-webkit-' + iSet); } - private getSrcset(): string { + private _getSrcset(): string { const srcset = new Set(); - if (this.breakpoints) { - this.breakpoints.forEach((bp) => { + 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`)}`); @@ -242,34 +242,34 @@ export class ImgBase extends ImgConfig { } }); } else { - srcset.add(`${this._getUrlBase(this._getElSize(this.currentImg.img)) as string} 1x`); + 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`); + 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`); + srcset.add(`${this._getUrlBase(this._getElSize(this._currentImg.img, 3)) as string} 3x`); } } return [...srcset].join(); } - private getSrc(): string | undefined { + private _getSrc(): string | undefined { return this._getUrlBase(); } - private get srcUrlPreview(): string | undefined { + private get _srcUrlPreview(): string | undefined { return this._getUrlBase('100x', '100'); } - private renderBackground(): void { - const selector = this.bgSelector as string; + 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); + this._renderBg(el as HTMLElement); }); } else { - this.renderBg(el as HTMLElement); + this._renderBg(el as HTMLElement); } }); } @@ -284,14 +284,14 @@ export class ImgBase extends ImgConfig { } } - private setupConfigForImage({ elNode }: ConfigImageParams): void { + private _setupConfigForImage({ elNode }: ConfigImageParams): void { this._setupEventProxy(elNode); this.initAttributes(elNode); } - private loaderImage({ src, srcset, elNode }: LoaderParams): Promise { + private _loaderImage({ src, srcset, elNode }: LoaderParams): Promise { return new Promise((resolve, reject) => { - this.setupConfigForImage({ elNode }); + this._setupConfigForImage({ elNode }); elNode.setAttribute(UNRESOLVED_ATTR, ''); @@ -312,32 +312,32 @@ export class ImgBase extends ImgConfig { }); } - private async renderImage(): Promise { + private async _renderImage(): Promise { if (this.$$('intersection')) { - if (this.hasPreviewImage) { - this.setupConfigForImage({ elNode: this._imgPreview }); + 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; + 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(), + await this._loaderImage({ + src: this._getSrc(), + srcset: this._getSrcset(), elNode: this._img, }); - if (this.hasPreviewImage) { + if (this._hasPreviewImage) { await this._imgPreview.remove(); } this.appendChild(this._img); } catch { - if (this.hasPreviewImage) { + if (this._hasPreviewImage) { await this._imgPreview?.remove(); } this.appendChild(this._img); @@ -348,28 +348,28 @@ export class ImgBase extends ImgConfig { } try { - if (this.hasPreviewImage) { - await this.loaderImage({ - src: this.srcUrlPreview, + 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(), + await this._loaderImage({ + src: this._getSrc(), + srcset: this._getSrcset(), elNode: this._img, }); - if (this.hasPreviewImage) { + if (this._hasPreviewImage) { await this._imgPreview?.remove(); } this.appendChild(this._img); } catch { - if (this.hasPreviewImage) { + if (this._hasPreviewImage) { await this._imgPreview?.remove(); } this.appendChild(this._img); @@ -377,10 +377,10 @@ export class ImgBase extends ImgConfig { } protected init(): void { - if (this.bgSelector) { - this.renderBackground(); + if (this._bgSelector) { + this._renderBackground(); } else { - this.renderImage(); + this._renderImage(); } } } diff --git a/src/blocks/Modal/Modal.ts b/src/blocks/Modal/Modal.ts index 322184304..71ab3b6aa 100644 --- a/src/blocks/Modal/Modal.ts +++ b/src/blocks/Modal/Modal.ts @@ -11,10 +11,10 @@ let LAST_ACTIVE_MODAL_ID: ModalId | null = null; export class Modal extends LitBlock { public static override styleAttrs = [...super.styleAttrs, 'uc-modal']; - private mouseDownTarget: EventTarget | null | undefined; - protected dialogEl = createRef(); + private _mouseDownTarget: EventTarget | null | undefined; + private _dialogEl = createRef(); - private closeDialog = (): void => { + private _closeDialog = (): void => { this.modalManager?.close(this.id); if (!this.modalManager?.hasActiveModals) { @@ -22,23 +22,23 @@ export class Modal extends LitBlock { } }; - private handleDialogClose = (): void => { - this.closeDialog(); + private _handleDialogClose = (): void => { + this._closeDialog(); }; - private handleDialogMouseDown = (e: MouseEvent): void => { - this.mouseDownTarget = e.target; + private _handleDialogMouseDown = (e: MouseEvent): void => { + this._mouseDownTarget = e.target; }; - private handleDialogMouseUp = (e: MouseEvent): void => { + private _handleDialogMouseUp = (e: MouseEvent): void => { const target = e.target as EventTarget | null; - if (target === this.dialogEl.value && target === this.mouseDownTarget) { - this.closeDialog(); + if (target === this._dialogEl.value && target === this._mouseDownTarget) { + this._closeDialog(); } }; public show(): void { - const dialog = this.dialogEl.value as HTMLDialogElement & { + const dialog = this._dialogEl.value as HTMLDialogElement & { showModal?: () => void; }; if (typeof dialog.showModal === 'function') { @@ -54,7 +54,7 @@ export class Modal extends LitBlock { } public hide(): void { - const dialog = this.dialogEl.value as HTMLDialogElement & { + const dialog = this._dialogEl.value as HTMLDialogElement & { close?: () => void; }; if (typeof dialog.close === 'function') { @@ -65,7 +65,7 @@ export class Modal extends LitBlock { } } - private handleModalOpen = ({ id }: Parameters[0]): void => { + private _handleModalOpen = ({ id }: Parameters[0]): void => { if (id === this.id) { LAST_ACTIVE_MODAL_ID = id; this.show(); @@ -75,7 +75,7 @@ export class Modal extends LitBlock { } }; - private handleModalClose = ({ id }: Parameters[0]): void => { + private _handleModalClose = ({ id }: Parameters[0]): void => { if (id === this.id) { this.hide(); this.emit( @@ -86,7 +86,7 @@ export class Modal extends LitBlock { } }; - private handleModalCloseAll = (_data: Parameters[0]): void => { + private _handleModalCloseAll = (_data: Parameters[0]): void => { this.hide(); if (LAST_ACTIVE_MODAL_ID === this.id) { @@ -111,32 +111,32 @@ export class Modal extends LitBlock { } }); - 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); } public override disconnectedCallback(): void { super.disconnectedCallback(); document.body.style.overflow = ''; - this.mouseDownTarget = undefined; + this._mouseDownTarget = undefined; - 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); } - private handleDialogRef(dialog: Element | undefined): void { - this.dialogEl = { value: dialog } as typeof this.dialogEl; + 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); + 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/ProgressBar/ProgressBar.ts b/src/blocks/ProgressBar/ProgressBar.ts index 9b0a9da54..1e0534de2 100644 --- a/src/blocks/ProgressBar/ProgressBar.ts +++ b/src/blocks/ProgressBar/ProgressBar.ts @@ -14,10 +14,10 @@ export class ProgressBar extends LitBlock { private _progressValue = 0; - private readonly fakeProgressLineRef = createRef(); + private readonly _fakeProgressLineRef = createRef(); - private readonly handleFakeProgressAnimation = (): void => { - const fakeProgressLine = this.fakeProgressLineRef.value; + private readonly _handleFakeProgressAnimation = (): void => { + const fakeProgressLine = this._fakeProgressLineRef.value; if (!fakeProgressLine) { return; } @@ -35,16 +35,16 @@ export class ProgressBar extends LitBlock { protected override firstUpdated(changedProperties: PropertyValues): void { super.firstUpdated(changedProperties); - this._progressValue = this.normalizeProgressValue(this.value); - this.updateProgressValueStyle(); - this.fakeProgressLineRef.value?.addEventListener('animationiteration', this.handleFakeProgressAnimation); + this._progressValue = this._normalizeProgressValue(this.value); + this._updateProgressValueStyle(); + this._fakeProgressLineRef.value?.addEventListener('animationiteration', this._handleFakeProgressAnimation); } protected override updated(changedProperties: PropertyValues): void { super.updated(changedProperties); if (changedProperties.has('value')) { - const normalizedValue = this.normalizeProgressValue(this.value); + const normalizedValue = this._normalizeProgressValue(this.value); if (!this.visible) { this._progressValue = normalizedValue; @@ -52,7 +52,7 @@ export class ProgressBar extends LitBlock { const nextValue = Math.max(this._progressValue, normalizedValue); if (nextValue !== this._progressValue) { this._progressValue = nextValue; - this.updateProgressValueStyle(); + this._updateProgressValueStyle(); } } } @@ -60,26 +60,26 @@ export class ProgressBar extends LitBlock { if (changedProperties.has('visible')) { this.classList.toggle('uc-progress-bar--hidden', !this.visible); if (this.visible) { - this.updateProgressValueStyle(); + this._updateProgressValueStyle(); } else { - this._progressValue = this.normalizeProgressValue(this.value); + this._progressValue = this._normalizeProgressValue(this.value); } } } public override disconnectedCallback(): void { super.disconnectedCallback(); - this.fakeProgressLineRef.value?.removeEventListener('animationiteration', this.handleFakeProgressAnimation); + this._fakeProgressLineRef.value?.removeEventListener('animationiteration', this._handleFakeProgressAnimation); } - private normalizeProgressValue(value: number): number { + private _normalizeProgressValue(value: number): number { if (!Number.isFinite(value)) { return 0; } return Math.min(100, Math.max(0, value)); } - private updateProgressValueStyle(): void { + private _updateProgressValueStyle(): void { if (!this.visible) { return; } @@ -88,7 +88,7 @@ export class ProgressBar extends LitBlock { public override render() { return html` -
+
`; } diff --git a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts index fc59a683f..dfe0a4498 100644 --- a/src/blocks/ProgressBarCommon/ProgressBarCommon.ts +++ b/src/blocks/ProgressBarCommon/ProgressBarCommon.ts @@ -13,10 +13,10 @@ export class ProgressBarCommon extends LitUploaderBlock { private _unobserveCollectionCb?: () => void; @state() - protected visible = false; + private _visible = false; @state() - protected value = 0; + private _value = 0; public constructor() { super(); @@ -34,11 +34,11 @@ export class ProgressBarCommon extends LitUploaderBlock { return item?.getValue('isUploading') ?? false; }); - this.visible = anyUploading; + this._visible = anyUploading; }); this.sub('*commonProgress', (progress: number) => { - this.value = progress; + this._value = progress; }); } @@ -46,7 +46,7 @@ export class ProgressBarCommon extends LitUploaderBlock { super.updated(changedProperties); if (changedProperties.has('visible' as keyof ProgressBarCommon)) { - if (this.visible) { + if (this._visible) { this.setAttribute('active', ''); } else { this.removeAttribute('active'); @@ -61,6 +61,6 @@ export class ProgressBarCommon extends LitUploaderBlock { } public override render() { - return html` `; + return html` `; } } diff --git a/src/blocks/SimpleBtn/SimpleBtn.ts b/src/blocks/SimpleBtn/SimpleBtn.ts index 09c32599c..85078f107 100644 --- a/src/blocks/SimpleBtn/SimpleBtn.ts +++ b/src/blocks/SimpleBtn/SimpleBtn.ts @@ -11,9 +11,9 @@ export class SimpleBtn extends LitUploaderBlock { public dropzone = true; @state() - private buttonTextKey = 'upload-file'; + private _buttonTextKey = 'upload-file'; - private readonly handleClick = () => { + private readonly _handleClick = () => { this.api.initFlow(); }; @@ -21,16 +21,16 @@ export class SimpleBtn extends LitUploaderBlock { super.initCallback(); this.subConfigValue('multiple', (val) => { - this.buttonTextKey = val ? 'upload-files' : 'upload-file'; + this._buttonTextKey = val ? 'upload-files' : 'upload-file'; }); } public override render() { return html` - diff --git a/src/blocks/SourceBtn/SourceBtn.ts b/src/blocks/SourceBtn/SourceBtn.ts index c4810441e..9499c65c5 100644 --- a/src/blocks/SourceBtn/SourceBtn.ts +++ b/src/blocks/SourceBtn/SourceBtn.ts @@ -26,25 +26,25 @@ export class SourceBtn extends LitUploaderBlock { public type?: string; @state() - private iconName = 'default'; + private _iconName = 'default'; @state() - private srcTypeKey = ''; + private _srcTypeKey = ''; - private initTypes(): void { - this.registerType({ + private _initTypes(): void { + this._registerType({ type: UploadSource.LOCAL, activate: () => { this.api.openSystemDialog(); return false; }, }); - this.registerType({ + this._registerType({ type: UploadSource.URL, activity: LitActivityBlock.activities.URL, textKey: 'from-url', }); - this.registerType({ + this._registerType({ type: UploadSource.CAMERA, activity: LitActivityBlock.activities.CAMERA, activate: () => { @@ -57,14 +57,14 @@ export class SourceBtn extends LitUploaderBlock { }, }); - this.registerType({ + this._registerType({ type: 'draw', activity: LitActivityBlock.activities.DRAW, icon: 'edit-draw', }); for (const mobileSourceType of Object.values(UploadSourceMobile)) { - this.registerType({ + this._registerType({ type: mobileSourceType, activity: LitActivityBlock.activities.CAMERA, activate: () => { @@ -82,7 +82,7 @@ export class SourceBtn extends LitUploaderBlock { } for (const externalSourceType of Object.values(ExternalUploadSource)) { - this.registerType({ + this._registerType({ type: externalSourceType, activity: LitActivityBlock.activities.EXTERNAL, activityParams: { @@ -94,14 +94,14 @@ export class SourceBtn extends LitUploaderBlock { public override initCallback(): void { super.initCallback(); - this.initTypes(); + this._initTypes(); if (this.type) { - this.applyType(this.type); + this._applyType(this.type); } } - private registerType(typeConfig: SourceTypeConfig): void { + private _registerType(typeConfig: SourceTypeConfig): void { this._registeredTypes[typeConfig.type] = typeConfig; } @@ -128,7 +128,7 @@ export class SourceBtn extends LitUploaderBlock { } } - private applyType(type: string): void { + private _applyType(type: string): void { const configType = this._registeredTypes[type]; if (!configType) { console.warn(`Unsupported source type: ${type}`); @@ -136,8 +136,8 @@ export class SourceBtn extends LitUploaderBlock { } const { textKey = type, icon = type } = configType; - this.srcTypeKey = `${L10N_PREFIX}${textKey}`; - this.iconName = icon; + this._srcTypeKey = `${L10N_PREFIX}${textKey}`; + this._iconName = icon; } protected override willUpdate(changedProperties: PropertyValues): void { @@ -145,10 +145,10 @@ export class SourceBtn extends LitUploaderBlock { if (changedProperties.has('type')) { if (this.type) { - this.applyType(this.type); + this._applyType(this.type); } else { - this.srcTypeKey = ''; - this.iconName = 'default'; + this._srcTypeKey = ''; + this._iconName = 'default'; } } } @@ -156,8 +156,8 @@ export class SourceBtn extends LitUploaderBlock { public override render() { return html` `; } diff --git a/src/blocks/SourceList/SourceList.ts b/src/blocks/SourceList/SourceList.ts index 2833d0e94..4cea0b0d0 100644 --- a/src/blocks/SourceList/SourceList.ts +++ b/src/blocks/SourceList/SourceList.ts @@ -60,13 +60,13 @@ export class SourceList extends LitBlock { resolvedSources.push(srcName); } - this.sources = resolvedSources; + this._sources = resolvedSources; } @state() - private sources: string[] = []; + private _sources: string[] = []; public override render() { - return html`${this.sources.map((type) => html``)}`; + return html`${this._sources.map((type) => html``)}`; } } diff --git a/src/blocks/Thumb/Thumb.ts b/src/blocks/Thumb/Thumb.ts index 4f44080d4..fa4b5ee3e 100644 --- a/src/blocks/Thumb/Thumb.ts +++ b/src/blocks/Thumb/Thumb.ts @@ -24,28 +24,28 @@ export class Thumb extends FileItemConfig { public uid = ''; @state() - private thumbUrl = ''; + private _thumbUrl = ''; - private renderedGridOnce = false; + private _renderedGridOnce = false; - private thumbRect: IntersectionObserverEntry['boundingClientRect'] | null = null; + private _thumbRect: IntersectionObserverEntry['boundingClientRect'] | null = null; - private isIntersecting = false; + private _isIntersecting = false; - private firstViewMode = this.cfg.filesViewMode; + private _firstViewMode = this.cfg.filesViewMode; - private observer?: IntersectionObserver; + private _observer?: IntersectionObserver; - private pendingThumbUpdate?: PendingThumbUpdate; + private _pendingThumbUpdate?: PendingThumbUpdate; - private calculateThumbSize(force = false): number { + private _calculateThumbSize(force = false): number { if (force) { - this.thumbRect = this.getBoundingClientRect(); + this._thumbRect = this.getBoundingClientRect(); } let size = Math.max( - parseInt(String(this?.thumbRect?.height || 0), 10), - parseInt(String(this?.thumbRect?.width || 0), 10), + parseInt(String(this?._thumbRect?.height || 0), 10), + parseInt(String(this?._thumbRect?.width || 0), 10), this.cfg.thumbSize, ); @@ -57,13 +57,13 @@ 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'); const currentThumbUrl = entry.getValue('thumbUrl'); - const size = this.calculateThumbSize(force); + const size = this._calculateThumbSize(force); if (fileInfo && isImage && uuid) { const thumbUrl = await this.proxyUrl( @@ -121,9 +121,9 @@ export class Thumb extends FileItemConfig { } }); - private debouncedGenerateThumb = debounce(this.generateThumbnail.bind(this), 100); + private _debouncedGenerateThumb = debounce(this._generateThumbnail.bind(this), 100); - private decodeImage(src: string, signal?: AbortSignal): Promise { + private _decodeImage(src: string, signal?: AbortSignal): Promise { return new Promise((resolve, reject) => { const image = new Image(); image.decoding = 'async'; @@ -168,22 +168,22 @@ export class Thumb extends FileItemConfig { }); } - private cancelPendingThumbUpdate(): void { - this.pendingThumbUpdate?.cancel(); - this.pendingThumbUpdate = undefined; + private _cancelPendingThumbUpdate(): void { + this._pendingThumbUpdate?.cancel(); + this._pendingThumbUpdate = undefined; } - private scheduleThumbUpdate(nextThumbUrl?: string): void { - this.cancelPendingThumbUpdate(); + private _scheduleThumbUpdate(nextThumbUrl?: string): void { + this._cancelPendingThumbUpdate(); if (!nextThumbUrl) { - if (this.thumbUrl) { - this.thumbUrl = ''; + if (this._thumbUrl) { + this._thumbUrl = ''; } return; } - if (nextThumbUrl === this.thumbUrl) { + if (nextThumbUrl === this._thumbUrl) { return; } @@ -198,9 +198,9 @@ export class Thumb extends FileItemConfig { }, }; - this.pendingThumbUpdate = pending; + this._pendingThumbUpdate = pending; - this.decodeImage(nextThumbUrl, abortController.signal) + this._decodeImage(nextThumbUrl, abortController.signal) .catch(() => {}) .then(() => { if (abortController.signal.aborted) { @@ -208,38 +208,38 @@ export class Thumb extends FileItemConfig { } pending.rafId = window.requestAnimationFrame(() => { if (!abortController.signal.aborted) { - this.thumbUrl = nextThumbUrl; + this._thumbUrl = nextThumbUrl; } }); }); } - private requestThumbGeneration(force = false): void { + private _requestThumbGeneration(force = false): void { if (!this.entry) { return; } if (force) { - this.generateThumbnail(true); + this._generateThumbnail(true); return; } - if (!this.isIntersecting) { + if (!this._isIntersecting) { return; } - this.debouncedGenerateThumb(); + this._debouncedGenerateThumb(); } protected override firstUpdated(changedProperties: PropertyValues): void { super.firstUpdated(changedProperties); - this.bindToEntry(); + this._bindToEntry(); } protected override updated(changedProperties: PropertyValues): void { super.updated(changedProperties); if (changedProperties.has('uid')) { - this.bindToEntry(); + this._bindToEntry(); } } @@ -248,29 +248,29 @@ export class Thumb extends FileItemConfig { if (!entry) { return; } - this.isIntersecting = entry.isIntersecting; + this._isIntersecting = entry.isIntersecting; if (entry.isIntersecting) { - this.thumbRect = entry.boundingClientRect; - this.requestThumbGeneration(); - this.observer?.disconnect(); + this._thumbRect = entry.boundingClientRect; + this._requestThumbGeneration(); + this._observer?.disconnect(); } if (entry.intersectionRatio === 0) { - this.debouncedGenerateThumb.cancel(); + this._debouncedGenerateThumb.cancel(); } } protected override reset(): void { super.reset(); - this.debouncedGenerateThumb.cancel(); - this.cancelPendingThumbUpdate(); - if (this.thumbUrl) { - this.thumbUrl = ''; + this._debouncedGenerateThumb.cancel(); + this._cancelPendingThumbUpdate(); + if (this._thumbUrl) { + this._thumbUrl = ''; } } - private bindToEntry(): void { + private _bindToEntry(): void { const id = this.uid?.trim(); if (!id) { if (this.entry) { @@ -288,7 +288,7 @@ export class Thumb extends FileItemConfig { this.entry = entry; const requestThumb = () => { - this.requestThumbGeneration(); + this._requestThumbGeneration(); }; this.subEntry('fileInfo', (fileInfo) => { @@ -298,23 +298,23 @@ export class Thumb extends FileItemConfig { }); this.subEntry('thumbUrl', (thumbUrl) => { - this.scheduleThumbUpdate(thumbUrl ?? undefined); + this._scheduleThumbUpdate(thumbUrl ?? undefined); }); this.subEntry('cdnUrlModifiers', requestThumb); - this.requestThumbGeneration(true); + this._requestThumbGeneration(true); } public override initCallback(): void { super.initCallback(); this.subConfigValue('filesViewMode', (viewMode) => { - if (viewMode === 'grid' && !this.renderedGridOnce) { - if (this.firstViewMode === 'list') { - this.requestThumbGeneration(true); + if (viewMode === 'grid' && !this._renderedGridOnce) { + if (this._firstViewMode === 'list') { + this._requestThumbGeneration(true); } - this.renderedGridOnce = true; + this._renderedGridOnce = true; } }); @@ -324,24 +324,24 @@ export class Thumb extends FileItemConfig { public override connectedCallback(): void { super.connectedCallback(); - this.observer?.disconnect(); - this.observer = new window.IntersectionObserver(this._observerCallback.bind(this), { threshold: 0.1 }); + this._observer?.disconnect(); + this._observer = new window.IntersectionObserver(this._observerCallback.bind(this), { threshold: 0.1 }); - this.observer.observe(this); + this._observer.observe(this); } public override disconnectedCallback(): void { super.disconnectedCallback(); - this.debouncedGenerateThumb.cancel(); - this.cancelPendingThumbUpdate(); - this.observer?.disconnect(); + this._debouncedGenerateThumb.cancel(); + this._cancelPendingThumbUpdate(); + this._observer?.disconnect(); } public override render() { return html`
- +
diff --git a/src/blocks/UploadList/UploadList.ts b/src/blocks/UploadList/UploadList.ts index 69558c19d..1dbdd3036 100644 --- a/src/blocks/UploadList/UploadList.ts +++ b/src/blocks/UploadList/UploadList.ts @@ -24,29 +24,30 @@ export class UploadList extends LitUploaderBlock { public override activityType = LitActivityBlock.activities.UPLOAD_LIST; @state() - private doneBtnVisible = false; + private _doneBtnVisible = false; @state() - private doneBtnEnabled = false; + private _doneBtnEnabled = false; @state() - private uploadBtnVisible = false; + private _uploadBtnVisible = false; @state() - private addMoreBtnVisible = false; + private _addMoreBtnVisible = false; @state() - private addMoreBtnEnabled = false; + private _addMoreBtnEnabled = false; @state() - private commonErrorMessage: string | null = null; + private _commonErrorMessage: string | null = null; @state() - private hasFiles = false; + private _hasFiles = false; @state() private _latestSummary: Summary | null = null; - protected get headerText() { + + private get _headerText() { if (!this._latestSummary) { return ''; } @@ -106,7 +107,7 @@ export class UploadList extends LitUploaderBlock { } }, 300); - protected _updateUploadsState(): void { + private _updateUploadsState(): void { const collectionState = this.api.getOutputCollectionState(); const summary: Summary = { total: collectionState.totalCount, @@ -135,12 +136,12 @@ export class UploadList extends LitUploaderBlock { doneBtnEnabled = summary.total === summary.succeed && fitCountRestrictions && validationOk && groupOk; } - 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; + 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; this._latestSummary = summary; } @@ -204,10 +205,10 @@ export class UploadList extends LitUploaderBlock { this.sub('*collectionErrors', (errors: OutputError[]) => { const firstError = errors.filter((err) => err.type !== 'SOME_FILES_HAS_ERRORS')[0]; if (!firstError) { - this.commonErrorMessage = null; + this._commonErrorMessage = null; return; } - this.commonErrorMessage = firstError.message; + this._commonErrorMessage = firstError.message; }); } @@ -222,7 +223,7 @@ export class UploadList extends LitUploaderBlock { public override render() { return html` - ${this.headerText} + ${this._headerText}
- ${this.commonErrorMessage ?? ''} + ${this._commonErrorMessage ?? ''}
@@ -269,8 +270,8 @@ export class UploadList extends LitUploaderBlock { - + `; diff --git a/src/lit/CssDataMixin.ts b/src/lit/CssDataMixin.ts index 57ee97aca..e8fab5c54 100644 --- a/src/lit/CssDataMixin.ts +++ b/src/lit/CssDataMixin.ts @@ -8,16 +8,16 @@ declare class CssDataMixinClassInterface { export function CssDataMixin>(ctor: T): T & Constructor { abstract class CssDataMixinClass extends ctor { - private cssDataCache: Record | null = null; - private computedStyle: CSSStyleDeclaration | null = null; + 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); + const cssDataCache = this._cssDataCache ?? Object.create(null); if (!Object.keys(cssDataCache).includes(propName) || !cssDataCache[propName]) { - if (!this.computedStyle) { - this.computedStyle = window.getComputedStyle(this); + if (!this._computedStyle) { + this._computedStyle = window.getComputedStyle(this); } - const val = this.computedStyle.getPropertyValue(propName).trim(); + const val = this._computedStyle.getPropertyValue(propName).trim(); try { cssDataCache[propName] = parseCssPropertyValue(val); } catch (error) { @@ -27,7 +27,7 @@ export function CssDataMixin>(ctor: T): T & Co cssDataCache[propName] = null; } } - this.cssDataCache = cssDataCache; + this._cssDataCache = cssDataCache; return cssDataCache[propName]; } } diff --git a/src/lit/LitBlock.ts b/src/lit/LitBlock.ts index 63a1ce00a..442a3d2f7 100644 --- a/src/lit/LitBlock.ts +++ b/src/lit/LitBlock.ts @@ -44,7 +44,7 @@ export class LitBlock extends LitBlockBase { const template = this.$[localeStateKey(str)] || str; const pluralObjects = getPluralObjects(template); for (const pluralObject of pluralObjects) { - variables[pluralObject.variable] = this.pluralize( + variables[pluralObject.variable] = this._pluralize( pluralObject.pluralKey, Number(variables[pluralObject.countVariable]), ); @@ -53,7 +53,7 @@ export class LitBlock extends LitBlockBase { return result; } - private pluralize(key: string, count: number): string { + private _pluralize(key: string, count: number): string { const locale = this.l10n('locale-id') || 'en'; const pluralForm = getPluralForm(locale, count); return this.l10n(`${key}__${pluralForm}`); @@ -173,11 +173,11 @@ export class LitBlock extends LitBlockBase { return (this.has('*telemetryManager') && this.$['*telemetryManager']) as TelemetryManager; } - protected get localeManager(): LocaleManager | null { + public get localeManager(): LocaleManager | null { return this.has('*localeManager') ? (this.$['*localeManager'] as LocaleManager) : null; } - protected get a11y(): A11y | null { + public get a11y(): A11y | null { return this.has('*a11y') ? (this.$['*a11y'] as A11y) : null; } diff --git a/src/lit/LitUploaderBlock.ts b/src/lit/LitUploaderBlock.ts index 18f4fb084..87f47e7f7 100644 --- a/src/lit/LitUploaderBlock.ts +++ b/src/lit/LitUploaderBlock.ts @@ -23,17 +23,17 @@ export class LitUploaderBlock extends LitActivityBlock { public static sourceTypes: Readonly; protected couldBeCtxOwner = false; - private isCtxOwner = false; + private _isCtxOwner = false; private _unobserveCollection?: () => void; private _unobserveCollectionProperties?: () => void; public override init$ = uploaderBlockCtx(this); - private get hasCtxOwner(): boolean { + private get _hasCtxOwner(): boolean { return this.hasBlockInCtx((block) => { if (block instanceof LitUploaderBlock) { - return block.isCtxOwner && block.isConnected && block !== this; + return block._isCtxOwner && block.isConnected && block !== this; } return false; }); @@ -66,7 +66,7 @@ export class LitUploaderBlock extends LitActivityBlock { this.add('*validationManager', new ValidationManager(this)); } - if (!this.hasCtxOwner && this.couldBeCtxOwner) { + if (!this._hasCtxOwner && this.couldBeCtxOwner) { this._initCtxOwner(); } } @@ -106,7 +106,7 @@ export class LitUploaderBlock extends LitActivityBlock { public override disconnectedCallback(): void { super.disconnectedCallback(); - if (this.isCtxOwner) { + if (this._isCtxOwner) { this._unobserveUploadCollection(); } @@ -116,13 +116,13 @@ export class LitUploaderBlock extends LitActivityBlock { public override connectedCallback(): void { super.connectedCallback(); - if (this.isCtxOwner) { + if (this._isCtxOwner) { this._observeUploadCollection(); } } private _initCtxOwner(): void { - this.isCtxOwner = true; + this._isCtxOwner = true; this._observeUploadCollection(); @@ -153,7 +153,6 @@ export class LitUploaderBlock extends LitActivityBlock { this._unobserveCollection = undefined; } - // biome-ignore lint/correctness/noUnusedPrivateClassMembers: invoked within _flushOutputItems when grouping outputs private async _createGroup(collectionState: OutputCollectionState): Promise { const uploadClientOptions = await this.getUploadClientOptions(); const uuidList = collectionState.allEntries.map((entry) => { @@ -292,11 +291,11 @@ export class LitUploaderBlock extends LitActivityBlock { } } if (this.cfg.cropPreset) { - this.setInitialCrop(); + this._setInitialCrop(); } if (this.cfg.cloudImageEditorAutoOpen) { - this.openCloudImageEditor(); + this._openCloudImageEditor(); } } if (changeMap.errors) { @@ -366,7 +365,7 @@ export class LitUploaderBlock extends LitActivityBlock { ); }; - private openCloudImageEditor(): void { + private _openCloudImageEditor(): void { const [entry] = this.uploadCollection .findItems((entry) => !!entry.getValue('fileInfo') && entry.getValue('isImage')) .map((id) => this.uploadCollection.read(id)); @@ -385,7 +384,7 @@ export class LitUploaderBlock extends LitActivityBlock { } } - private setInitialCrop(): void { + private _setInitialCrop(): void { const cropPreset = parseCropPreset(this.cfg.cropPreset); if (cropPreset) { const [aspectRatioPreset] = cropPreset; diff --git a/src/lit/SymbioteCompatMixin.ts b/src/lit/SymbioteCompatMixin.ts index a087cb9d2..5b1decd8c 100644 --- a/src/lit/SymbioteCompatMixin.ts +++ b/src/lit/SymbioteCompatMixin.ts @@ -57,22 +57,22 @@ export function SymbioteMixin>(ctor: T): T & C protected init$: Record = {}; public ctxOwner = false; - private _ctxNameAttr: string | undefined = undefined; + private _ctxNameAttrValue: string | undefined = undefined; private _pendingCtxInitOnConnect = false; @property({ type: String, attribute: 'ctx-name', noAccessor: true }) - private get ctxNameAttr(): string | undefined { - return this._ctxNameAttr; + private get _ctxNameAttr(): string | undefined { + return this._ctxNameAttrValue; } - private set ctxNameAttr(value: string | undefined) { + private set _ctxNameAttr(value: string | undefined) { const normalizedValue = value ?? undefined; - const oldValue = this._ctxNameAttr; + const oldValue = this._ctxNameAttrValue; if (oldValue === normalizedValue) { return; } - this._ctxNameAttr = normalizedValue; + this._ctxNameAttrValue = normalizedValue; this._handleCtxNameSourceChange(); } @@ -80,13 +80,13 @@ export function SymbioteMixin>(ctor: T): T & C private _ctxNameFromContext: string | undefined; @state() - public ctxName: string | undefined = this.effectiveCtxName; + public ctxName: string | undefined = this._effectiveCtxName; @state() - private isInitialized = false; + private _isInitialized = false; protected override shouldUpdate(changedProperties: PropertyValues): boolean { - if (!this.isInitialized) { + if (!this._isInitialized) { return false; } return super.shouldUpdate(changedProperties); @@ -97,8 +97,8 @@ export function SymbioteMixin>(ctor: T): T & C super(...args); // Consume ctxName from parent context - this._ctxNameAttr = this.getAttribute('ctx-name') || undefined; - this.ctxName = this.effectiveCtxName; + this._ctxNameAttrValue = this.getAttribute('ctx-name') || undefined; + this.ctxName = this._effectiveCtxName; this._ctxNameConsumer = new ContextConsumer(this, { context: ctxNameContext, @@ -114,12 +114,12 @@ export function SymbioteMixin>(ctor: T): T & C }); } - private get effectiveCtxName(): string | undefined { - return this.ctxNameAttr || this._ctxNameFromContext || undefined; + private get _effectiveCtxName(): string | undefined { + return this._ctxNameAttr || this._ctxNameFromContext || undefined; } private _handleCtxNameSourceChange(): void { - this.ctxName = this.effectiveCtxName; + this.ctxName = this._effectiveCtxName; if (!this.ctxName || this._symbioteFirstUpdated) { return; @@ -137,7 +137,7 @@ export function SymbioteMixin>(ctor: T): T & C super.willUpdate(changedProperties); // Update effective ctxName before updates - this.ctxName = this.effectiveCtxName; + this.ctxName = this._effectiveCtxName; if (this.ctxName) { if (!this._ctxNameProvider) { @@ -217,7 +217,7 @@ export function SymbioteMixin>(ctor: T): T & C } private _getSharedPubSub(): PubSub> | null { - if (!this._symbioteSharedPubSub && this.effectiveCtxName) { + if (!this._symbioteSharedPubSub && this._effectiveCtxName) { this._initSharedContext(); } if (this._symbioteSharedPubSub) { @@ -239,7 +239,7 @@ export function SymbioteMixin>(ctor: T): T & C */ private _initSharedContext() { const sharedSchema = this._getSharedSchemaRecord(); - const ctxName = this.effectiveCtxName; + const ctxName = this._effectiveCtxName; if (!ctxName) { console.error('SymbioteMixin: ctx-name is required for components with shared properties (*)'); @@ -268,7 +268,7 @@ export function SymbioteMixin>(ctor: T): T & C * Keys must start with '*' as local state support has been removed. */ public get $(): SymbioteStateBag { - if (this.effectiveCtxName) { + if (this._effectiveCtxName) { this._initSharedContext(); } return new Proxy( @@ -357,11 +357,11 @@ export function SymbioteMixin>(ctor: T): T & C if (this.ctxName) { this._pendingCtxInitOnConnect = false; this._performInitialization(); - } else if (this._pendingCtxInitOnConnect && this.effectiveCtxName) { + } else if (this._pendingCtxInitOnConnect && this._effectiveCtxName) { this._pendingCtxInitOnConnect = false; this._performInitialization(); } - } else if (this.isInitialized && this._needsReconnectInit) { + } else if (this._isInitialized && this._needsReconnectInit) { this._needsReconnectInit = false; this.initCallback(); } @@ -406,7 +406,7 @@ export function SymbioteMixin>(ctor: T): T & C // Call the user-defined init callback after everything is set up this.initCallback(); - this.isInitialized = true; + this._isInitialized = true; // Request update to render with initialized state this.requestUpdate(); diff --git a/src/lit/TestModeController.ts b/src/lit/TestModeController.ts index 1322d91b7..41b2d23b5 100644 --- a/src/lit/TestModeController.ts +++ b/src/lit/TestModeController.ts @@ -9,43 +9,45 @@ const isCustomElement = (el: Element): boolean => { }; export class TestModeController implements ReactiveController { - private trackedElements: Set = new Set(); - private originalValues: Map = new Map(); - private enabled = false; - private unsubscribe?: () => void; + private _trackedElements: Set = new Set(); + private _originalValues: Map = new Map(); + private _enabled = false; + private _unsubscribe?: () => void; + private _host: TestModeHost; - public constructor(private host: TestModeHost) { - this.host.addController(this); + 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(); + 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(); + 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._unsubscribe = unsubscribe as (() => void) | undefined; } - this.collectElements(); - this.applyTestMode(); + this._collectElements(); + this._applyTestMode(); } - private collectElements(): void { - const litHost = this.host as unknown as LitElement; + 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 hostElement = this._host as unknown as Element; const hostTag = hostElement.tagName?.toLowerCase(); const candidates = Array.from(root.querySelectorAll('[data-testid]')).filter( (el) => !isCustomElement(el), @@ -56,37 +58,37 @@ export class TestModeController implements ReactiveController { continue; } - if (!this.trackedElements.has(el)) { + if (!this._trackedElements.has(el)) { const attrValue = el.getAttribute('data-testid'); if (!attrValue) { continue; } - this.trackedElements.add(el); - this.originalValues.set(el, attrValue); + this._trackedElements.add(el); + this._originalValues.set(el, attrValue); } } - for (const el of Array.from(this.trackedElements)) { + for (const el of Array.from(this._trackedElements)) { if (!el.isConnected || (hostTag && el.closest(hostTag) !== hostElement)) { - this.trackedElements.delete(el); - this.originalValues.delete(el); + this._trackedElements.delete(el); + this._originalValues.delete(el); } } } - private applyTestMode(): void { - if (!this.trackedElements.size) { + 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); + const prefix = this._host.testId || ''; + for (const el of this._trackedElements) { + const baseValue = this._originalValues.get(el); if (!baseValue) { continue; } - if (this.enabled) { + if (this._enabled) { el.setAttribute('data-testid', `${prefix}--${baseValue}`); } else { el.removeAttribute('data-testid'); diff --git a/src/solutions/file-uploader/inline/FileUploaderInline.ts b/src/solutions/file-uploader/inline/FileUploaderInline.ts index 8b772a050..af0772dce 100644 --- a/src/solutions/file-uploader/inline/FileUploaderInline.ts +++ b/src/solutions/file-uploader/inline/FileUploaderInline.ts @@ -16,7 +16,7 @@ export class FileUploaderInline extends LitSolutionBlock { public static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-inline']; @state() - private couldCancel = false; + private _couldCancel = false; public constructor() { super(); @@ -28,18 +28,18 @@ export class FileUploaderInline extends LitSolutionBlock { } private _handleCancel = (): void => { - if (this.couldHistoryBack) { + if (this._couldHistoryBack) { const historyBack = this.$['*historyBack'] as (() => void) | undefined; historyBack?.(); return; } - if (this.couldShowList) { + if (this._couldShowList) { this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; } }; - private get couldHistoryBack(): boolean { + private get _couldHistoryBack(): boolean { const history = this.$['*history'] as string[] | undefined; if (!history || history.length <= 1) { return false; @@ -47,7 +47,7 @@ export class FileUploaderInline extends LitSolutionBlock { return history[history.length - 1] !== LitActivityBlock.activities.START_FROM; } - private get couldShowList(): boolean { + private get _couldShowList(): boolean { const uploadList = this.$['*uploadList'] as unknown[] | undefined; return this.cfg.showEmptyList || (Array.isArray(uploadList) && uploadList.length > 0); } @@ -78,7 +78,7 @@ export class FileUploaderInline extends LitSolutionBlock { }); this.sub('*history', () => { - this.couldCancel = this.couldHistoryBack || this.couldShowList; + this._couldCancel = this._couldHistoryBack || this._couldShowList; }); } @@ -92,7 +92,7 @@ export class FileUploaderInline extends LitSolutionBlock { type="button" class="uc-cancel-btn uc-secondary-btn" @click=${this._handleCancel} - ?hidden=${!this.couldCancel} + ?hidden=${!this._couldCancel} > ${this.l10n('start-from-cancel')} diff --git a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts index 71355dfe6..f623b0827 100644 --- a/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts +++ b/src/solutions/file-uploader/minimal/FileUploaderMinimal.ts @@ -19,16 +19,16 @@ export class FileUploaderMinimal extends LitSolutionBlock { public static override styleAttrs = [...super.styleAttrs, 'uc-file-uploader-minimal']; @state() - protected singleUpload = false; + private _singleUpload = false; @state() - protected isHiddenStartFrom = false; + private _isHiddenStartFrom = false; @state() - protected classUploadList = EMPTY_CLASS; + private _classUploadList = EMPTY_CLASS; @state() - protected classStartFrom = EMPTY_CLASS; + private _classStartFrom = EMPTY_CLASS; private _getInitActivity(): string { return (this.getCssData('--cfg-init-activity') as string | undefined) || LitActivityBlock.activities.START_FROM; @@ -43,26 +43,26 @@ export class FileUploaderMinimal extends LitSolutionBlock { } as FileUploaderMinimalInitState; } - private handleModalOpen = (data: Parameters[0]): void => { + private _handleModalOpen = (data: Parameters[0]): void => { if (data.id === LitActivityBlock.activities.CLOUD_IMG_EDIT) { - this.classUploadList = ACTIVE_CLASS; + this._classUploadList = ACTIVE_CLASS; } if (this.$['*currentActivity'] === LitActivityBlock.activities.UPLOAD_LIST) { - this.classUploadList = ACTIVE_CLASS; - this.isHiddenStartFrom = true; + this._classUploadList = ACTIVE_CLASS; + this._isHiddenStartFrom = true; } const uploadList = this.$['*uploadList'] as unknown[] | undefined; if (!uploadList || uploadList.length <= 0) { - this.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'] = LitActivityBlock.activities.UPLOAD_LIST; - this.isHiddenStartFrom = false; + this._isHiddenStartFrom = false; } if (data.id === LitActivityBlock.activities.CLOUD_IMG_EDIT) { @@ -92,10 +92,10 @@ export class FileUploaderMinimal extends LitSolutionBlock { this.sub('*uploadList', (list: unknown) => { if (Array.isArray(list) && list.length > 0) { this.$['*currentActivity'] = LitActivityBlock.activities.UPLOAD_LIST; - this.classStartFrom = EMPTY_CLASS; + this._classStartFrom = EMPTY_CLASS; } else { - this.classUploadList = EMPTY_CLASS; - this.isHiddenStartFrom = false; + this._classUploadList = EMPTY_CLASS; + this._isHiddenStartFrom = false; this.$['*currentActivity'] = initActivity; } }); @@ -117,37 +117,37 @@ export class FileUploaderMinimal extends LitSolutionBlock { 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.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); + 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')} - + From eaec0c87918382d6f4799df9ba62dd5262304fa9 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sat, 6 Dec 2025 23:38:11 +0300 Subject: [PATCH 45/60] fix(css): use CSS variable for progress bar opacity control --- src/blocks/FileItem/file-item.css | 5 +++-- src/blocks/ProgressBar/progress-bar.css | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/blocks/FileItem/file-item.css b/src/blocks/FileItem/file-item.css index 59ee9ec55..cc2f0ffba 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 { diff --git a/src/blocks/ProgressBar/progress-bar.css b/src/blocks/ProgressBar/progress-bar.css index 5eb63b4af..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; @@ -43,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; } From a49cdfe25d30141812675615bb4830b113c4808b Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sun, 7 Dec 2025 00:47:04 +0300 Subject: [PATCH 46/60] refactor: replace @symbiotejs/symbiote with nanostores-based PubSub - Add PubSubCompat.ts implementing PubSub interface using nanostores map - Add UID utility for generating unique identifiers - Add applyStyles utility for applying style maps to elements - Replace @symbiotejs/symbiote imports with local implementations - Update package.json: add nanostores, remove @symbiotejs/symbiote - Format demo HTML files --- demo/bundles/cloud-image-editor.html | 9 +- demo/bundles/minimal.html | 10 +- demo/features/validators.html | 9 +- demo/solutions/cloud-image-editor.html | 9 +- demo/solutions/minimal.html | 10 +- package-lock.json | 24 +++-- package.json | 2 +- src/abstract/TypedCollection.ts | 5 +- src/abstract/TypedData.ts | 3 +- src/abstract/UploaderPublicApi.ts | 6 +- .../src/lib/parseCropPreset.test.ts | 2 +- .../src/lib/parseCropPreset.ts | 2 +- src/blocks/FormInput/FormInput.ts | 2 +- src/index.ts | 3 +- src/lit/LitBlock.ts | 2 +- src/lit/LitUploaderBlock.ts | 12 +-- src/lit/PubSubCompat.ts | 96 +++++++++++++++++++ src/lit/SymbioteCompatMixin.ts | 10 +- src/utils/UID.ts | 5 + src/utils/applyStyles.ts | 12 +++ 20 files changed, 198 insertions(+), 35 deletions(-) create mode 100644 src/lit/PubSubCompat.ts create mode 100644 src/utils/UID.ts create mode 100644 src/utils/applyStyles.ts diff --git a/demo/bundles/cloud-image-editor.html b/demo/bundles/cloud-image-editor.html index 4161486f6..ab9239357 100644 --- a/demo/bundles/cloud-image-editor.html +++ b/demo/bundles/cloud-image-editor.html @@ -22,7 +22,14 @@ - + - + diff --git a/demo/features/validators.html b/demo/features/validators.html index 10b41ebe4..3e722e18d 100644 --- a/demo/features/validators.html +++ b/demo/features/validators.html @@ -25,7 +25,14 @@ - + + render() { + return html` +
+
+
🌐 Locale playground
+

File Uploader localization preview

+

Switch locales and layouts to see translated UI strings instantly.

+
+ +
+
+

Controls

+
+
+ Mode +
${this._renderModeOptions()}
+
+ +
+ Locale +
${this._renderLocaleOptions()}
+
+
+

Locales come from locales/file-uploader/*.ts.

+
- +
+

Preview

+ ${this._renderUploader()} +
+
+ + +
+ `; + } + } + customElements.define('uc-locales-demo', LocalesDemo); + -
-
-
+ 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%; } From 90f1ba6f18aced7e8aa9742b851a7b6a57530b0d Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sun, 7 Dec 2025 03:41:46 +0300 Subject: [PATCH 53/60] style: apply lint fixes --- src/blocks/ExternalSource/external-source.css | 2 +- src/blocks/Modal/modal.css | 2 +- src/blocks/UrlSource/url-source.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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/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/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; From 1869c34abe0f6fe00e506e2f6019f6134c7106c4 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sun, 7 Dec 2025 03:51:07 +0300 Subject: [PATCH 54/60] test: fix types test --- src/abstract/UploaderPublicApi.ts | 8 ++++++-- types/test/public-upload-api.test-d.tsx | 4 ---- types/test/uc-upload-ctx-provider.test-d.tsx | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/abstract/UploaderPublicApi.ts b/src/abstract/UploaderPublicApi.ts index 150bdf188..4eda18bad 100644 --- a/src/abstract/UploaderPublicApi.ts +++ b/src/abstract/UploaderPublicApi.ts @@ -350,11 +350,15 @@ export class UploaderPublicApi { public setCurrentActivity = ( activityType: T, - params?: T extends keyof ActivityParamsMap ? ActivityParamsMap[T] : undefined, + ...params: T extends keyof ActivityParamsMap + ? [ActivityParamsMap[T]] + : T extends RegisteredActivityType + ? [undefined?] + : [never] ) => { if (this._ctx.hasBlockInCtx((b) => b.activityType === activityType)) { this._ctx.set$({ - '*currentActivityParams': params ?? {}, + '*currentActivityParams': params[0] ?? {}, '*currentActivity': activityType, }); return; 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-upload-ctx-provider.test-d.tsx b/types/test/uc-upload-ctx-provider.test-d.tsx index 32be4f730..8234e425a 100644 --- a/types/test/uc-upload-ctx-provider.test-d.tsx +++ b/types/test/uc-upload-ctx-provider.test-d.tsx @@ -19,7 +19,7 @@ import { const instance = new UploadCtxProvider(); instance.uploadCollection.size; -instance.setOrAddState('fileId', 'uploading'); +instance.setOrAddState('*currentActivity', 'camera'); const api = instance.getAPI(); api.addFileFromUrl('https://example.com/image.png'); From 7a3955973f97d2661aaf877b5c24ad003d2dbbc0 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sun, 7 Dec 2025 19:55:18 +0300 Subject: [PATCH 55/60] chore: normalize package exports API to be compatible with the original one --- src/abstract/TypedCollection.ts | 2 +- src/abstract/TypedData.ts | 2 +- .../src/lib/parseCropPreset.test.ts | 3 ++- src/index.ts | 3 ++- src/lit/BaseComponent.ts | 7 +++++++ src/utils/UID.ts | 13 ++++++++----- 6 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 src/lit/BaseComponent.ts diff --git a/src/abstract/TypedCollection.ts b/src/abstract/TypedCollection.ts index ab11dde87..537592607 100644 --- a/src/abstract/TypedCollection.ts +++ b/src/abstract/TypedCollection.ts @@ -38,7 +38,7 @@ export class TypedCollection> { public constructor(options: TypedCollectionOptions) { this._initialValue = options.initialValue; - this._ctxId = UID.generate() as Uid; + this._ctxId = UID.generate(); this._data = PubSub.registerCtx>({}, this._ctxId); this._watchList = options.watchList || []; diff --git a/src/abstract/TypedData.ts b/src/abstract/TypedData.ts index fdd44ffb2..627f54f1f 100644 --- a/src/abstract/TypedData.ts +++ b/src/abstract/TypedData.ts @@ -9,7 +9,7 @@ export class TypedData> { private _data: PubSub; public constructor(initialValue: T) { - this._ctxId = UID.generate() as Uid; + this._ctxId = UID.generate(); this._data = PubSub.registerCtx(initialValue, this._ctxId); } diff --git a/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts b/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts index d5b787299..ccc234c4f 100644 --- a/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts +++ b/src/blocks/CloudImageEditor/src/lib/parseCropPreset.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; +import type { Uid } from '../../../../lit/Uid'; import { UID } from '../../../../utils/UID'; import { getClosestAspectRatio, parseCropPreset } from './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/index.ts b/src/index.ts index 3daa3b301..d3352ed3e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,8 @@ import './blocks/themes/uc-basic/index.css'; // Symbiote.js -export { PubSub } from './lit/PubSubCompat'; +export { PubSub as Data } from './lit/PubSubCompat'; +export { BaseComponent } from './lit/BaseComponent'; export { UID } from './utils/UID'; // Utils: 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/utils/UID.ts b/src/utils/UID.ts index 1f71e2f57..43c8d198c 100644 --- a/src/utils/UID.ts +++ b/src/utils/UID.ts @@ -1,5 +1,8 @@ -export const UID = { - generate(): string { - return `uid-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`; - }, -}; +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; + } +} From 9b5b86e0f6c2d55fad493379de9ab3e3368302d8 Mon Sep 17 00:00:00 2001 From: nd0ut Date: Sun, 7 Dec 2025 22:12:30 +0300 Subject: [PATCH 56/60] chore: fix biome warnings --- biome.json | 12 ++++++++- demo/features/validators.html | 4 +-- demo/index.html | 6 ++++- scripts/build-ssr-stubs.ts | 2 -- src/abstract/UploaderPublicApi.ts | 6 ++++- src/abstract/defineComponents.ts | 1 - src/abstract/localeRegistry.ts | 19 ++++++++----- src/abstract/managers/ModalManager.ts | 14 +++++----- src/abstract/uploadEntrySchema.ts | 4 +-- src/blocks/CameraSource/CameraSource.ts | 2 -- src/blocks/CameraSource/camera-source.css | 8 +++--- .../CloudImageEditor/src/css/common.css | 18 +++++++------ src/blocks/FileItem/file-item.css | 4 +-- src/blocks/Img/ImgBase.ts | 27 +++++++++++-------- src/blocks/Img/ImgConfig.ts | 6 ++--- src/blocks/SourceList/SourceList.ts | 1 - src/lit/Constructor.ts | 2 +- src/lit/LitUploaderBlock.ts | 16 ++++++++--- src/lit/SymbioteCompatMixin.ts | 1 - src/solutions/file-uploader/minimal/index.css | 4 +-- src/types/exported.ts | 2 +- stylelint-force-app-name-prefix.cjs | 16 +++++------ 22 files changed, 102 insertions(+), 73 deletions(-) diff --git a/biome.json b/biome.json index b6a66fe37..01724a5b2 100644 --- a/biome.json +++ b/biome.json @@ -19,7 +19,7 @@ "recommended": true, "suspicious": { "noDuplicateProperties": "off", - "noExplicitAny": "warn", + "noExplicitAny": "info", "noFocusedTests": "error" }, "complexity": { @@ -66,6 +66,16 @@ } } }, + { + "includes": ["**/*.test.*", "**/*.spec.*", "**/*.e2e.test.*"], + "linter": { + "rules": { + "style": { + "noNonNullAssertion": "off" + } + } + } + }, { "includes": ["demo/**/*.html"], "linter": { diff --git a/demo/features/validators.html b/demo/features/validators.html index 3e722e18d..b4511ab0b 100644 --- a/demo/features/validators.html +++ b/demo/features/validators.html @@ -37,8 +37,8 @@ + + + +