From 2ba9e23c2b17207fabd3f07b528d53bd4bf828eb Mon Sep 17 00:00:00 2001 From: Ehab Younes Date: Thu, 17 Sep 2026 15:09:43 +0000 Subject: [PATCH 1/2] chore(lint): migrate to oxlint and oxfmt Move linting to Oxlint and formatting to Oxfmt, keeping a small residual ESLint for what Oxlint cannot do (import-x/order, Markdown, package.json). - Add .oxlintrc.json with correctness category + curated rules from all categories, plus .oxlintrc.react.json for react/react-x rules - Add .oxfmtrc.json for formatting with oxfmt - Keep eslint.config.mjs for import-x/order, Markdown, and package.json linting (documented in CONTRIBUTING.md) - Run TypeScript 7 (tsc) side-by-side with TypeScript 6 (API for typescript-eslint) - Cap oxlint/oxfmt thread count at 8 (scripts/run-oxc.mjs) - Fix 5 no-misused-spread and require-array-sort-compare findings - Guard against oxlint config regressions with test/unit/oxlintConfig.test.ts Benchmarks: CI lint job -80% (26.3s -> 5.2s), format:check -91% (3.22s -> 0.30s), typecheck -83% (5.43s -> 0.95s). Fixes OOM on default heap. --- .oxfmtrc.json | 27 + .oxlintrc.json | 314 +++++ .oxlintrc.react.json | 87 ++ .vscode/settings.json | 11 +- .vscodeignore | 3 + AGENTS.md | 25 +- CONTRIBUTING.md | 30 + eslint.config.mjs | 236 +--- package.json | 22 +- packages/tasks/src/App.tsx | 2 +- packages/tasks/src/components/ActionMenu.tsx | 3 +- .../src/components/CreateTaskSection.tsx | 2 +- packages/tasks/src/components/StatePanel.tsx | 6 +- packages/tasks/src/utils/taskLoadingState.ts | 6 +- .../ui/src/components/Checkbox/Checkbox.tsx | 2 +- .../src/components/StatusPill/StatusPill.tsx | 6 +- .../ui/src/components/Tree/treeTransition.ts | 2 +- packages/ui/src/keybinding.ts | 3 +- packages/ui/src/useVscodeTheme.ts | 5 +- packages/ui/tsconfig.json | 4 +- packages/webview-shared/src/logger.ts | 4 +- pnpm-lock.yaml | 1082 ++++++++++++++--- pnpm-workspace.yaml | 4 +- scripts/run-oxc.mjs | 25 + scripts/timed.mjs | 8 + src/api/streamingFetchAdapter.ts | 3 +- src/core/cliManager.ts | 8 +- src/inbox.ts | 3 +- src/instrumentation/activation.ts | 6 +- src/instrumentation/auth.ts | 12 +- src/instrumentation/cli.ts | 9 +- src/instrumentation/deployment.ts | 9 +- src/instrumentation/diagnostics.ts | 16 +- src/instrumentation/workspaceOpen.ts | 4 +- src/login/loginCoordinator.ts | 9 +- src/telemetry/export/writers/json.ts | 6 +- src/telemetry/export/writers/otlp/types.ts | 3 +- src/telemetry/service.ts | 3 +- src/telemetry/sinks/localJsonlSink.ts | 3 +- src/workspace/workspacesProvider.ts | 4 +- test/mocks/testHelpers.ts | 2 +- .../unit/deployment/deploymentManager.test.ts | 5 +- test/unit/login/loginCoordinator.test.ts | 5 +- test/unit/oxlintConfig.test.ts | 81 ++ .../remoteServerDataPath.test.ts | 3 +- .../telemetry/sinks/localJsonlSink.test.ts | 6 +- test/utils/platform.ts | 3 +- 47 files changed, 1674 insertions(+), 448 deletions(-) create mode 100644 .oxfmtrc.json create mode 100644 .oxlintrc.json create mode 100644 .oxlintrc.react.json create mode 100644 scripts/run-oxc.mjs create mode 100644 scripts/timed.mjs create mode 100644 test/unit/oxlintConfig.test.ts diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000000..957addc988 --- /dev/null +++ b/.oxfmtrc.json @@ -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.json b/.oxlintrc.json new file mode 100644 index 0000000000..90bc3c81db --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,314 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "extends": [".oxlintrc.react.json"], + "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.json b/.oxlintrc.react.json new file mode 100644 index 0000000000..b2423bd5d4 --- /dev/null +++ b/.oxlintrc.react.json @@ -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..f34dcb3018 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -16,6 +16,9 @@ scripts/** .vscode-test.mjs tsconfig.json eslint.config.mjs +.oxlintrc.json +.oxlintrc.react.json +.oxfmtrc.json .eslintcache esbuild.mjs vitest.config.mts diff --git a/AGENTS.md b/AGENTS.md index ac0a27720c..3cdc6d27ea 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.json`): 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.json`: + +- `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.json`) 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..efdc98dfed 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.json` 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..e1a2b86b5a 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.json`), 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.json"), ); 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..d29e2b17a9 --- /dev/null +++ b/test/unit/oxlintConfig.test.ts @@ -0,0 +1,81 @@ +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.json"); + +interface Override { + files: string[]; + jsPlugins?: Array; +} + +const { overrides = [] } = JSON.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("resolves every relative jsPlugin specifier from the repo root", () => { + const specifiers = overrides + .flatMap((override) => override.jsPlugins ?? []) + .map(specifier) + .filter((s) => s.startsWith(".")); + expect(specifiers.length).toBeGreaterThan(0); + for (const s of specifiers) { + expect( + fs.existsSync(path.resolve(REPO_ROOT, s)), + `${s} should exist`, + ).toBe(true); + } + }); + + 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( + ((JSON.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)), From 35e90e38567ea85894ac8024301e7b2101362555 Mon Sep 17 00:00:00 2001 From: Ehab Younes Date: Fri, 18 Sep 2026 16:48:33 +0200 Subject: [PATCH 2/2] chore(lint): use .jsonc for the oxc config files Rename .oxfmtrc.json, .oxlintrc.json, and .oxlintrc.react.json to .jsonc. These files already carry comments, so the .jsonc extension gets GitHub to highlight them and gets VS Code to stop flagging the comments as errors. Oxfmt and Oxlint both discover the .jsonc names, and `extends` resolves .oxlintrc.react.jsonc. Parse the config with jsonc-parser in test/unit/oxlintConfig.test.ts so comments in .oxlintrc.jsonc stay possible. Drop the jsPlugins resolution case from that test. Oxlint loads JS plugins eagerly when it parses the config and exits non-zero on a missing one, even when the override glob matches nothing, so `pnpm lint` already covers it. --- .oxfmtrc.json => .oxfmtrc.jsonc | 0 .oxlintrc.json => .oxlintrc.jsonc | 2 +- .oxlintrc.react.json => .oxlintrc.react.jsonc | 0 .vscodeignore | 6 ++--- AGENTS.md | 6 ++--- CONTRIBUTING.md | 2 +- eslint.config.mjs | 4 ++-- test/unit/oxlintConfig.test.ts | 23 +++++-------------- 8 files changed, 16 insertions(+), 27 deletions(-) rename .oxfmtrc.json => .oxfmtrc.jsonc (100%) rename .oxlintrc.json => .oxlintrc.jsonc (99%) rename .oxlintrc.react.json => .oxlintrc.react.jsonc (100%) diff --git a/.oxfmtrc.json b/.oxfmtrc.jsonc similarity index 100% rename from .oxfmtrc.json rename to .oxfmtrc.jsonc diff --git a/.oxlintrc.json b/.oxlintrc.jsonc similarity index 99% rename from .oxlintrc.json rename to .oxlintrc.jsonc index 90bc3c81db..83be646421 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.jsonc @@ -1,6 +1,6 @@ { "$schema": "./node_modules/oxlint/configuration_schema.json", - "extends": [".oxlintrc.react.json"], + "extends": [".oxlintrc.react.jsonc"], "plugins": ["unicorn"], "categories": { "correctness": "error" diff --git a/.oxlintrc.react.json b/.oxlintrc.react.jsonc similarity index 100% rename from .oxlintrc.react.json rename to .oxlintrc.react.jsonc diff --git a/.vscodeignore b/.vscodeignore index f34dcb3018..93ceb676ab 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -16,9 +16,9 @@ scripts/** .vscode-test.mjs tsconfig.json eslint.config.mjs -.oxlintrc.json -.oxlintrc.react.json -.oxfmtrc.json +.oxlintrc.jsonc +.oxlintrc.react.jsonc +.oxfmtrc.jsonc .eslintcache esbuild.mjs vitest.config.mts diff --git a/AGENTS.md b/AGENTS.md index 3cdc6d27ea..909ecc4dfd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -54,12 +54,12 @@ xvfb-run -a pnpm test:integration Linting runs in two stages via `pnpm lint`: -1. **Oxlint** (`.oxlintrc.json`): all JS/TS/TSX rules, including type-aware +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.json`: +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 @@ -126,7 +126,7 @@ Non-negotiables: ## Code Style - TypeScript with strict typing -- Use Oxlint for code linting (`.oxlintrc.json`) and Oxfmt for formatting. +- 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.) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index efdc98dfed..ff4ed30b67 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -252,7 +252,7 @@ Oxlint equivalent lands, remove the corresponding entry from | `@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.json` and disables every rule Oxlint +`eslint-plugin-oxlint` reads `.oxlintrc.jsonc` and disables every rule Oxlint already covers, so the two stages never overlap. ## TypeScript Version diff --git a/eslint.config.mjs b/eslint.config.mjs index e1a2b86b5a..7ef58e4223 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -6,7 +6,7 @@ import packageJson from "eslint-plugin-package-json"; import oxlint from "eslint-plugin-oxlint"; import tseslint from "typescript-eslint"; -// Oxlint owns JS/TS/TSX linting (see `.oxlintrc.json`), including type-aware +// 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 @@ -107,5 +107,5 @@ export default defineConfig( }, // Turn off every rule Oxlint already covers. Must stay last so its disables win. - ...oxlint.buildFromOxlintConfigFile("./.oxlintrc.json"), + ...oxlint.buildFromOxlintConfigFile("./.oxlintrc.jsonc"), ); diff --git a/test/unit/oxlintConfig.test.ts b/test/unit/oxlintConfig.test.ts index d29e2b17a9..9a84e1b35a 100644 --- a/test/unit/oxlintConfig.test.ts +++ b/test/unit/oxlintConfig.test.ts @@ -1,17 +1,20 @@ +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.json"); +const CONFIG_PATH = path.join(REPO_ROOT, ".oxlintrc.jsonc"); interface Override { files: string[]; jsPlugins?: Array; } -const { overrides = [] } = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8")) as { +const { overrides = [] } = jsonc.parse( + fs.readFileSync(CONFIG_PATH, "utf8"), +) as { overrides?: Override[]; }; @@ -30,20 +33,6 @@ describe("oxlint config", () => { expect(offenders).toEqual([]); }); - it("resolves every relative jsPlugin specifier from the repo root", () => { - const specifiers = overrides - .flatMap((override) => override.jsPlugins ?? []) - .map(specifier) - .filter((s) => s.startsWith(".")); - expect(specifiers.length).toBeGreaterThan(0); - for (const s of specifiers) { - expect( - fs.existsSync(path.resolve(REPO_ROOT, s)), - `${s} should exist`, - ).toBe(true); - } - }); - 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. @@ -69,7 +58,7 @@ describe("oxlint config", () => { { cwd: REPO_ROOT, encoding: "utf8" }, ); const applied = new Set( - ((JSON.parse(output) as { overrides?: unknown[] }).overrides ?? []).map( + ((jsonc.parse(output) as { overrides?: unknown[] }).overrides ?? []).map( (_, index) => index, ), );