diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc new file mode 100644 index 0000000000..957addc988 --- /dev/null +++ b/.oxfmtrc.jsonc @@ -0,0 +1,27 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "printWidth": 80, + // Disabled to avoid churning the key order of every package.json in the repo. + "sortPackageJson": false, + "ignorePatterns": [ + "/dist/", + "/node_modules/", + "/out/", + "/.vscode-test/", + "/coverage/", + "*.vsix", + "flake.lock", + "pnpm-lock.yaml", + "/storybook-static/", + "**/__golden__/", + ".storybook/themes/generated/" + ], + "overrides": [ + { + "files": ["*.jsonc"], + "options": { + "trailingComma": "none" + } + } + ] +} diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc new file mode 100644 index 0000000000..83be646421 --- /dev/null +++ b/.oxlintrc.jsonc @@ -0,0 +1,314 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "extends": [".oxlintrc.react.jsonc"], + "plugins": ["unicorn"], + "categories": { + "correctness": "error" + }, + "options": { + "typeAware": true + }, + "env": { + "builtin": true + }, + "ignorePatterns": [ + "out/**", + "dist/**", + "**/*.d.ts", + "**/vite.config*.ts", + ".vscode-test/**", + "test/fixtures/scripts/**", + "storybook-static/**" + ], + "overrides": [ + { + "files": ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"], + "plugins": ["typescript", "import"], + "rules": { + "no-case-declarations": "error", + "no-empty": "error", + "no-fallthrough": "error", + "no-prototype-builtins": "error", + "no-regex-spaces": "error", + "preserve-caught-error": "error", + "no-var": "error", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + "no-array-constructor": "error", + "no-unused-expressions": "error", + "no-unused-vars": [ + "error", + { + "varsIgnorePattern": "^_", + "argsIgnorePattern": "^_" + } + ], + "no-throw-literal": "error", + "require-await": "off", + "typescript/await-thenable": "error", + "typescript/ban-ts-comment": "error", + "typescript/no-array-delete": "error", + "typescript/no-base-to-string": "error", + "typescript/no-duplicate-enum-values": "error", + "typescript/no-duplicate-type-constituents": "error", + "typescript/no-empty-object-type": "error", + "typescript/no-explicit-any": "error", + "typescript/no-extra-non-null-assertion": "error", + "typescript/no-floating-promises": "error", + "typescript/no-for-in-array": "error", + "typescript/no-implied-eval": "error", + "typescript/no-misused-new": "error", + "typescript/no-misused-promises": "error", + "typescript/no-namespace": "error", + "typescript/no-non-null-asserted-optional-chain": "error", + "typescript/no-redundant-type-constituents": "error", + "typescript/no-require-imports": "error", + "typescript/no-this-alias": "error", + "typescript/no-unnecessary-type-assertion": "error", + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-unsafe-argument": "error", + "typescript/no-unsafe-assignment": "error", + "typescript/no-unsafe-call": "error", + "typescript/no-unsafe-declaration-merging": "error", + "typescript/no-unsafe-enum-comparison": "error", + "typescript/no-unsafe-function-type": "error", + "typescript/no-unsafe-member-access": "error", + "typescript/no-unsafe-return": "error", + "typescript/no-unsafe-unary-minus": "error", + "typescript/no-wrapper-object-types": "error", + "typescript/only-throw-error": "error", + "typescript/prefer-as-const": "error", + "typescript/prefer-namespace-keyword": "error", + "typescript/prefer-promise-reject-errors": "error", + "typescript/require-await": "error", + "typescript/restrict-plus-operands": "error", + "typescript/restrict-template-expressions": "error", + "typescript/triple-slash-reference": "error", + "typescript/unbound-method": "error", + "no-empty-function": "error", + "typescript/adjacent-overload-signatures": "error", + "typescript/array-type": [ + "error", + { + "default": "array-simple" + } + ], + "typescript/ban-tslint-comment": "error", + "typescript/class-literal-property-style": "error", + "typescript/consistent-generic-constructors": "error", + "typescript/consistent-indexed-object-style": "error", + "typescript/consistent-type-assertions": "error", + "typescript/consistent-type-definitions": "error", + "typescript/dot-notation": [ + "error", + { + "allowIndexSignaturePropertyAccess": true + } + ], + "typescript/no-confusing-non-null-assertion": "error", + "typescript/no-inferrable-types": "error", + "typescript/non-nullable-type-assertion-style": "error", + "typescript/prefer-find": "error", + "typescript/prefer-for-of": "error", + "typescript/prefer-function-type": "error", + "typescript/prefer-includes": "error", + "typescript/prefer-nullish-coalescing": [ + "error", + { + "ignorePrimitives": { + "string": true + } + } + ], + "typescript/prefer-regexp-exec": "error", + "typescript/prefer-string-starts-ends-with": "error", + "eqeqeq": "error", + "no-console": "error", + "no-duplicate-imports": "off", + "import/no-duplicates": [ + "error", + { + "prefer-inline": true + } + ], + "typescript/consistent-type-imports": "error", + "typescript/switch-exhaustiveness-check": [ + "error", + { + "considerDefaultExhaustiveForUnions": true + } + ], + "typescript/no-non-null-assertion": "error" + } + }, + { + "files": [ + "test/**/*.{ts,tsx}", + "**/*.test.{ts,tsx}", + "**/*.spec.{ts,tsx}" + ], + "plugins": ["typescript"], + "rules": { + "no-empty-function": "off", + "typescript/consistent-type-imports": [ + "error", + { + "disallowTypeAnnotations": false + } + ], + "typescript/unbound-method": "off", + "typescript/no-non-null-assertion": "off", + "typescript/no-unsafe-assignment": "off", + "typescript/no-unsafe-call": "off", + "typescript/no-unsafe-return": "off" + } + }, + { + "files": [ + "esbuild.mjs", + "scripts/*.mjs", + ".storybook/themes/*.{mjs,cjs}" + ], + "env": { + "node": true + } + }, + { + "files": ["packages/*/src/**/*.ts", "packages/*/src/**/*.tsx"], + "env": { + "browser": true + }, + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@repo/mocks", "@repo/mocks/*"], + "message": "@repo/mocks is for tests and stories only. Do not import it from runtime code." + }, + { + "group": ["@repo/storybook-utils", "@repo/storybook-utils/*"], + "message": "@repo/storybook-utils is for stories only. Do not import it from runtime code." + } + ] + } + ] + } + }, + { + "files": ["packages/ui/**/*.{ts,tsx}"], + "rules": { + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["@repo/*"], + "message": "packages/ui must not import other workspace packages." + }, + { + "group": ["../../../**"], + "message": "packages/ui must not reach outside itself via relative paths." + } + ] + } + ] + } + }, + { + "files": ["packages/**/*.stories.ts", "packages/**/*.stories.tsx"], + "rules": { + "no-restricted-imports": "off" + } + }, + { + "files": [ + "**/*.ts", + "**/*.tsx", + "**/*.mts", + "**/*.cts", + "**/*.js", + "**/*.mjs", + "**/*.cjs" + ], + "jsPlugins": [ + { + "name": "eslint-js", + "specifier": "oxlint-plugin-eslint" + } + ], + "rules": { + "eslint-js/no-restricted-syntax": [ + "error", + { + "selector": "CallExpression[callee.property.name='executeCommand'][arguments.0.value='setContext'][arguments.length>=3]", + "message": "Do not use executeCommand('setContext', ...) directly. Use the ContextManager class instead." + }, + { + "selector": "CallExpression[callee.property.name='registerCommand'][arguments.0.value=/^coder\\./][arguments.length>=2]", + "message": "Do not use registerCommand('coder.*', ...) directly. Use the CommandManager class instead." + }, + { + "selector": "MemberExpression[property.name='remoteAuthority'][object.property.name='env'][object.object.name='vscode']", + "message": "env.remoteAuthority is a proposed API (resolvers) and throws through our own vscode module. Read it via vscodeProposed.env.remoteAuthority." + }, + { + "selector": "JSXExpressionContainer > LogicalExpression[operator='&&'][left.property.name='length']", + "message": "Numeric '.length' as a JSX '&&' operand renders 0 when empty. Use '.length > 0' or a ternary." + }, + { + "selector": "JSXExpressionContainer > LogicalExpression[operator='&&'][left.type='CallExpression'][left.callee.property.name='indexOf']", + "message": "Numeric 'indexOf()' as a JSX '&&' operand renders 0 for a match at index 0. Compare explicitly." + } + ], + "eslint-js/no-useless-assignment": "error" + } + }, + { + "files": ["src/core/contextManager.ts", "src/core/commandManager.ts"], + "rules": { + "eslint-js/no-restricted-syntax": "off" + } + }, + { + "files": [ + "**/*.stories.ts", + "**/*.stories.tsx", + "**/*.story.ts", + "**/*.story.tsx" + ], + "jsPlugins": [ + { + "name": "storybook", + "specifier": "./node_modules/eslint-plugin-storybook/dist/index.js" + } + ], + "rules": { + "storybook/await-interactions": "error", + "storybook/context-in-play-function": "error", + "storybook/default-exports": "error", + "storybook/hierarchy-separator": "error", + "storybook/no-redundant-story-name": "error", + "storybook/no-renderer-packages": "error", + "storybook/prefer-pascal-case": "error", + "storybook/story-exports": "error", + "storybook/use-storybook-expect": "error", + "storybook/use-storybook-testing-library": "error" + } + }, + { + "files": [".storybook/main.ts"], + "jsPlugins": [ + { + "name": "storybook", + "specifier": "./node_modules/eslint-plugin-storybook/dist/index.js" + } + ], + "rules": { + "storybook/no-uninstalled-addons": "error" + } + } + ] +} diff --git a/.oxlintrc.react.jsonc b/.oxlintrc.react.jsonc new file mode 100644 index 0000000000..b2423bd5d4 --- /dev/null +++ b/.oxlintrc.react.jsonc @@ -0,0 +1,87 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "overrides": [ + { + "files": ["packages/**/*.{ts,tsx}"], + "rules": { + "react/exhaustive-deps": "off", + "react/preserve-manual-memoization": "error", + "react/incompatible-library": "warn", + "react/error-boundaries": "error", + "react/globals": "error", + "react/immutability": "error", + "react/jsx-no-comment-textnodes": "warn", + "react/no-array-index-key": "warn", + "react/no-clone-element": "warn", + "react/no-direct-mutation-state": "error", + "react/purity": "warn", + "react/refs": "error", + "react/rules-of-hooks": "error", + "react/set-state-in-effect": "warn", + "react/set-state-in-render": "error", + "react/static-components": "error", + "react/unsupported-syntax": "error", + "react/use-memo": "error", + "react-x/dom-no-dangerously-set-innerhtml-with-children": "error", + "react-x/dom-no-dangerously-set-innerhtml": "warn", + "react-x/dom-no-find-dom-node": "error", + "react-x/dom-no-flush-sync": "error", + "react-x/dom-no-hydrate": "error", + "react-x/dom-no-render-return-value": "error", + "react-x/dom-no-render": "error", + "react-x/dom-no-script-url": "warn", + "react-x/dom-no-unsafe-iframe-sandbox": "warn", + "react-x/dom-no-use-form-state": "error", + "react-x/dom-no-void-elements-with-children": "error", + "react-x/jsx-no-children-prop-with-children": "error", + "react-x/jsx-no-children-prop": "warn", + "react-x/jsx-no-key-after-spread": "error", + "react-x/jsx-no-leaked-dollar": "error", + "react-x/jsx-no-leaked-semicolon": "warn", + "react-x/jsx-no-namespace": "error", + "react-x/naming-convention-context-name": "warn", + "react-x/naming-convention-id-name": "warn", + "react-x/naming-convention-ref-name": "warn", + "react-x/no-access-state-in-setstate": "error", + "react-x/no-children-count": "warn", + "react-x/no-children-for-each": "warn", + "react-x/no-children-map": "warn", + "react-x/no-children-only": "warn", + "react-x/no-children-to-array": "warn", + "react-x/no-component-will-mount": "error", + "react-x/no-component-will-receive-props": "error", + "react-x/no-component-will-update": "error", + "react-x/no-context-provider": "warn", + "react-x/no-create-ref": "error", + "react-x/no-forward-ref": "warn", + "react-x/no-missing-key": "error", + "react-x/no-nested-component-definitions": "error", + "react-x/no-nested-lazy-component-declarations": "error", + "react-x/no-set-state-in-component-did-mount": "warn", + "react-x/no-set-state-in-component-did-update": "warn", + "react-x/no-set-state-in-component-will-update": "warn", + "react-x/no-unnecessary-use-prefix": "warn", + "react-x/no-unsafe-component-will-mount": "warn", + "react-x/no-unsafe-component-will-receive-props": "warn", + "react-x/no-unsafe-component-will-update": "warn", + "react-x/no-unused-class-component-members": "warn", + "react-x/no-use-context": "warn", + "react-x/rsc-function-definition": "error", + "react-x/use-state": "warn", + "react-x/web-api-no-leaked-event-listener": "warn", + "react-x/web-api-no-leaked-fetch": "error", + "react-x/web-api-no-leaked-intersection-observer": "warn", + "react-x/web-api-no-leaked-interval": "warn", + "react-x/web-api-no-leaked-resize-observer": "warn", + "react-x/web-api-no-leaked-timeout": "warn" + }, + "jsPlugins": [ + { + "name": "react-x", + "specifier": "./node_modules/@eslint-react/eslint-plugin/dist/index.js" + } + ], + "plugins": ["react"] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index e4473024bd..75e5fc5901 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,16 +1,13 @@ { "editor.formatOnSave": true, + "editor.formatOnSaveMode": "file", "editor.codeActionsOnSave": { "source.fixAll.ts": "explicit", + "source.fixAll.oxc": "explicit", "source.fixAll.eslint": "explicit" }, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, + "editor.defaultFormatter": "oxc.oxc-vscode", + "oxc.typeAware": true, "vitest.nodeEnv": { "ELECTRON_RUN_AS_NODE": "1" }, diff --git a/.vscodeignore b/.vscodeignore index 2844c8de11..93ceb676ab 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -16,6 +16,9 @@ scripts/** .vscode-test.mjs tsconfig.json eslint.config.mjs +.oxlintrc.jsonc +.oxlintrc.react.jsonc +.oxfmtrc.jsonc .eslintcache esbuild.mjs vitest.config.mts diff --git a/AGENTS.md b/AGENTS.md index ac0a27720c..909ecc4dfd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -50,6 +50,25 @@ headless environments (CI, devcontainers) prefix with `xvfb-run -a`: xvfb-run -a pnpm test:integration ``` +## Linting and Formatting + +Linting runs in two stages via `pnpm lint`: + +1. **Oxlint** (`.oxlintrc.jsonc`): all JS/TS/TSX rules, including type-aware + rules via `oxlint-tsgolint`. +2. **ESLint** (`eslint.config.mjs`): a small residual set Oxlint cannot do. + See [CONTRIBUTING.md](CONTRIBUTING.md#linting) for the exhaustive list. + +When editing `.oxlintrc.jsonc`: + +- `overrides[].files` does not support extglob alternatives like `@(ts|tsx)`. + They silently match nothing (oxc-project/oxc#21525). Use brace globs + (`{ts,tsx}`) or list extensions. +- `settings` is not supported inside `overrides`, and `no-restricted-imports` + patterns only understand `**` and literal paths, not single `*`. + +`test/unit/oxlintConfig.test.ts` guards both regressions. + ## Testing - Test observable behavior and outputs, not implementation details @@ -107,7 +126,9 @@ Non-negotiables: ## Code Style - TypeScript with strict typing -- Use Prettier for code formatting and ESLint for code linting +- Use Oxlint for code linting (`.oxlintrc.jsonc`) and Oxfmt for formatting. + A residual ESLint config covers `import-x/order`, Markdown, and + `package.json` - Use ES6 features (arrow functions, destructuring, etc.) - Use `const` by default; `let` only when necessary - Never use `any` - use exact types when possible @@ -119,7 +140,7 @@ Non-negotiables: - Unit test files must be named `*.test.ts` and use Vitest - Extension tests go in `./test/unit/` - Webview tests go in `./test/webview//` -- Never disable ESLint rules without user approval +- Never disable lint rules without user approval ### Naming and Comments diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8c3cc7b3d1..ff4ed30b67 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -239,6 +239,36 @@ Alternatively: 4. If your change is something users ought to be aware of, add an entry in the changelog. +## Linting + +Linting runs in two stages: [Oxlint](https://oxc.rs) handles all JS/TS/TSX +rules, and a residual ESLint pass covers what Oxlint cannot do yet. When an +Oxlint equivalent lands, remove the corresponding entry from +`eslint.config.mjs` and this list. + +| ESLint rule/plugin | Why Oxlint can't do it | +| ----------------------------------------------------------- | ------------------------------------------------------------------------------ | +| `import-x/order` | Oxlint has no import ordering rule; Oxfmt's `sortImports` reorders differently | +| `@eslint/markdown` (`markdown/no-missing-label-refs`, etc.) | Oxlint only lints source extensions; Markdown needs processors | +| `eslint-plugin-package-json` (58 rules) | Oxlint only lints source extensions | + +`eslint-plugin-oxlint` reads `.oxlintrc.jsonc` and disables every rule Oxlint +already covers, so the two stages never overlap. + +## TypeScript Version + +TypeScript 7 has no programmatic API yet, so `typescript-eslint` cannot load +against it. The two run side-by-side, following the +[official guidance](https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/): + +- `typescript` is aliased to `@typescript/typescript6`: the 6.0 API that + `typescript-eslint` consumes. Its binary is `tsc6`. +- `@typescript/native` is aliased to `typescript@^7`: the `tsc` binary used by + `pnpm typecheck` and editors. + +When TypeScript 7 ships an API, drop `@typescript/native` and point `typescript` +back at a single version. + ## Node.js Version This extension targets the Node.js version bundled with VS Code's Electron: diff --git a/eslint.config.mjs b/eslint.config.mjs index 34f247abdf..7ef58e4223 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,18 +1,21 @@ -import storybook from "eslint-plugin-storybook"; - -// @ts-check -import eslint from "@eslint/js"; -import { defineConfig, globalIgnores } from "eslint/config"; import markdown from "@eslint/markdown"; -import tseslint from "typescript-eslint"; -import prettierConfig from "eslint-config-prettier"; +import { defineConfig, globalIgnores } from "eslint/config"; import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript"; import { flatConfigs as importXFlatConfigs } from "eslint-plugin-import-x"; import packageJson from "eslint-plugin-package-json"; -import eslintReact from "@eslint-react/eslint-plugin"; -import reactHooks from "eslint-plugin-react-hooks"; -import globals from "globals"; +import oxlint from "eslint-plugin-oxlint"; +import tseslint from "typescript-eslint"; +// Oxlint owns JS/TS/TSX linting (see `.oxlintrc.jsonc`), including type-aware +// rules. ESLint only covers what Oxlint cannot: +// +// - `import-x/order`: Oxlint omits it; Oxfmt's `sortImports` reorders +// differently. +// - Markdown: `@eslint/markdown` uses processors the JS plugin API lacks. +// - `package.json`: Oxlint only lints source extensions. +// +// `oxlint.buildFromOxlintConfigFile` turns off every rule Oxlint already +// covers, so the two never disagree. It must come last. export default defineConfig( globalIgnores([ "out/**", @@ -24,36 +27,16 @@ export default defineConfig( "storybook-static/**", ]), - // Base ESLint recommended rules (for JS/TS/TSX files only) + // Parse TypeScript without the type-aware programs; Oxlint owns typed rules. { - files: [ - "**/*.ts", - "**/*.tsx", - "**/*.mts", - "**/*.cts", - "**/*.js", - "**/*.mjs", - "**/*.cjs", - ], - ...eslint.configs.recommended, + files: ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"], + languageOptions: { parser: tseslint.parser }, }, - // TypeScript configuration with type-checked rules + // Import ordering for source files. { files: ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"], - extends: [ - ...tseslint.configs.recommendedTypeChecked, - ...tseslint.configs.stylisticTypeChecked, - importXFlatConfigs.typescript, - ], - languageOptions: { - parserOptions: { - projectService: { - allowDefaultProject: ["vitest.config.mts"], - }, - tsconfigRootDir: import.meta.dirname, - }, - }, + extends: [importXFlatConfigs.typescript], settings: { "import-x/resolver-next": [ createTypeScriptImportResolver({ project: "./tsconfig.json" }), @@ -61,38 +44,6 @@ export default defineConfig( "import-x/internal-regex": "^@/", }, rules: { - // Core ESLint rules - curly: "error", - eqeqeq: "error", - "no-throw-literal": "error", - "no-console": "error", - - // TypeScript rules (extending/overriding presets) - "require-await": "off", - "@typescript-eslint/require-await": "error", - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/switch-exhaustiveness-check": [ - "error", - { considerDefaultExhaustiveForUnions: true }, - ], - "@typescript-eslint/no-non-null-assertion": "error", - "@typescript-eslint/no-unused-vars": [ - "error", - { varsIgnorePattern: "^_", argsIgnorePattern: "^_" }, - ], - "@typescript-eslint/array-type": ["error", { default: "array-simple" }], - "@typescript-eslint/prefer-nullish-coalescing": [ - "error", - // Allow || for strings where empty string should be treated as falsy - { ignorePrimitives: { string: true } }, - ], - "@typescript-eslint/dot-notation": [ - "error", - // Allow bracket notation for index signatures (e.g., Record) - { allowIndexSignaturePropertyAccess: true }, - ], - - // Import rules "import-x/order": [ "error", { @@ -113,36 +64,10 @@ export default defineConfig( warnOnUnassignedImports: true, }, ], - "no-duplicate-imports": "off", - "import-x/no-duplicates": ["error", { "prefer-inline": true }], - "import-x/no-unresolved": ["error", { ignore: ["vscode"] }], - - // Custom AST selector rule - "no-restricted-syntax": [ - "error", - { - selector: - "CallExpression[callee.property.name='executeCommand'][arguments.0.value='setContext'][arguments.length>=3]", - message: - "Do not use executeCommand('setContext', ...) directly. Use the ContextManager class instead.", - }, - { - selector: - "CallExpression[callee.property.name='registerCommand'][arguments.0.value=/^coder\\./][arguments.length>=2]", - message: - "Do not use registerCommand('coder.*', ...) directly. Use the CommandManager class instead.", - }, - { - selector: - "MemberExpression[property.name='remoteAuthority'][object.property.name='env'][object.object.name='vscode']", - message: - "env.remoteAuthority is a proposed API (resolvers) and throws through our own vscode module. Read it via vscodeProposed.env.remoteAuthority.", - }, - ], }, }, - // Test files - use test tsconfig and relax some rules + // Test files resolve against the test tsconfig. { files: ["test/**/*.{ts,tsx}", "**/*.test.{ts,tsx}", "**/*.spec.{ts,tsx}"], settings: { @@ -150,121 +75,9 @@ export default defineConfig( createTypeScriptImportResolver({ project: "test/tsconfig.json" }), ], }, - rules: { - // Allow type annotations in tests (e.g., for vi.fn()) - "@typescript-eslint/consistent-type-imports": [ - "error", - { - disallowTypeAnnotations: false, - }, - ], - // vitest mocks trigger false positives for unbound-method - "@typescript-eslint/unbound-method": "off", - // Empty callbacks are common in test stubs - "@typescript-eslint/no-empty-function": "off", - // Test assertions often use non-null assertions for brevity - "@typescript-eslint/no-non-null-assertion": "off", - // Test mocks often have loose typing - relax unsafe rules - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-return": "off", - }, - }, - - // Disable no-restricted-syntax for contextManager and commandManager - { - files: ["src/core/contextManager.ts", "src/core/commandManager.ts"], - rules: { - "no-restricted-syntax": "off", - }, - }, - - // Build config - ESM with Node globals - { - files: ["esbuild.mjs", "scripts/*.mjs", ".storybook/themes/*.{mjs,cjs}"], - languageOptions: { - globals: { - ...globals.node, - }, - }, - }, - - // Webview packages - browser globals - { - files: ["packages/*/src/**/*.ts", "packages/*/src/**/*.tsx"], - languageOptions: { - globals: { - ...globals.browser, - }, - }, - }, - - // Prevent runtime package code from importing test/storybook-only packages - { - files: ["packages/*/src/**/*.ts", "packages/*/src/**/*.tsx"], - ignores: ["**/*.stories.*"], - rules: { - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@repo/mocks", "@repo/mocks/*"], - message: - "@repo/mocks is for tests and stories only. Do not import it from runtime code.", - }, - { - group: ["@repo/storybook-utils", "@repo/storybook-utils/*"], - message: - "@repo/storybook-utils is for stories only. Do not import it from runtime code.", - }, - ], - }, - ], - }, - }, - - // Keep the UI package independent from other workspace packages. - { - files: ["packages/ui/**/*.{ts,tsx}"], - rules: { - "import-x/no-relative-packages": "error", - "no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["@repo/*"], - message: "packages/ui must not import other workspace packages.", - }, - ], - }, - ], - }, }, - // React rules with type-checked analysis (covers hooks, JSX, DOM) - { - files: ["packages/**/*.{ts,tsx}"], - extends: [ - eslintReact.configs["recommended-type-checked"], - reactHooks.configs.flat.recommended, - // Keep @eslint-react's copy where both plugins ship the same rule - eslintReact.configs["disable-conflict-eslint-plugin-react-hooks"], - ], - rules: { - // React Compiler auto-memoizes; exhaustive-deps false-positives on useCallback - "@eslint-react/exhaustive-deps": "off", - // Compiler rules the conflict preset drops but recommended leaves off - "@eslint-react/globals": "error", - "@eslint-react/immutability": "error", - "@eslint-react/refs": "error", - "@eslint-react/web-api-no-leaked-fetch": "error", - "@eslint-react/jsx-no-leaked-dollar": "error", - }, - }, - - // Package.json linting + // Package.json linting. packageJson.configs.recommended, { // The root package.json is a VS Code extension (not an npm package), @@ -279,7 +92,7 @@ export default defineConfig( }, }, - // Markdown linting with GitHub-flavored admonitions allowed + // Markdown linting with GitHub-flavored admonitions allowed. ...markdown.configs.recommended, { files: ["**/*.md"], @@ -293,9 +106,6 @@ export default defineConfig( }, }, - // Storybook recommended rules for story files - ...storybook.configs["flat/recommended"], - - // Prettier must be last to override other formatting rules - prettierConfig, + // Turn off every rule Oxlint already covers. Must stay last so its disables win. + ...oxlint.buildFromOxlintConfigFile("./.oxlintrc.jsonc"), ); diff --git a/package.json b/package.json index 9d8a748974..4ea2eccace 100644 --- a/package.json +++ b/package.json @@ -18,14 +18,16 @@ "type": "commonjs", "main": "./dist/extension.js", "scripts": { - "build": "concurrently -g -n webviews,extension,compile-tests:integration \"pnpm build:webviews\" \"node esbuild.mjs\" \"pnpm compile-tests:integration\"", + "build": "concurrently -g -n webviews,extension \"pnpm build:webviews\" \"node esbuild.mjs\"", "build:production": "cross-env NODE_ENV=production pnpm build", + "build:test": "tsc -p test/integration --outDir out --noCheck", "build:webviews": "pnpm -r --filter \"./packages/*\" --parallel build", - "compile-tests:integration": "tsc -p test/integration --outDir out --noCheck", - "format": "prettier --write --cache --cache-strategy content .", - "format:check": "prettier --check --cache --cache-strategy content .", - "lint": "eslint --cache --cache-strategy content .", - "lint:fix": "pnpm lint --fix", + "format": "node scripts/run-oxc.mjs oxfmt --write .", + "format:check": "node scripts/run-oxc.mjs oxfmt --check .", + "lint": "concurrently -g -n oxlint,eslint \"pnpm lint:oxlint\" \"pnpm lint:eslint\"", + "lint:eslint": "node scripts/timed.mjs eslint --cache --cache-strategy content .", + "lint:fix": "pnpm lint:oxlint --fix && pnpm lint:eslint --fix", + "lint:oxlint": "node scripts/run-oxc.mjs oxlint --type-aware .", "package": "pnpm build:production && vsce package --no-dependencies", "package:prerelease": "pnpm build:production && vsce package --pre-release --no-dependencies", "storybook": "storybook dev -p 6006 --config-dir .storybook", @@ -34,7 +36,7 @@ "sync:vscode-themes": "node .storybook/themes/sync.mjs", "test": "cross-env CI=true ELECTRON_RUN_AS_NODE=1 electron node_modules/vitest/vitest.mjs", "test:extension": "cross-env ELECTRON_RUN_AS_NODE=1 electron node_modules/vitest/vitest.mjs --project extension", - "test:integration": "pnpm compile-tests:integration && node esbuild.mjs && vscode-test", + "test:integration": "pnpm build:test && node esbuild.mjs && vscode-test", "test:webview": "cross-env ELECTRON_RUN_AS_NODE=1 electron node_modules/vitest/vitest.mjs --project webview", "typecheck": "concurrently -g -n extension,tests,packages,storybook \"tsc --noEmit\" \"tsc --noEmit -p test\" \"pnpm typecheck:packages\" \"tsc --noEmit -p .storybook\"", "typecheck:packages": "pnpm -r --filter \"./packages/*\" --parallel typecheck", @@ -837,6 +839,7 @@ "@types/ws": "^8.18.1", "@typescript-eslint/eslint-plugin": "^8.70.0", "@typescript-eslint/parser": "^8.70.0", + "@typescript/native": "npm:typescript@^7.0.2", "@vitejs/plugin-react": "catalog:", "@vitest/coverage-v8": "^5.0.1", "@vscode/codicons": "catalog:", @@ -855,6 +858,7 @@ "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.5", "eslint-plugin-import-x": "^4.17.1", + "eslint-plugin-oxlint": "^1.83.0", "eslint-plugin-package-json": "^1.8.1", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-storybook": "^10.6.0", @@ -862,6 +866,10 @@ "jsdom": "^30.0.1", "jsonc-eslint-parser": "^3.3.0", "memfs": "^4.78.0", + "oxfmt": "0.68.0", + "oxlint": "1.83.0", + "oxlint-plugin-eslint": "^1.83.0", + "oxlint-tsgolint": "^7.0.2001", "playwright-core": "^1.63.0", "prettier": "^3.9.7", "react": "catalog:", diff --git a/packages/tasks/src/App.tsx b/packages/tasks/src/App.tsx index f4a2dea6f8..d407f40b60 100644 --- a/packages/tasks/src/App.tsx +++ b/packages/tasks/src/App.tsx @@ -24,7 +24,7 @@ export default function App() { return ( <> - {refreshing &&
} + {refreshing ?
: null} ); diff --git a/packages/tasks/src/components/ActionMenu.tsx b/packages/tasks/src/components/ActionMenu.tsx index 4d35b6837b..849b061469 100644 --- a/packages/tasks/src/components/ActionMenu.tsx +++ b/packages/tasks/src/components/ActionMenu.tsx @@ -16,7 +16,8 @@ interface ActionMenuAction { } export type ActionMenuItem = - { separator: true } | ({ separator?: false } & ActionMenuAction); + | { separator: true } + | ({ separator?: false } & ActionMenuAction); interface ActionMenuProps { items: ActionMenuItem[]; diff --git a/packages/tasks/src/components/CreateTaskSection.tsx b/packages/tasks/src/components/CreateTaskSection.tsx index ab0f7113b0..727428528c 100644 --- a/packages/tasks/src/components/CreateTaskSection.tsx +++ b/packages/tasks/src/components/CreateTaskSection.tsx @@ -56,7 +56,7 @@ export function CreateTaskSection({ templates }: CreateTaskSectionProps) { actionLabel="Create task" actionEnabled={canSubmit === true} /> - {error &&
{error.message}
} + {error ?
{error.message}
: null}
Template: diff --git a/packages/tasks/src/components/StatePanel.tsx b/packages/tasks/src/components/StatePanel.tsx index 599e453189..13a525c056 100644 --- a/packages/tasks/src/components/StatePanel.tsx +++ b/packages/tasks/src/components/StatePanel.tsx @@ -18,10 +18,10 @@ export function StatePanel({ return (
{icon} - {title &&

{title}

} - {description && ( + {title ?

{title}

: null} + {description ? (

{description}

- )} + ) : null} {action}
); diff --git a/packages/tasks/src/utils/taskLoadingState.ts b/packages/tasks/src/utils/taskLoadingState.ts index 13707bc3d3..da35fb8d6e 100644 --- a/packages/tasks/src/utils/taskLoadingState.ts +++ b/packages/tasks/src/utils/taskLoadingState.ts @@ -1,5 +1,9 @@ export type TaskLoadingState = - "pausing" | "resuming" | "deleting" | "downloading" | null; + | "pausing" + | "resuming" + | "deleting" + | "downloading" + | null; const ACTION_LABELS: Record, string> = { pausing: "Pausing...", diff --git a/packages/ui/src/components/Checkbox/Checkbox.tsx b/packages/ui/src/components/Checkbox/Checkbox.tsx index a4adfc5c21..62ba8163cd 100644 --- a/packages/ui/src/components/Checkbox/Checkbox.tsx +++ b/packages/ui/src/components/Checkbox/Checkbox.tsx @@ -35,7 +35,7 @@ export function Checkbox({ className="ui-checkbox__input" /> {children} diff --git a/packages/ui/src/components/StatusPill/StatusPill.tsx b/packages/ui/src/components/StatusPill/StatusPill.tsx index a5f43b66d8..d5179bfd40 100644 --- a/packages/ui/src/components/StatusPill/StatusPill.tsx +++ b/packages/ui/src/components/StatusPill/StatusPill.tsx @@ -10,7 +10,11 @@ import "./StatusPill.css"; import type { CodiconName } from "#codicons"; export type StatusPillTone = - "neutral" | "info" | "success" | "warning" | "danger"; + | "neutral" + | "info" + | "success" + | "warning" + | "danger"; export interface StatusPillProps extends ComponentProps<"span"> { icon?: CodiconName; diff --git a/packages/ui/src/components/Tree/treeTransition.ts b/packages/ui/src/components/Tree/treeTransition.ts index 42be5cb2ff..620030a0cf 100644 --- a/packages/ui/src/components/Tree/treeTransition.ts +++ b/packages/ui/src/components/Tree/treeTransition.ts @@ -352,7 +352,7 @@ function typeaheadMatch( current: TreeRowModel, ): TreeRowModel | undefined { const repeated = - query.length > 1 && [...query].every((key) => key === query[0]); + query.length > 1 && query.split("").every((key) => key === query[0]); const value = (repeated ? query[0] : query)?.toLocaleLowerCase() ?? ""; const from = query.length === 1 || repeated diff --git a/packages/ui/src/keybinding.ts b/packages/ui/src/keybinding.ts index 5ec4688f08..6f910c17a8 100644 --- a/packages/ui/src/keybinding.ts +++ b/packages/ui/src/keybinding.ts @@ -5,7 +5,8 @@ export type KeybindingPlatform = "mac" | "win" | "linux"; * fields as a `contributes.keybindings` entry. */ export type Keybinding = - string | ({ key: string } & Partial>); + | string + | ({ key: string } & Partial>); const MODIFIER_ORDER = ["ctrl", "shift", "alt", "meta"] as const; diff --git a/packages/ui/src/useVscodeTheme.ts b/packages/ui/src/useVscodeTheme.ts index 342d71990b..f7da620065 100644 --- a/packages/ui/src/useVscodeTheme.ts +++ b/packages/ui/src/useVscodeTheme.ts @@ -2,7 +2,10 @@ import { useSyncExternalStore } from "react"; /** Theme kinds VS Code reports via the `data-vscode-theme-kind` body attribute. */ export type VscodeThemeKind = - "light" | "dark" | "high-contrast" | "high-contrast-light"; + | "light" + | "dark" + | "high-contrast" + | "high-contrast-light"; const THEME_KIND_ATTRIBUTE = "data-vscode-theme-kind"; const THEME_ID_ATTRIBUTE = "data-vscode-theme-id"; diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index d8416421b9..cb209d45cd 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -1,7 +1,9 @@ { "extends": "../tsconfig.packages.json", "compilerOptions": { - "resolveJsonModule": true + "resolveJsonModule": true, + // Prevent relative imports escaping this package. + "rootDir": "." }, "include": ["src", "storybook", "storybook.preview.ts"] } diff --git a/packages/webview-shared/src/logger.ts b/packages/webview-shared/src/logger.ts index 3d2ed4a6dd..11f5ff2597 100644 --- a/packages/webview-shared/src/logger.ts +++ b/packages/webview-shared/src/logger.ts @@ -13,12 +13,12 @@ export interface Logger { * In webviews, this appears in the DevTools console. */ const consoleLogger: Logger = { - /* eslint-disable no-console */ + /* oxlint-disable no-console */ debug: (...args) => console.debug("[webview]", ...args), info: (...args) => console.info("[webview]", ...args), warn: (...args) => console.warn("[webview]", ...args), error: (...args) => console.error("[webview]", ...args), - /* eslint-enable no-console */ + /* oxlint-enable no-console */ }; let currentLogger: Logger = consoleLogger; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3103dbe47f..474678f4d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -223,8 +223,8 @@ catalogs: specifier: ^10.6.0 version: 10.6.0 typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: npm:@typescript/typescript6@^6.0.2 + version: 6.0.2 vite: specifier: ^8.3.0 version: 8.3.0 @@ -302,7 +302,7 @@ importers: version: 0.3.0(playwright-core@1.63.0)(storybook@10.6.0) '@eslint-react/eslint-plugin': specifier: ^5.19.1 - version: 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + version: 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@eslint/js': specifier: ^10.0.1 version: 10.0.1(eslint@10.10.0) @@ -323,7 +323,7 @@ importers: version: 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(storybook@10.6.0) '@storybook/react-vite': specifier: 'catalog:' - version: 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1)(typescript@6.0.3)(vite@8.3.0) + version: 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1)(vite@8.3.0) '@tanstack/react-query': specifier: 'catalog:' version: 5.103.0(react@19.3.0) @@ -371,10 +371,13 @@ importers: version: 8.18.1 '@typescript-eslint/eslint-plugin': specifier: ^8.70.0 - version: 8.70.0(@typescript-eslint/parser@8.70.0)(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + version: 8.70.0(@typescript-eslint/parser@8.70.0)(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/parser': specifier: ^8.70.0 - version: 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@typescript/native': + specifier: npm:typescript@^7.0.2 + version: typescript@7.0.2 '@vitejs/plugin-react': specifier: 'catalog:' version: 6.1.1(@rolldown/plugin-babel@0.2.4)(babel-plugin-react-compiler@1.0.0)(vite@8.3.0) @@ -429,6 +432,9 @@ importers: eslint-plugin-import-x: specifier: ^4.17.1 version: 4.17.1(@typescript-eslint/utils@8.70.0)(eslint@10.10.0)(supports-color@8.1.1) + eslint-plugin-oxlint: + specifier: ^1.83.0 + version: 1.83.0(oxlint@1.83.0) eslint-plugin-package-json: specifier: ^1.8.1 version: 1.8.1(eslint@10.10.0) @@ -437,7 +443,7 @@ importers: version: 7.1.1(eslint@10.10.0)(supports-color@8.1.1) eslint-plugin-storybook: specifier: ^10.6.0 - version: 10.6.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + version: 10.6.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) globals: specifier: ^17.12.0 version: 17.12.0 @@ -450,6 +456,18 @@ importers: memfs: specifier: ^4.78.0 version: 4.78.0 + oxfmt: + specifier: 0.68.0 + version: 0.68.0 + oxlint: + specifier: 1.83.0 + version: 1.83.0(oxlint-tsgolint@7.0.2001) + oxlint-plugin-eslint: + specifier: ^1.83.0 + version: 1.83.0 + oxlint-tsgolint: + specifier: ^7.0.2001 + version: 7.0.2001 playwright-core: specifier: ^1.63.0 version: 1.63.0 @@ -470,10 +488,10 @@ importers: version: 10.6.0(storybook@10.6.0) typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' typescript-eslint: specifier: ^8.70.0 - version: 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) utf-8-validate: specifier: ^6.0.6 version: 6.0.6 @@ -492,7 +510,7 @@ importers: devDependencies: typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' packages/netcheck: dependencies: @@ -508,7 +526,7 @@ importers: version: 1.57.5 typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.3.0(@types/node@22.20.3)(esbuild@0.28.2) @@ -517,7 +535,7 @@ importers: devDependencies: typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' packages/speedtest: dependencies: @@ -533,7 +551,7 @@ importers: version: 1.57.5 typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.3.0(@types/node@22.20.3)(esbuild@0.28.2) @@ -549,10 +567,10 @@ importers: devDependencies: '@storybook/react-vite': specifier: 'catalog:' - version: 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.3.0) + version: 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(vite@8.3.0) typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' packages/tasks: dependencies: @@ -604,7 +622,7 @@ importers: version: 1.0.0 typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.3.0(@types/node@22.20.3)(esbuild@0.28.2) @@ -632,7 +650,7 @@ importers: devDependencies: '@storybook/react-vite': specifier: 'catalog:' - version: 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.3.0) + version: 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(vite@8.3.0) '@types/react': specifier: 'catalog:' version: 19.3.0 @@ -650,7 +668,7 @@ importers: version: 10.6.0(@types/react@19.3.0)(bufferutil@4.1.0)(prettier@3.9.7)(react@19.3.0)(utf-8-validate@6.0.6) typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' packages/webview-shared: dependencies: @@ -675,7 +693,7 @@ importers: version: 19.3.0 typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' packages/workspaces: dependencies: @@ -727,7 +745,7 @@ importers: version: 1.0.0 typescript: specifier: 'catalog:' - version: 6.0.3 + version: '@typescript/typescript6@6.0.2' vite: specifier: 'catalog:' version: 8.3.0(@types/node@22.20.3)(esbuild@0.28.2) @@ -1773,6 +1791,280 @@ packages: cpu: [x64] os: [win32] + '@oxfmt/binding-android-arm-eabi@0.68.0': + resolution: {integrity: sha512-dhfYPbzv/h9JgHjNkl2R6sOjUfxDyLGOZVb3g8/ScaTNwwJcYgmHh8kcYFDUhinuy1QAoANCWUvw1jlk+z6gAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.68.0': + resolution: {integrity: sha512-v3Njdi6qY0O/5eGfg01ww2w6gTn2mUvZ72Bnx1/UN53A9wruh3Nk6otc3WkgJLkXD4Qgz1SOcVQieH1oD03V9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.68.0': + resolution: {integrity: sha512-ei4MCMzHFREmZwPJ7KuWUB4kBuHdsgDrnXGJVcEAopU7fj7S42I8BChdFILWdHvhFqR08FLJtOfbZIr2CDw0cA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.68.0': + resolution: {integrity: sha512-UrKgzZxYhwB9DSvTX+vdgl9M32wLUNKJcAKIoiyx/Kzn/zveqi7W6kYVcRroFMhS3Kwz0KhTk3WBeSuQn4YCTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.68.0': + resolution: {integrity: sha512-6jrEKgpJbilM1QaRv7hEtKXr4p4AK4jvvyOtajwyhu0kOz3e0O7OLnSTk6tBotRqCcUC4ehZRJ1Zx+Y99wieLw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.68.0': + resolution: {integrity: sha512-YOIVnKOBaLeGullskS179N12hjSAdFYnzLjOaKiLhAKNWgnShq9w4xRdtmUm6BlnP65l2/EA9Aw/KlftNxDM7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.68.0': + resolution: {integrity: sha512-xW5XoEHVNqydPBv2KXvk9lmEzyAlOQHVEazKoXUuAacqekjya+OdiaFjjEBl0oJD02raG8g3TRl9OVCh9PDIHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.68.0': + resolution: {integrity: sha512-QCvYwVVQieu6oyJglAgV9vH/YMDxZyR4cwVSYtoq9oOXd5N+D3TDUBjNwxFrLn5AdcJZOcvn/7IB17vJGp+2Og==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.68.0': + resolution: {integrity: sha512-4TVz5iFQ8ndrHnhX50UXiz9BIWAtUSOHJ6Nus4qWFfJBXq/Ed/krXbF/ehJu42BXM5tIvBs99jNIM22s9agY5A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.68.0': + resolution: {integrity: sha512-qLe3ao0RP84bnPxBvRI+GnlK/jybo538NWu0Xrm+zYeTmJtpzqLhnnd5BH21NafqKnplbGZjtN1cnrOlWF73lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.68.0': + resolution: {integrity: sha512-Yvyl7a6gbb0vM6r925KW2dO+/CmXySO5TVbcX7o/uZJ+d108HFOG0TxIyHApmn5USuj5mhDPxzhiVwOlGP7uSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.68.0': + resolution: {integrity: sha512-mJlFuFVCxzrYM5sFStN433D/s/mb6Wq4aCQAM02vs/OudHywnaSAd2rb1vlYUJtqdYIciJtiasuxvfbYkv5fLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.68.0': + resolution: {integrity: sha512-RlfSg++qs1hbKltRR6lYvV9EoI3MdlfSQD9w1hdHVYjHqjIn1tkH4FWOpMSmjKGN20zr+nI+W9o4ARogCDudGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.68.0': + resolution: {integrity: sha512-nyzRB9U+dlYUKu3pMo3afHzZBUv/oTHZMG36ZfJViNVfOIzp70Q4GS8FFRGgYJ/p0zcyDCgpBvYISOdJOMh+jQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.68.0': + resolution: {integrity: sha512-iCx3sbZRIvGrL1RafphEiUKBaW1lc0/tAjKOIB/Wjw2+STRBEdu5+fH1Gc1faEWEmc2k5Ks4iUUV54Zd5C9a1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.68.0': + resolution: {integrity: sha512-x2X5AZez7OgyLLFpwIgItoXBUqudDM7yiaTsxv8R8vKQ6e81l0jVw0NFeUCXzcl1sAJq8h+tC8N4mY8EiMeL4w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.68.0': + resolution: {integrity: sha512-AHVPjXkenLPQUh6kB8zSC8pX2ct9r4T1Edk9r/RNJyov6wPsS5uAfYtipwG4chn6+3bPFG5rI/3DxEeH8vib1w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.68.0': + resolution: {integrity: sha512-n09SjEk5VH7z8Hl4WVP7hho+cCwGViENkQFiM45vbW85dJd7kEhWaHRUobaPzEmrWyu6uumd4EuNfNyDKLtzDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.68.0': + resolution: {integrity: sha512-gPe+dJLXaPuWPWqlpklDAJp0k+K9KhQPYiQLHfb+i2rmFuUGfJ/5Qlj6tr1mO6of5g0DiLjG/XCFHIaPhotqqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@7.0.2001': + resolution: {integrity: sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@7.0.2001': + resolution: {integrity: sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@7.0.2001': + resolution: {integrity: sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@7.0.2001': + resolution: {integrity: sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@7.0.2001': + resolution: {integrity: sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@7.0.2001': + resolution: {integrity: sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.83.0': + resolution: {integrity: sha512-0yGY24EwsLk5YDe6F+VkmZyRHSwJDALa3nIrPpq7FXmp2lV2d0TzvBCGeZk+wgiULRGr5blhyr4QMp5KCXJUqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.83.0': + resolution: {integrity: sha512-hHfJ0vc17A4iUjH5p9BsTUPYbYRNxGpvD2lbu1aBRk54bzNIx9o5TtYF39QPZcV95DagZd+4DEAw2RH3G2ZsMg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.83.0': + resolution: {integrity: sha512-hsOjYjszLb/3zym/TkzUMPAoQlTJcuzSyEPOAyA+skXJIX9M0o+4JfOtqopX/Vf4hSLrJ98j0nvFo23gzk8auQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.83.0': + resolution: {integrity: sha512-mjh5oH2EA+wl5yRJYT9K9G61O2zFlpuv+yf2JwZOi0+dq2FnTUtm1h8i+5Ik0fXPWIu/k84I1psZR9aQsLAnyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.83.0': + resolution: {integrity: sha512-fNHr64/YaO8YssuoDVC8+F4Uk5enR86q5uxfHkQrjAPs1dbAILOrD2uaud+J7MO8Fx774g44ERLD0IGIvZE48w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.83.0': + resolution: {integrity: sha512-Qpwy3zzAwMj+8/lyYItHmkSMwbkprFNWTK7jPYDOxSyxEhaSLOWYUTCMkjF334J8/WD0nznCCsoBbIH6hpsuIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.83.0': + resolution: {integrity: sha512-s+BirYLFq7JL2k9sP0XI3ZXJ9dYvJ8sX3jLCLoag7tt+zrSHpZxP0jqznfL+Gdgwu7ay0dYgGYJXrQvq3iWloA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.83.0': + resolution: {integrity: sha512-7lihXt3vKr+GIyapNbHrnFHm/biiW30le6Zv/DExbAFPF6YwCQXVFlONPFehxs0CpGO4CBfYPM9rdDT+XMoIlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.83.0': + resolution: {integrity: sha512-q63JalLYVkZiZvls1z3PPUnpmQluOMXp0khqQMznCeAPLGydfNY8JhvuA4WlK57JfrvikU8wB5lPVveqpIXvew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.83.0': + resolution: {integrity: sha512-krQmDF+dRbxvdqVPV88ZuOoPPu8X5BuqDA8Hd+qcS4YMRQCb+nexA57DazgGsc/rGdKBe3QmV0mnv0bdpW/p5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.83.0': + resolution: {integrity: sha512-MmOl8Y6txEAXZU1RG8Rr264jQ6D7VPmqFsU/45x/FeWsGe32hklTqGrLE6UxHzp5Rjt0wP+20tY8YXKgSFB3mw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.83.0': + resolution: {integrity: sha512-u1rMymh0W3JZkq370kzQsYPULGWqhE09pZRqnZvUSoYaI9pVO5yVX+iYIslmWuEgwuzH9YAaOsScJiobWCHoOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.83.0': + resolution: {integrity: sha512-y0zK3HNwGysu7rqtE+BQG/d0bx5gh/KwlOtghN8oWeK1KcWzeaLqtZrbm8owqdma1lFyrce/hTO5ismuNu+INQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.83.0': + resolution: {integrity: sha512-rS5gM0NgD7ngmuJmbIehsidtrOwKkLFwCQbKEeb9KuyQrrWNq5Zkn0uV6AYdXOMJ0grrWEiLwBuvMxt8w5vsNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.83.0': + resolution: {integrity: sha512-W2IH4EtpcPaWcvNGCA95YoDg4vxqE/ZiPCi3arrxEEpsK7+JQN9WYwrlYFx9pcdP6KPXqRqkv3zdQPHcx7b6YQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.83.0': + resolution: {integrity: sha512-6LyKkUyoajssTPLlZmDbZIbu4IZ5B4bGuRUnBgCGpEvHP3FQMaYITncHA/unPUo7q+Z+pIu2HhdkQ+8d1SG7iA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.83.0': + resolution: {integrity: sha512-Uz/fObEtF0jmNJQJ8CGRBKfefYstS0/wjD3s6IGzP8nUwsJykHQJBiN3npHwKiGRGn/vvBEgNr4B3cCzmmatvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.83.0': + resolution: {integrity: sha512-u7XcvPW6Bk58tY5iWs2ESb0vJjoE/kuSpHxopbwp/p3ZtWVQXZ6wor5w3ssVTHOqd/v8b+QdhSFWQ4grEUNWpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.83.0': + resolution: {integrity: sha512-LZRubd7ph13QmAg4fFecTYVZkiYbROR2Htaxh/ufWRkDhPOm2wrwaEYR89e0YpPFD3dqBrPoxS7myBw5hmYA7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@peculiar/asn1-asym-key@2.9.4': resolution: {integrity: sha512-s7SJfjcXlR3MYMngDTeMLCy3VjGaIxeEy905CQ0j09pDbeYhNBvBGA7r7cAvCZYkVFo9kVg9RAki0K2iUz7SGQ==} engines: {node: '>=14'} @@ -2594,6 +2886,130 @@ packages: resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@typescript/typescript6@6.0.2': + resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} + hasBin: true + '@typespec/ts-http-runtime@0.3.9': resolution: {integrity: sha512-edSdeAqkdxBVzA1yL1LrLCml1YjyCVvPMtMqJpbF+6K609tHe8V6sQUzFQSGcYNhcuhOceZtjvN32+mpIth30A==} engines: {node: '>=22.0.0'} @@ -3415,6 +3831,11 @@ packages: eslint-import-resolver-node: optional: true + eslint-plugin-oxlint@1.83.0: + resolution: {integrity: sha512-DbR3PG6Yk9Yd71eBIylT5PH47mD+FVnsqUXLq/9+FVbNFjy+vm4Z5hquZIzlmNw55Qz6xSePnzoHIERqhzXO/g==} + peerDependencies: + oxlint: ~1.83.0 + eslint-plugin-package-json@1.8.1: resolution: {integrity: sha512-/Adb7EHfwIM2t13zdBuB6IjIsNSDkbPT+T9ZlIK0N6aAnj9hiekqFlFbUpEIsiQX4Zv7bASBDP2C3hu362e2kw==} engines: {node: ^22.22.2 || >=24.15.0} @@ -4378,6 +4799,40 @@ packages: oxc-resolver@11.21.2: resolution: {integrity: sha512-w5tLwYN3Zo24w5EeWJjJWZOwhYqTtC8PS2B1tIt7BZUuqTIcU07sQValbDw+rq7+AuAGzOHklgK+ifsy4lpXfw==} + oxfmt@0.68.0: + resolution: {integrity: sha512-Z0XMofcXCGUXbcpBHnWyUiX93BGiw1B+lcHNbQDWEtOhX06ewoFfu4zXkyiLhRrNnMq0twqXRHUcJetf+GsiQQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint-plugin-eslint@1.83.0: + resolution: {integrity: sha512-9v2O7rkCkT2MzaAoviunkZ+O/BjhjhHXZKg8P0iAPfLYfziQwTHTJWqlY/uGOPAzjdC+VffHcRliMgJkxIttgg==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxlint-tsgolint@7.0.2001: + resolution: {integrity: sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==} + hasBin: true + + oxlint@1.83.0: + resolution: {integrity: sha512-cyDzSzaw3uzP0TeCeq3lLRPPoaUxkbB4ZOXj+kn+5r+BX9V+4bNVGk9lxer+WrgcpebH4JxLlJ3KQjveVztOLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=7.0.2001' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4896,6 +5351,10 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinypool@2.1.2: + resolution: {integrity: sha512-9YodfrxS9g9IbFr/KOjE5bAeJ0p61n3bW6mqvy0jtoeKd1kTW1Cxm0oulm6KX2lyM9Gl6WIe8nEbY7LWv5ZJww==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -4983,6 +5442,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + ua-parser-js@1.0.41: resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} hasBin: true @@ -5772,89 +6236,89 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@eslint-react/ast@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) string-ts: 2.3.1 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/core@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@eslint-react/core@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/var': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/var': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/scope-manager': 8.70.0 '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) ts-pattern: 5.9.0 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/eslint-plugin@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@eslint-react/eslint-plugin@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - eslint-plugin-react-dom: 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - eslint-plugin-react-jsx: 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - eslint-plugin-react-naming-convention: 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - eslint-plugin-react-rsc: 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - eslint-plugin-react-web-api: 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - eslint-plugin-react-x: 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - typescript: 6.0.3 + eslint-plugin-react-dom: 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + eslint-plugin-react-jsx: 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + eslint-plugin-react-naming-convention: 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + eslint-plugin-react-rsc: 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + eslint-plugin-react-web-api: 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + eslint-plugin-react-x: 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/eslint@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@eslint-react/eslint@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/jsx@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@eslint-react/jsx@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/var': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/var': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) ts-pattern: 5.9.0 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/shared@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@eslint-react/shared@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) ts-pattern: 5.9.0 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' zod: 4.6.5 transitivePeerDependencies: - supports-color - '@eslint-react/var@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@eslint-react/var@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/scope-manager': 8.70.0 '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) ts-pattern: 5.9.0 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -5947,13 +6411,13 @@ snapshots: '@istanbuljs/schema@0.1.6': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.3.0)': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(@typescript/typescript6@6.0.2)(vite@8.3.0)': dependencies: glob: 13.0.6 - react-docgen-typescript: 2.4.0(typescript@6.0.3) + react-docgen-typescript: 2.4.0(@typescript/typescript6@6.0.2) vite: 8.3.0(@types/node@22.20.3)(esbuild@0.28.2) optionalDependencies: - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -6337,6 +6801,138 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.21.2': optional: true + '@oxfmt/binding-android-arm-eabi@0.68.0': + optional: true + + '@oxfmt/binding-android-arm64@0.68.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.68.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.68.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.68.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.68.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.68.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.68.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.68.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.68.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.68.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.68.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.68.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.68.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.68.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.68.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.68.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.68.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.68.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@7.0.2001': + optional: true + + '@oxlint-tsgolint/darwin-x64@7.0.2001': + optional: true + + '@oxlint-tsgolint/linux-arm64@7.0.2001': + optional: true + + '@oxlint-tsgolint/linux-x64@7.0.2001': + optional: true + + '@oxlint-tsgolint/win32-arm64@7.0.2001': + optional: true + + '@oxlint-tsgolint/win32-x64@7.0.2001': + optional: true + + '@oxlint/binding-android-arm-eabi@1.83.0': + optional: true + + '@oxlint/binding-android-arm64@1.83.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.83.0': + optional: true + + '@oxlint/binding-darwin-x64@1.83.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.83.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.83.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.83.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.83.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.83.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.83.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.83.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.83.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.83.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.83.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.83.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.83.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.83.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.83.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.83.0': + optional: true + '@peculiar/asn1-asym-key@2.9.4': dependencies: '@peculiar/asn1-pkcs8': 2.9.4 @@ -6900,12 +7496,12 @@ snapshots: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - '@storybook/react-vite@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.3.0)': + '@storybook/react-vite@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(vite@8.3.0)': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.3.0) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(@typescript/typescript6@6.0.2)(vite@8.3.0) '@rollup/pluginutils': 5.4.0 '@storybook/builder-vite': 10.6.0(storybook@10.6.0)(vite@8.3.0) - '@storybook/react': 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(typescript@6.0.3) + '@storybook/react': 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2) empathic: 2.0.1 magic-string: 1.4.1 react: 19.3.0 @@ -6916,19 +7512,19 @@ snapshots: tsconfig-paths: 4.2.0 vite: 8.3.0(@types/node@22.20.3)(esbuild@0.28.2) optionalDependencies: - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - '@types/react' - '@types/react-dom' - rollup - supports-color - '@storybook/react-vite@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1)(typescript@6.0.3)(vite@8.3.0)': + '@storybook/react-vite@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1)(vite@8.3.0)': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.3.0) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(@typescript/typescript6@6.0.2)(vite@8.3.0) '@rollup/pluginutils': 5.4.0 '@storybook/builder-vite': 10.6.0(storybook@10.6.0)(vite@8.3.0) - '@storybook/react': 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1)(typescript@6.0.3) + '@storybook/react': 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1) empathic: 2.0.1 magic-string: 1.4.1 react: 19.3.0 @@ -6939,42 +7535,42 @@ snapshots: tsconfig-paths: 4.2.0 vite: 8.3.0(@types/node@22.20.3)(esbuild@0.28.2) optionalDependencies: - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - '@types/react' - '@types/react-dom' - rollup - supports-color - '@storybook/react@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)(typescript@6.0.3)': + '@storybook/react@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@10.2.2)': dependencies: '@storybook/global': 5.0.0 '@storybook/react-dom-shim': 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0) react: 19.3.0 react-docgen: 8.0.3(supports-color@10.2.2) - react-docgen-typescript: 2.4.0(typescript@6.0.3) + react-docgen-typescript: 2.4.0(@typescript/typescript6@6.0.2) react-dom: 19.3.0(react@19.3.0) storybook: 10.6.0(@types/react@19.3.0)(bufferutil@4.1.0)(prettier@3.9.7)(react@19.3.0)(utf-8-validate@6.0.6) optionalDependencies: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@storybook/react@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@storybook/react@10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(@typescript/typescript6@6.0.2)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0)(supports-color@8.1.1)': dependencies: '@storybook/global': 5.0.0 '@storybook/react-dom-shim': 10.6.0(@types/react-dom@19.3.0)(@types/react@19.3.0)(react-dom@19.3.0)(react@19.3.0)(storybook@10.6.0) react: 19.3.0 react-docgen: 8.0.3(supports-color@8.1.1) - react-docgen-typescript: 2.4.0(typescript@6.0.3) + react-docgen-typescript: 2.4.0(@typescript/typescript6@6.0.2) react-dom: 19.3.0(react@19.3.0) storybook: 10.6.0(@types/react@19.3.0)(bufferutil@4.1.0)(prettier@3.9.7)(react@19.3.0)(utf-8-validate@6.0.6) optionalDependencies: '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -7138,40 +7734,40 @@ snapshots: dependencies: '@types/node': 22.20.3 - '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0)(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0)(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/type-utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/visitor-keys': 8.70.0 eslint: 10.10.0(supports-color@8.1.1) ignore: 7.0.9 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: '@typescript-eslint/scope-manager': 8.70.0 '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.70.0(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/project-service@8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2) '@typescript-eslint/types': 8.70.0 debug: 4.4.3(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -7180,47 +7776,47 @@ snapshots: '@typescript-eslint/types': 8.70.0 '@typescript-eslint/visitor-keys': 8.70.0 - '@typescript-eslint/tsconfig-utils@8.70.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.70.0(@typescript/typescript6@6.0.2)': dependencies: - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' - '@typescript-eslint/type-utils@8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) debug: 4.4.3(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.70.0': {} - '@typescript-eslint/typescript-estree@8.70.0(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)': dependencies: - '@typescript-eslint/project-service': 8.70.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@6.0.3) + '@typescript-eslint/project-service': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2) '@typescript-eslint/types': 8.70.0 '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3)': + '@typescript-eslint/utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1)': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0) '@typescript-eslint/scope-manager': 8.70.0 '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -7229,6 +7825,70 @@ snapshots: '@typescript-eslint/types': 8.70.0 eslint-visitor-keys: 5.0.1 + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@typescript/typescript6@6.0.2': + dependencies: + '@typescript/old': typescript@6.0.3 + '@typespec/ts-http-runtime@0.3.9(supports-color@8.1.1)': dependencies: http-proxy-agent: 7.0.2(supports-color@8.1.1) @@ -8008,10 +8668,15 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.12.2 optionalDependencies: - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color + eslint-plugin-oxlint@1.83.0(oxlint@1.83.0): + dependencies: + jsonc-parser: 3.3.1 + oxlint: 1.83.0(oxlint-tsgolint@7.0.2001) + eslint-plugin-package-json@1.8.1(eslint@10.10.0): dependencies: '@altano/repository-tools': 2.1.1 @@ -8028,17 +8693,17 @@ snapshots: sort-object-keys: 2.1.0 sort-package-json: 4.0.0 - eslint-plugin-react-dom@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + eslint-plugin-react-dom@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/jsx': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/jsx': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) compare-versions: 6.1.1 eslint: 10.10.0(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -8053,91 +8718,91 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-jsx@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + eslint-plugin-react-jsx@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/core': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/jsx': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/core': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/jsx': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + eslint-plugin-react-naming-convention@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/core': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/var': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/core': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/var': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) ts-pattern: 5.9.0 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-rsc@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + eslint-plugin-react-rsc@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/core': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/var': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/core': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/var': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + eslint-plugin-react-web-api@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/core': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/var': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/core': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/var': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) birecord: 0.1.2 eslint: 10.10.0(supports-color@8.1.1) ts-pattern: 5.9.0 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-x@5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + eslint-plugin-react-x@5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: - '@eslint-react/ast': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/core': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/eslint': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/jsx': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/shared': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@eslint-react/var': 5.19.1(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@eslint-react/ast': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/core': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/eslint': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/jsx': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/shared': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@eslint-react/var': 5.19.1(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/scope-manager': 8.70.0 - '@typescript-eslint/type-utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) compare-versions: 6.1.1 eslint: 10.10.0(supports-color@8.1.1) string-ts: 2.3.1 - ts-api-utils: 2.5.0(typescript@6.0.3) + ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) ts-pattern: 5.9.0 - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-storybook@10.6.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + eslint-plugin-storybook@10.6.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: '@typescript-eslint/types': 8.70.0 - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -9282,6 +9947,64 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.21.2 '@oxc-resolver/binding-win32-x64-msvc': 11.21.2 + oxfmt@0.68.0: + dependencies: + tinypool: 2.1.2 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.68.0 + '@oxfmt/binding-android-arm64': 0.68.0 + '@oxfmt/binding-darwin-arm64': 0.68.0 + '@oxfmt/binding-darwin-x64': 0.68.0 + '@oxfmt/binding-freebsd-x64': 0.68.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.68.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.68.0 + '@oxfmt/binding-linux-arm64-gnu': 0.68.0 + '@oxfmt/binding-linux-arm64-musl': 0.68.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.68.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.68.0 + '@oxfmt/binding-linux-riscv64-musl': 0.68.0 + '@oxfmt/binding-linux-s390x-gnu': 0.68.0 + '@oxfmt/binding-linux-x64-gnu': 0.68.0 + '@oxfmt/binding-linux-x64-musl': 0.68.0 + '@oxfmt/binding-openharmony-arm64': 0.68.0 + '@oxfmt/binding-win32-arm64-msvc': 0.68.0 + '@oxfmt/binding-win32-ia32-msvc': 0.68.0 + '@oxfmt/binding-win32-x64-msvc': 0.68.0 + + oxlint-plugin-eslint@1.83.0: {} + + 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 + + oxlint@1.83.0(oxlint-tsgolint@7.0.2001): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.83.0 + '@oxlint/binding-android-arm64': 1.83.0 + '@oxlint/binding-darwin-arm64': 1.83.0 + '@oxlint/binding-darwin-x64': 1.83.0 + '@oxlint/binding-freebsd-x64': 1.83.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.83.0 + '@oxlint/binding-linux-arm-musleabihf': 1.83.0 + '@oxlint/binding-linux-arm64-gnu': 1.83.0 + '@oxlint/binding-linux-arm64-musl': 1.83.0 + '@oxlint/binding-linux-ppc64-gnu': 1.83.0 + '@oxlint/binding-linux-riscv64-gnu': 1.83.0 + '@oxlint/binding-linux-riscv64-musl': 1.83.0 + '@oxlint/binding-linux-s390x-gnu': 1.83.0 + '@oxlint/binding-linux-x64-gnu': 1.83.0 + '@oxlint/binding-linux-x64-musl': 1.83.0 + '@oxlint/binding-openharmony-arm64': 1.83.0 + '@oxlint/binding-win32-arm64-msvc': 1.83.0 + '@oxlint/binding-win32-ia32-msvc': 1.83.0 + '@oxlint/binding-win32-x64-msvc': 1.83.0 + oxlint-tsgolint: 7.0.2001 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -9428,9 +10151,9 @@ snapshots: range-parser@1.2.0: {} - react-docgen-typescript@2.4.0(typescript@6.0.3): + react-docgen-typescript@2.4.0(@typescript/typescript6@6.0.2): dependencies: - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' react-docgen@8.0.3(supports-color@10.2.2): dependencies: @@ -9832,6 +10555,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tinypool@2.1.2: {} + tinyrainbow@2.0.0: {} tinyrainbow@3.1.1: {} @@ -9858,9 +10583,9 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.5.0(typescript@6.0.3): + ts-api-utils@2.5.0(@typescript/typescript6@6.0.2): dependencies: - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' ts-dedent@2.3.0: {} @@ -9892,19 +10617,42 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.8 - typescript-eslint@8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3): + typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1): dependencies: - '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0)(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/parser': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.70.0(supports-color@8.1.1)(typescript@6.0.3) - '@typescript-eslint/utils': 8.70.0(eslint@10.10.0)(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0)(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0)(supports-color@8.1.1) eslint: 10.10.0(supports-color@8.1.1) - typescript: 6.0.3 + typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color typescript@6.0.3: {} + 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 + ua-parser-js@1.0.41: {} underscore@1.13.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 811bc8fc9c..f0647df913 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -21,7 +21,9 @@ catalog: react-dom: ^19.3.0 storybook: ^10.6.0 storybook-addon-pseudo-states: ^10.6.0 - typescript: ^6.0.3 + # typescript stays on the 6.0 API for typescript-eslint; TypeScript 7 runs `tsc`. + # https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/ + typescript: npm:@typescript/typescript6@^6.0.2 vite: ^8.3.0 catalogMode: strict diff --git a/scripts/run-oxc.mjs b/scripts/run-oxc.mjs new file mode 100644 index 0000000000..2518b823da --- /dev/null +++ b/scripts/run-oxc.mjs @@ -0,0 +1,25 @@ +import { spawnSync } from "node:child_process"; +import { availableParallelism } from "node:os"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +/* + * Oxlint and Oxfmt default to one thread per core. Above ~32 cores the + * per-thread startup cost outweighs the parallelism it buys (oxc#21672). + * Cap rather than pin so smaller machines and CI keep their optimal count. + */ +const MAX_THREADS = 8; + +const repoRoot = join(dirname(fileURLToPath(import.meta.url)), ".."); +const [tool, ...args] = process.argv.slice(2); + +/* Resolve through the local bin directory so Windows shims work. */ +const binary = join(repoRoot, "node_modules", ".bin", tool); +const threads = String(Math.min(availableParallelism(), MAX_THREADS)); + +const result = spawnSync(binary, [...args, "--threads", threads], { + cwd: process.cwd(), + stdio: "inherit", +}); + +process.exit(result.status ?? 1); diff --git a/scripts/timed.mjs b/scripts/timed.mjs new file mode 100644 index 0000000000..b1f0d8c6be --- /dev/null +++ b/scripts/timed.mjs @@ -0,0 +1,8 @@ +import { spawnSync } from "node:child_process"; + +const [command, ...args] = process.argv.slice(2); +const start = performance.now(); +const result = spawnSync(command, args, { stdio: "inherit" }); +const seconds = ((performance.now() - start) / 1000).toFixed(1); +console.log(`${command} finished in ${seconds}s`); +process.exit(result.status ?? 1); diff --git a/src/api/streamingFetchAdapter.ts b/src/api/streamingFetchAdapter.ts index bd12ae2b33..16a26b5534 100644 --- a/src/api/streamingFetchAdapter.ts +++ b/src/api/streamingFetchAdapter.ts @@ -57,7 +57,8 @@ export function createStreamingFetchAdapter( }); const castRequest = response.request as - { res?: { responseUrl?: string } } | undefined; + | { res?: { responseUrl?: string } } + | undefined; return { body: { diff --git a/src/core/cliManager.ts b/src/core/cliManager.ts index 103448c42e..17a608755c 100644 --- a/src/core/cliManager.ts +++ b/src/core/cliManager.ts @@ -294,7 +294,8 @@ export class CliManager { const progressLogPath = downloadBinPath + ".progress.log"; let lockResult: - { release: () => Promise; waited: boolean } | undefined; + | { release: () => Promise; waited: boolean } + | undefined; let latestVersion = parsedVersion; try { lockResult = await trace.lockWait(() => @@ -745,10 +746,9 @@ export class CliManager { signal: controller.signal, baseURL: baseUrl, responseType: "stream", - headers: { - ...headers, + headers: Object.assign({}, headers, { "Accept-Encoding": "identity", - }, + }), decompress: false, // Ignore all errors so we can catch a 404! validateStatus: () => true, diff --git a/src/inbox.ts b/src/inbox.ts index 33d2fb0151..789ac8ac43 100644 --- a/src/inbox.ts +++ b/src/inbox.ts @@ -19,7 +19,8 @@ const TEMPLATE_WORKSPACE_OUT_OF_DISK = "f047f6a3-5713-40f7-85aa-0394cce9fa3a"; export class Inbox implements vscode.Disposable { private socket: - UnidirectionalStream | undefined; + | UnidirectionalStream + | undefined; private disposed = false; private constructor(private readonly logger: Logger) {} diff --git a/src/instrumentation/activation.ts b/src/instrumentation/activation.ts index 96e298eff6..008543152a 100644 --- a/src/instrumentation/activation.ts +++ b/src/instrumentation/activation.ts @@ -7,7 +7,11 @@ import type { TelemetryService } from "../telemetry/service"; * doesn't distinguish). `unknown`: validation threw before classification. */ export type ActivationAuthState = - "none" | "stored" | "valid_token" | "auth_failed" | "unknown"; + | "none" + | "stored" + | "valid_token" + | "auth_failed" + | "unknown"; /** Helpers scoped to the activation trace's lifetime. */ export interface ActivationTracer { diff --git a/src/instrumentation/auth.ts b/src/instrumentation/auth.ts index 07d4a692d4..44cf72015a 100644 --- a/src/instrumentation/auth.ts +++ b/src/instrumentation/auth.ts @@ -6,13 +6,19 @@ export type AuthTokenRefreshTrigger = "background" | "reactive"; export type AuthRecoveryAction = "refresh_success" | "login_required" | "none"; export type AuthLoginPromptTrigger = "auth_required" | "missing_session"; export type AuthLoginSource = - "auto_login" | "command" | "switch_deployment" | "uri"; + | "auto_login" + | "command" + | "switch_deployment" + | "uri"; export type LoginPromptReason = - "user_dismissed" | "no_url_provided" | "auth_failed"; + | "user_dismissed" + | "no_url_provided" + | "auth_failed"; export type LoginPromptOutcome = - { success: true } | { success: false; reason: LoginPromptReason }; + | { success: true } + | { success: false; reason: LoginPromptReason }; export type AuthLoginOutcome = | { success: true; method: LoginMethod } | { success: false; method?: LoginMethod; reason: LoginPromptReason }; diff --git a/src/instrumentation/cli.ts b/src/instrumentation/cli.ts index a4436bd5a2..2057e2a65c 100644 --- a/src/instrumentation/cli.ts +++ b/src/instrumentation/cli.ts @@ -15,10 +15,15 @@ export type CliResolveOutcome = | "download_disabled_fallback" | "fallback_to_existing_binary"; export type CliVersionCheckOutcome = - "missing" | "match" | "mismatch" | "unreadable"; + | "missing" + | "match" + | "mismatch" + | "unreadable"; export type CliConfigureErrorType = "credential_store" | "unknown"; export type CliResolveErrorType = - "downloads_disabled" | "download" | "fallback_declined"; + | "downloads_disabled" + | "download" + | "fallback_declined"; interface CliConfigureOptions { readonly silent: boolean; diff --git a/src/instrumentation/deployment.ts b/src/instrumentation/deployment.ts index c268d8df86..738b9ff918 100644 --- a/src/instrumentation/deployment.ts +++ b/src/instrumentation/deployment.ts @@ -1,9 +1,14 @@ import type { TelemetryReporter } from "../telemetry/reporter"; export type DeploymentSuspendReason = - "auth_config_change" | "auth_failure" | "credentials_removed" | "logout"; + | "auth_config_change" + | "auth_failure" + | "credentials_removed" + | "logout"; export type DeploymentRecoveryTrigger = - "auth_config" | "cross_window" | "token_update"; + | "auth_config" + | "cross_window" + | "token_update"; export class DeploymentTelemetry { public constructor(private readonly telemetry: TelemetryReporter) {} diff --git a/src/instrumentation/diagnostics.ts b/src/instrumentation/diagnostics.ts index dc96277926..4413f066f6 100644 --- a/src/instrumentation/diagnostics.ts +++ b/src/instrumentation/diagnostics.ts @@ -14,11 +14,21 @@ import type { Span } from "../telemetry/span"; import type { WorkspacePickerErrorCategory } from "./workspaceOpen"; export type DiagnosticCommand = - "speed_test" | "netcheck" | "support_bundle" | "export_telemetry"; + | "speed_test" + | "netcheck" + | "support_bundle" + | "export_telemetry"; export type DiagnosticErrorCategory = - WorkspacePickerErrorCategory | "parse_error" | "unsupported_cli" | "error"; + | WorkspacePickerErrorCategory + | "parse_error" + | "unsupported_cli" + | "error"; export type DiagnosticAbortStage = - "workspace_picker" | "input" | "prompt" | "save_dialog" | "progress"; + | "workspace_picker" + | "input" + | "prompt" + | "save_dialog" + | "progress"; export interface DiagnosticTrace { abort(stage: DiagnosticAbortStage): void; diff --git a/src/instrumentation/workspaceOpen.ts b/src/instrumentation/workspaceOpen.ts index 9bd3e5777e..c3845bd94f 100644 --- a/src/instrumentation/workspaceOpen.ts +++ b/src/instrumentation/workspaceOpen.ts @@ -30,7 +30,9 @@ export type WorkspacePickerResult = }; export type DevContainerMode = "dev_container" | "attached_container"; export type WorkspaceOpenAbortStage = - "workspace_picker" | "agent_picker" | "recent_folder_picker"; + | "workspace_picker" + | "agent_picker" + | "recent_folder_picker"; export interface WorkspaceOpenSelection { readonly workspace: Workspace; diff --git a/src/login/loginCoordinator.ts b/src/login/loginCoordinator.ts index e8057093de..ecb21072b3 100644 --- a/src/login/loginCoordinator.ts +++ b/src/login/loginCoordinator.ts @@ -32,7 +32,11 @@ import type { Logger } from "../logging/logger"; import type { OAuthCallback } from "../oauth/oauthCallback"; export type LoginMethod = - "mtls" | "provided_token" | "stored_token" | "cli_token" | "oauth"; + | "mtls" + | "provided_token" + | "stored_token" + | "cli_token" + | "oauth"; type LoginAttemptResult = | { success: false; reason: LoginPromptReason } @@ -491,7 +495,8 @@ export class LoginCoordinator implements vscode.Disposable { url: string, prompt: { title: string; detail: string }, previousSession: - { username: string | undefined; expired: boolean } | undefined, + | { username: string | undefined; expired: boolean } + | undefined, ): Promise { const previous = previousSession?.username ? ` for "${previousSession.username}"` diff --git a/src/telemetry/export/writers/json.ts b/src/telemetry/export/writers/json.ts index d9b8ddb1f2..d539c4be32 100644 --- a/src/telemetry/export/writers/json.ts +++ b/src/telemetry/export/writers/json.ts @@ -23,8 +23,10 @@ export async function writeJsonArrayExport( async function* chunks(): AsyncGenerator { yield "["; for await (const event of events) { - yield (count === 0 ? "\n" : ",\n") + - JSON.stringify(serializeTelemetryEvent(event)); + yield ( + (count === 0 ? "\n" : ",\n") + + JSON.stringify(serializeTelemetryEvent(event)) + ); count += 1; } yield count === 0 ? "]\n" : "\n]\n"; diff --git a/src/telemetry/export/writers/otlp/types.ts b/src/telemetry/export/writers/otlp/types.ts index 9b6513c842..38a5cf636b 100644 --- a/src/telemetry/export/writers/otlp/types.ts +++ b/src/telemetry/export/writers/otlp/types.ts @@ -11,7 +11,8 @@ export interface OtlpKeyValue { readonly key: string; readonly value: - { readonly stringValue: string } | { readonly doubleValue: number }; + | { readonly stringValue: string } + | { readonly doubleValue: number }; } export interface OtlpLogRecord { diff --git a/src/telemetry/service.ts b/src/telemetry/service.ts index c4ff3971cc..86bd89361a 100644 --- a/src/telemetry/service.ts +++ b/src/telemetry/service.ts @@ -89,7 +89,8 @@ export class TelemetryService implements vscode.Disposable, TelemetryReporter { [{ setting: TELEMETRY_LEVEL_SETTING, getValue: readLevel }], (changes) => { const next = changes.get(TELEMETRY_LEVEL_SETTING) as - TelemetryLevel | undefined; + | TelemetryLevel + | undefined; if (!next) { return; } diff --git a/src/telemetry/sinks/localJsonlSink.ts b/src/telemetry/sinks/localJsonlSink.ts index 2f2dbab8c4..7d5ca607d7 100644 --- a/src/telemetry/sinks/localJsonlSink.ts +++ b/src/telemetry/sinks/localJsonlSink.ts @@ -170,7 +170,8 @@ export class LocalJsonlSink implements TelemetrySink, vscode.Disposable { ], (changes) => { const next = changes.get(LOCAL_TELEMETRY_SETTING) as - LocalSinkConfig | undefined; + | LocalSinkConfig + | undefined; if (!next) { return; } diff --git a/src/workspace/workspacesProvider.ts b/src/workspace/workspacesProvider.ts index a8c203c01a..22f2e101e4 100644 --- a/src/workspace/workspacesProvider.ts +++ b/src/workspace/workspacesProvider.ts @@ -417,7 +417,9 @@ class AppStatusTreeItem extends vscode.TreeItem { } type CoderOpenableTreeItemType = - "coderWorkspaceSingleAgent" | "coderWorkspaceMultipleAgents" | "coderAgent"; + | "coderWorkspaceSingleAgent" + | "coderWorkspaceMultipleAgents" + | "coderAgent"; export class OpenableTreeItem extends vscode.TreeItem { constructor( diff --git a/test/mocks/testHelpers.ts b/test/mocks/testHelpers.ts index 95e8d17d4c..cebc94b7ab 100644 --- a/test/mocks/testHelpers.ts +++ b/test/mocks/testHelpers.ts @@ -368,7 +368,7 @@ export class MockUserInteraction { const handleMessage = (level: MessageCall["level"]) => - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- serves all show*Message overloads + // oxlint-disable-next-line no-explicit-any -- serves all show*Message overloads (message: string, ...rest: unknown[]): Thenable => { const items = rest.filter( (arg): arg is string => typeof arg === "string", diff --git a/test/unit/deployment/deploymentManager.test.ts b/test/unit/deployment/deploymentManager.test.ts index 1a45bfa596..59c03876d9 100644 --- a/test/unit/deployment/deploymentManager.test.ts +++ b/test/unit/deployment/deploymentManager.test.ts @@ -27,10 +27,9 @@ vi.mock("@/api/coderApi", async (importOriginal) => { const original = await importOriginal(); return { ...original, - CoderApi: { - ...original.CoderApi, + CoderApi: Object.assign({}, original.CoderApi, { create: vi.fn(), - }, + }), }; }); diff --git a/test/unit/login/loginCoordinator.test.ts b/test/unit/login/loginCoordinator.test.ts index eb1870a25b..17bbdcbf5f 100644 --- a/test/unit/login/loginCoordinator.test.ts +++ b/test/unit/login/loginCoordinator.test.ts @@ -80,8 +80,7 @@ vi.mock("@/api/coderApi", async (importOriginal) => { const original = await importOriginal(); return { ...original, - CoderApi: { - ...original.CoderApi, + CoderApi: Object.assign({}, original.CoderApi, { create: vi.fn(() => ({ getAxiosInstance: () => ({ defaults: { baseURL: "https://coder.example.com" }, @@ -90,7 +89,7 @@ vi.mock("@/api/coderApi", async (importOriginal) => { getAuthenticatedUser: mockGetAuthenticatedUser, dispose: vi.fn(), })), - }, + }), }; }); diff --git a/test/unit/oxlintConfig.test.ts b/test/unit/oxlintConfig.test.ts new file mode 100644 index 0000000000..9a84e1b35a --- /dev/null +++ b/test/unit/oxlintConfig.test.ts @@ -0,0 +1,70 @@ +import * as jsonc from "jsonc-parser"; +import { execFileSync } from "node:child_process"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import { describe, expect, it } from "vitest"; + +const REPO_ROOT = path.resolve(import.meta.dirname, "../.."); +const CONFIG_PATH = path.join(REPO_ROOT, ".oxlintrc.jsonc"); + +interface Override { + files: string[]; + jsPlugins?: Array; +} + +const { overrides = [] } = jsonc.parse( + fs.readFileSync(CONFIG_PATH, "utf8"), +) as { + overrides?: Override[]; +}; + +const specifier = (plugin: string | { name: string; specifier: string }) => + typeof plugin === "string" ? plugin : plugin.specifier; + +describe("oxlint config", () => { + it("has no extglob alternatives in override patterns", () => { + // oxlint's glob matcher silently drops patterns with `@(a|b)` + // (oxc-project/oxc#21525); they never match anything. + const offenders = overrides.flatMap((override, index) => + override.files + .filter((pattern) => /@\([^)]*\|/.test(pattern)) + .map((pattern) => `overrides[${index}] ${pattern}`), + ); + expect(offenders).toEqual([]); + }); + + it("applies the storybook override to story files", () => { + // Storybook rules only fire where the override applies, and its generated + // `**/*.stories.@(ts|tsx)` pattern silently matched nothing. + const storybookIndexes = overrides.flatMap((override, index) => + (override.jsPlugins ?? []).some((p) => + specifier(p).includes("eslint-plugin-storybook"), + ) + ? [index] + : [], + ); + expect(storybookIndexes.length).toBeGreaterThan(0); + + const story = "packages/tasks/src/components/CreateTaskSection.stories.tsx"; + const output = execFileSync( + process.execPath, + [ + path.join(REPO_ROOT, "node_modules/oxlint/bin/oxlint"), + "--config", + CONFIG_PATH, + "--print-config", + path.join(REPO_ROOT, story), + ], + { cwd: REPO_ROOT, encoding: "utf8" }, + ); + const applied = new Set( + ((jsonc.parse(output) as { overrides?: unknown[] }).overrides ?? []).map( + (_, index) => index, + ), + ); + expect( + storybookIndexes.some((index) => applied.has(index)), + `storybook override should apply to ${story}`, + ).toBe(true); + }); +}); diff --git a/test/unit/supportBundle/remoteServerDataPath.test.ts b/test/unit/supportBundle/remoteServerDataPath.test.ts index 639987309f..a3d924ced1 100644 --- a/test/unit/supportBundle/remoteServerDataPath.test.ts +++ b/test/unit/supportBundle/remoteServerDataPath.test.ts @@ -44,7 +44,8 @@ function useRemoteSshExtension(id: string): void { vi.mocked(vscode.extensions.getExtension).mockImplementation( (extensionId) => (extensionId === id ? { id: extensionId } : undefined) as - vscode.Extension | undefined, + | vscode.Extension + | undefined, ); } diff --git a/test/unit/telemetry/sinks/localJsonlSink.test.ts b/test/unit/telemetry/sinks/localJsonlSink.test.ts index d276e29372..838653b6ff 100644 --- a/test/unit/telemetry/sinks/localJsonlSink.test.ts +++ b/test/unit/telemetry/sinks/localJsonlSink.test.ts @@ -308,7 +308,11 @@ describe("LocalJsonlSink", () => { setup({ maxAgeDays: 365, maxTotalBytes: 4500 }); await vi.waitFor(() => - expect(vol.readdirSync(BASE_DIR).toSorted()).toEqual([ + expect( + (vol.readdirSync(BASE_DIR) as string[]).toSorted((a, b) => + a.localeCompare(b), + ), + ).toEqual([ "telemetry-2026-04-02-b.jsonl", "telemetry-2026-04-03-c.jsonl", ]), diff --git a/test/utils/platform.ts b/test/utils/platform.ts index 26320e3766..4157bfc2d4 100644 --- a/test/utils/platform.ts +++ b/test/utils/platform.ts @@ -104,7 +104,8 @@ export function shimExecFile< const sym = Symbol.for("nodejs.util.promisify.custom"); const customPromisify = Reflect.get(original, sym) as - ((...args: unknown[]) => unknown) | undefined; + | ((...args: unknown[]) => unknown) + | undefined; if (customPromisify) { Reflect.set(execFile, sym, (file: string, ...rest: unknown[]) => Reflect.apply(customPromisify, undefined, prepend(file, rest)),