diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 000000000..36248fb0c --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,13 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "printWidth": 80, + "tabWidth": 2, + "sortPackageJson": false, + "ignorePatterns": [ + "apps/cli-docs/**", + "packages/cli/**", + "packages/mcp-server-mocks/src/fixtures/**", + "**/worker-configuration.d.ts", + "**/tsconfig*.json" + ] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 000000000..ca44a1eda --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,26 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["eslint", "typescript", "unicorn", "oxc", "jsx-a11y"], + "categories": { + "correctness": "error" + }, + "ignorePatterns": [ + "apps/cli-docs/**", + "packages/cli/**", + "**/worker-configuration.d.ts", + "**/tsconfig*.json", + "packages/mcp-server-mocks/src/fixtures/**" + ], + "rules": { + "no-unused-vars": "off", + "jsx-a11y/interactive-supports-focus": "off" + }, + "overrides": [ + { + "files": ["packages/mcp-cloudflare/src/client/**/*.tsx"], + "rules": { + "jsx-a11y/no-static-element-interactions": "off" + } + } + ] +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 996634d12..bdf5bcbe5 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,4 +1,4 @@ { - "recommendations": ["biomejs.biome"], + "recommendations": ["oxc.oxc-vscode", "biomejs.biome"], "unwantedRecommendations": [] } diff --git a/.vscode/settings.json b/.vscode/settings.json index f2649bfbc..8daad2ef7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,21 +1,18 @@ { + "editor.defaultFormatter": "oxc.oxc-vscode", "editor.formatOnSave": true, + "editor.formatOnSaveMode": "file", "editor.codeActionsOnSave": { - "source.fixAll.biome": "explicit" + "source.fixAll.oxc": "explicit" }, "files.trimTrailingWhitespace": false, "files.trimFinalNewlines": false, "files.insertFinalNewline": true, "cursor.general.enableShadowWorkspace": true, "[json]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "biomejs.biome" + "editor.tabSize": 2 }, "[typescript]": { - "editor.tabSize": 2, - "editor.defaultFormatter": "biomejs.biome" - }, - "[typescriptreact]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.tabSize": 2 } } diff --git a/biome.json b/biome.json deleted file mode 100644 index f2719d59b..000000000 --- a/biome.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", - "assist": { "actions": { "source": { "organizeImports": "on" } } }, - "files": { - "includes": [ - "**", - "!!apps/cli-docs", - "!!packages/cli", - "!**/worker-configuration.d.ts", - "!**/tsconfig*.json", - "!**/packages/mcp-server-mocks/src/fixtures" - ] - }, - "vcs": { - "enabled": true, - "clientKind": "git", - "useIgnoreFile": true - }, - "linter": { - "enabled": true, - "rules": { - "preset": "recommended", - "correctness": { - "noUnusedImports": "warn", - "noUnusedVariables": "off", - "noUnusedFunctionParameters": "off" - }, - "suspicious": { - "noExplicitAny": "off", - "noDebugger": "off", - "noConfusingVoidType": "off", - "noPrototypeBuiltins": "off", - "noConsole": { "level": "off", "options": { "allow": ["log"] } } - }, - "style": { - "noNonNullAssertion": "off", - "noUnusedTemplateLiteral": "off" - }, - "security": { - "noDangerouslySetInnerHtml": "off" - }, - "complexity": { - "noUselessFragments": "off", - "useOptionalChain": "off", - "noImportantStyles": "off", - "noUselessUndefinedInitialization": "off", - "noUselessEscapeInRegex": "off" - } - } - }, - "formatter": { - "enabled": true, - "indentWidth": 2, - "indentStyle": "space" - }, - "css": { - "parser": { - "tailwindDirectives": true - } - }, - "overrides": [ - { - "includes": ["packages/mcp-cloudflare/src/client/**/*.tsx"], - "linter": { - "rules": { - "a11y": { - "noStaticElementInteractions": "off", - "useAriaPropsSupportedByRole": "off" - } - } - } - } - ] -} diff --git a/docs/contributing/coding-guidelines.md b/docs/contributing/coding-guidelines.md index 3c4ea012c..498833fb6 100644 --- a/docs/contributing/coding-guidelines.md +++ b/docs/contributing/coding-guidelines.md @@ -20,18 +20,27 @@ Essential patterns and standards for Sentry MCP development. ## Code Style -### Biome Configuration +### Formatting and linting + - 2 spaces, double quotes, semicolons -- Max line: 100 chars +- Formatter width: 80 characters - Trailing commas in multiline +- MCP and root files use Oxfmt and Oxlint; CLI files still use their own Biome rules. +- CLI's custom Grit rules and inline suppressions remain active until their + equivalents are available in the new linter. +- VS Code uses Oxc for root and MCP files. Oxfmt ignores `packages/cli/**`; + use `pnpm --filter sentry exec biome format --write ` to format a CLI + file and keep CLI's Biome checks in the pre-commit hook. ### Naming Conventions + - Files: `kebab-case.ts` - Functions: `camelCase` - Types/Classes: `PascalCase` - Constants: `UPPER_SNAKE_CASE` ### Import Order + ```typescript // 1. Node built-ins import { readFile } from "node:fs/promises"; @@ -50,14 +59,14 @@ export const toolName = { description: "Clear, concise description", parameters: z.object({ required: z.string().describe("Description"), - optional: z.string().optional() + optional: z.string().optional(), }), execute: async (params, context) => { // 1. Validate inputs // 2. Call API // 3. Format output return formatResponse(data); - } + }, }; ``` @@ -68,10 +77,10 @@ describe("Component", () => { it("handles normal case", async () => { // Arrange const input = createTestInput(); - + // Act const result = await method(input); - + // Assert expect(result).toMatchInlineSnapshot(); }); @@ -79,6 +88,7 @@ describe("Component", () => { ``` Key practices: + - Use inline snapshots for formatting - Mock with MSW - Test success and error paths @@ -87,9 +97,12 @@ Key practices: ## Quality Checklist Before committing: + ```bash -pnpm -w run lint # Biome check +pnpm -w run lint # Oxlint and ast-grep checks for MCP and root files pnpm -w run lint:fix # Fix issues +pnpm -w run format # Format MCP and root files with Oxfmt +pnpm --filter sentry run lint # CLI Biome rules pnpm tsc --noEmit # Type check pnpm test # Run tests pnpm -w run build # Build all @@ -97,19 +110,19 @@ pnpm -w run build # Build all ## JSDoc Pattern -```typescript +````typescript /** * Brief description. - * + * * @param param - Description * @returns What it returns - * + * * @example * ```typescript * const result = func(param); * ``` */ -``` +```` ## Security Essentials @@ -121,6 +134,7 @@ pnpm -w run build # Build all ## Common Patterns For shared patterns see: + - Error handling: [common-patterns.md](common-patterns.md#error-handling) - Zod schemas: [common-patterns.md](common-patterns.md#zod-schema-patterns) - API usage: [api-patterns.md](api-patterns.md) diff --git a/package.json b/package.json index 44283d879..55c307482 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ }, "scripts": { "docs:check": "node scripts/check-doc-links.mjs", - "test:ci-projects": "node --test scripts/ci-projects.test.mjs scripts/cli-nightly-version.test.mjs scripts/cloudflare-deployment.test.mjs scripts/deploy-workflow.test.mjs scripts/migrate-cloudflare-token.test.mjs", + "test:ci-projects": "node --test scripts/ci-projects.test.mjs scripts/cli-nightly-version.test.mjs scripts/cloudflare-deployment.test.mjs scripts/deploy-workflow.test.mjs scripts/migrate-cloudflare-token.test.mjs scripts/oxc-config.test.mjs", "dev": "pnpm --filter '@sentry/mcp-cloudflare...' --if-present run build && dotenv -e .env -e .env.local -- pnpm --parallel --filter @sentry/mcp-cloudflare --filter @sentry/mcp-core --filter @sentry/mcp-server-mocks --if-present run dev", "dev:stdio": "pnpm --filter '@sentry/mcp-server...' --if-present run build && dotenv -e .env -e .env.local -- pnpm --parallel --filter @sentry/mcp-server --filter @sentry/mcp-core --filter @sentry/mcp-server-mocks --if-present run dev", "build": "dotenv -e .env -e .env.local -- pnpm -r --filter '!sentry' --filter '!sentry-cli-docs' --if-present run build", @@ -32,10 +32,10 @@ "deploy:docs": "pnpm --filter sentry run generate:schema && pnpm --filter sentry run generate:docs && pnpm --filter sentry-cli-docs run build && pnpm --filter sentry-cli-docs run deploy", "eval": "pnpm --filter '@sentry/mcp-server-evals...' --if-present run build && dotenv -e .env -e .env.local -- pnpm --filter @sentry/mcp-server-evals run eval", "eval:ci": "pnpm --filter '@sentry/mcp-server-evals...' --if-present run build && CI=true dotenv -e .env -e .env.local -- pnpm --stream -r run eval:ci", - "format": "biome format --write", - "lint": "biome lint && pnpm run lint:ast-grep", + "format": "oxfmt --write", + "lint": "oxlint . && pnpm run lint:ast-grep", "lint:ast-grep": "ast-grep scan && ast-grep test --skip-snapshot-tests", - "lint:fix": "biome lint --fix", + "lint:fix": "oxlint --fix .", "pre-commit:generated": "node scripts/pre-commit-generated.mjs", "inspector": "pnpx @modelcontextprotocol/inspector@latest", "inspector:stdio": "pnpx @modelcontextprotocol/inspector@latest -- tsx packages/mcp-server/src/index.ts", @@ -50,11 +50,12 @@ }, "dependencies": { "@ast-grep/cli": "catalog:", - "@biomejs/biome": "catalog:", "@types/node": "catalog:", "dotenv": "catalog:", "dotenv-cli": "catalog:", "lint-staged": "catalog:", + "oxfmt": "catalog:", + "oxlint": "catalog:", "simple-git-hooks": "catalog:", "tsdown": "catalog:", "tsx": "catalog:", @@ -68,8 +69,12 @@ }, "lint-staged": { "*": [ - "biome format --write --no-errors-on-unmatched --files-ignore-unknown=true", - "biome lint --fix --no-errors-on-unmatched --files-ignore-unknown=true" + "oxfmt --write --no-error-on-unmatched-pattern", + "oxlint --fix --no-error-on-unmatched-pattern" + ], + "packages/cli/**/*": [ + "pnpm --filter sentry exec biome format --write --no-errors-on-unmatched --files-ignore-unknown=true", + "pnpm --filter sentry exec biome lint --fix --no-errors-on-unmatched --files-ignore-unknown=true" ] }, "devDependencies": { diff --git a/packages/mcp-cloudflare/src/client/components/animation/terminal-ui/StepsList.test.ts b/packages/mcp-cloudflare/src/client/components/animation/terminal-ui/StepsList.test.ts new file mode 100644 index 000000000..7858c6720 --- /dev/null +++ b/packages/mcp-cloudflare/src/client/components/animation/terminal-ui/StepsList.test.ts @@ -0,0 +1,44 @@ +import { + Children, + isValidElement, + type KeyboardEvent, + type KeyboardEventHandler, +} from "react"; +import { describe, expect, it, vi } from "vitest"; +import StepsList from "./StepsList"; + +const steps = Array.from({ length: 6 }, (_, index) => ({ + label: `Step ${index}`, + description: "", + startTime: 0, + pauseMs: null, +})); + +describe("StepsList keyboard navigation", () => { + it.each(["Enter", " "])("restarts from the final step with %j", (key) => { + const restart = vi.fn(); + const onSelectAction = vi.fn(); + const element = StepsList({ + steps, + globalIndex: steps.length - 1, + onSelectAction, + restart, + }); + const button = Children.toArray(element.props.children).find( + (child) => isValidElement(child) && child.type === "button", + ); + if (!isValidElement<{ onKeyDown: KeyboardEventHandler }>(button)) { + throw new Error("Step navigation button is missing"); + } + + const preventDefault = vi.fn(); + button.props.onKeyDown({ + key, + preventDefault, + } as unknown as KeyboardEvent); + + expect(preventDefault).toHaveBeenCalledOnce(); + expect(restart).toHaveBeenCalledOnce(); + expect(onSelectAction).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/mcp-cloudflare/src/client/components/animation/terminal-ui/StepsList.tsx b/packages/mcp-cloudflare/src/client/components/animation/terminal-ui/StepsList.tsx index 56d588777..898de8516 100644 --- a/packages/mcp-cloudflare/src/client/components/animation/terminal-ui/StepsList.tsx +++ b/packages/mcp-cloudflare/src/client/components/animation/terminal-ui/StepsList.tsx @@ -108,8 +108,8 @@ export default function StepsList({ onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); - if (globalIndex === 6) { - typeof restart === "function" && restart(); + if (globalIndex === 5) { + if (typeof restart === "function") restart(); } else { onSelectAction(Math.min(globalIndex + 1, steps.length - 1)); } diff --git a/packages/mcp-cloudflare/src/client/components/fragments/install-tabs.tsx b/packages/mcp-cloudflare/src/client/components/fragments/install-tabs.tsx index b5f6a561f..dbf2ad9e3 100644 --- a/packages/mcp-cloudflare/src/client/components/fragments/install-tabs.tsx +++ b/packages/mcp-cloudflare/src/client/components/fragments/install-tabs.tsx @@ -109,7 +109,7 @@ export default function InstallTabs({ const from = c.offsetHeight; const to = next.offsetHeight; c.style.height = `${from}px`; - c.offsetHeight; + void c.offsetHeight; c.style.transition = "height 300ms cubic-bezier(0.2, 0.8, 0.2, 1)"; c.style.height = `${to}px`; const done = () => { diff --git a/packages/mcp-core/package.json b/packages/mcp-core/package.json index fbaf8d976..6b98b990a 100644 --- a/packages/mcp-core/package.json +++ b/packages/mcp-core/package.json @@ -151,7 +151,7 @@ "test:ci": "pnpm run generate-definitions && pnpm run validate-skills && vitest run --reporter=default --reporter=junit --outputFile=tests.junit.xml", "test:watch": "pnpm run generate-definitions && vitest", "tsc": "tsc --noEmit", - "generate-definitions": "tsx scripts/generate-definitions.ts && biome format --write src/toolDefinitions.json src/skillDefinitions.json", + "generate-definitions": "tsx scripts/generate-definitions.ts && oxfmt --write src/toolDefinitions.json src/skillDefinitions.json", "generate-otel-namespaces": "tsx scripts/generate-otel-namespaces.ts", "measure-tokens": "tsx scripts/measure-token-cost.ts", "validate-skills": "tsx scripts/validate-skills-mapping.ts" diff --git a/packages/mcp-core/src/telem/logging.ts b/packages/mcp-core/src/telem/logging.ts index ff5159a91..c0a5262f1 100644 --- a/packages/mcp-core/src/telem/logging.ts +++ b/packages/mcp-core/src/telem/logging.ts @@ -408,7 +408,7 @@ export function logIssue( const { attachments, ...baseOptions } = options; const extra: LogContext = { - ...(baseOptions.extra ?? {}), + ...baseOptions.extra, ...(attachments && Object.keys(attachments).length > 0 ? { attachments: Object.keys(attachments) } : {}), diff --git a/packages/mcp-server/src/cli/parse.ts b/packages/mcp-server/src/cli/parse.ts index dc5be6fea..85b379e80 100644 --- a/packages/mcp-server/src/cli/parse.ts +++ b/packages/mcp-server/src/cli/parse.ts @@ -33,11 +33,11 @@ export function parseArgv(argv: string[]): CliArgs { }); const knownLong = new Set(Object.keys(options)); - const knownShort = new Set([ - ...(Object.values(options) + const knownShort = new Set( + Object.values(options) .map((o) => ("short" in o ? (o.short as string | undefined) : undefined)) - .filter(Boolean) as string[]), - ]); + .filter(Boolean) as string[], + ); const unknownArgs: string[] = []; for (const t of (tokens as any[]) || []) { diff --git a/packages/toolkit-core/src/auth-token.ts b/packages/toolkit-core/src/auth-token.ts index 59f6c24b1..c4118cba2 100644 --- a/packages/toolkit-core/src/auth-token.ts +++ b/packages/toolkit-core/src/auth-token.ts @@ -1,6 +1,6 @@ /** A valid bearer credential contains only visible ASCII bytes. */ const INVALID_TOKEN_CHARACTER_PATTERN = /[^\x21-\x7e]/; -// biome-ignore lint/suspicious/noControlCharactersInRegex: copied ASCII controls are removable edge padding. +// oxlint-disable-next-line no-control-regex -- copied ASCII controls are removable edge padding. const TOKEN_PADDING_PATTERN = /[\s\x00-\x1f\x7f]/; /** Strip padding at the edges without changing bytes within the token. */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cfe75f253..a6c2e1d6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,9 +21,6 @@ catalogs: '@ast-grep/cli': specifier: ^0.43.0 version: 0.43.0 - '@biomejs/biome': - specifier: ^2.5.5 - version: 2.5.5 '@cloudflare/vitest-pool-workers': specifier: 0.14.1 version: 0.14.1 @@ -120,6 +117,12 @@ catalogs: open: specifier: ^10.1.2 version: 10.1.2 + oxfmt: + specifier: 0.72.0 + version: 0.72.0 + oxlint: + specifier: 1.87.0 + version: 1.87.0 react: specifier: ^19.2.8 version: 19.2.8 @@ -194,9 +197,6 @@ importers: '@ast-grep/cli': specifier: 'catalog:' version: 0.43.0 - '@biomejs/biome': - specifier: 'catalog:' - version: 2.5.5 '@types/node': specifier: 'catalog:' version: 22.16.0 @@ -209,6 +209,12 @@ importers: lint-staged: specifier: 'catalog:' version: 15.5.2 + oxfmt: + specifier: 'catalog:' + version: 0.72.0 + oxlint: + specifier: 'catalog:' + version: 1.87.0 simple-git-hooks: specifier: 'catalog:' version: 2.13.1 @@ -1337,35 +1343,18 @@ packages: engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/biome@2.5.5': - resolution: {integrity: sha512-r1S8nFsAG1MY+vJFZALzIvwXAJv6ejDQ0mxP21Tgr9YK3ZFtjrvbBwDdNhx1rUqvccEIeNg20cYCNzl6Cr69pQ==} - engines: {node: '>=14.21.3'} - hasBin: true - '@biomejs/cli-darwin-arm64@2.3.8': resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-arm64@2.5.5': - resolution: {integrity: sha512-kUrAhXVWUrwmAUnV2iXSK7umxKFysTwvqK+Ty6ptUcLY/7T3SnCAjUowE4uvwaEej6nXZ7hu/dTtbokKdsPeag==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - '@biomejs/cli-darwin-x64@2.3.8': resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.5': - resolution: {integrity: sha512-DamiYc5bUYZ2uxlfc+RLEPtz1Abb6PO5eTbOkufLpSGwd/7AMQAdxhFYiXmwwkJL8IsT8S7GvdgwDHqaMFAvKw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.8': resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} engines: {node: '>=14.21.3'} @@ -1373,13 +1362,6 @@ packages: os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64-musl@2.5.5': - resolution: {integrity: sha512-U4WMl/sy/E/Q73vf15VspakLRRs2LDFcCeBxJnQfXzssb88zpV6PJPaQ3ezhQ7H6Ht2/8bvuZeHgJWzmoxllZg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - libc: [musl] - '@biomejs/cli-linux-arm64@2.3.8': resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} engines: {node: '>=14.21.3'} @@ -1387,13 +1369,6 @@ packages: os: [linux] libc: [glibc] - '@biomejs/cli-linux-arm64@2.5.5': - resolution: {integrity: sha512-lRKF/pH/1RiYiBKExi3TCZVAtvzEm77aifrvcNiDFrR9WxeAnDUjDnseb6y2XV85mjitLs6SILGm2XG77cHtSQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.3.8': resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} engines: {node: '>=14.21.3'} @@ -1401,13 +1376,6 @@ packages: os: [linux] libc: [musl] - '@biomejs/cli-linux-x64-musl@2.5.5': - resolution: {integrity: sha512-m7wC7tjX5Lrmo69dc4md8FeKpPU1NTCY1v7xUoQQ2vadWwNnBS0KZOG8471otFPHrTHihQJAjQPgMObpLvDe6A==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - libc: [musl] - '@biomejs/cli-linux-x64@2.3.8': resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} engines: {node: '>=14.21.3'} @@ -1415,37 +1383,18 @@ packages: os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64@2.5.5': - resolution: {integrity: sha512-H/O39nJEw/2Zm/fm7hrmxxoF8kK/aU1uCoPp70ruXVbomaAdLpJJnCmL11Q2JotT8QVHH06So04Oq53lCSwSwQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - libc: [glibc] - '@biomejs/cli-win32-arm64@2.3.8': resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-arm64@2.5.5': - resolution: {integrity: sha512-7BryINPuYypLUAH3o/o5ZdgomJ4zn3EDR0ChZJst7n32S6ZhKbgHXuYydLu+YAnx59ehGFR0z/MG6qnzQi3Yyw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - '@biomejs/cli-win32-x64@2.3.8': resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - '@biomejs/cli-win32-x64@2.5.5': - resolution: {integrity: sha512-bIBFo+n6MIxdNcVFy5CrurbKiZQiUciK3bt8+O9I4wjFZNTfXLpi+giq47522eXqW5NBc9ulx7dR1SlZKi2J5g==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@bruits/satteri-darwin-arm64@0.10.5': resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==} cpu: [arm64] @@ -2966,6 +2915,250 @@ packages: '@oxc-project/types@0.75.0': resolution: {integrity: sha512-QMW+06WOXs7+F301Y3X0VpmWhwuQVc/X/RP2zF9OIwvSMmsif3xURS2wxbakFIABYsytgBcHpUcFepVS0Qnd3A==} + '@oxfmt/binding-android-arm-eabi@0.72.0': + resolution: {integrity: sha512-u4U1uaDOVBuorGNC/07NLm48nECHOiJJka002YGML16Md2DRvf38RGBt01lH60EOGvNlFVmbLoksQedNBoZHKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.72.0': + resolution: {integrity: sha512-GCnM+Ae2mWOKC+92y3FOb6eZJeVnBAVz82e3lITUUg+kxukYKzBNAvJ/hhHIfa2A0md55SYYhdWPddSSy3KPVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.72.0': + resolution: {integrity: sha512-LjQ8tlevdtwraFlWC6AnQ1Forzde0clRmnsP3QmK+ydSElDt/J+5Jc+m+//Ly1G97aP7WCNUw110QMIUw2K7xA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.72.0': + resolution: {integrity: sha512-+ZbcxhB1C34RQR5IldSyY6Z/yalJIxHXhP36PGE4sEq0f/lgL5jCLmOKoDeVm8dqd9gFGDsd1bNWHSGCAwdSkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.72.0': + resolution: {integrity: sha512-yGPhA8sePEBFV9iGcprhyOk3Bz3fZshswMH3DpYIPZFLT1DG5LjiZ0j6AJQpSueaL6bUK0av1K+5+fe+ldy5EQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.72.0': + resolution: {integrity: sha512-/g5axuqFMcAtoQrFLR5EJEMDjR5Ea4GuzpdDmMpPWAgrF1DmL4kD1NPNVlpXEOxpFJnD6lPvLKYj1lzdlrfifA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.72.0': + resolution: {integrity: sha512-InVitdHbS09PM+w+WinIiyX37rC9R3L7lUP9mKy9uKTEDSUFaLjWsLoreRIxKivnv7Ndqc6Trvi+K+b6ZzhiJg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.72.0': + resolution: {integrity: sha512-WKjlyRAxpPjXoqeuwFBim5LscgvY+RNEiZ971C9JlRQZONhJTsXDki/oHFYQE+fzzRpzXh3owZvOdT3kNL2g+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.72.0': + resolution: {integrity: sha512-poafnbsPpJhR+5Mbwpf8CscugTyiRAzjTOxRVn8ra3X2jnURs2xL5Du2xl5g2iW85lICMglpmLf8jDjZEbNgzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.72.0': + resolution: {integrity: sha512-zNUi0gKRsO7S3IfPzsTbnm88OedPuX32hmZFWZRWHvWJlAoZRwVbeO6Nb3hng4vDgL7qUKp4TGqzPz1mhsycYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.72.0': + resolution: {integrity: sha512-qTY7z/iyF/rWI2HWwWMevXqZW5PZUOofUy2afK7v6rseXnpld3yjgyIk6pCux3DqWQ0lB+f5atvLJNBwzLvFsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.72.0': + resolution: {integrity: sha512-w18qfo8vEMD6EKEHtzTvjc6jH8yCyXIT1Bn7PFWJd0PpZyzH/VQDx4xvjCh0LGz6GRzqiezbisTdG9AoXtpkZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.72.0': + resolution: {integrity: sha512-grW8HwEir+vK7fCcq1ZgL3NHQCfZ1PidiERE9Hbf+24xGys+DoDaoqTht4ccfn0PcBwbViLkwkda/KNpJu2KRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.72.0': + resolution: {integrity: sha512-wQJRQfWBRIn88Pkr449EUViwRayrYUScg7ty+Ihiem21mQ9BUA6S9e/4RAgyNk9lMag0KBouyKskjq61rOC0WQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.72.0': + resolution: {integrity: sha512-T1B0uQzafxuGPjjaPrZJ497nxoi1BiI65JfsYc56nNpmev3msfb/iaTmH2kQuNFqa8PKxpMlf3GhWrWBvBPORQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.72.0': + resolution: {integrity: sha512-OKxxgTurl7+hypVplO8QRAbbQlwEs0j1Y6FZv+ZN2qNbdxQk2muMlzuJNBGTCWwxQ0rkkOD1uK/DW1fvzoUSJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.72.0': + resolution: {integrity: sha512-L78TKzURqvjuZOCo88ixMbPXf/RP7u31Y0cmjJ/KEmrHmfYhmhEvsDaTYPiyTRne64jUgCbADfY0YeoQk4/Xyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.72.0': + resolution: {integrity: sha512-gQtFW+Ii8BWgtJTAD17TY/WsdNS5gUfAPov8iI1jeq4r9lRRYImmxPL08UU00/RLaCfBJwh2UgINnDY0iOiZ+A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.72.0': + resolution: {integrity: sha512-uhooIN+DCzWX5uH7mQkSVCsODqsGluGJ4n3ch4+mITtWKpESMDjUJUSDBAVFuYQDwqY2McPDKdKJbM0oZVW/Qw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.87.0': + resolution: {integrity: sha512-22tVIHlB9898OYsBKmYB6He1MCSqdTmK1BVWuSNUTVrpS0KWNege+U9uEYqGJ+KatQag0r/oU44i3OOs46z7HQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.87.0': + resolution: {integrity: sha512-JfZQ3MWf74n8ov0DojZpkOduIubYJvZL5tbTMMhDutsal6u1xH1QuNpN+lK+EQwF8AeAfgwTR2fgh5U2br27XA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.87.0': + resolution: {integrity: sha512-rkx6Xvvw93z2GImVOyvbZwAZcoY0Z6MJW177XNsSB+i/CBsH7ANyelTp01VZyIkM3iSXtqKVb4+ptBgPHap5pQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.87.0': + resolution: {integrity: sha512-cw5nYw7L/pQ2SgGBgOcg/Qo89llQre3vIc/kuBLhSICzu1r5s8L76H3ug6AIFsD98WpROj8/z5JVzkf4daxHaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.87.0': + resolution: {integrity: sha512-x/SuznE6loRZK9gz9AS4ZmzNzSu+5KdeoCS+sVHhnrE8HM6AD8UyTjwldQTTqlXGvkwHASgB0NiTNOc3o3PdAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.87.0': + resolution: {integrity: sha512-+JEDmCAXiiFmKhAjZhgAOwaHWY6WENOQ5QA+lFuY59tgsUCDOTRi46B+lENK6CWvtxsXpwkZXNOgpjAQcpIpnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.87.0': + resolution: {integrity: sha512-/uC9XqXLAC9AHFLNycwmSQEvKqGrOCgU+uXALI7gNW0DG81TJ/3T2eHnKdRvcb5R1gFEfjxDwI4e4zIa29rICQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.87.0': + resolution: {integrity: sha512-FTRYPsBy/M728vnUv7l+KAwSAa3Qi4BQbhVvy7NYuMTZ0sUa/OWsbMx79HVFw6u/5KWcaYayDsoOiv7xbevzDg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.87.0': + resolution: {integrity: sha512-6sC+N7IY0h1egd8SrYUGNN7CUyKJZ4bIZakKa7V7hfinf4jfi8Kq4+klJvFp5DqXcwMn44I5MeBwmJluO1odFg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.87.0': + resolution: {integrity: sha512-d5Mnn+ICbhoJPi37Ccjy+86T5qfH2+mSTrTMBXNPfB+wqSWOayBBLLIrCXdUy1YssluCVdGkl+DO9w5r5ODmUA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.87.0': + resolution: {integrity: sha512-sf5YWuUo1Dx9loqWCgF8P278MycfcD4JHjDC/LV5j11L3Lqa4PFiwCjD6B8kP4AjsgZZkLn3xbpJEtZBaccs4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.87.0': + resolution: {integrity: sha512-+aCraYbmK3uU3P0rFojjeaK9pGY6JvBDXh/0CM+gPyWKmNmXmnFe0qj4qj02U4ibFpbd9Pa9CmDvIdjJUd29rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.87.0': + resolution: {integrity: sha512-7rzbZQIljo6VLWVPqUyLa2P/WV3VFsJB4M52R4NCUJn1A50yjtUsHxiMHFL9opEKGFIiTbZ3VQzmtcJOPUq4NQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.87.0': + resolution: {integrity: sha512-Dry46Fa+AXE/xt9J/YriujU1pU9mzfNWHGQwtOYibAFH8HLrKWCi93AhIGnuUMiwn2JbuBkRyz51f50Ly4r4ow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.87.0': + resolution: {integrity: sha512-f/HMZez74gJvnRpGz+b5sdGyWrEgRLmFTXg9sNoqjPWogGxYHUhXKTKyMiYsu9rUGR2ciYqL3fk+Ua4JhMJbRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.87.0': + resolution: {integrity: sha512-lEC6ZfPZm/07JlB7FsOWX9o1RiHlXiBW594LSUGuXmekC8LZmvUPP9XzE2WZcNxJi5cHA/Fw56o02c3JxgMA5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.87.0': + resolution: {integrity: sha512-afBWKOD36dUiA9AenaiWpCg8xfyUVPYznyAAVXu413brK4RA5UI/Xoc4yfeGIT8G1a44MV+JR7hioryerBDzGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.87.0': + resolution: {integrity: sha512-daptNsEOuru4/nJTxV4DBHNJ5GepzmaBVQf+jjgKQGi9NRlZKik+RFq4hUL7ewsF1pwjKM+SkYaMbF82UwFGnw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.87.0': + resolution: {integrity: sha512-k+m/EShyXE29J/r1fjk0HlAzhN5JhIvj044oSJkXTEkCLrWZQgXb/3r4q5LTw/eaKW/4GuMXG2xmiJs3s5rPNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@pagefind/darwin-arm64@1.5.2': resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} cpu: [arm64] @@ -6801,6 +6994,32 @@ packages: resolution: {integrity: sha512-ov0NzaDCOInknS7mP1cwKdJERt3utPW8ldjtdUXQ8Ty0GEFD08wk422vCUN0d7pST6kqtV7dxoI9w1Zi0l/9TA==} engines: {node: ^20.19.0 || >=22.12.0} + oxfmt@0.72.0: + resolution: {integrity: sha512-16OQeL0uhPZbfmT9S9WWM0Nv9+BmVi8Ra1uTYaSKj/qSCs6FB30KOhz9JoNYw6thT+K5bVxsk/tSEOu497i34g==} + 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@1.87.0: + resolution: {integrity: sha512-drxVlaW7Oqq7wSy1CN25znRu00aRq8n57Q2wniJRxCmtYVz07ufCm7EVDPQFZURrTgQIjzKrVEHAD/HcvJXObg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=7.0.2003' + 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'} @@ -7735,6 +7954,10 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinypool@2.2.0: + resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} @@ -9141,65 +9364,30 @@ snapshots: '@biomejs/cli-win32-arm64': 2.3.8 '@biomejs/cli-win32-x64': 2.3.8 - '@biomejs/biome@2.5.5': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.5 - '@biomejs/cli-darwin-x64': 2.5.5 - '@biomejs/cli-linux-arm64': 2.5.5 - '@biomejs/cli-linux-arm64-musl': 2.5.5 - '@biomejs/cli-linux-x64': 2.5.5 - '@biomejs/cli-linux-x64-musl': 2.5.5 - '@biomejs/cli-win32-arm64': 2.5.5 - '@biomejs/cli-win32-x64': 2.5.5 - '@biomejs/cli-darwin-arm64@2.3.8': optional: true - '@biomejs/cli-darwin-arm64@2.5.5': - optional: true - '@biomejs/cli-darwin-x64@2.3.8': optional: true - '@biomejs/cli-darwin-x64@2.5.5': - optional: true - '@biomejs/cli-linux-arm64-musl@2.3.8': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.5': - optional: true - '@biomejs/cli-linux-arm64@2.3.8': optional: true - '@biomejs/cli-linux-arm64@2.5.5': - optional: true - '@biomejs/cli-linux-x64-musl@2.3.8': optional: true - '@biomejs/cli-linux-x64-musl@2.5.5': - optional: true - '@biomejs/cli-linux-x64@2.3.8': optional: true - '@biomejs/cli-linux-x64@2.5.5': - optional: true - '@biomejs/cli-win32-arm64@2.3.8': optional: true - '@biomejs/cli-win32-arm64@2.5.5': - optional: true - '@biomejs/cli-win32-x64@2.3.8': optional: true - '@biomejs/cli-win32-x64@2.5.5': - optional: true - '@bruits/satteri-darwin-arm64@0.10.5': optional: true @@ -10454,6 +10642,120 @@ snapshots: '@oxc-project/types@0.75.0': {} + '@oxfmt/binding-android-arm-eabi@0.72.0': + optional: true + + '@oxfmt/binding-android-arm64@0.72.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.72.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.72.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.72.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.72.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.72.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.72.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.72.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.72.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.72.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.87.0': + optional: true + + '@oxlint/binding-android-arm64@1.87.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.87.0': + optional: true + + '@oxlint/binding-darwin-x64@1.87.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.87.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.87.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.87.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.87.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.87.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.87.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.87.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.87.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.87.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.87.0': + optional: true + '@pagefind/darwin-arm64@1.5.2': optional: true @@ -14732,6 +15034,52 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.143.0 '@oxc-parser/binding-win32-x64-msvc': 0.143.0 + oxfmt@0.72.0: + dependencies: + tinypool: 2.2.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.72.0 + '@oxfmt/binding-android-arm64': 0.72.0 + '@oxfmt/binding-darwin-arm64': 0.72.0 + '@oxfmt/binding-darwin-x64': 0.72.0 + '@oxfmt/binding-freebsd-x64': 0.72.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.72.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.72.0 + '@oxfmt/binding-linux-arm64-gnu': 0.72.0 + '@oxfmt/binding-linux-arm64-musl': 0.72.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.72.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.72.0 + '@oxfmt/binding-linux-riscv64-musl': 0.72.0 + '@oxfmt/binding-linux-s390x-gnu': 0.72.0 + '@oxfmt/binding-linux-x64-gnu': 0.72.0 + '@oxfmt/binding-linux-x64-musl': 0.72.0 + '@oxfmt/binding-openharmony-arm64': 0.72.0 + '@oxfmt/binding-win32-arm64-msvc': 0.72.0 + '@oxfmt/binding-win32-ia32-msvc': 0.72.0 + '@oxfmt/binding-win32-x64-msvc': 0.72.0 + + oxlint@1.87.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.87.0 + '@oxlint/binding-android-arm64': 1.87.0 + '@oxlint/binding-darwin-arm64': 1.87.0 + '@oxlint/binding-darwin-x64': 1.87.0 + '@oxlint/binding-freebsd-x64': 1.87.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.87.0 + '@oxlint/binding-linux-arm-musleabihf': 1.87.0 + '@oxlint/binding-linux-arm64-gnu': 1.87.0 + '@oxlint/binding-linux-arm64-musl': 1.87.0 + '@oxlint/binding-linux-ppc64-gnu': 1.87.0 + '@oxlint/binding-linux-riscv64-gnu': 1.87.0 + '@oxlint/binding-linux-riscv64-musl': 1.87.0 + '@oxlint/binding-linux-s390x-gnu': 1.87.0 + '@oxlint/binding-linux-x64-gnu': 1.87.0 + '@oxlint/binding-linux-x64-musl': 1.87.0 + '@oxlint/binding-openharmony-arm64': 1.87.0 + '@oxlint/binding-win32-arm64-msvc': 1.87.0 + '@oxlint/binding-win32-ia32-msvc': 1.87.0 + '@oxlint/binding-win32-x64-msvc': 1.87.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -15884,6 +16232,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 + tinypool@2.2.0: {} + tinyrainbow@3.1.0: {} tmp-promise@3.0.3: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index aec5e43f7..c70f58705 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -38,7 +38,6 @@ catalog: "@ai-sdk/mcp": ^1.0.16 "@ai-sdk/openai": ^3.0.23 "@ai-sdk/react": ^3.0.232 - "@biomejs/biome": ^2.5.5 "@cloudflare/vite-plugin": ^1.31.0 "@cloudflare/vitest-pool-workers": 0.14.1 "@cloudflare/workers-oauth-provider": ^0.10.3 @@ -74,6 +73,8 @@ catalog: miniflare: 4.20260401.0 msw: ^2.10.2 open: ^10.1.2 + oxfmt: 0.72.0 + oxlint: 1.87.0 react: ^19.2.8 react-dom: ^19.2.8 react-markdown: ^9.1.0 @@ -94,21 +95,61 @@ catalog: zod: ^4.4.3 minimumReleaseAgeExclude: - - '@ai-sdk/gateway@3.0.153' - - '@ai-sdk/provider-utils@4.0.40' - - '@ai-sdk/react@3.0.232' + - "@ai-sdk/gateway@3.0.153" + - "@ai-sdk/provider-utils@4.0.40" + - "@ai-sdk/react@3.0.232" - ai@6.0.230 - agents@0.20.1 - - '@sentry/browser-utils@11.1.0' - - '@sentry/browser@11.1.0' - - '@sentry/bundler-plugins@11.1.0' - - '@sentry/cloudflare@11.1.0' - - '@sentry/core@11.1.0' - - '@sentry/feedback@11.1.0' - - '@sentry/node@11.1.0' - - '@sentry/opentelemetry@11.1.0' - - '@sentry/react@11.1.0' - - '@sentry/replay-canvas@11.1.0' - - '@sentry/replay@11.1.0' - - '@sentry/server-runtime-injection@11.1.0' - - '@sentry/server-utils@11.1.0' + - "@sentry/browser-utils@11.1.0" + - "@sentry/browser@11.1.0" + - "@sentry/bundler-plugins@11.1.0" + - "@sentry/cloudflare@11.1.0" + - "@sentry/core@11.1.0" + - "@sentry/feedback@11.1.0" + - "@sentry/node@11.1.0" + - "@sentry/opentelemetry@11.1.0" + - "@sentry/react@11.1.0" + - "@sentry/replay-canvas@11.1.0" + - "@sentry/replay@11.1.0" + - "@sentry/server-runtime-injection@11.1.0" + - "@sentry/server-utils@11.1.0" + - "@oxfmt/binding-android-arm-eabi@0.72.0" + - "@oxfmt/binding-android-arm64@0.72.0" + - "@oxfmt/binding-darwin-arm64@0.72.0" + - "@oxfmt/binding-darwin-x64@0.72.0" + - "@oxfmt/binding-freebsd-x64@0.72.0" + - "@oxfmt/binding-linux-arm-gnueabihf@0.72.0" + - "@oxfmt/binding-linux-arm-musleabihf@0.72.0" + - "@oxfmt/binding-linux-arm64-gnu@0.72.0" + - "@oxfmt/binding-linux-arm64-musl@0.72.0" + - "@oxfmt/binding-linux-ppc64-gnu@0.72.0" + - "@oxfmt/binding-linux-riscv64-gnu@0.72.0" + - "@oxfmt/binding-linux-riscv64-musl@0.72.0" + - "@oxfmt/binding-linux-s390x-gnu@0.72.0" + - "@oxfmt/binding-linux-x64-gnu@0.72.0" + - "@oxfmt/binding-linux-x64-musl@0.72.0" + - "@oxfmt/binding-openharmony-arm64@0.72.0" + - "@oxfmt/binding-win32-arm64-msvc@0.72.0" + - "@oxfmt/binding-win32-ia32-msvc@0.72.0" + - "@oxfmt/binding-win32-x64-msvc@0.72.0" + - "@oxlint/binding-android-arm-eabi@1.87.0" + - "@oxlint/binding-android-arm64@1.87.0" + - "@oxlint/binding-darwin-arm64@1.87.0" + - "@oxlint/binding-darwin-x64@1.87.0" + - "@oxlint/binding-freebsd-x64@1.87.0" + - "@oxlint/binding-linux-arm-gnueabihf@1.87.0" + - "@oxlint/binding-linux-arm-musleabihf@1.87.0" + - "@oxlint/binding-linux-arm64-gnu@1.87.0" + - "@oxlint/binding-linux-arm64-musl@1.87.0" + - "@oxlint/binding-linux-ppc64-gnu@1.87.0" + - "@oxlint/binding-linux-riscv64-gnu@1.87.0" + - "@oxlint/binding-linux-riscv64-musl@1.87.0" + - "@oxlint/binding-linux-s390x-gnu@1.87.0" + - "@oxlint/binding-linux-x64-gnu@1.87.0" + - "@oxlint/binding-linux-x64-musl@1.87.0" + - "@oxlint/binding-openharmony-arm64@1.87.0" + - "@oxlint/binding-win32-arm64-msvc@1.87.0" + - "@oxlint/binding-win32-ia32-msvc@1.87.0" + - "@oxlint/binding-win32-x64-msvc@1.87.0" + - oxfmt@0.72.0 + - oxlint@1.87.0 diff --git a/scripts/check-doc-links.mjs b/scripts/check-doc-links.mjs index 201175bed..b5a6ab15b 100644 --- a/scripts/check-doc-links.mjs +++ b/scripts/check-doc-links.mjs @@ -71,7 +71,7 @@ for (const file of files) { // 2) Flag at-prefixed repo-local references. These can force some agents to // inline the entire target file. const atPathRe = - /@(?:docs|packages|scripts)\/[A-Za-z0-9_.\-\/]+\.(?:mdc|md|ts|tsx|js|json)|@(?:AGENTS|README|TELEMETRY)\.md/g; + /@(?:docs|packages|scripts)\/[A-Za-z0-9_.\-/]+\.(?:mdc|md|ts|tsx|js|json)|@(?:AGENTS|README|TELEMETRY)\.md/g; for (const m of contentNoFences.matchAll(atPathRe)) { problems.push({ file: rel, diff --git a/scripts/oxc-config.test.mjs b/scripts/oxc-config.test.mjs new file mode 100644 index 000000000..31939e322 --- /dev/null +++ b/scripts/oxc-config.test.mjs @@ -0,0 +1,41 @@ +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { test } from "node:test"; + +function readRootJson(path) { + return JSON.parse( + readFileSync(new URL(`../${path}`, import.meta.url), "utf8"), + ); +} + +test("Oxlint retains its default correctness plugins alongside accessibility", () => { + const { plugins } = readRootJson(".oxlintrc.json"); + for (const plugin of ["eslint", "typescript", "unicorn", "oxc", "jsx-a11y"]) { + assert.ok(plugins.includes(plugin), `${plugin} plugin must remain enabled`); + } +}); + +test("editor uses Oxc for root and MCP while CLI retains Biome", () => { + const settings = readRootJson(".vscode/settings.json"); + const formatter = readRootJson(".oxfmtrc.json"); + const extensions = readRootJson(".vscode/extensions.json"); + + assert.equal(settings["editor.defaultFormatter"], "oxc.oxc-vscode"); + assert.equal( + settings["editor.codeActionsOnSave"]["source.fixAll.oxc"], + "explicit", + ); + assert.equal( + settings["editor.codeActionsOnSave"]["source.fixAll.biome"], + undefined, + ); + for (const language of ["[json]", "[typescript]", "[typescriptreact]"]) { + assert.notEqual( + settings[language]?.["editor.defaultFormatter"], + "biomejs.biome", + ); + } + assert.ok(formatter.ignorePatterns.includes("packages/cli/**")); + assert.ok(extensions.recommendations.includes("oxc.oxc-vscode")); + assert.ok(extensions.recommendations.includes("biomejs.biome")); +});