diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 43377acd..7e6e5ef6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ permissions: jobs: lint: - name: Lint and format check + name: Lint, format, and typecheck runs-on: ubuntu-latest timeout-minutes: 10 @@ -28,10 +28,12 @@ jobs: with: bun-version: "1.3.11" - run: bun install --frozen-lockfile - - name: ESLint + - name: Oxlint run: bun run lint - name: Prettier run: bun run format:check + - name: TypeScript + run: bun run typecheck unit: name: Unit tests diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000..e8975057 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,343 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript"], + "categories": { + "correctness": "off" + }, + "options": { + "typeAware": true + }, + "env": { + "builtin": true + }, + "ignorePatterns": [ + ".cache/**", + ".claude/**", + ".tmp/**", + "build/**", + "coverage/**", + "node_modules/**", + "public/third_party/**", + "scripts/.deps/**", + "src/third_party/**" + ], + "rules": { + "no-array-constructor": "error", + "no-unused-expressions": "error", + "no-unused-vars": "error", + "typescript/ban-ts-comment": "error", + "typescript/no-duplicate-enum-values": "error", + "typescript/no-empty-object-type": "error", + "typescript/no-explicit-any": "error", + "typescript/no-extra-non-null-assertion": "error", + "typescript/no-misused-new": "error", + "typescript/no-namespace": "error", + "typescript/no-non-null-asserted-optional-chain": "error", + "typescript/no-require-imports": "error", + "typescript/no-this-alias": "error", + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-unsafe-declaration-merging": "error", + "typescript/no-unsafe-function-type": "error", + "typescript/no-wrapper-object-types": "error", + "typescript/prefer-as-const": "error", + "typescript/prefer-namespace-keyword": "error", + "typescript/triple-slash-reference": "error" + }, + "overrides": [ + { + "files": ["**/*.{js,mjs,cjs,ts,mts,cts}"], + "rules": { + "constructor-super": "error", + "for-direction": "error", + "getter-return": "error", + "no-async-promise-executor": "error", + "no-case-declarations": "error", + "no-class-assign": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "error", + "no-const-assign": "error", + "no-constant-binary-expression": "error", + "no-constant-condition": "error", + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-class-members": "error", + "no-dupe-else-if": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-empty": "error", + "no-empty-character-class": "error", + "no-empty-pattern": "error", + "no-empty-static-block": "error", + "no-ex-assign": "error", + "no-extra-boolean-cast": "error", + "no-fallthrough": "error", + "no-func-assign": "error", + "no-global-assign": "error", + "no-import-assign": "error", + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-loss-of-precision": "error", + "no-misleading-character-class": "error", + "no-new-native-nonconstructor": "error", + "no-nonoctal-decimal-escape": "error", + "no-obj-calls": "error", + "no-prototype-builtins": "error", + "no-redeclare": "error", + "no-regex-spaces": "error", + "no-self-assign": "error", + "no-setter-return": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-this-before-super": "error", + "no-unassigned-vars": "error", + "no-undef": "error", + "no-unexpected-multiline": "error", + "no-unreachable": "error", + "no-unsafe-finally": "error", + "no-unsafe-negation": "error", + "no-unsafe-optional-chaining": "error", + "no-unused-labels": "error", + "no-unused-private-class-members": "error", + "no-useless-assignment": "error", + "no-useless-backreference": "error", + "no-useless-catch": "error", + "no-useless-escape": "error", + "no-with": "error", + "preserve-caught-error": "error", + "require-yield": "error", + "use-isnan": "error", + "valid-typeof": "error" + } + }, + { + "files": ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"], + "rules": { + "constructor-super": "off", + "getter-return": "off", + "no-class-assign": "off", + "no-const-assign": "off", + "no-dupe-class-members": "off", + "no-dupe-keys": "off", + "no-func-assign": "off", + "no-import-assign": "off", + "no-new-native-nonconstructor": "off", + "no-obj-calls": "off", + "no-redeclare": "off", + "no-setter-return": "off", + "no-this-before-super": "off", + "no-undef": "off", + "no-unreachable": "off", + "no-unsafe-negation": "off", + "no-var": "error", + "no-with": "off", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error" + } + }, + { + "files": ["src/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "typescript/await-thenable": "error", + "typescript/no-array-delete": "error", + "typescript/no-base-to-string": "error", + "typescript/no-duplicate-type-constituents": "error", + "typescript/no-floating-promises": "error", + "typescript/no-for-in-array": "error", + "typescript/no-implied-eval": "error", + "typescript/no-misused-promises": "error", + "typescript/no-redundant-type-constituents": "error", + "typescript/no-unnecessary-type-assertion": "error", + "typescript/no-unsafe-argument": "error", + "typescript/no-unsafe-assignment": "error", + "typescript/no-unsafe-call": "error", + "typescript/no-unsafe-enum-comparison": "error", + "typescript/no-unsafe-member-access": "error", + "typescript/no-unsafe-return": "error", + "typescript/no-unsafe-unary-minus": "error", + "typescript/only-throw-error": "error", + "typescript/prefer-promise-reject-errors": "error", + "typescript/require-await": "error", + "typescript/restrict-plus-operands": "error", + "typescript/restrict-template-expressions": "error", + "typescript/unbound-method": "error" + } + }, + { + "files": ["src/**/*.{js,mjs,cjs,ts,mts,cts,d.ts}"], + "env": { + "browser": true, + "webextensions": true + } + }, + { + "files": ["tests/**/*.{js,mjs,cjs,ts,mts,cts}"], + "globals": { + "BuildError": "readonly", + "BuildMessage": "readonly", + "Bun": "readonly", + "HTMLRewriter": "readonly", + "Loader": "readonly", + "ResolveError": "readonly", + "ResolveMessage": "readonly", + "ShadowRealm": "readonly" + }, + "env": { + "browser": true, + "jest": true, + "node": true, + "webextensions": true + } + }, + { + "files": ["build.ts", "scripts/**/*.{js,mjs,cjs,ts,mts,cts}"], + "globals": { + "addEventListener": "readonly", + "alert": "readonly", + "BuildError": "readonly", + "BuildMessage": "readonly", + "Bun": "readonly", + "confirm": "readonly", + "dispatchEvent": "readonly", + "HTMLRewriter": "readonly", + "Loader": "readonly", + "onerror": "writable", + "onmessage": "writable", + "PerformanceServerTiming": "readonly", + "PerformanceTiming": "readonly", + "postMessage": "readonly", + "prompt": "readonly", + "removeEventListener": "readonly", + "reportError": "readonly", + "ResolveError": "readonly", + "ResolveMessage": "readonly", + "self": "readonly", + "ShadowRealm": "readonly", + "Worker": "readonly" + }, + "env": { + "node": true + } + }, + { + "files": ["scripts/**/*.cjs"], + "rules": { + "prefer-template": "off", + "typescript/no-require-imports": "off" + } + }, + { + "files": ["src/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["src/background/*", "src/content-script/*", "src/shared/*"], + "message": "Legacy module roots are deprecated. Import from @core, @adapters, or @ui." + } + ] + } + ] + } + }, + { + "files": ["src/core/domain/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@core/application/*", "@adapters/*", "@ui/*"], + "message": "Domain must not depend on application, adapters, or UI." + } + ] + } + ] + } + }, + { + "files": ["src/core/application/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@adapters/*", "@ui/*"], + "message": "Application must not depend on adapters or UI." + } + ] + } + ] + } + }, + { + "files": ["src/adapters/chrome/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@ui/*"], + "message": "Adapters must not depend on UI." + } + ] + } + ] + } + }, + { + "files": ["src/adapters/chrome/background/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@adapters/chrome/content-script/*"], + "message": "Background adapter must not import content-script modules directly." + } + ] + } + ] + } + }, + { + "files": ["src/adapters/chrome/content-script/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@adapters/chrome/background/*"], + "message": "Content-script adapter must not import background modules directly." + } + ] + } + ] + } + }, + { + "files": ["src/ui/**/*.{ts,mts,cts,d.ts}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@adapters/chrome/background/*", "@adapters/chrome/content-script/*"], + "message": "UI modules must not depend on adapter internals." + } + ] + } + ] + } + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ad7de5a2..a7412f86 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ Additionally, background and content-script are isolated from each other: - `src/adapters/chrome/background/` must not import from `content-script/` - `src/adapters/chrome/content-script/` must not import from `background/` -These boundaries are enforced by ESLint `no-restricted-imports` rules. +These boundaries are enforced by Oxlint `no-restricted-imports` rules. ### Entry Points diff --git a/README.md b/README.md index 7276fa62..13f8b3df 100644 --- a/README.md +++ b/README.md @@ -113,8 +113,8 @@ bun run build --platform=firefox ```bash bun run check # lint + format + typecheck -bun run lint # ESLint only -bun run typecheck # TypeScript only +bun run lint # Oxlint with TypeScript-aware rules +bun run typecheck # TypeScript 7 only bun run format:check # Prettier only ``` @@ -153,7 +153,7 @@ src/ onboarding/ # First-run experience ``` -Layer boundaries are enforced by ESLint `no-restricted-imports` rules. See [docs/agents/architecture.md](docs/agents/architecture.md) for details. +Layer boundaries are enforced by Oxlint `no-restricted-imports` rules. See [docs/agents/architecture.md](docs/agents/architecture.md) for details. ## Bug Reporting diff --git a/bun.lock b/bun.lock index 29318717..d029f816 100644 --- a/bun.lock +++ b/bun.lock @@ -12,7 +12,6 @@ "luxon": "^3.7.2", }, "devDependencies": { - "@eslint/js": "^10.0.1", "@lexical/history": "^0.48.0", "@lexical/plain-text": "^0.48.0", "@lexical/rich-text": "^0.48.0", @@ -25,17 +24,16 @@ "@types/luxon": "^3.7.2", "@webgpu/types": "^0.1.71", "ckeditor5": "^48.3.1", - "eslint": "^10.8.0", "glob": "^13.0.6", - "globals": "^17.8.0", "jsdom": "^30.0.0", "lexical": "^0.48.0", + "oxlint": "1.76.0", + "oxlint-tsgolint": "7.0.2001", "prettier": "3.8.3", "puppeteer": "24.40.0", "quill": "^2.0.3", "rimraf": "^6.1.3", - "typescript": "6.0.2", - "typescript-eslint": "8.58.2", + "typescript": "7.0.2", }, }, }, @@ -182,32 +180,8 @@ "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - - "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - - "@eslint/config-helpers": ["@eslint/config-helpers@0.7.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw=="], - - "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - - "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" } }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="], - - "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], - "@exodus/bytes": ["@exodus/bytes@1.15.1", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q=="], - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], - - "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@lexical/clipboard": ["@lexical/clipboard@0.48.0", "", { "dependencies": { "@lexical/extension": "0.48.0", "@lexical/html": "0.48.0", "@lexical/internal": "0.48.0", "@lexical/list": "0.48.0", "@lexical/selection": "0.48.0", "@lexical/utils": "0.48.0", "@types/trusted-types": "^2.0.7", "lexical": "0.48.0" }, "peerDependencies": { "typescript": ">=5.2" }, "optionalPeers": ["typescript"] }, "sha512-xO2trk6+yBl8XXa/VNe20kXczmPxFoWtUHjidbBLEtlGBj+mo63pJj6H5o/WlZsoMKmIOJxwxsn2ejrS8G0/7A=="], "@lexical/dragon": ["@lexical/dragon@0.48.0", "", { "dependencies": { "@lexical/extension": "0.48.0", "lexical": "0.48.0" }, "peerDependencies": { "typescript": ">=5.2" }, "optionalPeers": ["typescript"] }, "sha512-uPuu7fVca9vmL/Oz30CRZ7FIPIodwMrTgNsRmV8jE6Qd6a7RNiTW7r3+EhbhIdkLb/sjcWsYyOMyUR1TJAB0wQ=="], @@ -238,6 +212,56 @@ "@mlc-ai/web-xgrammar": ["@mlc-ai/web-xgrammar@0.1.27", "", {}, "sha512-0WJvW3mjotHA2NeAfaWFE2pQkOgXH9xC2U4IQOJNcioLac0k6VjSbj14jBRprt89frnPzxLo280riaEb+ZQqbg=="], + "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@7.0.2001", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w=="], + + "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@7.0.2001", "", { "os": "darwin", "cpu": "x64" }, "sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw=="], + + "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@7.0.2001", "", { "os": "linux", "cpu": "arm64" }, "sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A=="], + + "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@7.0.2001", "", { "os": "linux", "cpu": "x64" }, "sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ=="], + + "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@7.0.2001", "", { "os": "win32", "cpu": "arm64" }, "sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q=="], + + "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@7.0.2001", "", { "os": "win32", "cpu": "x64" }, "sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog=="], + + "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.76.0", "", { "os": "android", "cpu": "arm" }, "sha512-ZHIE5Zt9AsPDcY4nOlofXt0YfneEeo+QrKMPcPzLf2Z6Q8VtV2W73d7SFJ920WUwyik783u/doKCs3KXdwG+7w=="], + + "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.76.0", "", { "os": "android", "cpu": "arm64" }, "sha512-shm/ngQilHK6bs+ElJWa4oHfNj5vL1Gl/iVEJldTQjpr0/67oSgr0KUpbmcnLig5Fo0v/l6j2567A7TOL89ONA=="], + + "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.76.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rvJmrAPKSQ9aWJ6wIS6CK2tJjwzfW0ApQH9qokq6sfDvmHwoyIHxHFMq7z7i7GiV6fdE6s8qvBqWKPTu8RmT6Q=="], + + "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.76.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U/zYdb7VYKGY6pA9Vd2rYl9O/HlCylcOlb5PGPvVLtg+oLGsk6H3XGKEMHKyqD3nmmtmlmwb/8SwU2vfSAtvMw=="], + + "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.76.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-WvKG9CAriuo0XNiFzpXjDngUZcRGFNpaK2kLyMUsnJlShxkT96u+BpJQ3KqdQwGOrvI14L6V8bAwXwAYNNY6Jg=="], + + "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.76.0", "", { "os": "linux", "cpu": "arm" }, "sha512-qJ5+RH99TqFRq3UCDxkW0zJJu9c+OAHFY72vGlxZLEpuO+MpKo3POgqb8sYipL9KYm8XY6ofb0HsOuvY6hQNqQ=="], + + "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.76.0", "", { "os": "linux", "cpu": "arm" }, "sha512-PvPCVptkgVARsucgIqFQQcSmJ6xc6GtnVB5bRBekRahTc9eObMtjHfMjy5M+C2tHt5UCMttWM9RuSk/H9NqYeg=="], + + "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.76.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-3KeFDx8Bu4HPAXbuHZOr/oHvN+QT+JQhMw/NYPz7Z071xLSsG27Jfh9PIQVEY7hk1I+jr43ExqRIeJ6VKk2yLw=="], + + "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.76.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oPFkkKTgl0K/EIg9fQ8oA3IGcI05/Mq1en04iFa41mmNPT+6KEiByVazTOZZJiHMBBrbsns1YJ2e1Scqwzesjw=="], + + "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.76.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gN7yZ0eqflA5Fhf1wvHxGUltIV3FsvmB1zhNMDEK9vSHhc7E6qg9CuPeBgPZab66Tjzq6w6kHAtNEvnTHf4cyw=="], + + "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.76.0", "", { "os": "linux", "cpu": "none" }, "sha512-S/HqMbn22mQrjtErUxEoS/a55u8kIeXvreIxiJu5G7Le3UecEd6SQZxrDIpuhtgaFnsY/nVra3ytP+pRljDilA=="], + + "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.76.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZIga3097VJZolGZk6SrIAUokIGfRkxRlhiHDUznZptGBfwrhD7pNfD1rzEzsCwvk/1DX0A1bLz+liuNh5QKIVQ=="], + + "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.76.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-ZGiiA7pFzMJSyMWYZTVlPgbTsx+Vl8ihLGMIujPwaslUF7kIPPWAbVmAlTc+9lWDV+DCiB8Ikixu+lSHeOIIWQ=="], + + "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.76.0", "", { "os": "linux", "cpu": "x64" }, "sha512-JLiy5WuvEBFTT6ErIFV35SLzi0R7Iri6MKU6dZbTxfIx8pndbbPs3Mj780nMipBFcPkti+okAPOJ9POKkHFEgg=="], + + "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.76.0", "", { "os": "linux", "cpu": "x64" }, "sha512-z7lgKQtbo/I1NIe8G5NHLesxJDv0tRSUWTpXKb9Pm3E9nKFKfO4IOSDtFroKgXtOYb0jQbcdH+0wzTyMXVes+A=="], + + "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.76.0", "", { "os": "none", "cpu": "arm64" }, "sha512-JOjKymIpb9QcYfEhZsN6h4V9Ivd474W38cNIBRv6bg2TbIvogbMTH0Mg6YWW9TiRDqfcX+/Hyfsbo5vcSE5guQ=="], + + "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.76.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-pqDWZiwcmByWUEm1NFUBNiT6aentCcaoMWJv0HbXEmuYermJ4sg8ppVrshubYP2MZ6SHccJJcpr6x469PuDFIw=="], + + "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.76.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-Ba0O659kgMv6pwO3z9PdO+K3aMxQRaw9HnG+e6AtOfgwcKFvYilciQYBoUBmxfQvOCKZe1SwjMkuB542NkuDMQ=="], + + "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.76.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5qcirPHO8nKfkoowEVWtpAoVTcYDy6g0UT0NGic450Qv8J2NrOqg4uQ8QppRP4MDTC7Xx47lbZnmadTH03CGGA=="], + "@preact/signals-core": ["@preact/signals-core@1.14.1", "", {}, "sha512-vxPpfXqrwUe9lpjqfYNjAF/0RF/eFGeLgdJzdmIIZjpOnTmGmAB4BjWone562mJGMRP4frU6iZ6ei3PDsu52Ng=="], "@puppeteer/browsers": ["@puppeteer/browsers@2.13.0", "", { "dependencies": { "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA=="], @@ -254,10 +278,6 @@ "@types/dom-navigation": ["@types/dom-navigation@1.0.7", "", {}, "sha512-Di4W+i2faYquHUnyWUg3bBQp5pTNvjDDA7mIYfD/1WlLgan6sKkeVjGbdL78K0CuNEk5Pfc/c0rfelwkz10mnQ=="], - "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], - - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/filesystem": ["@types/filesystem@0.0.36", "", { "dependencies": { "@types/filewriter": "*" } }, "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA=="], "@types/filewriter": ["@types/filewriter@0.0.33", "", {}, "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g=="], @@ -266,8 +286,6 @@ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/luxon": ["@types/luxon@3.7.2", "", {}, "sha512-gW+Oib+vUtGJBtNC8V9Reww0oIpusw+4m81uncg9REGZAJfqOQHfo/nkabnc7w0QReXyPqjrbWMJk6NuAkiX3Q=="], "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], @@ -282,37 +300,51 @@ "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.2", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.2", "@typescript-eslint/type-utils": "8.58.2", "@typescript-eslint/utils": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw=="], + "@typescript/typescript-aix-ppc64": ["@typescript/typescript-aix-ppc64@7.0.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.2", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.2", "@typescript-eslint/types": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg=="], + "@typescript/typescript-darwin-arm64": ["@typescript/typescript-darwin-arm64@7.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.2", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.2", "@typescript-eslint/types": "^8.58.2", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg=="], + "@typescript/typescript-darwin-x64": ["@typescript/typescript-darwin-x64@7.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2" } }, "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q=="], + "@typescript/typescript-freebsd-arm64": ["@typescript/typescript-freebsd-arm64@7.0.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.2", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A=="], + "@typescript/typescript-freebsd-x64": ["@typescript/typescript-freebsd-x64@7.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2", "@typescript-eslint/utils": "8.58.2", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg=="], + "@typescript/typescript-linux-arm": ["@typescript/typescript-linux-arm@7.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.58.2", "", {}, "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ=="], + "@typescript/typescript-linux-arm64": ["@typescript/typescript-linux-arm64@7.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.2", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.2", "@typescript-eslint/tsconfig-utils": "8.58.2", "@typescript-eslint/types": "8.58.2", "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw=="], + "@typescript/typescript-linux-loong64": ["@typescript/typescript-linux-loong64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.2", "@typescript-eslint/types": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA=="], + "@typescript/typescript-linux-mips64el": ["@typescript/typescript-linux-mips64el@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.2", "", { "dependencies": { "@typescript-eslint/types": "8.58.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA=="], + "@typescript/typescript-linux-ppc64": ["@typescript/typescript-linux-ppc64@7.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="], - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + "@typescript/typescript-linux-riscv64": ["@typescript/typescript-linux-riscv64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="], - "@webgpu/types": ["@webgpu/types@0.1.71", "", {}, "sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A=="], + "@typescript/typescript-linux-s390x": ["@typescript/typescript-linux-s390x@7.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="], - "acorn": ["acorn@8.16.0", "", { "bin": "bin/acorn" }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "@typescript/typescript-linux-x64": ["@typescript/typescript-linux-x64@7.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="], - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "@typescript/typescript-netbsd-arm64": ["@typescript/typescript-netbsd-arm64@7.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="], - "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + "@typescript/typescript-netbsd-x64": ["@typescript/typescript-netbsd-x64@7.0.2", "", { "os": "none", "cpu": "x64" }, "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="], + + "@typescript/typescript-openbsd-arm64": ["@typescript/typescript-openbsd-arm64@7.0.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="], + + "@typescript/typescript-openbsd-x64": ["@typescript/typescript-openbsd-x64@7.0.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="], - "ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + "@typescript/typescript-sunos-x64": ["@typescript/typescript-sunos-x64@7.0.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="], + + "@typescript/typescript-win32-arm64": ["@typescript/typescript-win32-arm64@7.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="], + + "@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@webgpu/types": ["@webgpu/types@0.1.71", "", {}, "sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -348,7 +380,7 @@ "blurhash": ["blurhash@2.0.5", "", {}, "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w=="], - "brace-expansion": ["brace-expansion@5.0.8", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg=="], + "brace-expansion": ["brace-expansion@5.0.3", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA=="], "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], @@ -380,8 +412,6 @@ "cosmiconfig": ["cosmiconfig@9.0.2", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg=="], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], "csv-parse": ["csv-parse@7.0.1", "", {}, "sha512-+2z7Ar0APQ7Uu6fX4cn+pitRmxjZ1WPBcGmZFKmA74FCyi7Et/XZx8cjNQ5CjbZ4HCOxXCOpRBYvYH08Qa003A=="], @@ -398,8 +428,6 @@ "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], @@ -422,24 +450,12 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - "eslint": ["eslint@10.8.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ=="], - - "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - - "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], - - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], @@ -452,30 +468,14 @@ "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "fix": ["fix@0.0.6", "", { "dependencies": { "pipe": "0.0.2", "underscore": "1.1.6", "underscore.string": "1.1.4" } }, "sha512-UQ+8m0GnIakgpY+92a9y+pYoX3Y6eaW7WNTkPolQ7r58Fjzq7NhyRLMrZ6J6U1u4y7H7APugjRmZ+i6CAn4+Dg=="], - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], @@ -486,10 +486,6 @@ "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "globals": ["globals@17.8.0", "", {}, "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ=="], - "hast-util-embedded": ["hast-util-embedded@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA=="], "hast-util-from-dom": ["hast-util-from-dom@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hastscript": "^9.0.0", "web-namespaces": "^2.0.0" } }, "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q=="], @@ -528,52 +524,30 @@ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - "ip-address": ["ip-address@10.3.1", "", {}, "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g=="], "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], "jsdom": ["jsdom@30.0.0", "", { "dependencies": { "@asamuzakjp/css-color": "^6.0.5", "@asamuzakjp/dom-selector": "^8.2.5", "@bramus/specificity": "^2.4.2", "@csstools/css-syntax-patches-for-csstree": "^1.1.6", "@exodus/bytes": "^1.15.1", "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.5.2", "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.2", "undici": "^8.7.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", "whatwg-url": "^17.1.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.2.3" }, "optionalPeers": ["canvas"] }, "sha512-JQHfRGmmKmaZoUAvIgff5jjG/0SzTQlGz8c7t72KzBzo8ZULEjAjnYE0sNwBOUA4QtWwYE2xoYitg8NFsmiYxA=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - "lexical": ["lexical@0.48.0", "", { "dependencies": { "@lexical/internal": "0.48.0" }, "peerDependencies": { "typescript": ">=5.2" }, "optionalPeers": ["typescript"] }, "sha512-KK4Tyr/cPsleoZ7XvhGRiRmcrZidSmoFUdIXK9nPubIifoC+80Dc5THyc4xtGKtsW24S1TsHzk5gmfBU+TxmEg=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - "lodash-es": ["lodash-es@4.17.23", "", {}, "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="], "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], @@ -674,7 +648,7 @@ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], - "minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], + "minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], @@ -682,17 +656,13 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "netmask": ["netmask@2.1.1", "", {}, "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "oxlint": ["oxlint@1.76.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.76.0", "@oxlint/binding-android-arm64": "1.76.0", "@oxlint/binding-darwin-arm64": "1.76.0", "@oxlint/binding-darwin-x64": "1.76.0", "@oxlint/binding-freebsd-x64": "1.76.0", "@oxlint/binding-linux-arm-gnueabihf": "1.76.0", "@oxlint/binding-linux-arm-musleabihf": "1.76.0", "@oxlint/binding-linux-arm64-gnu": "1.76.0", "@oxlint/binding-linux-arm64-musl": "1.76.0", "@oxlint/binding-linux-ppc64-gnu": "1.76.0", "@oxlint/binding-linux-riscv64-gnu": "1.76.0", "@oxlint/binding-linux-riscv64-musl": "1.76.0", "@oxlint/binding-linux-s390x-gnu": "1.76.0", "@oxlint/binding-linux-x64-gnu": "1.76.0", "@oxlint/binding-linux-x64-musl": "1.76.0", "@oxlint/binding-openharmony-arm64": "1.76.0", "@oxlint/binding-win32-arm64-msvc": "1.76.0", "@oxlint/binding-win32-ia32-msvc": "1.76.0", "@oxlint/binding-win32-x64-msvc": "1.76.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-6QoFioEU4fNdiUx/2Eo6TRd6NG7H7njnRCz8rhB66cZmMHDTqcm1Rjvl8Wry+ZTQMBAmyb4Mlf62Mk5X+eHSOw=="], - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "oxlint-tsgolint": ["oxlint-tsgolint@7.0.2001", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "7.0.2001", "@oxlint-tsgolint/darwin-x64": "7.0.2001", "@oxlint-tsgolint/linux-arm64": "7.0.2001", "@oxlint-tsgolint/linux-x64": "7.0.2001", "@oxlint-tsgolint/win32-arm64": "7.0.2001", "@oxlint-tsgolint/win32-x64": "7.0.2001" }, "bin": { "tsgolint": "./bin/tsgolint.js" } }, "sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg=="], "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], @@ -708,22 +678,14 @@ "parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "^8.0.0" } }, "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw=="], - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "pipe": ["pipe@0.0.2", "", {}, "sha512-67s0/X7rv2PX1sl64FQqC0qQuSpd1tv8Wh6c+U1lprj6Q7NxDYulCxZTbVbDvc/HSpZLYh7Oo821xReXSCZikQ=="], - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], @@ -776,10 +738,6 @@ "semver": ["semver@7.7.4", "", { "bin": "bin/semver.js" }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], @@ -810,8 +768,6 @@ "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "tldts": ["tldts@7.0.23", "", { "dependencies": { "tldts-core": "^7.0.23" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw=="], "tldts-core": ["tldts-core@7.0.23", "", {}, "sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ=="], @@ -826,17 +782,11 @@ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], - "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="], - "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="], - - "typescript-eslint": ["typescript-eslint@8.58.2", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.2", "@typescript-eslint/parser": "8.58.2", "@typescript-eslint/typescript-estree": "8.58.2", "@typescript-eslint/utils": "8.58.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ=="], + "typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="], "underscore": ["underscore@1.1.6", "", {}, "sha512-aqSzrO92Cjmeo8G7F49+ZHWBo3IJpjpsUZZaqfOHJGN61flbpLxQw/sP91p4kf/2+nkFrG6AG2WHlJh6RCf+/g=="], @@ -860,8 +810,6 @@ "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - "vanilla-colorful": ["vanilla-colorful@0.7.2", "", {}, "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg=="], "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], @@ -880,10 +828,6 @@ "whatwg-url": ["whatwg-url@17.1.0", "", { "dependencies": { "@exodus/bytes": "^1.15.1", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], @@ -902,46 +846,26 @@ "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], "@bramus/specificity/css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@eslint/config-array/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - - "@typescript-eslint/project-service/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.65.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg=="], - - "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.65.0", "", {}, "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg=="], - "ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "data-urls/whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="], - "glob/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - "html-encoding-sniffer/@exodus/bytes": ["@exodus/bytes@1.14.1", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ=="], - "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - "path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], "@bramus/specificity/css-tree/mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.3", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA=="], - "ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "data-urls/whatwg-url/@exodus/bytes": ["@exodus/bytes@1.14.1", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ=="], - - "glob/minimatch/brace-expansion": ["brace-expansion@5.0.3", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA=="], } } diff --git a/docs/agents/commands.md b/docs/agents/commands.md index b04c412f..3f12e32b 100644 --- a/docs/agents/commands.md +++ b/docs/agents/commands.md @@ -2,8 +2,8 @@ Use Bun for installs, scripts, and versioning. `bun.lock` is the canonical lockfile. -- Primary language: TypeScript with strict type-checking. -- Linting and formatting are handled with ESLint and Prettier through the Bun scripts in `package.json`. +- Primary language: TypeScript 7 with strict type-checking. +- Linting and formatting are handled with Oxlint and Prettier through the Bun scripts in `package.json`. ## Common Commands @@ -79,7 +79,7 @@ Run the full check suite and fix all errors before pushing: bun run check ``` -This runs lint (`eslint`), format check (`prettier --check`), and typecheck in sequence. All three must pass. Do not push a branch with a failing `bun run check`. +This runs lint (`oxlint`), format check (`prettier --check`), and TypeScript 7 typecheck in sequence. All three must pass. Do not push a branch with a failing `bun run check`. ## PR Notes diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 7ff146d8..00000000 --- a/eslint.config.js +++ /dev/null @@ -1,209 +0,0 @@ -import js from "@eslint/js"; -import globals from "globals"; -import tseslint from "typescript-eslint"; -import { defineConfig } from "eslint/config"; -import { fileURLToPath } from "url"; - -const ALL_CODE_FILES = ["**/*.{js,mjs,cjs,ts,mts,cts}"]; -const SOURCE_FILES = ["src/**/*.{js,mjs,cjs,ts,mts,cts,d.ts}"]; -const TEST_FILES = ["tests/**/*.{js,mjs,cjs,ts,mts,cts}"]; -const TOOLING_FILES = ["build.ts", "eslint.config.js", "scripts/**/*.{js,mjs,cjs,ts,mts,cts}"]; -const MODULE_FILES = ["src/**/*.{ts,mts,cts,d.ts}"]; -const ESLINT_CONFIG_DIR = fileURLToPath(new URL(".", import.meta.url)); - -export default defineConfig([ - { - ignores: [ - ".cache/**", - ".claude/**", - ".tmp/**", - "build/**", - "coverage/**", - "node_modules/**", - "public/third_party/**", - "scripts/.deps/**", - "src/third_party/**", - ], - }, - { - linterOptions: { - reportUnusedDisableDirectives: "error", - }, - }, - { - files: ALL_CODE_FILES, - plugins: { js }, - extends: ["js/recommended"], - }, - ...tseslint.configs.recommendedTypeChecked, - { - files: MODULE_FILES, - languageOptions: { - parserOptions: { - projectService: true, - tsconfigRootDir: ESLINT_CONFIG_DIR, - }, - }, - }, - { - files: ["**/*.{js,mjs,cjs}"], - ...tseslint.configs.disableTypeChecked, - }, - { - files: TEST_FILES, - ...tseslint.configs.disableTypeChecked, - }, - { - files: TOOLING_FILES, - ...tseslint.configs.disableTypeChecked, - }, - { - files: SOURCE_FILES, - languageOptions: { - globals: { - ...globals.browser, - ...globals.webextensions, - }, - }, - }, - { - files: TEST_FILES, - languageOptions: { - globals: { - ...globals.browser, - ...globals.webextensions, - ...globals.jest, - ...globals.node, - ...globals.bunBuiltin, - }, - }, - }, - { - files: TOOLING_FILES, - languageOptions: { - globals: { - ...globals.node, - ...globals.bunBuiltin, - }, - }, - }, - { - files: ["scripts/**/*.cjs"], - rules: { - "@typescript-eslint/no-require-imports": "off", - "prefer-template": "off", - }, - }, - { - files: MODULE_FILES, - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["src/background/*", "src/content-script/*", "src/shared/*"], - message: "Legacy module roots are deprecated. Import from @core, @adapters, or @ui.", - }, - ], - }, - ], - }, - }, - { - files: ["src/core/domain/**/*.{ts,mts,cts,d.ts}"], - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@core/application/*", "@adapters/*", "@ui/*"], - message: "Domain must not depend on application, adapters, or UI.", - }, - ], - }, - ], - }, - }, - { - files: ["src/core/application/**/*.{ts,mts,cts,d.ts}"], - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@adapters/*", "@ui/*"], - message: "Application must not depend on adapters or UI.", - }, - ], - }, - ], - }, - }, - { - files: ["src/adapters/chrome/**/*.{ts,mts,cts,d.ts}"], - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@ui/*"], - message: "Adapters must not depend on UI.", - }, - ], - }, - ], - }, - }, - { - files: ["src/adapters/chrome/background/**/*.{ts,mts,cts,d.ts}"], - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@adapters/chrome/content-script/*"], - message: "Background adapter must not import content-script modules directly.", - }, - ], - }, - ], - }, - }, - { - files: ["src/adapters/chrome/content-script/**/*.{ts,mts,cts,d.ts}"], - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@adapters/chrome/background/*"], - message: "Content-script adapter must not import background modules directly.", - }, - ], - }, - ], - }, - }, - { - files: ["src/ui/**/*.{ts,mts,cts,d.ts}"], - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@adapters/chrome/background/*", "@adapters/chrome/content-script/*"], - message: "UI modules must not depend on adapter internals.", - }, - ], - }, - ], - }, - }, -]); diff --git a/package.json b/package.json index d799b933..f636e7c7 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "watch": "bun build.ts --mode=development --watch", "build": "bun build.ts --mode=production", "check": "bun run lint && bun run format:check && bun run typecheck", - "lint": "eslint . --cache --cache-location .cache/eslint --max-warnings=0", + "lint": "oxlint --type-aware --deny-warnings --report-unused-disable-directives .", "typecheck": "bun tsc --noEmit", "test": "bun scripts/run-unit-tests.ts", "test:e2e": "bun scripts/run-e2e.ts --suite=smoke", @@ -19,7 +19,7 @@ "preversion": "bun run test", "version": "bun scripts/update-manifest-version.cjs", "postversion": "git push && git push --tags", - "lint:fix": "bun run lint -- --fix", + "lint:fix": "oxlint --type-aware --fix --deny-warnings --report-unused-disable-directives .", "fix": "bun run lint:fix && bun run format", "format": "prettier . --cache --write", "format:check": "prettier . --cache --check", @@ -36,7 +36,6 @@ }, "homepage": "https://github.com/bartekplus/FluentTyper#readme", "devDependencies": { - "@eslint/js": "^10.0.1", "@lexical/history": "^0.48.0", "@lexical/plain-text": "^0.48.0", "@lexical/rich-text": "^0.48.0", @@ -49,17 +48,16 @@ "@types/luxon": "^3.7.2", "@webgpu/types": "^0.1.71", "ckeditor5": "^48.3.1", - "eslint": "^10.8.0", "glob": "^13.0.6", - "globals": "^17.8.0", "jsdom": "^30.0.0", "lexical": "^0.48.0", + "oxlint": "1.76.0", + "oxlint-tsgolint": "7.0.2001", "prettier": "3.8.3", "puppeteer": "24.40.0", "quill": "^2.0.3", "rimraf": "^6.1.3", - "typescript": "6.0.2", - "typescript-eslint": "8.58.2" + "typescript": "7.0.2" }, "dependencies": { "@mlc-ai/web-llm": "^0.2.84", diff --git a/src/adapters/chrome/background/ObservabilityService.ts b/src/adapters/chrome/background/ObservabilityService.ts index 6b0460ef..b736e9d5 100644 --- a/src/adapters/chrome/background/ObservabilityService.ts +++ b/src/adapters/chrome/background/ObservabilityService.ts @@ -42,7 +42,7 @@ function cloneConfig(config: ObservabilityConfig): ObservabilityConfig { moduleId, override ? { ...override } : override, ]), - ) as ObservabilityConfig["moduleOverrides"], + ), }; } diff --git a/src/adapters/chrome/background/testing/RuntimeTestHooks.ts b/src/adapters/chrome/background/testing/RuntimeTestHooks.ts index fc7067a1..c9e5cf72 100644 --- a/src/adapters/chrome/background/testing/RuntimeTestHooks.ts +++ b/src/adapters/chrome/background/testing/RuntimeTestHooks.ts @@ -40,7 +40,7 @@ const TEST_TRIGGER_COMMAND_ALLOW_LIST = new Set([ ]); function getWebLLMTestGlobals(): WebLLMTestGlobals { - return globalThis as WebLLMTestGlobals; + return globalThis; } function normalizePredictions(predictions: unknown[]): string[] { diff --git a/src/adapters/chrome/content-script/suggestions/EditableContextResolver.ts b/src/adapters/chrome/content-script/suggestions/EditableContextResolver.ts index 2bc25eef..7c7d0a41 100644 --- a/src/adapters/chrome/content-script/suggestions/EditableContextResolver.ts +++ b/src/adapters/chrome/content-script/suggestions/EditableContextResolver.ts @@ -1,6 +1,5 @@ import { ContentEditableAdapter } from "./ContentEditableAdapter"; import { TextTargetAdapter } from "./TextTargetAdapter"; -import type { TextTarget } from "./TextTargetAdapter"; import type { SuggestionElement, EditableContext } from "./types"; export class EditableContextResolver { @@ -24,7 +23,7 @@ export class EditableContextResolver { return null; } - const snapshot = TextTargetAdapter.snapshot(elem as TextTarget); + const snapshot = TextTargetAdapter.snapshot(elem); const blockContext = this.contentEditableAdapter.getBlockContext(elem); return { diff --git a/src/adapters/chrome/content-script/suggestions/HostEditorAdapterResolver.ts b/src/adapters/chrome/content-script/suggestions/HostEditorAdapterResolver.ts index f7cf2f5e..7477e51f 100644 --- a/src/adapters/chrome/content-script/suggestions/HostEditorAdapterResolver.ts +++ b/src/adapters/chrome/content-script/suggestions/HostEditorAdapterResolver.ts @@ -1,4 +1,4 @@ -import { TextTargetAdapter, type TextTarget } from "./TextTargetAdapter"; +import { TextTargetAdapter } from "./TextTargetAdapter"; import { InjectedHostEditorPageBridge, type HostEditorPageBridge } from "./HostEditorPageBridge"; import { isLineEditorController, @@ -134,7 +134,7 @@ class BridgedLineEditorHostSession implements HostEditorSession { } public createPostEditFingerprint(): PostEditFingerprint { - const target = (this.backingTarget ?? this.elem) as TextTarget; + const target = this.backingTarget ?? this.elem; return TextTargetAdapter.createPostEditFingerprint(target); } } @@ -203,7 +203,7 @@ class LineEditorHostSession implements HostEditorSession { } public createPostEditFingerprint(): PostEditFingerprint { - const target = (this.backingTarget ?? this.elem) as TextTarget; + const target = this.backingTarget ?? this.elem; return TextTargetAdapter.createPostEditFingerprint(target); } diff --git a/src/adapters/chrome/content-script/suggestions/HostEditorMainWorldBridge.ts b/src/adapters/chrome/content-script/suggestions/HostEditorMainWorldBridge.ts index d45905aa..80cbeb99 100644 --- a/src/adapters/chrome/content-script/suggestions/HostEditorMainWorldBridge.ts +++ b/src/adapters/chrome/content-script/suggestions/HostEditorMainWorldBridge.ts @@ -34,7 +34,7 @@ type BridgeRequest = // the problems caused by dispatching synthetic beforeinput events which // CKEditor-5 handles using its own (stale) model selection. -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-argument */ +/* oxlint-disable typescript/no-explicit-any, typescript/no-unsafe-member-access, typescript/no-unsafe-assignment, typescript/no-unsafe-call, typescript/no-unsafe-argument */ interface CKEditorModel { document: { selection: { getFirstPosition(): any } }; change(callback: (writer: any) => void): void; @@ -433,7 +433,7 @@ function applyCKEditor5BlockReplacement( return { applied: true, didDispatchInput: false }; } -/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-argument */ +/* oxlint-enable typescript/no-explicit-any, typescript/no-unsafe-member-access, typescript/no-unsafe-assignment, typescript/no-unsafe-call, typescript/no-unsafe-argument */ function findLineEditorController(elem: HTMLElement): LineEditorController | null { let current: HTMLElement | null = elem; diff --git a/src/adapters/chrome/content-script/suggestions/InlineSuggestionPresenter.ts b/src/adapters/chrome/content-script/suggestions/InlineSuggestionPresenter.ts index 6c4ab4c8..7398bc29 100644 --- a/src/adapters/chrome/content-script/suggestions/InlineSuggestionPresenter.ts +++ b/src/adapters/chrome/content-script/suggestions/InlineSuggestionPresenter.ts @@ -61,7 +61,7 @@ export class InlineSuggestionPresenter { return; } - const snapshot = TextTargetAdapter.snapshot(entry.elem as TextTarget); + const snapshot = TextTargetAdapter.snapshot(entry.elem); const mentionText = resolveMentionToken(snapshot.beforeCursor).token || entry.latestMentionText; if (!mentionText) { this.clearForEntry(entry.id); diff --git a/src/adapters/chrome/content-script/suggestions/SuggestionEntryPredictionContext.ts b/src/adapters/chrome/content-script/suggestions/SuggestionEntryPredictionContext.ts index 8625d975..3f132cc6 100644 --- a/src/adapters/chrome/content-script/suggestions/SuggestionEntryPredictionContext.ts +++ b/src/adapters/chrome/content-script/suggestions/SuggestionEntryPredictionContext.ts @@ -1,5 +1,5 @@ import type { PredictionInputAction } from "@core/domain/messageTypes"; -import { TextTargetAdapter, type TextTarget } from "./TextTargetAdapter"; +import { TextTargetAdapter } from "./TextTargetAdapter"; import type { SuggestionEntry, SuggestionSnapshot } from "./types"; type SuggestionEntryCursorContextSource = Pick< @@ -81,7 +81,7 @@ export function resolveEditableCursorContext({ typedKey?: string | null; }): EditableCursorContext { if (TextTargetAdapter.isTextValue(entry.elem)) { - const resolvedSnapshot = snapshot ?? TextTargetAdapter.snapshot(entry.elem as TextTarget); + const resolvedSnapshot = snapshot ?? TextTargetAdapter.snapshot(entry.elem); return { beforeCursor: resolvedSnapshot.beforeCursor, afterCursor: resolvedSnapshot.afterCursor, @@ -107,7 +107,7 @@ export function resolveEditableCursorContext({ } const beforeBlockBoundary = contentEditableAdapter.isCollapsedSelectionBeforeBlockBoundary( - entry.elem as HTMLElement, + entry.elem, ); const useFullTextOffsets = blockContext.beforeCursor.length === 0 && @@ -115,7 +115,7 @@ export function resolveEditableCursorContext({ beforeBlockBoundary; if (useFullTextOffsets) { const previousBlockFallback = hasMultipleBlockDescendants - ? contentEditableAdapter.getPreviousBlockTextBySelection(entry.elem as HTMLElement) + ? contentEditableAdapter.getPreviousBlockTextBySelection(entry.elem) : null; return { beforeCursor: previousBlockFallback ?? "", diff --git a/src/adapters/chrome/content-script/suggestions/SuggestionEntrySession.ts b/src/adapters/chrome/content-script/suggestions/SuggestionEntrySession.ts index 20988919..6784bd59 100644 --- a/src/adapters/chrome/content-script/suggestions/SuggestionEntrySession.ts +++ b/src/adapters/chrome/content-script/suggestions/SuggestionEntrySession.ts @@ -14,7 +14,7 @@ import { shouldReleaseAcceptedSuggestionSuppressionOnKeydown as shouldReleaseAcceptedSuggestionSuppressionOnKeydownHelper, syncAcceptedSuggestionTrailingSpaceState as syncAcceptedSuggestionTrailingSpaceStateHelper, } from "./SuggestionAcceptedState"; -import { TextTargetAdapter, type TextTarget } from "./TextTargetAdapter"; +import { TextTargetAdapter } from "./TextTargetAdapter"; import { buildCaretTrace, clipTraceText, collapseTraceWhitespace } from "./traceUtils"; import type { PendingKeyFallback, @@ -95,7 +95,7 @@ export class SuggestionEntrySession { } public requestPrediction(): void { - const snapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const snapshot = TextTargetAdapter.snapshot(this.entry.elem); const context = this.resolveEditableCursorContext(this.entry, snapshot); this.predictionCoordinator.schedule(this.entry, { force: true, @@ -212,7 +212,7 @@ export class SuggestionEntrySession { return; } if (this.entry.suppressNextSuggestionInputPrediction) { - const snapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const snapshot = TextTargetAdapter.snapshot(this.entry.elem); const preservesPendingExtensionEdit = this.shouldPreservePendingExtensionEdit(snapshot); logger.debug("Evaluating post-accept input suppression", { suggestionId: this.entry.id, @@ -395,7 +395,7 @@ export class SuggestionEntrySession { } controls.clearPendingFallback(); - const reconcileSnapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const reconcileSnapshot = TextTargetAdapter.snapshot(this.entry.elem); logger.debug("Proceeding with key fallback reconcile", { suggestionId: this.entry.id, inputAction: pending.inputAction, @@ -495,7 +495,7 @@ export class SuggestionEntrySession { return; } if (TextTargetAdapter.isTextValue(this.entry.elem)) { - if (!TextTargetAdapter.hasCollapsedSelection(this.entry.elem as TextTarget)) { + if (!TextTargetAdapter.hasCollapsedSelection(this.entry.elem)) { controls.dismissEntry(); return; } @@ -550,7 +550,7 @@ export class SuggestionEntrySession { return false; } - const snapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const snapshot = TextTargetAdapter.snapshot(this.entry.elem); const currentFullText = `${snapshot.beforeCursor}${snapshot.afterCursor}`; const textChanged = pending.expectedFullText !== null && currentFullText !== pending.expectedFullText; @@ -635,7 +635,7 @@ export class SuggestionEntrySession { ): void { controls.clearPendingFallback(); const shouldWaitForTextChange = inputAction === "insert" && observeMutations; - const currentSnapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const currentSnapshot = TextTargetAdapter.snapshot(this.entry.elem); const currentBeforeCursor = this.resolveBeforeCursorForPrediction(this.entry, { snapshot: currentSnapshot, }); @@ -796,7 +796,7 @@ export class SuggestionEntrySession { } private resolveCurrentPredictionContext(): { beforeCursor: string; fullText: string } { - const snapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const snapshot = TextTargetAdapter.snapshot(this.entry.elem); const context = this.resolveEditableCursorContext(this.entry, snapshot); return { beforeCursor: context.beforeCursor, @@ -820,7 +820,7 @@ export class SuggestionEntrySession { ): string { return this.resolveEditableCursorContext( entry, - snapshot ?? TextTargetAdapter.snapshot(entry.elem as TextTarget), + snapshot ?? TextTargetAdapter.snapshot(entry.elem), { inputAction, hasMultipleBlockDescendants, @@ -847,9 +847,7 @@ export class SuggestionEntrySession { if (eventIsComposing === true) { return "event_composing"; } - return TextTargetAdapter.hasCollapsedSelection(entry.elem as TextTarget) - ? null - : "selection_not_collapsed"; + return TextTargetAdapter.hasCollapsedSelection(entry.elem) ? null : "selection_not_collapsed"; } private shouldAllowContentEditableFallbackPredictionWithNonCollapsedSelection( @@ -973,7 +971,7 @@ export class SuggestionEntrySession { typeof globalThis.performance?.now === "function" ? globalThis.performance.now() : Date.now(); - const resolved = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const resolved = TextTargetAdapter.snapshot(this.entry.elem); snapshotDurationMs = (typeof globalThis.performance?.now === "function" ? globalThis.performance.now() @@ -1062,7 +1060,7 @@ export class SuggestionEntrySession { return; } - snapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + snapshot = TextTargetAdapter.snapshot(this.entry.elem); if (this.shouldSkipPredictionForUnstableInputState(this.entry)) { this.handleSuppressedInput(); return; @@ -1430,16 +1428,9 @@ export class SuggestionEntrySession { !TextTargetAdapter.isTextValue(this.entry.elem) && (this.entry.elem as HTMLElement).isContentEditable ) { - const activeBlock = this.contentEditableAdapter.getActiveBlockElement( - this.entry.elem as HTMLElement, - ); - const blockContext = this.contentEditableAdapter.getBlockContext( - this.entry.elem as HTMLElement, - ); - if ( - !blockContext || - !TextTargetAdapter.hasCollapsedSelection(this.entry.elem as TextTarget) - ) { + const activeBlock = this.contentEditableAdapter.getActiveBlockElement(this.entry.elem); + const blockContext = this.contentEditableAdapter.getBlockContext(this.entry.elem); + if (!blockContext || !TextTargetAdapter.hasCollapsedSelection(this.entry.elem)) { return false; } const blockFullText = `${blockContext.beforeCursor}${blockContext.afterCursor}`; @@ -1454,10 +1445,10 @@ export class SuggestionEntrySession { if ( !TextTargetAdapter.isTextValue(this.entry.elem) && pendingEdit.source === "grammar" && - TextTargetAdapter.hasCollapsedSelection(this.entry.elem as TextTarget) + TextTargetAdapter.hasCollapsedSelection(this.entry.elem) ) { const actualFingerprint = TextTargetAdapter.createPostEditFingerprint( - this.entry.elem as TextTarget, + this.entry.elem, snapshot, ); if ( @@ -1471,7 +1462,7 @@ export class SuggestionEntrySession { } } return TextTargetAdapter.matchesPostEditFingerprint( - this.entry.elem as TextTarget, + this.entry.elem, pendingEdit.postEditFingerprint, snapshot, ); @@ -1552,7 +1543,7 @@ export class SuggestionEntrySession { if (!this.isFocused() || this.shouldSkipPredictionForUnstableInputState(this.entry)) { return; } - const snapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const snapshot = TextTargetAdapter.snapshot(this.entry.elem); const grammarContext = this.resolveEditableCursorContext(this.entry, snapshot); const grammarEdit = grammarContext.safeForGrammar ? this.grammarCoordinator.run({ @@ -1576,7 +1567,7 @@ export class SuggestionEntrySession { if (applyResult.didDispatchInput) { return; } - const updatedSnapshot = TextTargetAdapter.snapshot(this.entry.elem as TextTarget); + const updatedSnapshot = TextTargetAdapter.snapshot(this.entry.elem); const predictionContext = this.resolveEditableCursorContext(this.entry, updatedSnapshot); this.predictionCoordinator.schedule(this.entry, { force: true, @@ -1651,12 +1642,8 @@ export class SuggestionEntrySession { if (TextTargetAdapter.isTextValue(this.entry.elem)) { return null; } - const activeBlock = this.contentEditableAdapter.getActiveBlockElement( - this.entry.elem as HTMLElement, - ); - const blockContext = this.contentEditableAdapter.getBlockContext( - this.entry.elem as HTMLElement, - ); + const activeBlock = this.contentEditableAdapter.getActiveBlockElement(this.entry.elem); + const blockContext = this.contentEditableAdapter.getBlockContext(this.entry.elem); if (!activeBlock || !blockContext) { return null; } diff --git a/src/adapters/chrome/content-script/suggestions/SuggestionPositioningService.ts b/src/adapters/chrome/content-script/suggestions/SuggestionPositioningService.ts index 752308d5..6008b1d2 100644 --- a/src/adapters/chrome/content-script/suggestions/SuggestionPositioningService.ts +++ b/src/adapters/chrome/content-script/suggestions/SuggestionPositioningService.ts @@ -571,6 +571,6 @@ export class SuggestionPositioningService { right: left + width, bottom: top + height, toJSON: () => ({ left, top, width, height }), - } as DOMRect; + }; } } diff --git a/src/adapters/chrome/content-script/suggestions/SuggestionPredictionCoordinator.ts b/src/adapters/chrome/content-script/suggestions/SuggestionPredictionCoordinator.ts index fa253039..e6e8daf7 100644 --- a/src/adapters/chrome/content-script/suggestions/SuggestionPredictionCoordinator.ts +++ b/src/adapters/chrome/content-script/suggestions/SuggestionPredictionCoordinator.ts @@ -1,4 +1,4 @@ -import { TextTargetAdapter, type TextTarget } from "./TextTargetAdapter"; +import { TextTargetAdapter } from "./TextTargetAdapter"; import type { PredictionRequest, PredictionResponse, SuggestionEntry } from "./types"; import type { PredictionInputAction } from "@core/domain/messageTypes"; import { extractPredictionTokenSuffix } from "@core/domain/predictionToken"; @@ -71,7 +71,7 @@ export class SuggestionPredictionCoordinator { this.cancelPending(entry); const beforeCursor = - beforeCursorOverride ?? TextTargetAdapter.snapshot(entry.elem as TextTarget).beforeCursor; + beforeCursorOverride ?? TextTargetAdapter.snapshot(entry.elem).beforeCursor; const traceContext = createPredictionTraceContext(); if (force) { @@ -127,7 +127,7 @@ export class SuggestionPredictionCoordinator { ): void { this.cancelPending(entry); const beforeCursor = - beforeCursorOverride ?? TextTargetAdapter.snapshot(entry.elem as TextTarget).beforeCursor; + beforeCursorOverride ?? TextTargetAdapter.snapshot(entry.elem).beforeCursor; this.requestPrediction( entry, false, @@ -182,7 +182,7 @@ export class SuggestionPredictionCoordinator { ): void { const snapshot = beforeCursorOverride === undefined || afterCursorOverride === undefined - ? TextTargetAdapter.snapshot(entry.elem as TextTarget) + ? TextTargetAdapter.snapshot(entry.elem) : null; const beforeCursor = beforeCursorOverride ?? snapshot?.beforeCursor ?? ""; const afterCursor = afterCursorOverride ?? snapshot?.afterCursor ?? ""; diff --git a/src/adapters/chrome/content-script/suggestions/SuggestionTextEditService.ts b/src/adapters/chrome/content-script/suggestions/SuggestionTextEditService.ts index 05591cc4..efda93c6 100644 --- a/src/adapters/chrome/content-script/suggestions/SuggestionTextEditService.ts +++ b/src/adapters/chrome/content-script/suggestions/SuggestionTextEditService.ts @@ -4,7 +4,7 @@ import { SPACING_RULES, Spacing } from "@core/domain/spacingRules"; import { ContentEditableAdapter, type ContentEditableEditResult } from "./ContentEditableAdapter"; import { HostEditorAdapterResolver, type HostEditorSession } from "./HostEditorAdapterResolver"; import { CURSOR_MOVE_COUNT_ATTR, CURSOR_MOVE_EVENT } from "./HostEditorBridgeProtocol"; -import { TextTargetAdapter, type TextTarget } from "./TextTargetAdapter"; +import { TextTargetAdapter } from "./TextTargetAdapter"; import { buildCaretTrace, clipTraceText, collapseTraceWhitespace } from "./traceUtils"; import type { ExtensionEditSnapshot, @@ -118,7 +118,7 @@ export class SuggestionTextEditService { return this.acceptContentEditableSuggestion(entry, suggestion, blockContext, blockTokenInfo); } - let snapshot = TextTargetAdapter.snapshot(entry.elem as TextTarget); + let snapshot = TextTargetAdapter.snapshot(entry.elem); const tokenInfo = this.findMentionToken(snapshot.beforeCursor); const triggerText = tokenInfo.token || entry.latestMentionText; @@ -234,12 +234,12 @@ export class SuggestionTextEditService { entry.pendingExtensionEdit = null; return null; } - const postEditSnapshot = TextTargetAdapter.snapshot(entry.elem as TextTarget); + const postEditSnapshot = TextTargetAdapter.snapshot(entry.elem); if (entry.pendingExtensionEdit) { entry.pendingExtensionEdit.cursorAfter = postEditSnapshot.cursorOffset; entry.pendingExtensionEdit.postEditFingerprint = TextTargetAdapter.createPostEditFingerprint( - entry.elem as TextTarget, + entry.elem, postEditSnapshot, ); } @@ -324,7 +324,7 @@ export class SuggestionTextEditService { }); } - const snapshot: SuggestionSnapshot = TextTargetAdapter.snapshot(entry.elem as TextTarget); + const snapshot: SuggestionSnapshot = TextTargetAdapter.snapshot(entry.elem); const pendingEdit = entry.pendingExtensionEdit; const { replaceStart, @@ -342,14 +342,11 @@ export class SuggestionTextEditService { source === "grammar" && "isContentEditable" in entry.elem && (entry.elem as HTMLElement).isContentEditable && - TextTargetAdapter.hasCollapsedSelection(entry.elem as TextTarget); + TextTargetAdapter.hasCollapsedSelection(entry.elem); const fingerprintMatch = isContentEditableGrammar ? (() => { - const actual = TextTargetAdapter.createPostEditFingerprint( - entry.elem as TextTarget, - snapshot, - ); + const actual = TextTargetAdapter.createPostEditFingerprint(entry.elem, snapshot); return ( actual.fullText === postEditFingerprint.fullText && actual.selectionCollapsed === postEditFingerprint.selectionCollapsed && @@ -357,11 +354,7 @@ export class SuggestionTextEditService { snapshot.cursorOffset <= replaceStart + replacementText.length ); })() - : TextTargetAdapter.matchesPostEditFingerprint( - entry.elem as TextTarget, - postEditFingerprint, - snapshot, - ); + : TextTargetAdapter.matchesPostEditFingerprint(entry.elem, postEditFingerprint, snapshot); if (!fingerprintMatch) { entry.pendingExtensionEdit = null; @@ -429,7 +422,7 @@ export class SuggestionTextEditService { if ( !activeBlock || !blockContext || - !TextTargetAdapter.hasCollapsedSelection(entry.elem as TextTarget) || + !TextTargetAdapter.hasCollapsedSelection(entry.elem) || activeBlock !== (pendingEdit.blockElement ?? null) ) { entry.pendingExtensionEdit = null; @@ -480,7 +473,7 @@ export class SuggestionTextEditService { if (!entry.manualAutoFixSuppression) { return; } - const snapshot = snapshotOverride ?? TextTargetAdapter.snapshot(entry.elem as TextTarget); + const snapshot = snapshotOverride ?? TextTargetAdapter.snapshot(entry.elem); const fullText = `${snapshot.beforeCursor}${snapshot.afterCursor}`; const tokenContext = this.resolveTokenContext(fullText, snapshot.cursorOffset); if ( @@ -513,8 +506,7 @@ export class SuggestionTextEditService { typeof edit.deleteForwards === "number" && Number.isFinite(edit.deleteForwards) ? Math.max(0, edit.deleteForwards) : 0; - const snapshot: SuggestionSnapshot = - context.snapshot ?? TextTargetAdapter.snapshot(entry.elem as TextTarget); + const snapshot: SuggestionSnapshot = context.snapshot ?? TextTargetAdapter.snapshot(entry.elem); this.syncManualAutoFixSuppression(entry, snapshot); const fullText = `${snapshot.beforeCursor}${snapshot.afterCursor}`; @@ -580,7 +572,7 @@ export class SuggestionTextEditService { replaceStart, Math.min(fullText.length, blockStart + blockCursor + deleteForwards), ); - activeBlock = this.contentEditableAdapter.getActiveBlockElement(entry.elem as HTMLElement); + activeBlock = this.contentEditableAdapter.getActiveBlockElement(entry.elem); } } const expectedFullText = `${fullText.slice(0, replaceStart)}${replacement}${fullText.slice(replaceEnd)}`; @@ -621,10 +613,9 @@ export class SuggestionTextEditService { blockSourceText !== null ) { const blockContext = - context.contentEditableContext ?? - this.contentEditableAdapter.getBlockContext(entry.elem as HTMLElement); + context.contentEditableContext ?? this.contentEditableAdapter.getBlockContext(entry.elem); if (blockContext) { - const hostEditorSession = this.resolveHostEditorSession(entry.elem as HTMLElement, { + const hostEditorSession = this.resolveHostEditorSession(entry.elem, { beforeCursor: blockContext.beforeCursor, afterCursor: blockContext.afterCursor, blockText: blockSourceText, @@ -645,7 +636,7 @@ export class SuggestionTextEditService { } if (applyResult === null) { applyResult = this.tryHostGrammarEditWithMatchingBlockText( - entry.elem as HTMLElement, + entry.elem, blockSourceText, blockReplaceStart, blockReplaceEnd, @@ -659,7 +650,7 @@ export class SuggestionTextEditService { // the full paragraph block. Translate local offsets into the // host's full-block coordinate space and retry. applyResult = this.tryHostGrammarEditWithFullBlockOffsets( - entry.elem as HTMLElement, + entry.elem, blockSourceText, blockReplaceStart, blockReplaceEnd, @@ -676,7 +667,7 @@ export class SuggestionTextEditService { // CKEditor reconciles through its normal rendering pipeline // instead of racing against a foreign DOM mutation. applyResult = this.tryHostGrammarEditWithStaleHostRewrite( - entry.elem as HTMLElement, + entry.elem, blockSourceText, blockReplaceStart, blockReplaceEnd, @@ -787,7 +778,7 @@ export class SuggestionTextEditService { } : null; if (postEditSnapshot === null) { - postEditSnapshot = TextTargetAdapter.snapshot(entry.elem as TextTarget); + postEditSnapshot = TextTargetAdapter.snapshot(entry.elem); } let finalApplyResult = applyResult; @@ -803,7 +794,7 @@ export class SuggestionTextEditService { expectedBlockCursorAfter, }); if (corrected) { - this.domPreferredGrammarTargets.add(entry.elem as HTMLElement); + this.domPreferredGrammarTargets.add(entry.elem); finalApplyResult = corrected.applyResult; postEditSnapshot = corrected.postEditSnapshot; } @@ -816,7 +807,7 @@ export class SuggestionTextEditService { cursorBefore: snapshot.cursorOffset, cursorAfter: postEditSnapshot.cursorOffset, postEditFingerprint: TextTargetAdapter.createPostEditFingerprint( - entry.elem as TextTarget, + entry.elem, postEditSnapshot, ), source: "grammar", @@ -853,7 +844,7 @@ export class SuggestionTextEditService { : null; const snapshot = isTextValueTarget || !entry.expectedCursorPosIsBlockLocal - ? TextTargetAdapter.snapshot(entry.elem as TextTarget) + ? TextTargetAdapter.snapshot(entry.elem) : null; const currentCursorOffset = blockContext !== null ? blockContext.beforeCursor.length : (snapshot?.cursorOffset ?? -1); @@ -1145,7 +1136,7 @@ export class SuggestionTextEditService { if (TextTargetAdapter.isTextValue(elem)) { return false; } - return this.domPreferredGrammarTargets.has(elem as HTMLElement); + return this.domPreferredGrammarTargets.has(elem); } private matchesExpectedGrammarResult( @@ -1508,7 +1499,7 @@ export class SuggestionTextEditService { postEditFingerprint: { fullText: "", cursorOffset: cursorAfter, - selectionCollapsed: TextTargetAdapter.hasCollapsedSelection(entry.elem as TextTarget), + selectionCollapsed: TextTargetAdapter.hasCollapsedSelection(entry.elem), }, source: "suggestion", blockScoped: true, @@ -1572,7 +1563,7 @@ export class SuggestionTextEditService { : { fullText: "", cursorOffset: postEditCursorAfter, - selectionCollapsed: TextTargetAdapter.hasCollapsedSelection(entry.elem as TextTarget), + selectionCollapsed: TextTargetAdapter.hasCollapsedSelection(entry.elem), }; entry.pendingExtensionEdit.blockElement = activeBlock; entry.pendingExtensionEdit.postEditBlockText = postEditBlockText; @@ -1625,7 +1616,7 @@ export class SuggestionTextEditService { applyResult: ContentEditableEditResult | { didMutateDom: boolean; didDispatchInput: boolean }; postEditSnapshot: SuggestionSnapshot; } | null { - const currentSnapshot = TextTargetAdapter.snapshot(entry.elem as TextTarget); + const currentSnapshot = TextTargetAdapter.snapshot(entry.elem); const currentFullText = `${currentSnapshot.beforeCursor}${currentSnapshot.afterCursor}`; if ( currentFullText === expectedFullText && @@ -1687,7 +1678,7 @@ export class SuggestionTextEditService { if (!TextTargetAdapter.isTextValue(elem)) { this.contentEditableAdapter.setCaret(elem, cursorAfter); } - const postEditSnapshot = TextTargetAdapter.snapshot(elem as TextTarget); + const postEditSnapshot = TextTargetAdapter.snapshot(elem); return { applyResult: { didMutateDom: false, @@ -1735,7 +1726,7 @@ export class SuggestionTextEditService { } return { applyResult, - postEditSnapshot: TextTargetAdapter.snapshot(elem as TextTarget), + postEditSnapshot: TextTargetAdapter.snapshot(elem), }; } diff --git a/src/core/application/logging/Logger.ts b/src/core/application/logging/Logger.ts index bd025f86..020abda7 100644 --- a/src/core/application/logging/Logger.ts +++ b/src/core/application/logging/Logger.ts @@ -84,7 +84,7 @@ function cloneConfig(config: ObservabilityConfig): ObservabilityConfig { moduleId, override ? { ...override } : override, ]), - ) as ObservabilityConfig["moduleOverrides"], + ), }; } diff --git a/src/core/application/repositories/CoreSettingsRepository.ts b/src/core/application/repositories/CoreSettingsRepository.ts index 54df5482..c9fbc649 100644 --- a/src/core/application/repositories/CoreSettingsRepository.ts +++ b/src/core/application/repositories/CoreSettingsRepository.ts @@ -190,7 +190,7 @@ export class CoreSettingsRepository extends SettingsRepositoryBase { continue; } if (typeof expansion === "string") { - normalized.push([shortcut, expansion as unknown as object]); + normalized.push([shortcut, expansion]); continue; } if (!expansion || typeof expansion !== "object" || Array.isArray(expansion)) { diff --git a/src/core/application/repositories/ObservabilitySettingsRepository.ts b/src/core/application/repositories/ObservabilitySettingsRepository.ts index 28afc4b3..4f351b14 100644 --- a/src/core/application/repositories/ObservabilitySettingsRepository.ts +++ b/src/core/application/repositories/ObservabilitySettingsRepository.ts @@ -59,9 +59,7 @@ export class ObservabilitySettingsRepository extends SettingsRepositoryBase { return { enabled: typeof enabled === "boolean" ? enabled : DEFAULT_OBSERVABILITY_ENABLED, - defaultLevel: isLogLevel(defaultLevel) - ? defaultLevel - : (DEFAULT_OBSERVABILITY_DEFAULT_LEVEL as LogLevel), + defaultLevel: isLogLevel(defaultLevel) ? defaultLevel : DEFAULT_OBSERVABILITY_DEFAULT_LEVEL, moduleOverrides: sanitizeModuleOverrides(moduleOverrides), }; } diff --git a/src/core/application/settings/SettingsMigrationV3.ts b/src/core/application/settings/SettingsMigrationV3.ts index 670312de..d4f1c509 100644 --- a/src/core/application/settings/SettingsMigrationV3.ts +++ b/src/core/application/settings/SettingsMigrationV3.ts @@ -46,7 +46,7 @@ export async function migrateSettingsV3(settings: SettingsManager): Promise { diff --git a/src/core/application/storage/ChromeStorageBackend.ts b/src/core/application/storage/ChromeStorageBackend.ts index 4b277249..14521ea7 100644 --- a/src/core/application/storage/ChromeStorageBackend.ts +++ b/src/core/application/storage/ChromeStorageBackend.ts @@ -87,7 +87,7 @@ export class ChromeStorageBackend implements StorageBackend { Object.defineProperty(result, key.substring(prefix.length), { configurable: true, enumerable: true, - value: value as string, + value: value, writable: true, }); } diff --git a/src/core/domain/grammar/GrammarRuleEngine.ts b/src/core/domain/grammar/GrammarRuleEngine.ts index 0fc98136..67243925 100644 --- a/src/core/domain/grammar/GrammarRuleEngine.ts +++ b/src/core/domain/grammar/GrammarRuleEngine.ts @@ -7,7 +7,7 @@ const LEGACY_SOURCE_RULE_IDS = new Set(["spacingRule", "capitalizeFirstLetter"]) type LegacyGrammarRuleId = "spacingRule" | "capitalizeFirstLetter"; function isLegacySourceRuleId(ruleId: GrammarRule["id"]): ruleId is LegacyGrammarRuleId { - return LEGACY_SOURCE_RULE_IDS.has(ruleId as LegacyGrammarRuleId); + return LEGACY_SOURCE_RULE_IDS.has(ruleId); } export class GrammarRuleEngine { diff --git a/src/ui/options/textExpander.ts b/src/ui/options/textExpander.ts index f57937ce..e86ab51f 100644 --- a/src/ui/options/textExpander.ts +++ b/src/ui/options/textExpander.ts @@ -84,7 +84,7 @@ function createElementWrapper(tag: string, props: Record): Elem return this; }, addEvent(type, fn) { - el.addEventListener(type, fn as EventListener); + el.addEventListener(type, fn); }, set(key, value) { if (key === "placeholder") { diff --git a/src/ui/settings-engine/controls/ListBoxMultiSelectControl.ts b/src/ui/settings-engine/controls/ListBoxMultiSelectControl.ts index 9e205610..c2abee1f 100644 --- a/src/ui/settings-engine/controls/ListBoxMultiSelectControl.ts +++ b/src/ui/settings-engine/controls/ListBoxMultiSelectControl.ts @@ -70,7 +70,7 @@ export class ListBoxMultiSelectControl extends BaseControl { return; } - const optObj = options as { groups?: string[]; values: OptionEntry[] }; + const optObj = options; for (const opt of optObj.values ?? []) { appendOption(select, opt); } diff --git a/src/ui/settings-engine/controls/SelectControl.ts b/src/ui/settings-engine/controls/SelectControl.ts index 5e4eb22d..739a0ef5 100644 --- a/src/ui/settings-engine/controls/SelectControl.ts +++ b/src/ui/settings-engine/controls/SelectControl.ts @@ -1,4 +1,4 @@ -import type { SelectConfig, OptionEntry } from "../types.js"; +import type { SelectConfig } from "../types.js"; import type { Store } from "@core/application/storage/Store.js"; import type { SelectFieldControl } from "./FieldControl.js"; import { @@ -82,7 +82,7 @@ export class SelectControl extends BaseControl implements SelectFieldCon } // Object with optional groups and values - const optObj = options as { groups?: string[]; values: OptionEntry[] }; + const optObj = options; const groups: Record = {}; if (optObj.groups) { diff --git a/tests/e2e/e2e-helpers.ts b/tests/e2e/e2e-helpers.ts index 5ca8e0c2..14e06dcc 100644 --- a/tests/e2e/e2e-helpers.ts +++ b/tests/e2e/e2e-helpers.ts @@ -390,7 +390,7 @@ export async function getBackgroundContext(browser: Browser): Promise