From 263a2c21a9e45cd946b1342b8bb52c3141a9e512 Mon Sep 17 00:00:00 2001 From: Dinh Le Date: Sat, 3 Oct 2026 14:21:31 +0700 Subject: [PATCH 1/3] chore: migrate linting, formatting and typecheck to uncheck Replace ESLint (@antfu/eslint-config, eslint-plugin-format), lint-staged and simple-git-hooks with uncheck, which runs sherif, oxlint, oxfmt and tsc behind one command, matching middleapi/standard-server. --- .claude/settings.json | 8 +- .github/dependabot.yml | 14 +- .github/workflows/ci.yaml | 6 +- .zed/settings.json | 56 +- README.md | 3 +- eslint.config.js | 18 - oxfmt.config.ts | 6 + oxlint.config.ts | 17 + package.json | 27 +- packages/downgrader/package.json | 33 +- packages/downgrader/tsconfig.json | 2 +- packages/types/package.json | 33 +- packages/types/tests/README.md | 2 +- packages/types/tsconfig.json | 2 +- pnpm-lock.yaml | 3080 +++-------------------------- pnpm-workspace.yaml | 1 - scripts/sync-sponsors.ts | 71 +- tsconfig.base.json | 23 - tsconfig.json | 2 +- tsconfig.lib.json | 12 - 20 files changed, 335 insertions(+), 3081 deletions(-) delete mode 100644 eslint.config.js create mode 100644 oxfmt.config.ts create mode 100644 oxlint.config.ts delete mode 100644 tsconfig.base.json delete mode 100644 tsconfig.lib.json diff --git a/.claude/settings.json b/.claude/settings.json index a97d6a6..75c4920 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,14 +1,12 @@ { "hooks": { - "PostToolUse": [ + "Stop": [ { - "matcher": "Write|Edit", "hooks": [ { "type": "command", - "command": "jq -r '.tool_input.file_path // .tool_response.filePath' | { read -r f; ./node_modules/.bin/eslint --no-warn-ignored --fix \"$f\"; } 2>/dev/null || true", - "timeout": 30, - "statusMessage": "Running eslint --fix" + "command": "pnpm exec uncheck hooks run --fix", + "timeout": 600 } ] } diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4549829..b0ba06b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,17 +10,17 @@ updates: default-days: 1 versioning-strategy: increase groups: - eslint: + uncheck: patterns: - - eslint - - '@antfu/eslint-config' - - 'eslint-plugin-*' + - uncheck + - oxlint + - oxfmt dev-dependencies-minor-patch: dependency-type: development exclude-patterns: - - eslint - - '@antfu/eslint-config' - - 'eslint-plugin-*' + - uncheck + - oxlint + - oxfmt update-types: - minor - patch diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index aa0ebbc..f1acaf1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -10,7 +10,7 @@ permissions: contents: read jobs: - lint_and_typecheck: + check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 @@ -19,9 +19,7 @@ jobs: - run: pnpm i - - run: pnpm run lint - - - run: pnpm run type:check + - run: pnpm run check test_matrix: runs-on: ubuntu-latest diff --git a/.zed/settings.json b/.zed/settings.json index 13410e9..ed49452 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -1,35 +1,14 @@ { "format_on_save": "on", - // Use ESLint's --fix: - "code_actions_on_format": { - "source.fixAll.eslint": true - }, - "formatter": [], - // Enable eslint for all supported languages - // Defaults only include https://github.com/search?q=repo%3Azed-industries%2Fzed%20eslint_languages&type=code - "languages": { - "HTML": { - "language_servers": ["...", "eslint"] - }, - "Markdown": { - "language_servers": ["...", "eslint"] - }, - "Markdown-Inline": { - "language_servers": ["...", "eslint"] - }, - "JSON": { - "language_servers": ["...", "eslint"] - }, - "JSONC": { - "language_servers": ["...", "eslint"] - }, - "YAML": { - "language_servers": ["...", "eslint"] - }, - "CSS": { - "language_servers": ["...", "eslint"] + "formatter": { + "external": { + "command": "./node_modules/.bin/oxfmt", + "arguments": ["--stdin-filepath", "{buffer_path}"] } - // Add other languages as needed + }, + // Apply oxlint's auto fixes on save: + "code_actions_on_format": { + "source.fixAll.oxc": true }, "lsp": { "typescript-language-server": { @@ -40,25 +19,6 @@ } } } - }, - "eslint": { - "settings": { - "workingDirectories": ["./"], - - // Silent the stylistic rules in your IDE, but still auto fix them - "rulesCustomizations": [ - { "rule": "style/*", "severity": "off", "fixable": true }, - { "rule": "format/*", "severity": "off", "fixable": true }, - { "rule": "*-indent", "severity": "off", "fixable": true }, - { "rule": "*-spacing", "severity": "off", "fixable": true }, - { "rule": "*-spaces", "severity": "off", "fixable": true }, - { "rule": "*-order", "severity": "off", "fixable": true }, - { "rule": "*-dangle", "severity": "off", "fixable": true }, - { "rule": "*-newline", "severity": "off", "fixable": true }, - { "rule": "*quotes", "severity": "off", "fixable": true }, - { "rule": "*semi", "severity": "off", "fixable": true } - ] - } } } } diff --git a/README.md b/README.md index 5858709..267adc0 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,7 @@ TypeScript tooling for the [OpenAPI Specification](https://spec.openapis.org/), ```bash pnpm install pnpm test -pnpm lint -pnpm type:check +pnpm check pnpm bench ``` diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 7343a4a..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import antfu from '@antfu/eslint-config' - -export default antfu({ - formatters: true, - rules: { - 'yaml/sort-keys': 'off', - 'pnpm/json-enforce-catalog': 'off', - 'pnpm/yaml-enforce-settings': 'off', - 'ts/method-signature-style': 'off', - 'guard-for-in': 'error', - }, -}, { - files: ['**/*.test.ts', '**/*.test-d.ts'], - rules: { - 'unused-imports/no-unused-vars': 'off', - 'antfu/no-top-level-await': 'off', - }, -}) diff --git a/oxfmt.config.ts b/oxfmt.config.ts new file mode 100644 index 0000000..d4174f6 --- /dev/null +++ b/oxfmt.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'oxfmt' +import { middleapi } from 'uncheck/oxfmt' + +export default defineConfig({ + ...middleapi, +}) diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 0000000..f45eb09 --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'oxlint' +import { middleapi } from 'uncheck/oxlint' + +export default defineConfig({ + extends: [middleapi], + rules: { + 'unicorn/no-thenable': 'off', + }, + overrides: [ + { + files: ['**/*.test.ts', '**/*.test-d.ts'], + rules: { + 'no-unused-vars': 'off', + }, + }, + ], +}) diff --git a/package.json b/package.json index 493a421..101a1ab 100644 --- a/package.json +++ b/package.json @@ -1,42 +1,33 @@ { "name": "@openapi-spec/repo", - "type": "module", "version": "0.3.0", + "private": true, "license": "MIT", + "type": "module", "scripts": { - "prepare": "simple-git-hooks", - "type:check": "pnpm run -r type:check && tsc", + "prepare": "uncheck prepare --pre-commit", + "check": "uncheck", + "fix": "uncheck --fix", "test": "vitest run", "test:coverage": "vitest run --coverage", "bench": "vitest bench --run", - "lint": "eslint .", - "lint:fix": "eslint --fix .", - "repo:fix": "sherif --fix", - "sync:sponsors": "node scripts/sync-sponsors.ts && eslint --fix '**/README.md'" + "sync:sponsors": "node scripts/sync-sponsors.ts && pnpm run fix '**/README.md'" }, "devDependencies": { - "@antfu/eslint-config": "^9.5.1", "@codspeed/vitest-plugin": "^5.7.1", "@seriousme/openapi-schema-validator": "^2.9.1", "@types/node": "^26.4.0", "@vitest/coverage-v8": "^4.1.11", "bumpp": "^12.3.0", "changelogithub": "^15.0.5", - "eslint": "^10.10.0", - "eslint-plugin-format": "^2.0.1", - "lint-staged": "^17.4.1", + "oxfmt": "^0.71.0", + "oxlint": "^1.86.0", "sherif": "^1.13.0", - "simple-git-hooks": "^2.13.1", "typescript": "^6.0.3", "unbuild": "^3.6.1", + "uncheck": "^0.1.0", "vitest": "^4.1.11" }, - "simple-git-hooks": { - "pre-commit": "pnpm lint-staged" - }, - "lint-staged": { - "*": "eslint --no-warn-ignored --fix" - }, "devEngines": { "packageManager": { "name": "pnpm", diff --git a/packages/downgrader/package.json b/packages/downgrader/package.json index 8d4d7ce..9041efb 100644 --- a/packages/downgrader/package.json +++ b/packages/downgrader/package.json @@ -1,19 +1,7 @@ { "name": "@openapi-spec/downgrader", - "type": "module", "version": "0.3.0", "description": "Downgrade OpenAPI specifications one minor version at a time: 3.2 to 3.1 and 3.1 to 3.0, for whole documents or individual schemas", - "license": "MIT", - "funding": [ - "https://github.com/sponsors/dinwwwh", - "https://opencollective.com/middleapi" - ], - "homepage": "https://github.com/middleapi/openapi-spec", - "repository": { - "type": "git", - "url": "git+https://github.com/middleapi/openapi-spec.git", - "directory": "packages/downgrader" - }, "keywords": [ "converter", "downgrade", @@ -27,6 +15,21 @@ "swagger", "typescript" ], + "homepage": "https://github.com/middleapi/openapi-spec", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/middleapi/openapi-spec.git", + "directory": "packages/downgrader" + }, + "funding": [ + "https://github.com/sponsors/dinwwwh", + "https://opencollective.com/middleapi" + ], + "files": [ + "dist" + ], + "type": "module", "sideEffects": false, "exports": { "./package.json": "./package.json", @@ -34,9 +37,6 @@ "./v3.2-to-v3.1": "./src/v3.2-to-v3.1.ts", "./v3.1-to-v3.0": "./src/v3.1-to-v3.0.ts" }, - "files": [ - "dist" - ], "publishConfig": { "exports": { "./package.json": "./package.json", @@ -58,8 +58,7 @@ } }, "scripts": { - "prepack": "unbuild", - "type:check": "tsc -b" + "prepack": "unbuild" }, "dependencies": { "@openapi-spec/types": "workspace:^" diff --git a/packages/downgrader/tsconfig.json b/packages/downgrader/tsconfig.json index 0e040b5..2252556 100644 --- a/packages/downgrader/tsconfig.json +++ b/packages/downgrader/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.lib.json", + "extends": "uncheck/tsconfig/middleapi/lib", "compilerOptions": { "tsBuildInfoFile": "out/.tsbuildinfo", "outDir": "out" diff --git a/packages/types/package.json b/packages/types/package.json index 7341c39..95d353d 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,19 +1,7 @@ { "name": "@openapi-spec/types", - "type": "module", "version": "0.3.0", "description": "TypeScript types for the OpenAPI Specification, covering versions 3.0, 3.1, and 3.2 with complete inline documentation", - "license": "MIT", - "funding": [ - "https://github.com/sponsors/dinwwwh", - "https://opencollective.com/middleapi" - ], - "homepage": "https://github.com/middleapi/openapi-spec", - "repository": { - "type": "git", - "url": "git+https://github.com/middleapi/openapi-spec.git", - "directory": "packages/types" - }, "keywords": [ "oas", "openapi", @@ -27,6 +15,21 @@ "types", "typescript" ], + "homepage": "https://github.com/middleapi/openapi-spec", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/middleapi/openapi-spec.git", + "directory": "packages/types" + }, + "funding": [ + "https://github.com/sponsors/dinwwwh", + "https://opencollective.com/middleapi" + ], + "files": [ + "dist" + ], + "type": "module", "sideEffects": false, "exports": { "./package.json": "./package.json", @@ -34,9 +37,6 @@ "./v3.1": "./src/v3.1.ts", "./v3.2": "./src/v3.2.ts" }, - "files": [ - "dist" - ], "publishConfig": { "exports": { "./package.json": "./package.json", @@ -58,7 +58,6 @@ } }, "scripts": { - "prepack": "unbuild", - "type:check": "tsc -b" + "prepack": "unbuild" } } diff --git a/packages/types/tests/README.md b/packages/types/tests/README.md index 05402cd..d050abd 100644 --- a/packages/types/tests/README.md +++ b/packages/types/tests/README.md @@ -1,6 +1,6 @@ # Real-document fixtures -Official OpenAPI documents embedded as TypeScript object literals. Each file types its document as the `OpenAPIObject` of the version module matching its `openapi` field, so `pnpm type:check` at the repository root compiles the whole corpus and fails whenever the types reject a valid document. The downgrader's corpus tests reuse the same fixtures as conversion input. +Official OpenAPI documents embedded as TypeScript object literals. Each file types its document as the `OpenAPIObject` of the version module matching its `openapi` field, so `pnpm check` at the repository root compiles the whole corpus and fails whenever the types reject a valid document. The downgrader's corpus tests reuse the same fixtures as conversion input. Sources (Apache-2.0, © the OpenAPI Initiative): diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json index 3e0f03d..b9efe9b 100644 --- a/packages/types/tsconfig.json +++ b/packages/types/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.lib.json", + "extends": "uncheck/tsconfig/middleapi/lib", "include": ["package.json", "src"], "exclude": [ "**/*.test.*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f476da5..924f05b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,9 +166,6 @@ importers: .: devDependencies: - '@antfu/eslint-config': - specifier: ^9.5.1 - version: 9.5.1(@typescript-eslint/typescript-estree@8.69.0(supports-color@7.2.0)(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(eslint-plugin-format@2.0.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(oxlint@1.80.0)(supports-color@7.2.0)(typescript@6.0.3)(vitest@4.1.11) '@codspeed/vitest-plugin': specifier: ^5.7.1 version: 5.7.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)(tinybench@2.9.0)(vite@7.3.6(@types/node@26.4.0)(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0))(vitest@4.1.11) @@ -187,27 +184,24 @@ importers: changelogithub: specifier: ^15.0.5 version: 15.0.5 - eslint: - specifier: ^10.10.0 - version: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-format: - specifier: ^2.0.1 - version: 2.0.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - lint-staged: - specifier: ^17.4.1 - version: 17.4.1 + oxfmt: + specifier: ^0.71.0 + version: 0.71.0 + oxlint: + specifier: ^1.86.0 + version: 1.86.0 sherif: specifier: ^1.13.0 version: 1.13.0 - simple-git-hooks: - specifier: ^2.13.1 - version: 2.13.1 typescript: specifier: ^6.0.3 version: 6.0.3 unbuild: specifier: ^3.6.1 version: 3.6.1(typescript@6.0.3) + uncheck: + specifier: ^0.1.0 + version: 0.1.0(oxfmt@0.71.0)(oxlint@1.86.0)(sherif@1.13.0)(typescript@6.0.3) vitest: specifier: ^4.1.11 version: 4.1.11(@types/node@26.4.0)(@vitest/coverage-v8@4.1.11)(vite@7.3.6(@types/node@26.4.0)(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) @@ -222,79 +216,6 @@ importers: packages: - '@antfu/eslint-config@9.5.1': - resolution: {integrity: sha512-BoQGe5lY9spYmGqtUOC6hWohxob4SNn+7o5nHsOXoLn+9vJqNGqC/2/vRoXbcOa3dT4Rx/ZV/Qkr6uf72KTbxQ==} - hasBin: true - peerDependencies: - '@angular-eslint/eslint-plugin': ^21.1.0 - '@angular-eslint/eslint-plugin-template': ^21.1.0 - '@angular-eslint/template-parser': ^21.1.0 - '@eslint-react/eslint-plugin': ^5.6.0 - '@next/eslint-plugin-next': '>=15.0.0' - '@prettier/plugin-xml': ^3.4.1 - '@unocss/eslint-plugin': '>=0.50.0' - astro-eslint-parser: '>=1.0.2' - eslint: ^9.10.0 || ^10.0.0 - eslint-plugin-astro: '>=1.2.0' - eslint-plugin-erasable-syntax-only: ^0.7.1 - eslint-plugin-format: '>=0.1.0' - eslint-plugin-jsx-a11y: '>=6.10.2' - eslint-plugin-react-refresh: ^0.5.0 - eslint-plugin-slop: '>=0.1.1' - eslint-plugin-solid: ^0.17.0 - eslint-plugin-sonarjs: '>=4.0.0' - eslint-plugin-svelte: '>=2.35.1' - eslint-plugin-vuejs-accessibility: ^2.4.1 - prettier-plugin-astro: ^0.14.0 - prettier-plugin-slidev: ^1.0.5 - svelte-eslint-parser: '>=0.37.0' - peerDependenciesMeta: - '@angular-eslint/eslint-plugin': - optional: true - '@angular-eslint/eslint-plugin-template': - optional: true - '@angular-eslint/template-parser': - optional: true - '@eslint-react/eslint-plugin': - optional: true - '@next/eslint-plugin-next': - optional: true - '@prettier/plugin-xml': - optional: true - '@unocss/eslint-plugin': - optional: true - astro-eslint-parser: - optional: true - eslint-plugin-astro: - optional: true - eslint-plugin-erasable-syntax-only: - optional: true - eslint-plugin-format: - optional: true - eslint-plugin-jsx-a11y: - optional: true - eslint-plugin-react-refresh: - optional: true - eslint-plugin-slop: - optional: true - eslint-plugin-solid: - optional: true - eslint-plugin-sonarjs: - optional: true - eslint-plugin-svelte: - optional: true - eslint-plugin-vuejs-accessibility: - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-slidev: - optional: true - svelte-eslint-parser: - optional: true - - '@antfu/install-pkg@2.0.1': - resolution: {integrity: sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ==} - '@babel/code-frame@8.0.0': resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} engines: {node: ^22.18.0 || >=24.11.0} @@ -324,20 +245,6 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@cacheable/memory@2.2.0': - resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - - '@cacheable/utils@2.5.0': - resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - - '@clack/core@1.4.3': - resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} - engines: {node: '>= 20.12.0'} - - '@clack/prompts@1.7.0': - resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} - engines: {node: '>= 20.12.0'} - '@codspeed/core@5.7.1': resolution: {integrity: sha512-7mrFkqaY14rXu3XHv3o7bK3btLK0LFRxfeK3bQC8dLduI/Ty9eq8Hv8rx04FAY/onQbRTx3rUUQg5xprYHpATQ==} @@ -351,38 +258,6 @@ packages: '@colordx/core@5.6.0': resolution: {integrity: sha512-EDlcg/Hmlj1WuFh/Os9YhA+A2aasB2XlgwFfGePUDuW7fVHC07HBi5AFIMx0Ct1eM8kHM9NRyOtZ0MuVYa8xvg==} - '@dprint/formatter@0.5.1': - resolution: {integrity: sha512-cdZUrm0iv/FnnY3CKE2dEcVhNEzrC551aE2h2mTFwQCRBrqyARLDnb7D+3PlXTUVp3s34ftlnGOVCmhLT9DeKA==} - - '@dprint/markdown@0.21.1': - resolution: {integrity: sha512-XbZ/R7vRrBaZFYXG6vAvLvtaMVXHu8XB+xwie7OYrG+dPoGDP8UADGirIbzUyX8TmrAZcl6QBmalipTGlpzRmQ==} - - '@dprint/toml@0.7.0': - resolution: {integrity: sha512-eFaQTcfxKHB+YyTh83x7GEv+gDPuj9q5NFOTaoj5rZmQTbj6OgjjMxUicmS1R8zYcx8YAq5oA9J3YFa5U6x2gA==} - - '@e18e/eslint-plugin@0.8.0': - resolution: {integrity: sha512-js/TeM+XJyoJ2Zk4if5uTEchv3MEbqugc9gLgq8YdB6Dy+LvwGACpQiAwcul0r4LUl0TvhuzAKUeIUPtGp2cew==} - peerDependencies: - eslint: ^9.0.0 || ^10.0.0 - oxlint: ^1.72.0 - peerDependenciesMeta: - eslint: - optional: true - oxlint: - optional: true - - '@es-joy/jsdoccomment@0.92.0': - resolution: {integrity: sha512-WivZqV5jPTYDQJgIMp0hTsyQESKYNY6yCJr4b0l84tYtQntkAMkc6zARh2vlRQyeg4aYHPUkCUDpvr2IWAiGpQ==} - engines: {node: ^22.22.2 || >=24.15.0} - - '@es-joy/jsdoccomment@0.96.0': - resolution: {integrity: sha512-nvtxrDqAJOKMPSsMHqshCnHvnCqFnJTsKpTaTSaZoUi9VxGVe2JvgQeAY/Qvh2wyqXByIAqNTgI7h9elXzn0yQ==} - engines: {node: ^22.22.2 || >=24.15.0} - - '@es-joy/resolve.exports@1.2.0': - resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} - engines: {node: '>=10'} - '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -695,83 +570,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-plugin-eslint-comments@4.7.2': - resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - - '@eslint-community/eslint-utils@4.10.1': - resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/compat@2.1.1': - resolution: {integrity: sha512-rMcy8GSrwNzcISX/BlTDY/GLB4eCopEuy9woIls3To+15OLxykZrxxq+WUcylCPCQ6F4MujjBM1DX5V1aqI3Vw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^8.40 || 9 || 10 - peerDependenciesMeta: - eslint: - optional: true - - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/config-helpers@0.7.0': - resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/css-tree@4.1.0': - resolution: {integrity: sha512-cg0ohyrAG3swyGqt8t1K/OK97DqBw/ftDvlvyY1fmEst5B40UOmsimwLENq74z2dyw5CDM+3zJIW+CV2nFNDdA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/markdown@8.0.3': - resolution: {integrity: sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/plugin-kit@0.7.3': - resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} - - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -788,15 +586,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@keyv/bigmap@1.3.1': - resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} - engines: {node: '>= 18'} - peerDependencies: - keyv: ^5.6.0 - - '@keyv/serialize@1.1.1': - resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@napi-rs/lzma-linux-x64-gnu@1.5.1': resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} engines: {node: ^22.20 || ^24.12 || >=25} @@ -804,258 +593,250 @@ packages: os: [linux] libc: [glibc] - '@ota-meshi/ast-token-store@0.3.0': - resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@oxfmt/binding-android-arm-eabi@0.35.0': - resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} + '@oxfmt/binding-android-arm-eabi@0.71.0': + resolution: {integrity: sha512-l31EyBfB4egJeFua11aQFEUE9nnDtfpWCadqQovm0WL30t/yUHtdFl/5HyFXvd5xT8Ewh3U4TI9f30GowrQ1fw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.35.0': - resolution: {integrity: sha512-/O+EbuAJYs6nde/anv+aID6uHsGQApyE9JtYBo/79KyU8e6RBN3DMbT0ix97y1SOnCglurmL2iZ+hlohjP2PnQ==} + '@oxfmt/binding-android-arm64@0.71.0': + resolution: {integrity: sha512-E8q39SUZzSXQ08oZoFoTkxRADkdBNgL6De4qgZYr2O4JCunwqrZwAyCebxIF3yVHBafHM30WUkhTkDi+jNYZOw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.35.0': - resolution: {integrity: sha512-pGqRtqlNdn9d4VrmGUWVyQjkw79ryhI6je9y2jfqNUIZCfqceob+R97YYAoG7C5TFyt8ILdLVoN+L2vw/hSFyA==} + '@oxfmt/binding-darwin-arm64@0.71.0': + resolution: {integrity: sha512-pTteTrN88DicrmJ3DocBmpNDa6Umfh0iveEG8rnAlDFQpclmtDS7hnIvZbIEV9mDO0Ot1U0sjtoJQ1itd/ZMhQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.35.0': - resolution: {integrity: sha512-8GmsDcSozTPjrCJeGpp+sCmS9+9V5yRrdEZ1p/sTWxPG5nYeAfSLuS0nuEYjXSO+CtdSbStIW6dxa+4NM58yRw==} + '@oxfmt/binding-darwin-x64@0.71.0': + resolution: {integrity: sha512-G5melRC3IiNEgXlNKJhSExJYQGAQIppHFp2cl/wFrqQcEwmc4k4TkrHaFTR29SDudjoW5AZq5cXPGJDqtlH/Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.35.0': - resolution: {integrity: sha512-QyfKfTe0ytHpFKHAcHCGQEzN45QSqq1AHJOYYxQMgLM3KY4xu8OsXHpCnINjDsV4XGnQzczJDU9e04Zmd8XqIQ==} + '@oxfmt/binding-freebsd-x64@0.71.0': + resolution: {integrity: sha512-Hb1P5yKb9aiH2VSbm3Ml37mKjzqpunYet9krw/YK7V5JsAUJDQlju3Yk/dEqQvJD/usBvpi01Vbk9ZDNo0a8Cw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': - resolution: {integrity: sha512-u+kv3JD6P3J38oOyUaiCqgY5TNESzBRZJ5lyZQ6c2czUW2v5SIN9E/KWWa9vxoc+P8AFXQFUVrdzGy1tK+nbPQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.71.0': + resolution: {integrity: sha512-r7n4JEO+rkp0kaP3ia+0hv6FzK3PQIHqaF0jxGuhjJ4JHVX9ZVRbgpDVDW+OloyuJsRWpWFDKIHe8gfl1p/4mQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.35.0': - resolution: {integrity: sha512-1NiZroCiV57I7Pf8kOH4XGR366kW5zir3VfSMBU2D0V14GpYjiYmPYFAoJboZvp8ACnZKUReWyMkNKSa5ad58A==} + '@oxfmt/binding-linux-arm-musleabihf@0.71.0': + resolution: {integrity: sha512-EEynTF4nakgqDhVCmd3cHQCmTcw0BM8ea6eHigTdtZ3yxdsBNv+dYkt+OpDDZx1n/jzjI7J+Ht7IgkqFWuJUxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.35.0': - resolution: {integrity: sha512-7Q0Xeg7ZnW2nxnZ4R7aF6DEbCFls4skgHZg+I63XitpNvJCbVIU8MFOTZlvZGRsY9+rPgWPQGeUpLHlyx0wvMA==} + '@oxfmt/binding-linux-arm64-gnu@0.71.0': + resolution: {integrity: sha512-7VgJIrywCwR/G6YMv+HqsccUt8Z4q4mbM2xR+Ry/6AeMk4pCmZ9aO4Srd3mmrvVu8PsCZGP7oHEHSXWTmyloaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.35.0': - resolution: {integrity: sha512-5Okqi+uhYFxwKz8hcnUftNNwdm8BCkf6GSCbcz9xJxYMm87k1E4p7PEmAAbhLTk7cjSdDre6TDL0pDzNX+Y22Q==} + '@oxfmt/binding-linux-arm64-musl@0.71.0': + resolution: {integrity: sha512-AOCaminv/+fhinUXKvtPZT4POhNYmN9GfvaJdgJa1AbvuzClWGwDIXfJg8eu3sYaVL2B68jNvmS7LZGAYa0z3A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.35.0': - resolution: {integrity: sha512-9k66pbZQXM/lBJWys3Xbc5yhl4JexyfqkEf/tvtq8976VIJnLAAL3M127xHA3ifYSqxdVHfVGTg84eiBHCGcNw==} + '@oxfmt/binding-linux-ppc64-gnu@0.71.0': + resolution: {integrity: sha512-0SHxuaa4QRLM7jfsd8wc6L7KdLg+FR6/ah9k1eAvcrK/Sni7oxchMvsjwUsyakVAta+wBVDkjJTr7/RFU0uUGA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.35.0': - resolution: {integrity: sha512-aUcY9ofKPtjO52idT6t0SAQvEF6ctjzUQa1lLp7GDsRpSBvuTrBQGeq0rYKz3gN8dMIQ7mtMdGD9tT4LhR8jAQ==} + '@oxfmt/binding-linux-riscv64-gnu@0.71.0': + resolution: {integrity: sha512-UNKj1+rPorTK6uSlQzpN96vDNbHbL/63zcpznweo0ImQdkDdtQCS7G3puxX++2cESPKT2B56Y6DICUmFTJde5A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.35.0': - resolution: {integrity: sha512-C6yhY5Hvc2sGM+mCPek9ZLe5xRUOC/BvhAt2qIWFAeXMn4il04EYIjl3DsWiJr0xDMTJhvMOmD55xTRPlNp39w==} + '@oxfmt/binding-linux-riscv64-musl@0.71.0': + resolution: {integrity: sha512-5cVXKj7a0mWu7GU6/bZgNyv+KtLgM5S9cnT26Os2/abj8pK/bklHsbdYEHGLLniGjNYkyzwem8mZciPCaDtilw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.35.0': - resolution: {integrity: sha512-RG2hlvOMK4OMZpO3mt8MpxLQ0AAezlFqhn5mI/g5YrVbPFyoCv9a34AAvbSJS501ocOxlFIRcKEuw5hFvddf9g==} + '@oxfmt/binding-linux-s390x-gnu@0.71.0': + resolution: {integrity: sha512-lNpcMuZvyU1V/CY5h19hac03m4E4PLSYRckcxZOynSPojI4Mwt6nEu9wT/gVf0bclH3xGEWjwqApnSTgjkd2oA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.35.0': - resolution: {integrity: sha512-wzmh90Pwvqj9xOKHJjkQYBpydRkaXG77ZvDz+iFDRRQpnqIEqGm5gmim2s6vnZIkDGsvKCuTdtxm0GFmBjM1+w==} + '@oxfmt/binding-linux-x64-gnu@0.71.0': + resolution: {integrity: sha512-5/Z6pUewQpknXqC4/ykK6Zc6RiteAnPem1Ci7K1RZLVF6w6MMjwHjR4vsjijW4Czidgv7HKeVglGjElADliT9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.35.0': - resolution: {integrity: sha512-+HCqYCJPCUy5I+b2cf+gUVaApfgtoQT3HdnSg/l7NIcLHOhKstlYaGyrFZLmUpQt4WkFbpGKZZayG6zjRU0KFA==} + '@oxfmt/binding-linux-x64-musl@0.71.0': + resolution: {integrity: sha512-uVdG2N/4GEbOeljpQ+xv+NeEwJWJGj0WaxSiSYnoiqIYy3RWrWd3rGUmxWXP1A8+ferNvvwFoDAtvgsDUvBuSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.35.0': - resolution: {integrity: sha512-kFYmWfR9YL78XyO5ws+1dsxNvZoD973qfVMNFOS4e9bcHXGF7DvGC2tY5UDFwyMCeB33t3sDIuGONKggnVNSJA==} + '@oxfmt/binding-openharmony-arm64@0.71.0': + resolution: {integrity: sha512-1LwEZmSDRFKeBaGd/Hgj2xI3SmgGFpF4YtgkSx0sTYdTiZfHWbcFvRIBjL1YiDNdQd9Khda3Ij8CoqBULjskDg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.35.0': - resolution: {integrity: sha512-uD/NGdM65eKNCDGyTGdO8e9n3IHX+wwuorBvEYrPJXhDXL9qz6gzddmXH8EN04ejUXUujlq4FsoSeCfbg0Y+Jg==} + '@oxfmt/binding-win32-arm64-msvc@0.71.0': + resolution: {integrity: sha512-5tplmkeMXmza3PUptJQy25wCPJbIAg5g5r7zs+DI+7eEYOqbY+7roMdSH2zbDvv1Pb4oTDJ6NWYx9IRxBxXwhQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.35.0': - resolution: {integrity: sha512-oSRD2k8J2uxYDEKR2nAE/YTY9PobOEnhZgCmspHu0+yBQ665yH8lFErQVSTE7fcGJmJp/cC6322/gc8VFuQf7g==} + '@oxfmt/binding-win32-ia32-msvc@0.71.0': + resolution: {integrity: sha512-T2LWgh3Vx4PYDjtcqRRGDyCsVxeF/VE5xTpUQiCm65bNLwMpRnJYj6Hlkf6qRM3+jxCIOqHD1kVHNQCCiAVMNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.35.0': - resolution: {integrity: sha512-WCDJjlS95NboR0ugI2BEwzt1tYvRDorDRM9Lvctls1SLyKYuNRCyrPwp1urUPFBnwgBNn9p2/gnmo7gFMySRoQ==} + '@oxfmt/binding-win32-x64-msvc@0.71.0': + resolution: {integrity: sha512-L06SVp7Hu1EQTkh3+PHnKK26dxVbEpOG2InMwCooTE4MA437b5FgfTleCCiGn4ykISHnHU6UHaIg7SiMO7rBHA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.80.0': - resolution: {integrity: sha512-RM3Plj+biQpxa5d1GOOX6ciDlcUROmm4OZ/pLTpitkQt2mJv4jhtY4cbgaetOm5UKWZe05/TGQ6o1Vl8EOHkrA==} + '@oxlint/binding-android-arm-eabi@1.86.0': + resolution: {integrity: sha512-63Ozq6yQn79B2UxjSZ9huJmI+3/ZPI7hxAe6TyFh9oQL447KnIMoffOdtog+h4KILbQr61ZRvFPW5gYbAUgpgQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.80.0': - resolution: {integrity: sha512-YlO5JEf0Yr2bUUlu8O8daVcUxtcGGbcSmyV7E7nSbJbfAdxTE0PFPwgnIlw7wXJaTYjb+qs5hI5q3jxUkI7cAw==} + '@oxlint/binding-android-arm64@1.86.0': + resolution: {integrity: sha512-JdLGp44phbf/0Du236Dt06yfK6Qw8xhTFeDvHJdjk167r59OfP5+BL31mgMYVnswS8e+j6tFuccSY0QDC/lgCw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.80.0': - resolution: {integrity: sha512-BULDOyO3AhsmdWfQeIUCykDt3dd7XZBGLhp1eIh56skRv01O+cNjNPwXMIbeW1x4+pxcln5if72wcRgViVo7PA==} + '@oxlint/binding-darwin-arm64@1.86.0': + resolution: {integrity: sha512-h+vkOr4ik6KLFCXdtNVEj9xfnXfNUpPoF95QjORdhiSpLqQePzcN81kGHjAgsw1/G7WBWK5KsFKbI2UK8EyzMA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.80.0': - resolution: {integrity: sha512-YJ4JzLw7N5TDSQFlA0hAQGHvnDZgyypm1yunObVWcWiF9KM7eGCJKYKLgTC2Fi/57OdnBhbj4OkzPGdFQJ6HyA==} + '@oxlint/binding-darwin-x64@1.86.0': + resolution: {integrity: sha512-wbglRuH5eKsp68keTOOeKDHU1astWSRYFsh2bwKQTAPb44rD6kVgzYI1ZrAJRTc6/7PH55ZXFCQx0rQXrj0UdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.80.0': - resolution: {integrity: sha512-AYUIk5QnL0s8oWAYsREZwkRYy1SupJTXALo93J1TgzHywxQtdM99FecRMQ87MXEdPQ0j1TmEpeeq3fGNkpvMqg==} + '@oxlint/binding-freebsd-x64@1.86.0': + resolution: {integrity: sha512-yTQ7QSOlNfQsrfbeVweTiegQJLKPjUKgXp/JpGiFzza6Hp29S9LAoH77TM3L0RjK39iQRZB5lk5iq2t241Mfag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.80.0': - resolution: {integrity: sha512-9hBZVANupQ89W9dXyE0n8doCyaW5pDyGn3y6XlIMPZ+rIKuyqkr3SNUXmVJIhuvUq0NBU3RBiSXXE69l4XI6KA==} + '@oxlint/binding-linux-arm-gnueabihf@1.86.0': + resolution: {integrity: sha512-QYJGy0E2Tv8GAayyBIeHFTwQb8u+zrvrOYrifuDGZDr9ad5XsDhiMScpZymhS9fwWjqrgG2ZUwT4vpY0ISqp4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.80.0': - resolution: {integrity: sha512-SvS2uKqzY+pbfuvAHzH4338R6Zwo805GAwrIMVvK1KxoOWCIjZUdfzTCvilD7z6JK91v011+zYMryabhDo2AsQ==} + '@oxlint/binding-linux-arm-musleabihf@1.86.0': + resolution: {integrity: sha512-oQo83CafLT8p3qh0AGkN0tSUIh5Hm63mfDsoqUmBQUBnSZLNBAbyRaAftfGY5a0cKZ34dG6jAtMYgcY5kZqt5g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.80.0': - resolution: {integrity: sha512-tCLadyqRVL3pQTRPNg7cjXKvcvS4fbyXeQHhKk5BTJ1oftQln5/yIIWbu/Xom/DX41zv2P9QGt6+D/TtQVtY3A==} + '@oxlint/binding-linux-arm64-gnu@1.86.0': + resolution: {integrity: sha512-EM6wy5c2UM12qPb7iDJDBAZvHyfEJGH6iosFgaFiaRZpirz99//EHcUyD2KAskz07x1TULuiAtsojf4nvWWksw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.80.0': - resolution: {integrity: sha512-XfpCNRlOPcLlJl4Bn/FUhjqlR6BVavEykERBf/MV7YA9VZDa5g5znVqYhyviMafcxS9Pe/i/kPvHNO0U6svEHQ==} + '@oxlint/binding-linux-arm64-musl@1.86.0': + resolution: {integrity: sha512-vCiUQb9ZNzZalxYRU4mlZwUqT5f+c7Sk9DwUOplWHtik3Dl4r3DVnUB5tBeRuTAUe6MUVCTylNW7TkkN8J1oTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.80.0': - resolution: {integrity: sha512-3I4yMwcFG9NeO8ioY6JBBuKsIm5GL/x7MATt1S4tVWaxPu5HcJ+XnLUbcVBTxG8q2Wu56HSj+NmXQiVYb1lp6A==} + '@oxlint/binding-linux-ppc64-gnu@1.86.0': + resolution: {integrity: sha512-T0AzE89yjTYmOhB/hb6i+rWTpe2mYt+xiguBhs9DEPIJTZ1H8OYqsE4VxJHHw2Wlq8Mztwvp2P8NV87ZOuhPRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.80.0': - resolution: {integrity: sha512-E1wAKymkpe1/E8helzBKdm81OBOF+ezxRyXRMEuik3ZpWDER5CPOKZwF66RsdwW98uwZv8UTFremUQtC1CzdJA==} + '@oxlint/binding-linux-riscv64-gnu@1.86.0': + resolution: {integrity: sha512-s49r0K2f5Oc7fJoMUO1WkdhYK5Ob79uYRwWQ/XNoGysaOq3RUGmGUbHSuXiyydTTA+P9xEdDEnnlZVXiaSJhlw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.80.0': - resolution: {integrity: sha512-+gLRGD4sIo3+VA++iham5UxD9tKSoJ/VOrROCEXIcknrYtQg6iIQgvjN0cpiRF7N6UYC7pJbvHJlDnMge5LRpQ==} + '@oxlint/binding-linux-riscv64-musl@1.86.0': + resolution: {integrity: sha512-JIa2tYR8ayb3nvcMSZzn4O/xTy13S7MHllu7cBD+B5qDQXXSRy/Vwk1aNpiTjZmBJGwKCHOy/NvnY5Xcwg27uQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.80.0': - resolution: {integrity: sha512-aR0PrzHj9leW3NmzBAAP4EzdoBNoJcs9sjnIQPIwyRnBGYrRbXUIpEB5Q39AqK3PLY5JK5uEhDQDiUa1QSAstw==} + '@oxlint/binding-linux-s390x-gnu@1.86.0': + resolution: {integrity: sha512-XwXMyBsAuWZkhZU74UNcfQKr1CJJAKnS80dZzOnjl6A4fKcf91IjFgidegQugMHA5SN8ulwDXEDV1yPntjXgQQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.80.0': - resolution: {integrity: sha512-vSVh5cSo3Xxs6ghBCcFJlpbkbENzDog1qXtoXLa/HC3aCrR4XO76GZbXmQoCPHnu99nQpdCeC3H9tdNICfDh7A==} + '@oxlint/binding-linux-x64-gnu@1.86.0': + resolution: {integrity: sha512-C1WjukSyMnr66b+w1/tV8RFVv6d9v0MzDf4p9IxVXknqgmTHBgZh1pccN1eHzFr0b9Tbb3OXoPsAAdAuHAQfeA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.80.0': - resolution: {integrity: sha512-FfzBXpNQ8u7/ZI/p8bl73MeZ508Ax3hxWp3SiJpEFiC+BB9XcXy5FAZHTLKDPSzrUpxQZSZJAVdDmuJp/+HDBQ==} + '@oxlint/binding-linux-x64-musl@1.86.0': + resolution: {integrity: sha512-ap6KLmvC38c6MdYzsIh25cXQupqYvjd37tMNftzrX1DCtkX1Gcf2B+S2B17dD4lKa5c5gJog7DQJyDo82PBKyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.80.0': - resolution: {integrity: sha512-zMzbkumtmprCgRwoYNzcB3iC39fXdJIMLMU33KdCjEGLlJGOEt1+LwQ4LF8ndLzAEKVz4BR0y3V6Xrkk3Nm3yA==} + '@oxlint/binding-openharmony-arm64@1.86.0': + resolution: {integrity: sha512-996Q9w/2GLwNyy5Djs39Jt09aFlr4b7TPhoj7dvo5FHmcyiF68nPz73HNc5UAYKIYeK+M9JzPQ4Wg1r1dXvP6A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.80.0': - resolution: {integrity: sha512-ib6iRcrXsk4t1fm3iKcwksyWh1ZkZXC/2mEzakl0ai2+6HZunf1WWMZ/xP9EJAvw9g9K4UVTC3NF/+G2qLrbTQ==} + '@oxlint/binding-win32-arm64-msvc@1.86.0': + resolution: {integrity: sha512-9uTCHYTknNkug5+46ViSoUMuOuGWK61D87QnblU6CXaWKJC630Z7dbls61vdHxya/cR2ycQZ6Mm6ckgF6Cag5g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.80.0': - resolution: {integrity: sha512-xhRWBMpLxZvgKAH6+DJZmpP+W8Y8UdQOSU1JfxSWNXsaBaRGW77j+1hCuNHlzj7OH4SPN8fYd1q0o2qrDtoVyw==} + '@oxlint/binding-win32-ia32-msvc@1.86.0': + resolution: {integrity: sha512-a47ga7EKVfMU8rO0i1m3mGwfNRj3FhQyt1d/ukO/E9u1HHF3KpR3tyb3VhuJBGEVPF8uR4exSyHUyx7xbE+uxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.80.0': - resolution: {integrity: sha512-yAnO7lwBYQnz2pcfBPIGQQZWIX5zd5R/1aAKIF3oE+TVj7IhoHcROjOkz3sRDngzqhfPKfFaXqug5j5rE5dn6Q==} + '@oxlint/binding-win32-x64-msvc@1.86.0': + resolution: {integrity: sha512-az4dzifCRzES1crwu6pDFXzJTIanrdxXFL9TbiJWrx9LKcuacbR83aPvxDA1LKLNswi/RoqitC7Afcflhu3zBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@pkgr/core@0.3.6': - resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} - engines: {node: ^14.18.0 || >=16.0.0} - '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} @@ -1255,117 +1036,24 @@ packages: resolution: {integrity: sha512-EgGqVIP8xiKHmNTHWbrxec+RhD/WPUay7D/erEc7vWoZKxTT9f2aCEu1egKVpxcEbT1z0wdAbWFR9o2Is5FJEw==} hasBin: true - '@sindresorhus/base62@1.0.0': - resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} - engines: {node: '>=18'} - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@stylistic/eslint-plugin@5.10.0': - resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^9.0.0 || ^10.0.0 - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/hast@3.0.5': - resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/katex@0.16.8': - resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@26.4.0': resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@typescript-eslint/eslint-plugin@8.69.0': - resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.69.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/parser@8.69.0': - resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.69.0': - resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.69.0': - resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.69.0': - resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.69.0': - resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.69.0': - resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.69.0': - resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.69.0': - resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/visitor-keys@8.69.0': - resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@4.1.11': resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==} peerDependencies: @@ -1375,22 +1063,6 @@ packages: '@vitest/browser': optional: true - '@vitest/eslint-plugin@1.6.27': - resolution: {integrity: sha512-X1RCAfwbatG4GFbJ/1PIHP9MSZMt0JJThqbYID+vS4L783k6QGlLPe421wQE8dHXuGCcenVLsydiM4qzsYWxhg==} - engines: {node: '>=18'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '*' - eslint: '>=8.57.0' - typescript: '>=5.0.0' - vitest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - typescript: - optional: true - vitest: - optional: true - '@vitest/expect@4.1.11': resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} @@ -1420,26 +1092,6 @@ packages: '@vitest/utils@4.1.11': resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} - '@vue/compiler-core@3.5.42': - resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==} - - '@vue/compiler-dom@3.5.42': - resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==} - - '@vue/compiler-sfc@3.5.42': - resolution: {integrity: sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==} - - '@vue/compiler-ssr@3.5.42': - resolution: {integrity: sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==} - - '@vue/shared@3.5.42': - resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} @@ -1465,9 +1117,6 @@ packages: ajv: optional: true - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -1479,10 +1128,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - are-docs-informative@0.1.1: - resolution: {integrity: sha512-sqRsNQBwbKLRX0jV5Cu5uzmtflf892n4Vukz7T659ebL4pz3mpOqCMU7lxMoBTFwnp10E3YB5ZcyHM41W5bcDA==} - engines: {node: '>=18'} - args-tokenizer@0.3.0: resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} @@ -1506,10 +1151,6 @@ packages: axios@1.20.0: resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - baseline-browser-mapping@2.11.20: resolution: {integrity: sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==} engines: {node: '>=6.0.0'} @@ -1522,10 +1163,6 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@5.0.9: - resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} - engines: {node: 20 || >=22} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1535,10 +1172,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - builtin-modules@5.3.0: - resolution: {integrity: sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==} - engines: {node: '>=18.20'} - bumpp@12.3.0: resolution: {integrity: sha512-YgW09sgbIGQmAD/Jk7FEGP0tm0PeDz+Zgk+IAk+MOHhb/98pj/l3CgkxSjd7C1O99JPxTNwS+bPOTNaHuNh6lQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} @@ -1568,9 +1201,6 @@ packages: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} - cacheable@2.5.0: - resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1581,16 +1211,10 @@ packages: caniuse-lite@1.0.30001810: resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - change-case@5.4.4: - resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - changelogen@0.5.7: resolution: {integrity: sha512-cTZXBcJMl3pudE40WENOakXkcVtrbBpbkmSkM20NdRiUqa4+VYRdXdEsgQ0BNQ6JBE2YymTNWtPKVF7UCTN5+g==} hasBin: true @@ -1600,9 +1224,6 @@ packages: engines: {node: ^22.19.0 || ^24.11.0 || >=26.0.0} hasBin: true - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1615,10 +1236,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} @@ -1633,18 +1250,6 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - comment-parser@1.4.7: - resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} - engines: {node: '>= 12.0.0'} - - comment-parser@1.4.8: - resolution: {integrity: sha512-rKZTGo4fzKYna8UcL0isTg5wkBNla7bxTypLwZQXjIdi++IdP1OJ41rI5Mti3/jltkPujbu4i9LIARYA+zpotQ==} - engines: {node: '>= 12.0.0'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -1661,21 +1266,9 @@ packages: convert-gitmoji@0.1.5: resolution: {integrity: sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==} - convert-hrtime@5.0.0: - resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} - engines: {node: '>=12'} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.50.0: - resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} - engines: {node: '>=6.4.0'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - css-declaration-sorter@7.4.0: resolution: {integrity: sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==} engines: {node: ^14 || ^16 || >=18} @@ -1733,12 +1326,6 @@ packages: supports-color: optional: true - decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1762,28 +1349,13 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - detect-indent@7.0.2: - resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} - engines: {node: '>=12.20'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1812,26 +1384,10 @@ packages: electron-to-chromium@1.5.415: resolution: {integrity: sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==} - empathic@2.0.1: - resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} - engines: {node: '>=14'} - - enhanced-resolve@5.24.5: - resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} - engines: {node: '>=10.13.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - - entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} - engines: {node: '>=20.19.0'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1865,231 +1421,12 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-flat-gitignore@2.4.0: - resolution: {integrity: sha512-JhYC+V7qEDiCDsbJcVP8fxNc62fk4+i91YLP/YvmVHlkaQ8Xo99olYN8MO5COdxl7onGlsrfZVONe5NYsZP1UA==} - peerDependencies: - eslint: ^9.5.0 || ^10.0.0 - - eslint-flat-config-utils@3.2.0: - resolution: {integrity: sha512-PHgo1X5uqIorJONLVD9BIaOSdoYFD3z/AeJljdqDPlWVRpeCYkDbK9k0AXoYVqqNJr6FEYIEr5Rm2TSktLQcHw==} - - eslint-formatting-reporter@0.0.0: - resolution: {integrity: sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==} - peerDependencies: - eslint: '>=8.40.0' - - eslint-json-compat-utils@0.2.3: - resolution: {integrity: sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==} - engines: {node: '>=12'} - peerDependencies: - '@eslint/json': '*' - eslint: '*' - jsonc-eslint-parser: ^2.4.0 || ^3.0.0 - peerDependenciesMeta: - '@eslint/json': - optional: true - - eslint-merge-processors@2.0.0: - resolution: {integrity: sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==} - peerDependencies: - eslint: '*' - - eslint-parser-plain@0.1.1: - resolution: {integrity: sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==} - - eslint-plugin-antfu@3.2.3: - resolution: {integrity: sha512-U2fnz/H0gFPxpuC7QpaHa0Jv2AgCZ5hunp36SOP/yWo8yFzgvMh8X4pZ4uN4IKoqtBhk7G3HuVa93Urf51+sZg==} - peerDependencies: - eslint: '*' - - eslint-plugin-command@4.0.0: - resolution: {integrity: sha512-mM1UdKu39YF5nUBVbA+PaVvpB3R3Niwjes8CQ8rJTTbgIThgrfQILgDqmtpAAQL1xGaolCoES1SfiwzwPVGkXQ==} - engines: {node: ^22.22.2 || >=24.15.0} - peerDependencies: - '@typescript-eslint/typescript-estree': '*' - '@typescript-eslint/utils': '*' - eslint: '*' - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-format@2.0.1: - resolution: {integrity: sha512-0BA65p5DAiuKtx5MmMJfPk9WaTjoHHbyVW7ZXRhaZoA1fdiMHhay9QRiDL2wr0hJWZxdF7CRThOK/70VUKVg2g==} - peerDependencies: - eslint: ^8.40.0 || ^9.0.0 || ^10.0.0 - - eslint-plugin-import-lite@0.6.0: - resolution: {integrity: sha512-80vevx2A7i3H7n1/6pqDO8cc5wRz6OwLDvIyVl9UflBV1N1f46e9Ihzi65IOLYoSxM6YykK2fTw1xm0Ixx6aTQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^9.0.0 || ^10.0.0 - - eslint-plugin-jsdoc@64.3.5: - resolution: {integrity: sha512-BqRUwfREoBH+7pzDD+uIQ3aema5P7BnPYcHj3mU0DLm+p/5TEHdimkXgnQfYl0AGgB9PZxZW/Lk7D69FTJSLXw==} - engines: {node: ^22.22.2 || >=24.15.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - - eslint-plugin-jsonc@3.4.2: - resolution: {integrity: sha512-q5xzjCYFQuhFomTbctXzd3STfDJ8XduvaigjQmMEbP2gzSKrc58y3Fv6D775/cIK1/sRUn+4kpljiU2iW8k0zw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: '>=9.38.0' - - eslint-plugin-n@18.3.0: - resolution: {integrity: sha512-cPVguuDe6DrIPb/qUXHf8P89MaVTUmiYWwpt5gX5AILsvRIiZAxMFXcFR6QHYBksqKJpjfUBlL/RleCJUWcD7w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: '>=8.57.1' - ts-declaration-location: ^1.0.6 - typescript: '>=5.0.0' - peerDependenciesMeta: - ts-declaration-location: - optional: true - typescript: - optional: true - - eslint-plugin-no-only-tests@3.4.0: - resolution: {integrity: sha512-4S3/9Nb7A2tiMcpzEQE9bQSlpeOz6WJkgryBuou/SA8W2x2c8Zf4j0NvTKBjv6qNhF9T79tmkecm/0CHqV0UGg==} - engines: {node: '>=5.0.0'} - - eslint-plugin-perfectionist@5.11.0: - resolution: {integrity: sha512-kZV1otBcu4xT5R1p+0x1N1wRv4pS+OIbxrA47n5a1fTnN3MWbexOx5eQgbQhGyCNbpvF/rqrbnpkGjumHF+Y0Q==} - engines: {node: ^20.0.0 || >=22.0.0} - peerDependencies: - eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 - - eslint-plugin-pnpm@1.9.1: - resolution: {integrity: sha512-8++1Egww2cqc9Wylmt7P+xXNMQVCosAZ4m4W4Gc0V5lGea8HFByHTRvUI+ZvvpO8fLXGg2O4MQc90EhuI3mMdQ==} - peerDependencies: - eslint: ^9.0.0 || ^10.0.0 - - eslint-plugin-regexp@3.3.0: - resolution: {integrity: sha512-TT0JTQbW7CRKohntpGAsMdQ1K3MsmJK4gdAhKJtIwlJ0JvuYxauymFgJdvqxIY4lqNj0EuRZWVrymQtEdJYEFg==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: '>=9.38.0' - - eslint-plugin-toml@1.5.0: - resolution: {integrity: sha512-qBjRywEkKxO2uYOjus//6GVF1r+Hg5QDkRO8RTY6XcaXgWfBU0DhwpFmJa2Ljf0Sz49r7DdZlpKwwHmJ4nmH1Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: '>=9.38.0' - - eslint-plugin-unicorn@74.0.0: - resolution: {integrity: sha512-AGnsGi2SxHg1HEAXxn9nSnZfyjvTWkxm8E8hpd/9tD6dLjBUdcD7+D6ZN64HmmCXTSXlrwVyUqe20Uyb2CaurA==} - engines: {node: '>=22'} - peerDependencies: - eslint: '>=10.4' - - eslint-plugin-unused-imports@4.4.1: - resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - - eslint-plugin-vue@10.10.0: - resolution: {integrity: sha512-dL9x9rBHqqNcByWiLOHK6L0SB97V82/NC0cZRn9cXPjM7pCuWlpQQP9bFH4vjBv80ej1ZpzAkuD8zWH1o9bZbA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - vue-eslint-parser: ^10.3.0 - peerDependenciesMeta: - '@stylistic/eslint-plugin': - optional: true - '@typescript-eslint/parser': - optional: true - - eslint-plugin-yml@3.8.1: - resolution: {integrity: sha512-E/70psRwxz5EJ8dBtzrFfqSiiInuSytbdtFCjueb/GcKjsWzPBfxfhtQePImMAPjHwMA/VDurO7DJwStDJ4wWg==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} - peerDependencies: - eslint: '>=9.38.0' - - eslint-processor-vue-blocks@2.0.0: - resolution: {integrity: sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==} - peerDependencies: - '@vue/compiler-sfc': ^3.3.0 - eslint: '>=9.0.0' - - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint@10.10.0: - resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} @@ -2100,30 +1437,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-string-truncated-width@3.0.3: - resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} - - fast-string-width@3.0.2: - resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.6: resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} - fast-wrap-ansi@0.2.2: - resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - - fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2133,21 +1449,10 @@ packages: picomatch: optional: true - file-entry-cache@11.1.5: - resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-up-simple@1.0.1: - resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} - engines: {node: '>=18'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - find-up@6.3.0: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2155,12 +1460,6 @@ packages: fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - flat-cache@6.1.23: - resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} - - flatted@3.4.4: - resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} - follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -2174,10 +1473,6 @@ packages: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} @@ -2193,10 +1488,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function-timeout@1.0.2: - resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} - engines: {node: '>=18'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2205,9 +1496,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-tsconfig@4.14.3: - resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} - giget@1.2.5: resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} hasBin: true @@ -2216,35 +1504,14 @@ packages: resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} hasBin: true - github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - - globals@17.12.0: - resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==} - engines: {node: '>=18'} - - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2257,10 +1524,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hashery@1.5.1: - resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} - engines: {node: '>=20'} - hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -2268,15 +1531,6 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hookified@1.15.1: - resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - - hookified@2.2.0: - resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2284,34 +1538,10 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - identifier-regex@1.1.0: - resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} - engines: {node: '>=18'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.8: - resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} - engines: {node: '>= 4'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-builtin-module@5.0.0: - resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} - engines: {node: '>=18.20'} - is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} @@ -2329,10 +1559,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-identifier@1.1.0: - resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} - engines: {node: '>=18'} - is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -2352,9 +1578,6 @@ packages: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -2378,49 +1601,15 @@ packages: js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - jsdoc-type-pratt-parser@9.0.1: - resolution: {integrity: sha512-1LJ/negRKJxH0+ulOsJYEpUgzIs1DAOz9QctuS4In2LW/Ro3l8C4ej5al+5FU2hBGEOAY3R3SCnP6x8226JMIw==} - engines: {node: ^22.22.2 || >=24.15.0} - - jsdoc-type-pratt-parser@9.2.1: - resolution: {integrity: sha512-V4Ww4EHnTcTLSOMoB0FsF72JhQvcAsriCm/LWnxJeGWoxIjEL2l9na11abQok5SYShq8m0Gl02el/xAbTCulvQ==} - engines: {node: ^22.22.2 || >=24.15.0} - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - jsonc-eslint-parser@3.3.0: - resolution: {integrity: sha512-hYTGkHGNRZnXOFZ1urhINADoqDrGfpy53cjw+dxk84QE0pUDujQzeUeamNs6Mz44/TKD49z2x6/GVSu4ZrtA+Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - katex@0.16.47: - resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} - hasBin: true - - keyv@5.6.0: - resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - knitwork@1.3.0: resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} @@ -2499,19 +1688,6 @@ packages: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} - lint-staged@17.4.1: - resolution: {integrity: sha512-FmJeudcalbSfg1du+JCfvi5vS6Qt08KgbfLWiHinbef+2JJwUZwAWVoaO1AcJVUTWPfk0t30PMQNwPAeCzYQ+Q==} - engines: {node: '>=22.22.1'} - hasBin: true - - local-pkg@1.2.1: - resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} - engines: {node: '>=14'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - locate-path@7.2.0: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2522,168 +1698,26 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} magicast@0.5.4: resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} - make-asynchronous@1.1.0: - resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} - engines: {node: '>=18'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - - mdast-util-from-markdown@2.0.3: - resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} - - mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - - mdast-util-math@3.0.0: - resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - mdn-data@2.34.0: - resolution: {integrity: sha512-OgIlLv0NxJKVW4GTSAoEgpRGd4F2XCqGinK0MsMlBCCS/Zcm2/LsbercNWNA7PeMMcjl75NnI97eqyo7zkdxWA==} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-extension-math@3.1.0: - resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2692,10 +1726,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - minimatch@10.2.6: - resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} - engines: {node: 18 || 20 || >=22} - minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -2737,9 +1767,6 @@ packages: mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - module-replacements@3.3.0: - resolution: {integrity: sha512-AVZL23uePazQOZlb/QMGwxsUa1oWA62Cfe6ApPzgasUoF4cdCWAiRPVq4KkaQzXbIDAlpLhLG61Jx8Lju4wjTg==} - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -2752,13 +1779,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - natural-orderby@5.0.0: - resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} - engines: {node: '>=18'} - node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -2782,9 +1802,6 @@ packages: engines: {node: ^14.16.0 || >=16.10.0} hasBin: true - object-deep-merge@2.0.1: - resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} - obug@2.1.4: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} @@ -2802,21 +1819,25 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - oxfmt@0.35.0: - resolution: {integrity: sha512-QYeXWkP+aLt7utt5SLivNIk09glWx9QE235ODjgcEZ3sd1VMaUBSpLymh6ZRCA76gD2rMP4bXanUz/fx+nLM9Q==} + oxfmt@0.71.0: + resolution: {integrity: sha512-lUPUl0d/+Io5pDrsPXWs6rB4N/bpB78oj9CTDpnbulfDz+0r3XXcHPlQ7kRPJ2GjIT4nX+/mcqunOeP9BvsEtg==} 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.80.0: - resolution: {integrity: sha512-5nTiSps4qdbCWLbxzuO00alHkEO2exR9YMN/ig6QXWrLsYSG0KaObOAM+l6oU2LcKPWoSAGYbkZIGEu1ViiWKA==} + oxlint@1.86.0: + resolution: {integrity: sha512-og0lhgvZfgGF//gOOmZXvtr+GmBbAGEnbEhv/QUg7UW2Wi4wHMnJbnMD+zuHgPdJxdklfgpPupdlAaAySyxrZg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=7.0.2001' + oxlint-tsgolint: '>=7.0.2003' vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: @@ -2824,55 +1845,21 @@ packages: vite-plus: optional: true - p-event@6.0.1: - resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} - engines: {node: '>=16.17'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-locate@6.0.0: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} - package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} - parse-gitignore@2.0.0: - resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} - engines: {node: '>=14'} - - parse-imports-exports@0.2.4: - resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - - parse-statements@1.0.11: - resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - path-exists@5.0.0: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2905,13 +1892,6 @@ packages: pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - pnpm-workspace-yaml@1.9.1: - resolution: {integrity: sha512-Xj/T2X6DNAWbtk/9UQ0/TJRswltiHZevmcMjqoL7WrpJi67lu3qaslU4+I+zJ8wtwqmuvAE0KkB8rbv2ZdogBg==} - postcss-calc@10.1.1: resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} engines: {node: ^18.12 || ^20.9 || >=22.0} @@ -3091,19 +2071,6 @@ packages: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} - - prettier@3.9.6: - resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} - engines: {node: '>=14'} - hasBin: true - pretty-bytes@7.1.1: resolution: {integrity: sha512-X+vn9z8nOFZQlxOLmfJ0iKDdMD7jYTsTW12OAlCpdoE3Igik6L37pugIZi+N3usuyp5McfgKPWi12q3zvHLeGQ==} engines: {node: '>=20'} @@ -3112,24 +2079,9 @@ packages: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qified@0.10.1: - resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} - engines: {node: '>=20'} - - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - quote-js-string@0.1.0: - resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} - engines: {node: '>=22'} - rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -3144,29 +2096,10 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} - refa@0.12.1: - resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - regexp-ast-analysis@0.7.1: - resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - regjsparser@0.13.2: - resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} - hasBin: true - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - reserved-identifiers@1.2.0: - resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} - engines: {node: '>=18'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.12: resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} @@ -3196,10 +2129,6 @@ packages: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} - scslre@0.3.0: - resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} - engines: {node: ^14.0.0 || >=16.0.0} - scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} @@ -3208,14 +2137,6 @@ packages: engines: {node: '>=10'} hasBin: true - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - sherif-darwin-arm64@1.13.0: resolution: {integrity: sha512-k38jpGpZIEWS5dpSRLSvVi53LZuGO3hDqB88jgdLMDN11LZM6yTDcP0GytnQ8OpE6Br/Js6bDCLsdWDarZdV9g==} cpu: [arm64] @@ -3267,26 +2188,10 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - simple-git-hooks@2.13.1: - resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} - hasBin: true - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@5.0.0: - resolution: {integrity: sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==} - - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - stack-trace@1.0.0-pre2: resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} engines: {node: '>=16'} @@ -3300,24 +2205,12 @@ packages: std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - strip-indent@4.1.1: - resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} - engines: {node: '>=12'} - stylehacks@7.0.11: resolution: {integrity: sha512-iODNfhXVLqc5LADs+Y6Oh5wJuK5ZcHbVng8aiK3y9pjMQdc5hLrBW0eFU6FtnpNrE6PoEg/MmFTU4waotj5WNg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.5.13 - super-regex@1.1.0: - resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} - engines: {node: '>=18'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3331,23 +2224,11 @@ packages: engines: {node: '>=16'} hasBin: true - synckit@0.11.13: - resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} - engines: {node: ^14.18.0 || >=16.0.0} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - time-span@5.1.0: - resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} - engines: {node: '>=12'} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3362,8 +2243,8 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@2.1.0: - resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + tinypool@2.2.0: + resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} engines: {node: ^20.0.0 || >=22.0.0} tinyrainbow@3.1.1: @@ -3374,28 +2255,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-valid-identifier@1.0.0: - resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} - engines: {node: '>=20'} - - toml-eslint-parser@1.0.3: - resolution: {integrity: sha512-A5F0cM6+mDleacLIEUkmfpkBbnHJFV1d2rprHU2MXNk7mlxHq2zGojA+SRvQD1RoMo9gqjZPWEaKG4v1BQ48lw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -3413,6 +2272,25 @@ packages: typescript: optional: true + uncheck@0.1.0: + resolution: {integrity: sha512-KFZos2+8SEIyx1B1NinrsCXWK3U6QVr6Y6yNKr7t+a18mrRJq7a+DL6EmjjakksROJb0cnr8EFuIh8e/rlqhbg==} + engines: {node: '>=22.20'} + hasBin: true + peerDependencies: + oxfmt: '*' + oxlint: '>=1.60.0' + sherif: '>=1.10.0' + typescript: '*' + peerDependenciesMeta: + oxfmt: + optional: true + oxlint: + optional: true + sherif: + optional: true + typescript: + optional: true + unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} @@ -3422,21 +2300,6 @@ packages: undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - - unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - untyped@2.0.0: resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true @@ -3447,16 +2310,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - verkit@0.3.2: - resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} - engines: {node: '>=18.12.0'} - verkit@0.4.0: resolution: {integrity: sha512-sXMwN6DMHeouPfCxkxWkKAmxphWKEenHYY5H1nIBzU3PmDsmJp6kBXJdshjVdpMZuWCmL9SH7KFRx29AylpP6g==} engines: {node: '>=18.12.0'} @@ -3542,119 +2398,29 @@ packages: jsdom: optional: true - vue-eslint-parser@10.4.1: - resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - - web-worker@1.5.0: - resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wsl-utils@0.1.0: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml-eslint-parser@2.1.0: - resolution: {integrity: sha512-1zo9KRfp6vIAXBEhWAz09ex3hUwh3T+/6dGbGteHvNseA0Uk4FgQnPES55klZ6cDzSy9FpgKS0D/CoLUvCCj4w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - snapshots: - '@antfu/eslint-config@9.5.1(@typescript-eslint/typescript-estree@8.69.0(supports-color@7.2.0)(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(@vue/compiler-sfc@3.5.42)(eslint-plugin-format@2.0.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(oxlint@1.80.0)(supports-color@7.2.0)(typescript@6.0.3)(vitest@4.1.11)': - dependencies: - '@antfu/install-pkg': 2.0.1 - '@clack/prompts': 1.7.0 - '@e18e/eslint-plugin': 0.8.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(oxlint@1.80.0) - '@eslint-community/eslint-plugin-eslint-comments': 4.7.2(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint/markdown': 8.0.3(supports-color@7.2.0) - '@stylistic/eslint-plugin': 5.10.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)(vitest@4.1.11) - ansis: 4.3.1 - cac: 7.0.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-config-flat-gitignore: 2.4.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-flat-config-utils: 3.2.0 - eslint-merge-processors: 2.0.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-antfu: 3.2.3(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-command: 4.0.0(@typescript-eslint/typescript-estree@8.69.0(supports-color@7.2.0)(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-import-lite: 0.6.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-jsdoc: 64.3.5(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - eslint-plugin-jsonc: 3.4.2(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-n: 18.3.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(typescript@6.0.3) - eslint-plugin-no-only-tests: 3.4.0 - eslint-plugin-perfectionist: 5.11.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - eslint-plugin-pnpm: 1.9.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-regexp: 3.3.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-toml: 1.5.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - eslint-plugin-unicorn: 74.0.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-plugin-vue: 10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)))(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(vue-eslint-parser@10.4.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)) - eslint-plugin-yml: 3.8.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.42)(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - globals: 17.12.0 - local-pkg: 1.2.1 - parse-gitignore: 2.0.0 - toml-eslint-parser: 1.0.3 - vue-eslint-parser: 10.4.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - yaml-eslint-parser: 2.1.0 - optionalDependencies: - eslint-plugin-format: 2.0.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - transitivePeerDependencies: - - '@eslint/json' - - '@typescript-eslint/typescript-estree' - - '@typescript-eslint/utils' - - '@vue/compiler-sfc' - - oxlint - - supports-color - - ts-declaration-location - - typescript - - vitest - - '@antfu/install-pkg@2.0.1': - dependencies: - package-manager-detector: 1.8.0 - tinyexec: 1.3.0 - '@babel/code-frame@8.0.0': dependencies: '@babel/helper-validator-identifier': 8.0.4 @@ -3679,30 +2445,6 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@cacheable/memory@2.2.0': - dependencies: - '@cacheable/utils': 2.5.0 - '@keyv/bigmap': 1.3.1(keyv@5.6.0) - hookified: 1.15.1 - keyv: 5.6.0 - - '@cacheable/utils@2.5.0': - dependencies: - hashery: 1.5.1 - keyv: 5.6.0 - - '@clack/core@1.4.3': - dependencies: - fast-wrap-ansi: 0.2.2 - sisteransi: 1.0.5 - - '@clack/prompts@1.7.0': - dependencies: - '@clack/core': 1.4.3 - fast-string-width: 3.0.2 - fast-wrap-ansi: 0.2.2 - sisteransi: 1.0.5 - '@codspeed/core@5.7.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: axios: 1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) @@ -3726,39 +2468,6 @@ snapshots: '@colordx/core@5.6.0': {} - '@dprint/formatter@0.5.1': {} - - '@dprint/markdown@0.21.1': {} - - '@dprint/toml@0.7.0': {} - - '@e18e/eslint-plugin@0.8.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(oxlint@1.80.0)': - dependencies: - empathic: 2.0.1 - module-replacements: 3.3.0 - semver: 7.8.5 - optionalDependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - oxlint: 1.80.0 - - '@es-joy/jsdoccomment@0.92.0': - dependencies: - '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.69.0 - comment-parser: 1.4.7 - esquery: 1.7.0 - jsdoc-type-pratt-parser: 9.0.1 - - '@es-joy/jsdoccomment@0.96.0': - dependencies: - '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.69.0 - comment-parser: 1.4.8 - esquery: 1.7.0 - jsdoc-type-pratt-parser: 9.2.1 - - '@es-joy/resolve.exports@1.2.0': {} - '@esbuild/aix-ppc64@0.25.12': optional: true @@ -3915,237 +2624,142 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))': + '@jridgewell/gen-mapping@0.3.13': dependencies: - escape-string-regexp: 4.0.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - ignore: 7.0.8 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))': + '@jridgewell/remapping@2.3.5': dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-visitor-keys: 3.4.3 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@eslint-community/regexpp@4.12.2': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@eslint/compat@2.1.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))': - dependencies: - '@eslint/core': 1.2.1 - optionalDependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) + '@jridgewell/sourcemap-codec@1.5.5': {} - '@eslint/config-array@0.23.5(supports-color@7.2.0)': + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@eslint/object-schema': 3.0.5 - debug: 4.4.3(supports-color@7.2.0) - minimatch: 10.2.6 - transitivePeerDependencies: - - supports-color + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@eslint/config-helpers@0.5.5': - dependencies: - '@eslint/core': 1.2.1 + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true - '@eslint/config-helpers@0.7.0': - dependencies: - '@eslint/core': 1.2.1 + '@oxfmt/binding-android-arm-eabi@0.71.0': + optional: true - '@eslint/core@1.2.1': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/css-tree@4.1.0': - dependencies: - mdn-data: 2.34.0 - source-map-js: 1.2.1 - - '@eslint/markdown@8.0.3(supports-color@7.2.0)': - dependencies: - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.3 - github-slugger: 2.0.0 - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-frontmatter: 2.0.1(supports-color@7.2.0) - mdast-util-gfm: 3.1.0(supports-color@7.2.0) - mdast-util-math: 3.0.0(supports-color@7.2.0) - micromark-extension-frontmatter: 2.0.0 - micromark-extension-gfm: 3.0.0 - micromark-extension-math: 3.1.0 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@eslint/object-schema@3.0.5': {} - - '@eslint/plugin-kit@0.7.3': - dependencies: - '@eslint/core': 1.2.1 - levn: 0.4.1 - - '@humanfs/core@0.19.2': - dependencies: - '@humanfs/types': 0.15.0 - - '@humanfs/node@0.16.8': - dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 - - '@humanfs/types@0.15.0': {} - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.4.3': {} - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@keyv/bigmap@1.3.1(keyv@5.6.0)': - dependencies: - hashery: 1.5.1 - hookified: 1.15.1 - keyv: 5.6.0 - - '@keyv/serialize@1.1.1': {} - - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - optional: true - - '@ota-meshi/ast-token-store@0.3.0': {} - - '@oxfmt/binding-android-arm-eabi@0.35.0': + '@oxfmt/binding-android-arm64@0.71.0': optional: true - '@oxfmt/binding-android-arm64@0.35.0': + '@oxfmt/binding-darwin-arm64@0.71.0': optional: true - '@oxfmt/binding-darwin-arm64@0.35.0': + '@oxfmt/binding-darwin-x64@0.71.0': optional: true - '@oxfmt/binding-darwin-x64@0.35.0': + '@oxfmt/binding-freebsd-x64@0.71.0': optional: true - '@oxfmt/binding-freebsd-x64@0.35.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.71.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': + '@oxfmt/binding-linux-arm-musleabihf@0.71.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.35.0': + '@oxfmt/binding-linux-arm64-gnu@0.71.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.35.0': + '@oxfmt/binding-linux-arm64-musl@0.71.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.35.0': + '@oxfmt/binding-linux-ppc64-gnu@0.71.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.35.0': + '@oxfmt/binding-linux-riscv64-gnu@0.71.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.35.0': + '@oxfmt/binding-linux-riscv64-musl@0.71.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.35.0': + '@oxfmt/binding-linux-s390x-gnu@0.71.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.35.0': + '@oxfmt/binding-linux-x64-gnu@0.71.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.35.0': + '@oxfmt/binding-linux-x64-musl@0.71.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.35.0': + '@oxfmt/binding-openharmony-arm64@0.71.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.35.0': + '@oxfmt/binding-win32-arm64-msvc@0.71.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.35.0': + '@oxfmt/binding-win32-ia32-msvc@0.71.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.35.0': + '@oxfmt/binding-win32-x64-msvc@0.71.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.35.0': + '@oxlint/binding-android-arm-eabi@1.86.0': optional: true - '@oxlint/binding-android-arm-eabi@1.80.0': + '@oxlint/binding-android-arm64@1.86.0': optional: true - '@oxlint/binding-android-arm64@1.80.0': + '@oxlint/binding-darwin-arm64@1.86.0': optional: true - '@oxlint/binding-darwin-arm64@1.80.0': + '@oxlint/binding-darwin-x64@1.86.0': optional: true - '@oxlint/binding-darwin-x64@1.80.0': + '@oxlint/binding-freebsd-x64@1.86.0': optional: true - '@oxlint/binding-freebsd-x64@1.80.0': + '@oxlint/binding-linux-arm-gnueabihf@1.86.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.80.0': + '@oxlint/binding-linux-arm-musleabihf@1.86.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.80.0': + '@oxlint/binding-linux-arm64-gnu@1.86.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.80.0': + '@oxlint/binding-linux-arm64-musl@1.86.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.80.0': + '@oxlint/binding-linux-ppc64-gnu@1.86.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.80.0': + '@oxlint/binding-linux-riscv64-gnu@1.86.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.80.0': + '@oxlint/binding-linux-riscv64-musl@1.86.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.80.0': + '@oxlint/binding-linux-s390x-gnu@1.86.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.80.0': + '@oxlint/binding-linux-x64-gnu@1.86.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.80.0': + '@oxlint/binding-linux-x64-musl@1.86.0': optional: true - '@oxlint/binding-linux-x64-musl@1.80.0': + '@oxlint/binding-openharmony-arm64@1.86.0': optional: true - '@oxlint/binding-openharmony-arm64@1.80.0': + '@oxlint/binding-win32-arm64-msvc@1.86.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.80.0': + '@oxlint/binding-win32-ia32-msvc@1.86.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.80.0': + '@oxlint/binding-win32-x64-msvc@1.86.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.80.0': - optional: true - - '@pkgr/core@0.3.6': {} - '@quansync/fs@1.0.0': dependencies: quansync: 1.0.0 @@ -4279,148 +2893,23 @@ snapshots: ajv-formats: 3.0.1(ajv@8.20.0) yaml: 2.9.0 - '@sindresorhus/base62@1.0.0': {} - '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))': - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@typescript-eslint/types': 8.69.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.7 - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/debug@4.1.13': - dependencies: - '@types/ms': 2.1.0 - '@types/deep-eql@4.0.2': {} - '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.9': {} - '@types/hast@3.0.5': - dependencies: - '@types/unist': 3.0.3 - - '@types/json-schema@7.0.15': {} - - '@types/katex@0.16.8': {} - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/ms@2.1.0': {} - '@types/node@26.4.0': dependencies: undici-types: 8.3.0 '@types/resolve@1.20.2': {} - '@types/unist@3.0.3': {} - - '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.69.0 - '@typescript-eslint/type-utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.69.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - ignore: 7.0.8 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.69.0 - '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.69.0 - debug: 4.4.3(supports-color@7.2.0) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.69.0(supports-color@7.2.0)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) - '@typescript-eslint/types': 8.69.0 - debug: 4.4.3(supports-color@7.2.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.69.0': - dependencies: - '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/visitor-keys': 8.69.0 - - '@typescript-eslint/tsconfig-utils@8.69.0(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 - - '@typescript-eslint/type-utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - debug: 4.4.3(supports-color@7.2.0) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.69.0': {} - - '@typescript-eslint/typescript-estree@8.69.0(supports-color@7.2.0)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) - '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/visitor-keys': 8.69.0 - debug: 4.4.3(supports-color@7.2.0) - 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 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@typescript-eslint/scope-manager': 8.69.0 - '@typescript-eslint/types': 8.69.0 - '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.69.0': - dependencies: - '@typescript-eslint/types': 8.69.0 - eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@4.1.11(vitest@4.1.11)': dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -4435,18 +2924,6 @@ snapshots: tinyrainbow: 3.1.1 vitest: 4.1.11(@types/node@26.4.0)(@vitest/coverage-v8@4.1.11)(vite@7.3.6(@types/node@26.4.0)(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) - '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)(vitest@4.1.11)': - dependencies: - '@typescript-eslint/scope-manager': 8.69.0 - '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - typescript: 6.0.3 - vitest: 4.1.11(@types/node@26.4.0)(@vitest/coverage-v8@4.1.11)(vite@7.3.6(@types/node@26.4.0)(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) - transitivePeerDependencies: - - supports-color - '@vitest/expect@4.1.11': dependencies: '@standard-schema/spec': 1.1.0 @@ -4488,42 +2965,6 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.1 - '@vue/compiler-core@3.5.42': - dependencies: - '@babel/parser': 7.29.8 - '@vue/shared': 3.5.42 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.42': - dependencies: - '@vue/compiler-core': 3.5.42 - '@vue/shared': 3.5.42 - - '@vue/compiler-sfc@3.5.42': - dependencies: - '@babel/parser': 7.29.8 - '@vue/compiler-core': 3.5.42 - '@vue/compiler-dom': 3.5.42 - '@vue/compiler-ssr': 3.5.42 - '@vue/shared': 3.5.42 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.26 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.42': - dependencies: - '@vue/compiler-dom': 3.5.42 - '@vue/shared': 3.5.42 - - '@vue/shared@3.5.42': {} - - acorn-jsx@5.3.2(acorn@8.18.0): - dependencies: - acorn: 8.18.0 - acorn@8.18.0: {} agent-base@6.0.2(supports-color@7.2.0): @@ -4540,13 +2981,6 @@ snapshots: optionalDependencies: ajv: 8.20.0 - ajv@6.15.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 @@ -4561,8 +2995,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 - are-docs-informative@0.1.1: {} - args-tokenizer@0.3.0: {} assertion-error@2.0.1: {} @@ -4594,18 +3026,12 @@ snapshots: - debug - supports-color - balanced-match@4.0.4: {} - baseline-browser-mapping@2.11.20: {} binary-extensions@2.3.0: {} boolbase@1.0.0: {} - brace-expansion@5.0.9: - dependencies: - balanced-match: 4.0.4 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -4618,8 +3044,6 @@ snapshots: node-releases: 2.0.54 update-browserslist-db: 1.3.2(browserslist@4.28.8) - builtin-modules@5.3.0: {} - bumpp@12.3.0: dependencies: args-tokenizer: 0.3.0 @@ -4668,14 +3092,6 @@ snapshots: cac@7.0.0: {} - cacheable@2.5.0: - dependencies: - '@cacheable/memory': 2.2.0 - '@cacheable/utils': 2.5.0 - hookified: 1.15.1 - keyv: 5.6.0 - qified: 0.10.1 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4690,12 +3106,8 @@ snapshots: caniuse-lite@1.0.30001810: {} - ccount@2.0.1: {} - chai@6.2.2: {} - change-case@5.4.4: {} - changelogen@0.5.7: dependencies: c12: 1.11.2 @@ -4729,8 +3141,6 @@ snapshots: transitivePeerDependencies: - magicast - character-entities@2.0.2: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -4749,8 +3159,6 @@ snapshots: chownr@2.0.0: {} - ci-info@4.4.0: {} - citty@0.1.6: dependencies: consola: 3.4.2 @@ -4763,12 +3171,6 @@ snapshots: commander@11.1.0: {} - commander@8.3.0: {} - - comment-parser@1.4.7: {} - - comment-parser@1.4.8: {} - commondir@1.0.1: {} confbox@0.1.8: {} @@ -4779,20 +3181,8 @@ snapshots: convert-gitmoji@0.1.5: {} - convert-hrtime@5.0.0: {} - convert-source-map@2.0.0: {} - core-js-compat@3.50.0: - dependencies: - browserslist: 4.28.8 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - css-declaration-sorter@7.4.0(postcss@8.5.26): dependencies: postcss: 8.5.26 @@ -4873,12 +3263,6 @@ snapshots: optionalDependencies: supports-color: 7.2.0 - decode-named-character-reference@1.3.0: - dependencies: - character-entities: 2.0.2 - - deep-is@0.1.4: {} - deepmerge@4.3.1: {} default-browser-id@5.0.1: {} @@ -4894,21 +3278,11 @@ snapshots: delayed-stream@1.0.0: {} - dequal@2.0.3: {} - destr@2.0.5: {} - detect-indent@7.0.2: {} - detect-libc@2.1.2: optional: true - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diff-sequences@29.6.3: {} - dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -4939,19 +3313,8 @@ snapshots: electron-to-chromium@1.5.415: {} - empathic@2.0.1: {} - - enhanced-resolve@5.24.5: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - entities@4.5.0: {} - entities@7.0.1: {} - - entities@8.0.0: {} - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -5029,362 +3392,28 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@4.0.0: {} - - escape-string-regexp@5.0.0: {} - - eslint-compat-utils@0.5.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - semver: 7.8.5 - - eslint-config-flat-gitignore@2.4.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@eslint/compat': 2.1.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - - eslint-flat-config-utils@3.2.0: - dependencies: - '@eslint/config-helpers': 0.5.5 - pathe: 2.0.3 - - eslint-formatting-reporter@0.0.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - prettier-linter-helpers: 1.0.1 - - eslint-json-compat-utils@0.2.3(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(jsonc-eslint-parser@3.3.0): - dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - esquery: 1.7.0 - jsonc-eslint-parser: 3.3.0 - - eslint-merge-processors@2.0.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - - eslint-parser-plain@0.1.1: {} - - eslint-plugin-antfu@3.2.3(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - - eslint-plugin-command@4.0.0(@typescript-eslint/typescript-estree@8.69.0(supports-color@7.2.0)(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@es-joy/jsdoccomment': 0.92.0 - '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - - eslint-plugin-es-x@7.8.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint-community/regexpp': 4.12.2 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-compat-utils: 0.5.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - - eslint-plugin-format@2.0.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@dprint/formatter': 0.5.1 - '@dprint/markdown': 0.21.1 - '@dprint/toml': 0.7.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-formatting-reporter: 0.0.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint-parser-plain: 0.1.1 - ohash: 2.0.12 - oxfmt: 0.35.0 - prettier: 3.9.6 - synckit: 0.11.13 - - eslint-plugin-import-lite@0.6.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - - eslint-plugin-jsdoc@64.3.5(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): - dependencies: - '@es-joy/jsdoccomment': 0.96.0 - '@es-joy/resolve.exports': 1.2.0 - '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - are-docs-informative: 0.1.1 - comment-parser: 1.4.8 - debug: 4.4.3(supports-color@7.2.0) - escape-string-regexp: 5.0.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - espree: 11.2.0 - esquery: 1.7.0 - html-entities: 2.6.0 - object-deep-merge: 2.0.1 - parse-imports-exports: 0.2.4 - semver: 7.8.5 - spdx-expression-parse: 5.0.0 - to-valid-identifier: 1.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jsonc@3.4.2(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.3 - '@ota-meshi/ast-token-store': 0.3.0 - diff-sequences: 29.6.3 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-json-compat-utils: 0.2.3(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(jsonc-eslint-parser@3.3.0) - jsonc-eslint-parser: 3.3.0 - natural-compare: 1.4.0 - synckit: 0.11.13 - transitivePeerDependencies: - - '@eslint/json' - - eslint-plugin-n@18.3.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(typescript@6.0.3): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - enhanced-resolve: 5.24.5 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-es-x: 7.8.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - get-tsconfig: 4.14.3 - globals: 15.15.0 - globrex: 0.1.2 - ignore: 5.3.2 - semver: 7.8.5 - optionalDependencies: - typescript: 6.0.3 - - eslint-plugin-no-only-tests@3.4.0: {} - - eslint-plugin-perfectionist@5.11.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): - dependencies: - '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - natural-orderby: 5.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-pnpm@1.9.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - empathic: 2.0.1 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-json-compat-utils: 0.2.3(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(jsonc-eslint-parser@3.3.0) - jsonc-eslint-parser: 3.3.0 - pathe: 2.0.3 - pnpm-workspace-yaml: 1.9.1 - tinyglobby: 0.2.17 - yaml: 2.9.0 - yaml-eslint-parser: 2.1.0 - transitivePeerDependencies: - - '@eslint/json' - - eslint-plugin-regexp@3.3.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint-community/regexpp': 4.12.2 - comment-parser: 1.4.8 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - jsdoc-type-pratt-parser: 9.2.1 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - scslre: 0.3.0 - - eslint-plugin-toml@1.5.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): - dependencies: - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.3 - '@ota-meshi/ast-token-store': 0.3.0 - debug: 4.4.3(supports-color@7.2.0) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - toml-eslint-parser: 1.0.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-unicorn@74.0.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint/css-tree': 4.1.0 - browserslist: 4.28.8 - change-case: 5.4.4 - ci-info: 4.4.0 - core-js-compat: 3.50.0 - detect-indent: 7.0.2 - entities: 8.0.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - find-up-simple: 1.0.1 - globals: 17.12.0 - indent-string: 5.0.0 - is-builtin-module: 5.0.0 - is-identifier: 1.1.0 - pluralize: 8.0.0 - quote-js-string: 0.1.0 - regjsparser: 0.13.2 - reserved-identifiers: 1.2.0 - semver: 7.8.5 - strip-indent: 4.1.1 - yaml: 2.9.0 - - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - - eslint-plugin-vue@10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)))(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(vue-eslint-parser@10.4.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - natural-compare: 1.4.0 - nth-check: 2.1.1 - postcss-selector-parser: 7.1.5 - semver: 7.8.5 - vue-eslint-parser: 10.4.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - xml-name-validator: 5.0.0 - optionalDependencies: - '@stylistic/eslint-plugin': 5.10.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - - eslint-plugin-yml@3.8.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.3 - '@ota-meshi/ast-token-store': 0.3.0 - diff-sequences: 29.6.3 - escape-string-regexp: 5.0.0 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - natural-compare: 1.4.0 - yaml-eslint-parser: 2.1.0 - - eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.42)(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)): - dependencies: - '@vue/compiler-sfc': 3.5.42 - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - - eslint-scope@9.1.2: - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint-visitor-keys@5.0.1: {} - - eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0): - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5(supports-color@7.2.0) - '@eslint/config-helpers': 0.7.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.3 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 - ajv: 6.15.0 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@7.2.0) - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 11.1.5 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.6 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.7.0 - transitivePeerDependencies: - - supports-color - - espree@10.4.0: - dependencies: - acorn: 8.18.0 - acorn-jsx: 5.3.2(acorn@8.18.0) - eslint-visitor-keys: 4.2.1 - - espree@11.2.0: - dependencies: - acorn: 8.18.0 - acorn-jsx: 5.3.2(acorn@8.18.0) - eslint-visitor-keys: 5.0.1 - - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 - esutils@2.0.3: {} - expect-type@1.4.0: {} exsolve@1.1.1: {} fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-string-truncated-width@3.0.3: {} - - fast-string-width@3.0.2: - dependencies: - fast-string-truncated-width: 3.0.3 - fast-uri@3.1.6: {} - fast-wrap-ansi@0.2.2: - dependencies: - fast-string-width: 3.0.2 - - fault@2.0.1: - dependencies: - format: 0.2.2 - fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 - file-entry-cache@11.1.5: - dependencies: - flat-cache: 6.1.23 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - find-up-simple@1.0.1: {} - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - find-up@6.3.0: dependencies: locate-path: 7.2.0 @@ -5396,14 +3425,6 @@ snapshots: mlly: 1.8.2 rollup: 4.63.0 - flat-cache@6.1.23: - dependencies: - cacheable: 2.5.0 - flatted: 3.4.4 - hookified: 1.15.1 - - flatted@3.4.4: {} - follow-redirects@1.16.0(debug@4.4.3(supports-color@7.2.0)): optionalDependencies: debug: 4.4.3(supports-color@7.2.0) @@ -5416,8 +3437,6 @@ snapshots: hasown: 2.0.4 mime-types: 2.1.35 - format@0.2.2: {} - fraction.js@5.3.4: {} fs-minipass@2.1.0: @@ -5429,8 +3448,6 @@ snapshots: function-bind@1.1.2: {} - function-timeout@1.0.2: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5449,10 +3466,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 - get-tsconfig@4.14.3: - dependencies: - resolve-pkg-maps: 1.0.0 - giget@1.2.5: dependencies: citty: 0.1.6 @@ -5465,26 +3478,12 @@ snapshots: giget@3.3.1: {} - github-slugger@2.0.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - globals@15.15.0: {} - - globals@17.12.0: {} - - globrex@0.1.2: {} - gopd@1.2.0: {} - graceful-fs@4.2.11: {} - has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -5493,22 +3492,12 @@ snapshots: dependencies: has-symbols: 1.1.0 - hashery@1.5.1: - dependencies: - hookified: 1.15.1 - hasown@2.0.4: dependencies: function-bind: 1.1.2 hookable@5.5.3: {} - hookified@1.15.1: {} - - hookified@2.2.0: {} - - html-entities@2.6.0: {} - html-escaper@2.0.2: {} https-proxy-agent@5.0.1(supports-color@7.2.0): @@ -5518,26 +3507,10 @@ snapshots: transitivePeerDependencies: - supports-color - identifier-regex@1.1.0: - dependencies: - reserved-identifiers: 1.2.0 - - ignore@5.3.2: {} - - ignore@7.0.8: {} - - imurmurhash@0.1.4: {} - - indent-string@5.0.0: {} - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-builtin-module@5.0.0: - dependencies: - builtin-modules: 5.3.0 - is-core-module@2.16.2: dependencies: hasown: 2.0.4 @@ -5550,11 +3523,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-identifier@1.1.0: - dependencies: - identifier-regex: 1.1.0 - super-regex: 1.1.0 - is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -5571,8 +3539,6 @@ snapshots: dependencies: is-inside-container: 1.0.0 - isexe@2.0.0: {} - istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -5592,46 +3558,12 @@ snapshots: js-tokens@10.0.0: {} - jsdoc-type-pratt-parser@9.0.1: - dependencies: - '@types/estree': 1.0.9 - - jsdoc-type-pratt-parser@9.2.1: - dependencies: - '@types/estree': 1.0.9 - '@types/node': 26.4.0 - - jsesc@3.1.0: {} - - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - - jsonc-eslint-parser@3.3.0: - dependencies: - acorn: 8.18.0 - eslint-visitor-keys: 5.0.1 - verkit: 0.3.2 - jsonc-parser@3.3.1: {} - katex@0.16.47: - dependencies: - commander: 8.3.0 - - keyv@5.6.0: - dependencies: - '@keyv/serialize': 1.1.1 - knitwork@1.3.0: {} - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lightningcss-android-arm64@1.33.0: optional: true @@ -5684,24 +3616,6 @@ snapshots: lilconfig@3.1.3: {} - lint-staged@17.4.1: - dependencies: - picomatch: 4.0.7 - string-argv: 0.3.2 - tinyexec: 1.3.0 - optionalDependencies: - yaml: 2.9.0 - - local-pkg@1.2.1: - dependencies: - mlly: 1.8.2 - pkg-types: 2.3.1 - quansync: 0.2.11 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - locate-path@7.2.0: dependencies: p-locate: 6.0.0 @@ -5710,8 +3624,6 @@ snapshots: lodash.uniq@4.5.0: {} - longest-streak@3.1.0: {} - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5722,369 +3634,22 @@ snapshots: '@babel/types': 7.29.8 source-map-js: 1.2.1 - make-asynchronous@1.1.0: - dependencies: - p-event: 6.0.1 - type-fest: 4.41.0 - web-worker: 1.5.0 - make-dir@4.0.0: dependencies: semver: 7.8.5 - markdown-table@3.0.4: {} - math-intrinsics@1.1.0: {} - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - - mdast-util-from-markdown@2.0.3(supports-color@7.2.0): - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2(supports-color@7.2.0) - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-frontmatter@2.0.1(supports-color@7.2.0): - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-to-markdown: 2.1.2 - micromark-extension-frontmatter: 2.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0(supports-color@7.2.0): - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0(supports-color@7.2.0): - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0(supports-color@7.2.0): - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0(supports-color@7.2.0): - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0(supports-color@7.2.0): - dependencies: - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0(supports-color@7.2.0) - mdast-util-gfm-strikethrough: 2.0.0(supports-color@7.2.0) - mdast-util-gfm-table: 2.0.0(supports-color@7.2.0) - mdast-util-gfm-task-list-item: 2.0.0(supports-color@7.2.0) - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-math@3.0.0(supports-color@7.2.0): - dependencies: - '@types/hast': 3.0.5 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) - mdast-util-to-markdown: 2.1.2 - unist-util-remove-position: 5.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.1.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdn-data@2.0.28: {} mdn-data@2.27.1: {} - mdn-data@2.34.0: {} - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-frontmatter@2.0.0: - dependencies: - fault: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-table@2.1.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.2 - - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-math@3.1.0: - dependencies: - '@types/katex': 0.16.8 - devlop: 1.1.0 - katex: 0.16.47 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.3.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 - - micromark-util-encode@2.0.1: {} - - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.2 - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - - micromark@4.0.2(supports-color@7.2.0): - dependencies: - '@types/debug': 4.1.13 - debug: 4.4.3(supports-color@7.2.0) - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 - minimatch@10.2.6: - dependencies: - brace-expansion: 5.0.9 - minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -6123,18 +3688,12 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.4 - module-replacements@3.3.0: {} - mri@1.2.0: {} ms@2.1.3: {} nanoid@3.3.18: {} - natural-compare@1.4.0: {} - - natural-orderby@5.0.0: {} - node-fetch-native@1.6.7: {} node-gyp-build@4.8.4: {} @@ -6156,8 +3715,6 @@ snapshots: tinyexec: 0.3.2 ufo: 1.6.4 - object-deep-merge@2.0.1: {} - obug@2.1.4: {} ofetch@1.5.1: @@ -6177,100 +3734,64 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - oxfmt@0.35.0: + oxfmt@0.71.0: dependencies: - tinypool: 2.1.0 + tinypool: 2.2.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.35.0 - '@oxfmt/binding-android-arm64': 0.35.0 - '@oxfmt/binding-darwin-arm64': 0.35.0 - '@oxfmt/binding-darwin-x64': 0.35.0 - '@oxfmt/binding-freebsd-x64': 0.35.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.35.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.35.0 - '@oxfmt/binding-linux-arm64-gnu': 0.35.0 - '@oxfmt/binding-linux-arm64-musl': 0.35.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.35.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.35.0 - '@oxfmt/binding-linux-riscv64-musl': 0.35.0 - '@oxfmt/binding-linux-s390x-gnu': 0.35.0 - '@oxfmt/binding-linux-x64-gnu': 0.35.0 - '@oxfmt/binding-linux-x64-musl': 0.35.0 - '@oxfmt/binding-openharmony-arm64': 0.35.0 - '@oxfmt/binding-win32-arm64-msvc': 0.35.0 - '@oxfmt/binding-win32-ia32-msvc': 0.35.0 - '@oxfmt/binding-win32-x64-msvc': 0.35.0 - - oxlint@1.80.0: + '@oxfmt/binding-android-arm-eabi': 0.71.0 + '@oxfmt/binding-android-arm64': 0.71.0 + '@oxfmt/binding-darwin-arm64': 0.71.0 + '@oxfmt/binding-darwin-x64': 0.71.0 + '@oxfmt/binding-freebsd-x64': 0.71.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.71.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.71.0 + '@oxfmt/binding-linux-arm64-gnu': 0.71.0 + '@oxfmt/binding-linux-arm64-musl': 0.71.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.71.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.71.0 + '@oxfmt/binding-linux-riscv64-musl': 0.71.0 + '@oxfmt/binding-linux-s390x-gnu': 0.71.0 + '@oxfmt/binding-linux-x64-gnu': 0.71.0 + '@oxfmt/binding-linux-x64-musl': 0.71.0 + '@oxfmt/binding-openharmony-arm64': 0.71.0 + '@oxfmt/binding-win32-arm64-msvc': 0.71.0 + '@oxfmt/binding-win32-ia32-msvc': 0.71.0 + '@oxfmt/binding-win32-x64-msvc': 0.71.0 + + oxlint@1.86.0: optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.80.0 - '@oxlint/binding-android-arm64': 1.80.0 - '@oxlint/binding-darwin-arm64': 1.80.0 - '@oxlint/binding-darwin-x64': 1.80.0 - '@oxlint/binding-freebsd-x64': 1.80.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.80.0 - '@oxlint/binding-linux-arm-musleabihf': 1.80.0 - '@oxlint/binding-linux-arm64-gnu': 1.80.0 - '@oxlint/binding-linux-arm64-musl': 1.80.0 - '@oxlint/binding-linux-ppc64-gnu': 1.80.0 - '@oxlint/binding-linux-riscv64-gnu': 1.80.0 - '@oxlint/binding-linux-riscv64-musl': 1.80.0 - '@oxlint/binding-linux-s390x-gnu': 1.80.0 - '@oxlint/binding-linux-x64-gnu': 1.80.0 - '@oxlint/binding-linux-x64-musl': 1.80.0 - '@oxlint/binding-openharmony-arm64': 1.80.0 - '@oxlint/binding-win32-arm64-msvc': 1.80.0 - '@oxlint/binding-win32-ia32-msvc': 1.80.0 - '@oxlint/binding-win32-x64-msvc': 1.80.0 - optional: true - - p-event@6.0.1: - dependencies: - p-timeout: 6.1.4 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 + '@oxlint/binding-android-arm-eabi': 1.86.0 + '@oxlint/binding-android-arm64': 1.86.0 + '@oxlint/binding-darwin-arm64': 1.86.0 + '@oxlint/binding-darwin-x64': 1.86.0 + '@oxlint/binding-freebsd-x64': 1.86.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.86.0 + '@oxlint/binding-linux-arm-musleabihf': 1.86.0 + '@oxlint/binding-linux-arm64-gnu': 1.86.0 + '@oxlint/binding-linux-arm64-musl': 1.86.0 + '@oxlint/binding-linux-ppc64-gnu': 1.86.0 + '@oxlint/binding-linux-riscv64-gnu': 1.86.0 + '@oxlint/binding-linux-riscv64-musl': 1.86.0 + '@oxlint/binding-linux-s390x-gnu': 1.86.0 + '@oxlint/binding-linux-x64-gnu': 1.86.0 + '@oxlint/binding-linux-x64-musl': 1.86.0 + '@oxlint/binding-openharmony-arm64': 1.86.0 + '@oxlint/binding-win32-arm64-msvc': 1.86.0 + '@oxlint/binding-win32-ia32-msvc': 1.86.0 + '@oxlint/binding-win32-x64-msvc': 1.86.0 p-limit@4.0.0: dependencies: yocto-queue: 1.2.2 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-locate@6.0.0: dependencies: p-limit: 4.0.0 - p-timeout@6.1.4: {} - package-manager-detector@1.8.0: {} - parse-gitignore@2.0.0: {} - - parse-imports-exports@0.2.4: - dependencies: - parse-statements: 1.0.11 - - parse-statements@1.0.11: {} - - path-exists@4.0.0: {} - path-exists@5.0.0: {} - path-key@3.1.1: {} - path-parse@1.0.7: {} pathe@1.1.2: {} @@ -6299,12 +3820,6 @@ snapshots: exsolve: 1.1.1 pathe: 2.0.3 - pluralize@8.0.0: {} - - pnpm-workspace-yaml@1.9.1: - dependencies: - yaml: 2.9.0 - postcss-calc@10.1.1(postcss@8.5.26): dependencies: postcss: 8.5.26 @@ -6474,30 +3989,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.1: - dependencies: - fast-diff: 1.3.0 - - prettier@3.9.6: {} - pretty-bytes@7.1.1: {} proxy-from-env@2.1.0: {} - punycode@2.3.1: {} - - qified@0.10.1: - dependencies: - hookified: 2.2.0 - - quansync@0.2.11: {} - quansync@1.0.0: {} - quote-js-string@0.1.0: {} - rc9@2.1.2: dependencies: defu: 6.1.7 @@ -6514,25 +4011,8 @@ snapshots: readdirp@5.1.1: {} - refa@0.12.1: - dependencies: - '@eslint-community/regexpp': 4.12.2 - - regexp-ast-analysis@0.7.1: - dependencies: - '@eslint-community/regexpp': 4.12.2 - refa: 0.12.1 - - regjsparser@0.13.2: - dependencies: - jsesc: 3.1.0 - require-from-string@2.0.2: {} - reserved-identifiers@1.2.0: {} - - resolve-pkg-maps@1.0.0: {} - resolve@1.22.12: dependencies: es-errors: 1.3.0 @@ -6587,22 +4067,10 @@ snapshots: sax@1.6.1: {} - scslre@0.3.0: - dependencies: - '@eslint-community/regexpp': 4.12.2 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - scule@1.3.0: {} semver@7.8.5: {} - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - sherif-darwin-arm64@1.13.0: optional: true @@ -6640,21 +4108,8 @@ snapshots: siginfo@2.0.0: {} - simple-git-hooks@2.13.1: {} - - sisteransi@1.0.5: {} - source-map-js@1.2.1: {} - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@5.0.0: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 - - spdx-license-ids@3.0.23: {} - stack-trace@1.0.0-pre2: {} stackback@0.0.2: {} @@ -6663,22 +4118,12 @@ snapshots: std-env@4.2.0: {} - string-argv@0.3.2: {} - - strip-indent@4.1.1: {} - stylehacks@7.0.11(postcss@8.5.26): dependencies: browserslist: 4.28.8 postcss: 8.5.26 postcss-selector-parser: 7.1.5 - super-regex@1.1.0: - dependencies: - function-timeout: 1.0.2 - make-asynchronous: 1.1.0 - time-span: 5.1.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -6695,12 +4140,6 @@ snapshots: picocolors: 1.1.1 sax: 1.6.1 - synckit@0.11.13: - dependencies: - '@pkgr/core': 0.3.6 - - tapable@2.3.3: {} - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -6710,10 +4149,6 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - time-span@5.1.0: - dependencies: - convert-hrtime: 5.0.0 - tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -6725,7 +4160,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinypool@2.1.0: {} + tinypool@2.2.0: {} tinyrainbow@3.1.1: {} @@ -6733,25 +4168,6 @@ snapshots: dependencies: is-number: 7.0.0 - to-valid-identifier@1.0.0: - dependencies: - '@sindresorhus/base62': 1.0.0 - reserved-identifiers: 1.2.0 - - toml-eslint-parser@1.0.3: - dependencies: - eslint-visitor-keys: 5.0.1 - - ts-api-utils@2.5.0(typescript@6.0.3): - dependencies: - typescript: 6.0.3 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@4.41.0: {} - typescript@6.0.3: {} ufo@1.6.4: {} @@ -6791,6 +4207,13 @@ snapshots: - vue-sfc-transformer - vue-tsc + uncheck@0.1.0(oxfmt@0.71.0)(oxlint@1.86.0)(sherif@1.13.0)(typescript@6.0.3): + optionalDependencies: + oxfmt: 0.71.0 + oxlint: 1.86.0 + sherif: 1.13.0 + typescript: 6.0.3 + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 @@ -6806,30 +4229,6 @@ snapshots: undici-types@8.3.0: {} - unist-util-is@6.0.1: - dependencies: - '@types/unist': 3.0.3 - - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - - unist-util-visit@5.1.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - untyped@2.0.0: dependencies: citty: 0.1.6 @@ -6844,14 +4243,8 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - util-deprecate@1.0.2: {} - verkit@0.3.2: {} - verkit@0.4.0: {} vite@7.3.6(@types/node@26.4.0)(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0): @@ -6897,48 +4290,17 @@ snapshots: transitivePeerDependencies: - msw - vue-eslint-parser@10.4.1(eslint@10.10.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): - dependencies: - debug: 4.4.3(supports-color@7.2.0) - eslint: 10.10.0(jiti@2.7.0)(supports-color@7.2.0) - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - semver: 7.8.5 - transitivePeerDependencies: - - supports-color - - web-worker@1.5.0: {} - - which@2.0.2: - dependencies: - isexe: 2.0.0 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - word-wrap@1.2.5: {} - wsl-utils@0.1.0: dependencies: is-wsl: 3.1.1 - xml-name-validator@5.0.0: {} - yallist@4.0.0: {} - yaml-eslint-parser@2.1.0: - dependencies: - eslint-visitor-keys: 5.0.1 - yaml: 2.9.0 - yaml@2.9.0: {} - yocto-queue@0.1.0: {} - yocto-queue@1.2.2: {} - - zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index db89155..2b7e14c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,4 +10,3 @@ preferWorkspacePackages: true allowBuilds: esbuild: true - simple-git-hooks: false diff --git a/scripts/sync-sponsors.ts b/scripts/sync-sponsors.ts index b49f362..d907c2b 100644 --- a/scripts/sync-sponsors.ts +++ b/scripts/sync-sponsors.ts @@ -20,22 +20,14 @@ interface Sponsor { slot?: number } -const SPONSORS_SOURCE_URL - = 'https://raw.githubusercontent.com/middleapi/static/refs/heads/main/sponsors.json' -const PAST_SPONSORS_URL - = 'https://htmlpreview.github.io/?https://github.com/middleapi/static/blob/main/sponsors.svg' +const SPONSORS_SOURCE_URL = + 'https://raw.githubusercontent.com/middleapi/static/refs/heads/main/sponsors.json' +const PAST_SPONSORS_URL = + 'https://htmlpreview.github.io/?https://github.com/middleapi/static/blob/main/sponsors.svg' const ROOT_DIR = process.cwd() const README_FILE_NAME = 'README.md' -const SKIP_DIRS = new Set([ - 'node_modules', - '.git', - 'dist', - '.output', - '.next', - '.nuxt', - '.turbo', -]) +const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', '.output', '.next', '.nuxt', '.turbo']) async function findReadmes(dir: string): Promise { const entries = await readdir(dir, { withFileTypes: true }) @@ -51,8 +43,7 @@ async function findReadmes(dir: string): Promise { } subdirPromises.push(findReadmes(fullPath)) - } - else if (entry.isFile() && entry.name === README_FILE_NAME) { + } else if (entry.isFile() && entry.name === README_FILE_NAME) { result.push(fullPath) } } @@ -72,10 +63,13 @@ function escapeHtml(value: string): string { .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') - .replaceAll('\'', ''') + .replaceAll("'", ''') } -function getTierImageSizeAndColumns(tierLevel: number, tierLevels: number[]): [columns: number, imageSize: number] { +function getTierImageSizeAndColumns( + tierLevel: number, + tierLevels: number[], +): [columns: number, imageSize: number] { const rank = tierLevels.indexOf(tierLevel) const columnByRank = [3, 4, 5, 6, 7, 8] @@ -111,21 +105,15 @@ function buildSlotCards(slotSponsors: Sponsor[]): string[] { } function buildSponsorsSection(sponsors: Sponsor[]): string { - const activeSponsors = sponsors.filter( - sponsor => sponsor.tierLevel > 0 && sponsor.amount > 0, - ) - const pastSponsors = sponsors.filter( - sponsor => sponsor.tierLevel <= 0 || sponsor.amount <= 0, - ) + const activeSponsors = sponsors.filter((sponsor) => sponsor.tierLevel > 0 && sponsor.amount > 0) + const pastSponsors = sponsors.filter((sponsor) => sponsor.tierLevel <= 0 || sponsor.amount <= 0) // Slot sponsors are featured as cards up top; the tier tables below carry // everyone else so nobody appears twice. const slotSponsors = activeSponsors - .filter(sponsor => sponsor.slot !== undefined) + .filter((sponsor) => sponsor.slot !== undefined) .toSorted((a, b) => (a.slot ?? 0) - (b.slot ?? 0)) - const tieredSponsors = activeSponsors.filter( - sponsor => sponsor.slot === undefined, - ) + const tieredSponsors = activeSponsors.filter((sponsor) => sponsor.slot === undefined) const groupedSponsors = new Map() @@ -153,9 +141,9 @@ function buildSponsorsSection(sponsors: Sponsor[]): string { // Sizes rank against every active tier, slot sponsors' tiers included, so // featuring the top tiers as cards does not inflate the tables below them. - const sizeTierLevels = [ - ...new Set(activeSponsors.map(sponsor => sponsor.tierLevel)), - ].toSorted((a, b) => b - a) + const sizeTierLevels = [...new Set(activeSponsors.map((sponsor) => sponsor.tierLevel))].toSorted( + (a, b) => b - a, + ) const tierLevels = [...groupedSponsors.keys()].toSorted((a, b) => b - a) for (const tierLevel of tierLevels) { @@ -166,10 +154,7 @@ function buildSponsorsSection(sponsors: Sponsor[]): string { } const tierTitle = tierSponsors[0]?.tierTitlePlural ?? `Tier ${tierLevel}` - const [columns, imageSize] = getTierImageSizeAndColumns( - tierLevel, - sizeTierLevels, - ) + const [columns, imageSize] = getTierImageSizeAndColumns(tierLevel, sizeTierLevels) lines.push(`### ${tierTitle}`, '', '', ' ') @@ -213,12 +198,8 @@ function replaceSponsorsSection(content: string, replacement: string): string { return content } - const nextHeadingIndex = content.indexOf( - '\n## ', - startIndex + heading.length, - ) - const endIndex - = nextHeadingIndex === -1 ? content.length : nextHeadingIndex + 1 + const nextHeadingIndex = content.indexOf('\n## ', startIndex + heading.length) + const endIndex = nextHeadingIndex === -1 ? content.length : nextHeadingIndex + 1 // Trimmed to a single trailing newline, or a section replaced at the end of // the file leaves a blank last line that the markdown fixer removes — and @@ -230,9 +211,7 @@ async function main(): Promise { const response = await fetch(SPONSORS_SOURCE_URL) if (!response.ok) { - throw new Error( - `Failed to fetch sponsors data: ${response.status} ${response.statusText}`, - ) + throw new Error(`Failed to fetch sponsors data: ${response.status} ${response.statusText}`) } // Links arrive with their tracking params already baked in upstream. @@ -243,7 +222,7 @@ async function main(): Promise { const replacement = buildSponsorsSection(sponsors) const readmeContents = await Promise.all( - readmeFiles.map(readmePath => readFile(readmePath, 'utf-8')), + readmeFiles.map((readmePath) => readFile(readmePath, 'utf-8')), ) const writePromises: Promise[] = [] @@ -260,13 +239,13 @@ async function main(): Promise { } await Promise.all(writePromises) + // oxlint-disable-next-line no-console console.log(`Updated sponsors section in ${updatedCount} README files.`) } try { await main() -} -catch (error) { +} catch (error) { console.error(error) process.exitCode = 1 } diff --git a/tsconfig.base.json b/tsconfig.base.json deleted file mode 100644 index 228dcc8..0000000 --- a/tsconfig.base.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "target": "ES2022", - "jsx": "react-jsx", - "lib": ["ES2022"], - "moduleDetection": "force", - "useDefineForClassFields": true, - "module": "ES2022", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "types": [], - "strict": true, - "noImplicitOverride": true, - "noUncheckedIndexedAccess": true, - "noEmit": true, - "outDir": "${configDir}/dist", - "noUncheckedSideEffectImports": true, - "esModuleInterop": true, - "isolatedModules": true, - "skipLibCheck": true - } -} diff --git a/tsconfig.json b/tsconfig.json index ad90cfe..2d481f0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.base.json", + "extends": "uncheck/tsconfig/middleapi", "compilerOptions": { "lib": ["ES2024"], "types": ["node", "vitest/globals"] diff --git a/tsconfig.lib.json b/tsconfig.lib.json deleted file mode 100644 index 7970b84..0000000 --- a/tsconfig.lib.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.base.json", - "compilerOptions": { - "composite": true, - "lib": ["ES2022"], - "declaration": true, - "declarationMap": true, - "emitDeclarationOnly": true, - "noEmit": false - } -} From a0f30569101717be2e8eff74f1de88ec5938e1dd Mon Sep 17 00:00:00 2001 From: Dinh Le Date: Sat, 3 Oct 2026 14:21:40 +0700 Subject: [PATCH 2/3] style: format with oxfmt --- .github/workflows/pullfrog.yml | 3 +- packages/downgrader/benches/__shared__/api.ts | 121 ++- .../downgrader/benches/__shared__/graphs.ts | 67 +- .../downgrader/benches/__shared__/schemas.ts | 26 +- packages/downgrader/benches/chained.bench.ts | 4 +- .../downgrader/benches/v3.1-to-v3.0.bench.ts | 8 +- .../downgrader/benches/v3.2-to-v3.1.bench.ts | 1 + packages/downgrader/src/shared.ts | 52 +- packages/downgrader/src/v3.1-to-v3.0.ts | 181 +++-- packages/downgrader/src/v3.2-to-v3.1.ts | 40 +- packages/downgrader/tests/corpus.test.ts | 3 +- packages/downgrader/tests/orpc-document.ts | 182 +---- packages/downgrader/tests/orpc.test.ts | 39 +- .../downgrader/tests/v3.1-to-v3.0.test.ts | 690 ++++++++++++++---- .../downgrader/tests/v3.2-to-v3.1.test.ts | 287 ++++++-- packages/downgrader/tests/validate.ts | 12 +- packages/types/src/namespace.test.ts | 12 +- packages/types/src/v3.0.test-d.ts | 8 +- packages/types/src/v3.0.ts | 54 +- packages/types/src/v3.1.ts | 39 +- packages/types/src/v3.2.test-d.ts | 8 +- packages/types/src/v3.2.ts | 53 +- .../tests/examples/callback-example-3-0.ts | 3 +- .../tests/examples/non-oauth-scopes-3-1.ts | 3 +- .../types/tests/examples/tictactoe-3-1.ts | 3 +- packages/types/tests/examples/uspto-3-0.ts | 22 +- .../tests/examples/webhook-example-3-1.ts | 3 +- .../example-object-examples.ts | 3 +- .../schema-tests-3.1/json-schema-dialect.ts | 3 +- .../schema-tests-3.1/link-object-examples.ts | 2 +- .../schema-tests-3.1/media-type-examples.ts | 5 +- packages/types/tests/schema-tests-3.1/mega.ts | 2 +- .../schema-tests-3.1/non-oauth-scopes.ts | 3 +- .../schema-tests-3.1/paths-object-example.ts | 3 +- .../schema-tests-3.1/request-body-examples.ts | 3 +- .../response-object-examples.ts | 3 +- .../types/tests/schema-tests-3.1/schema.ts | 4 +- .../types/tests/schema-tests-3.1/servers.ts | 3 +- .../tests/schema-tests-3.1/style-defaults.ts | 18 +- .../tests/schema-tests-3.1/webhook-example.ts | 3 +- .../example-object-examples.ts | 3 +- .../schema-tests-3.2/json-schema-dialect.ts | 3 +- .../schema-tests-3.2/link-object-examples.ts | 2 +- .../schema-tests-3.2/media-type-examples.ts | 5 +- packages/types/tests/schema-tests-3.2/mega.ts | 2 +- .../schema-tests-3.2/non-oauth-scopes.ts | 3 +- ...meter-object-cookie-form-allow-reserved.ts | 3 +- .../parameter-object-query-allow-reserved.ts | 3 +- .../schema-tests-3.2/paths-object-example.ts | 3 +- .../schema-tests-3.2/request-body-examples.ts | 3 +- .../response-object-examples.ts | 3 +- .../types/tests/schema-tests-3.2/schema.ts | 4 +- .../types/tests/schema-tests-3.2/servers.ts | 3 +- .../tests/schema-tests-3.2/style-defaults.ts | 18 +- .../tests/schema-tests-3.2/webhook-example.ts | 3 +- 55 files changed, 1372 insertions(+), 668 deletions(-) diff --git a/.github/workflows/pullfrog.yml b/.github/workflows/pullfrog.yml index 47ccedc..41b75ae 100644 --- a/.github/workflows/pullfrog.yml +++ b/.github/workflows/pullfrog.yml @@ -34,8 +34,7 @@ jobs: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - GOOGLE_GENERATIVE_AI_API_KEY: - ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }} + GOOGLE_GENERATIVE_AI_API_KEY: ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }} GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} XAI_API_KEY: ${{ secrets.XAI_API_KEY }} DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} diff --git a/packages/downgrader/benches/__shared__/api.ts b/packages/downgrader/benches/__shared__/api.ts index 91f38f2..e9c5ec5 100644 --- a/packages/downgrader/benches/__shared__/api.ts +++ b/packages/downgrader/benches/__shared__/api.ts @@ -83,14 +83,20 @@ function sharedSchemas(): Record { } } -function resourceSchemas(name: string, parent: string | undefined): Record { +function resourceSchemas( + name: string, + parent: string | undefined, +): Record { const fields = (): Record => ({ name: { type: 'string', minLength: 1, maxLength: 120 }, description: { type: ['string', 'null'], maxLength: 2000 }, price: { type: 'number', exclusiveMinimum: 0, examples: [9.99] }, quantity: { type: 'integer', minimum: 0, default: 0 }, tags: { type: 'array', items: { type: 'string' }, uniqueItems: true, maxItems: 20 }, - metadata: { type: 'object', additionalProperties: { type: ['string', 'number', 'boolean', 'null'] } }, + metadata: { + type: 'object', + additionalProperties: { type: ['string', 'number', 'boolean', 'null'] }, + }, dimensions: schemaRef(`${name}/$defs/Dimensions`), }) return { @@ -104,7 +110,10 @@ function resourceSchemas(name: string, parent: string | undefined): Record = {} const schemas = sharedSchemas() @@ -149,23 +160,44 @@ function build(resources: number, v32: boolean): Document { const name = `Resource${index}` const path = `/resources-${index}` as const const tag = `resource-${index}` - const success = (status: string, schema: OpenAPIV3_2.SchemaObject): OpenAPIV3_2.ResponsesObject => ({ - [status]: { description: `The ${name}.`, ...(v32 && { summary: name }), content: json(schema) }, + const success = ( + status: string, + schema: OpenAPIV3_2.SchemaObject, + ): OpenAPIV3_2.ResponsesObject => ({ + [status]: { + description: `The ${name}.`, + ...(v32 && { summary: name }), + content: json(schema), + }, default: errorResponse(v32), }) - tags.push({ name: tag, description: `Operations on ${name}.`, ...(v32 && { summary: name, parent: 'resources', kind: 'nav' }) }) + tags.push({ + name: tag, + description: `Operations on ${name}.`, + ...(v32 && { summary: name, parent: 'resources', kind: 'nav' }), + }) Object.assign(schemas, resourceSchemas(name, index === 0 ? undefined : `Resource${index - 1}`)) examples[name] = { summary: `A sample ${name}.`, - [v32 ? 'dataValue' : 'value']: { id: '3fa85f64-5717-4562-b3fc-2c963f66afa6', kind: name, name: 'Sample', status: 'active', createdAt: '2026-01-01T00:00:00Z' }, + [v32 ? 'dataValue' : 'value']: { + id: '3fa85f64-5717-4562-b3fc-2c963f66afa6', + kind: name, + name: 'Sample', + status: 'active', + createdAt: '2026-01-01T00:00:00Z', + }, } paths[path] = { get: { operationId: `list${name}`, tags: [tag], - parameters: [ref('#/components/parameters/Cursor'), ref('#/components/parameters/Limit'), { name: 'status', in: 'query', schema: schemaRef('Status') }], + parameters: [ + ref('#/components/parameters/Cursor'), + ref('#/components/parameters/Limit'), + { name: 'status', in: 'query', schema: schemaRef('Status') }, + ], responses: success('200', schemaRef(`${name}Page`)), }, post: { @@ -176,7 +208,10 @@ function build(resources: number, v32: boolean): Document { callbacks: { created: { '{$request.header.X-Callback-Url}': { - post: { requestBody: { content: json(schemaRef(name)) }, responses: { 204: { description: 'Received.' } } }, + post: { + requestBody: { content: json(schemaRef(name)) }, + responses: { 204: { description: 'Received.' } }, + }, }, }, }, @@ -185,7 +220,12 @@ function build(resources: number, v32: boolean): Document { query: { operationId: `search${name}`, tags: [tag], - requestBody: { content: json({ type: 'object', properties: { text: { type: 'string' }, status: schemaRef('Status') } }) }, + requestBody: { + content: json({ + type: 'object', + properties: { text: { type: 'string' }, status: schemaRef('Status') }, + }), + }, responses: success('200', schemaRef(`${name}Page`)), }, }), @@ -219,7 +259,10 @@ function build(resources: number, v32: boolean): Document { operationId: `stream${name}`, tags: [tag], responses: { - 200: { description: `A stream of ${name} changes.`, content: { 'application/jsonl': { itemSchema: schemaRef(name) } } }, + 200: { + description: `A stream of ${name} changes.`, + content: { 'application/jsonl': { itemSchema: schemaRef(name) } }, + }, default: errorResponse(v32), }, }, @@ -232,7 +275,15 @@ function build(resources: number, v32: boolean): Document { operationId: `get${name}`, tags: [tag], responses: { - 200: { description: `The ${name}.`, content: { 'application/json': { schema: schemaRef(name), examples: { sample: ref(`#/components/examples/${name}`) } } } }, + 200: { + description: `The ${name}.`, + content: { + 'application/json': { + schema: schemaRef(name), + examples: { sample: ref(`#/components/examples/${name}`) }, + }, + }, + }, 404: ref('#/components/responses/NotFound'), default: errorResponse(v32), }, @@ -240,7 +291,9 @@ function build(resources: number, v32: boolean): Document { patch: { operationId: `update${name}`, tags: [tag], - requestBody: { content: { 'application/merge-patch+json': { schema: schemaRef(`${name}Input`) } } }, + requestBody: { + content: { 'application/merge-patch+json': { schema: schemaRef(`${name}Input`) } }, + }, responses: success('200', schemaRef(name)), }, delete: { @@ -266,9 +319,15 @@ function build(resources: number, v32: boolean): Document { version: '1.0.0', license: { name: 'MIT', identifier: 'MIT' }, }, - jsonSchemaDialect: v32 ? 'https://spec.openapis.org/oas/3.2/dialect/2025-09-17' : 'https://spec.openapis.org/oas/3.1/dialect/base', + jsonSchemaDialect: v32 + ? 'https://spec.openapis.org/oas/3.2/dialect/2025-09-17' + : 'https://spec.openapis.org/oas/3.1/dialect/base', servers: [ - { url: 'https://api.example.com/v1', description: 'Production', ...(v32 && { name: 'production' }) }, + { + url: 'https://api.example.com/v1', + description: 'Production', + ...(v32 && { name: 'production' }), + }, { url: 'https://{region}.api.example.com/v1', description: 'Regional', @@ -285,13 +344,31 @@ function build(resources: number, v32: boolean): Document { parameters: { Id: { name: 'id', in: 'path', required: true, schema: { type: 'string', format: 'uuid' } }, Cursor: { name: 'cursor', in: 'query', schema: { type: ['string', 'null'] } }, - Limit: { name: 'limit', in: 'query', schema: { type: 'integer', minimum: 1, maximum: 100, default: 20 } }, + Limit: { + name: 'limit', + in: 'query', + schema: { type: 'integer', minimum: 1, maximum: 100, default: 20 }, + }, }, responses: { - NotFound: { description: 'Not found.', content: { 'application/problem+json': { schema: schemaRef('Error') } } }, + NotFound: { + description: 'Not found.', + content: { 'application/problem+json': { schema: schemaRef('Error') } }, + }, ...(v32 - ? { Problem: { summary: 'Problem', description: 'A problem.', content: { 'application/problem+json': ref('#/components/mediaTypes/Problem') } } } - : { Error: { description: 'A problem.', content: { 'application/problem+json': { schema: schemaRef('Error') } } } }), + ? { + Problem: { + summary: 'Problem', + description: 'A problem.', + content: { 'application/problem+json': ref('#/components/mediaTypes/Problem') }, + }, + } + : { + Error: { + description: 'A problem.', + content: { 'application/problem+json': { schema: schemaRef('Error') } }, + }, + }), }, examples, pathItems, @@ -317,7 +394,9 @@ function build(resources: number, v32: boolean): Document { }, }, }, - ...(v32 && { mediaTypes: { Problem: { description: 'A problem.', schema: schemaRef('Error') } } }), + ...(v32 && { + mediaTypes: { Problem: { description: 'A problem.', schema: schemaRef('Error') } }, + }), }, } } diff --git a/packages/downgrader/benches/__shared__/graphs.ts b/packages/downgrader/benches/__shared__/graphs.ts index 0af314d..3743f53 100644 --- a/packages/downgrader/benches/__shared__/graphs.ts +++ b/packages/downgrader/benches/__shared__/graphs.ts @@ -21,10 +21,17 @@ export function schemaDiamond(depth: number): OpenAPIV3_2.SchemaObject { return node } -function diamondLevel(level: number, depth: number, pointer: (level: number) => string): OpenAPIV3_2.SchemaObject { +function diamondLevel( + level: number, + depth: number, + pointer: (level: number) => string, +): OpenAPIV3_2.SchemaObject { return level === depth ? { type: ['string', 'null'] } - : { type: 'object', properties: { left: { $ref: pointer(level + 1) }, right: { $ref: pointer(level + 1) } } } + : { + type: 'object', + properties: { left: { $ref: pointer(level + 1) }, right: { $ref: pointer(level + 1) } }, + } } /** @@ -33,12 +40,24 @@ function diamondLevel(level: number, depth: number, pointer: (level: number) => * `$ref`s. Every level has to be inlined. */ export function referenceDiamondV31(depth: number): OpenAPIV3_1.OpenAPIObject { - const pointer = (level: number): string => `#/webhooks/w${level}/post/requestBody/content/application~1json/schema` + const pointer = (level: number): string => + `#/webhooks/w${level}/post/requestBody/content/application~1json/schema` const webhooks: Record = {} for (let level = 0; level <= depth; level++) { - webhooks[`w${level}`] = { post: { requestBody: { content: { 'application/json': { schema: diamondLevel(level, depth, pointer) } } } } } + webhooks[`w${level}`] = { + post: { + requestBody: { + content: { 'application/json': { schema: diamondLevel(level, depth, pointer) } }, + }, + }, + } + } + return { + openapi: '3.1.2', + info: info(), + components: { schemas: { Root: { $ref: pointer(0) } } }, + webhooks, } - return { openapi: '3.1.2', info: info(), components: { schemas: { Root: { $ref: pointer(0) } } }, webhooks } } /** @@ -51,7 +70,11 @@ export function referenceDiamondV32(depth: number): OpenAPIV3_2.OpenAPIObject { for (let level = 0; level <= depth; level++) { mediaTypes[`M${level}`] = { schema: diamondLevel(level, depth, pointer) } } - return { openapi: '3.2.0', info: info(), components: { mediaTypes, schemas: { Root: { $ref: pointer(0) } } } } + return { + openapi: '3.2.0', + info: info(), + components: { mediaTypes, schemas: { Root: { $ref: pointer(0) } } }, + } } /** @@ -59,24 +82,40 @@ export function referenceDiamondV32(depth: number): OpenAPIV3_2.OpenAPIObject { * `base` and callbacks to every `h`, itself included, so about k! paths * run through them. `pointer` says where they live. */ -function cyclicCallbackGraph(k: number, pointer: (name: string) => string): Record { - const items: Record = { base: { get: { responses: { 200: { description: 'ok' } } } } } +function cyclicCallbackGraph( + k: number, + pointer: (name: string) => string, +): Record { + const items: Record = { + base: { get: { responses: { 200: { description: 'ok' } } } }, + } for (let i = 0; i < k; i++) { - const callbacks = Object.fromEntries(Array.from({ length: k }, (_, j) => [`c${j}`, { '{$request.body#/url}': { $ref: pointer(`h${j}`) } }])) - items[`h${i}`] = { $ref: pointer('base'), post: { callbacks, responses: { 200: { description: 'ok' } } } } + const callbacks = Object.fromEntries( + Array.from({ length: k }, (_, j) => [ + `c${j}`, + { '{$request.body#/url}': { $ref: pointer(`h${j}`) } }, + ]), + ) + items[`h${i}`] = { + $ref: pointer('base'), + post: { callbacks, responses: { 200: { description: 'ok' } } }, + } } return items } /** A cyclic callback graph in the webhooks, which 3.0 lacks, entered from a path. */ export function callbackGraphV31(k: number): OpenAPIV3_1.OpenAPIObject { - const webhooks = cyclicCallbackGraph(k, name => `#/webhooks/${name}`) as Record + const webhooks = cyclicCallbackGraph(k, (name) => `#/webhooks/${name}`) as Record< + string, + OpenAPIV3_1.PathItemObject + > return { openapi: '3.1.2', info: info(), paths: { '/a': { $ref: '#/webhooks/h0' } }, webhooks } } /** A cyclic callback graph in a `query` operation, which 3.1 lacks, entered from a path. */ export function callbackGraphV32(k: number): OpenAPIV3_2.OpenAPIObject { - const graph = cyclicCallbackGraph(k, name => `#/paths/~1q/query/callbacks/cb/${name}`) + const graph = cyclicCallbackGraph(k, (name) => `#/paths/~1q/query/callbacks/cb/${name}`) return { openapi: '3.2.0', info: info(), @@ -93,7 +132,9 @@ export function callbackGraphV32(k: number): OpenAPIV3_2.OpenAPIObject { */ export function pathItemChainV31(length: number): OpenAPIV3_1.OpenAPIObject { const pointer = (index: number): string => `#/components/pathItems/P${index}` - const pathItems: Record = { [`P${length}`]: { get: { responses: { 200: { description: 'ok' } } } } } + const pathItems: Record = { + [`P${length}`]: { get: { responses: { 200: { description: 'ok' } } } }, + } const paths: OpenAPIV3_1.PathsObject = {} for (let index = 0; index < length; index++) { pathItems[`P${index}`] = { $ref: pointer(index + 1) } diff --git a/packages/downgrader/benches/__shared__/schemas.ts b/packages/downgrader/benches/__shared__/schemas.ts index 8d0c73c..6c56234 100644 --- a/packages/downgrader/benches/__shared__/schemas.ts +++ b/packages/downgrader/benches/__shared__/schemas.ts @@ -39,14 +39,29 @@ export const ORDER_SCHEMA: OpenAPIV3_2.SchemaObject = { type: 'array', items: { oneOf: [ - { type: 'object', required: ['kind', 'percent'], properties: { kind: { const: 'percent' }, percent: { type: 'number', exclusiveMinimum: 0, maximum: 100 } } }, - { type: 'object', required: ['kind', 'amount'], properties: { kind: { const: 'fixed' }, amount: { $ref: '#/$defs/Money' } } }, + { + type: 'object', + required: ['kind', 'percent'], + properties: { + kind: { const: 'percent' }, + percent: { type: 'number', exclusiveMinimum: 0, maximum: 100 }, + }, + }, + { + type: 'object', + required: ['kind', 'amount'], + properties: { kind: { const: 'fixed' }, amount: { $ref: '#/$defs/Money' } }, + }, ], discriminator: { propertyName: 'kind' }, }, }, total: { $ref: '#/$defs/Money' }, - location: { type: 'array', prefixItems: [{ type: 'number' }, { type: 'number' }], items: false }, + location: { + type: 'array', + prefixItems: [{ type: 'number' }, { type: 'number' }], + items: false, + }, giftWrap: { type: 'boolean' }, giftMessage: { type: ['string', 'null'], maxLength: 500 }, invoice: { type: 'string', contentEncoding: 'base64', contentMediaType: 'application/pdf' }, @@ -55,7 +70,10 @@ export const ORDER_SCHEMA: OpenAPIV3_2.SchemaObject = { }, dependentRequired: { giftMessage: ['giftWrap'] }, if: { properties: { status: { const: 'shipped' } } }, - then: { required: ['shippedAt'], properties: { shippedAt: { type: 'string', format: 'date-time' } } }, + then: { + required: ['shippedAt'], + properties: { shippedAt: { type: 'string', format: 'date-time' } }, + }, else: { properties: { shippedAt: { type: 'null' } } }, $defs: { Money: { diff --git a/packages/downgrader/benches/chained.bench.ts b/packages/downgrader/benches/chained.bench.ts index 9ebb96b..2cf9c95 100644 --- a/packages/downgrader/benches/chained.bench.ts +++ b/packages/downgrader/benches/chained.bench.ts @@ -2,10 +2,10 @@ // package README), and this is what that costs end to end, as oRPC pays it // for every 3.0 document it generates. -import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' - import { downgradeSpecV31ToV30, downgradeSpecV32ToV31 } from '@openapi-spec/downgrader' +import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' import { bench, describe } from 'vitest' + import { corpusV32 } from '../tests/corpus' import { doc as orpcDocument } from '../tests/orpc-document' import { createApiV32 } from './__shared__/api' diff --git a/packages/downgrader/benches/v3.1-to-v3.0.bench.ts b/packages/downgrader/benches/v3.1-to-v3.0.bench.ts index 0c2560e..7102470 100644 --- a/packages/downgrader/benches/v3.1-to-v3.0.bench.ts +++ b/packages/downgrader/benches/v3.1-to-v3.0.bench.ts @@ -1,8 +1,14 @@ import { downgradeSchemaV31ToV30, downgradeSpecV31ToV30 } from '@openapi-spec/downgrader' import { bench, describe } from 'vitest' + import { corpusV31 } from '../tests/corpus' import { createApiV31 } from './__shared__/api' -import { callbackGraphV31, pathItemChainV31, referenceDiamondV31, schemaDiamond } from './__shared__/graphs' +import { + callbackGraphV31, + pathItemChainV31, + referenceDiamondV31, + schemaDiamond, +} from './__shared__/graphs' import { ORDER_SCHEMA, PROPERTY_SCHEMA } from './__shared__/schemas' const API_10_RESOURCES = createApiV31(10) diff --git a/packages/downgrader/benches/v3.2-to-v3.1.bench.ts b/packages/downgrader/benches/v3.2-to-v3.1.bench.ts index ce4e25b..bb6d1c6 100644 --- a/packages/downgrader/benches/v3.2-to-v3.1.bench.ts +++ b/packages/downgrader/benches/v3.2-to-v3.1.bench.ts @@ -1,5 +1,6 @@ import { downgradeSchemaV32ToV31, downgradeSpecV32ToV31 } from '@openapi-spec/downgrader' import { bench, describe } from 'vitest' + import { corpusV32 } from '../tests/corpus' import { createApiV32 } from './__shared__/api' import { callbackGraphV32, referenceDiamondV32, schemaDiamond } from './__shared__/graphs' diff --git a/packages/downgrader/src/shared.ts b/packages/downgrader/src/shared.ts index 3cf2a0c..faec0f7 100644 --- a/packages/downgrader/src/shared.ts +++ b/packages/downgrader/src/shared.ts @@ -18,9 +18,22 @@ export type Field = (value: unknown, ctx: Context, parent: Record -export type Finish = (out: Record, source: Record, ctx: Context) => void - -export const HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const +export type Finish = ( + out: Record, + source: Record, + ctx: Context, +) => void + +export const HTTP_METHODS = [ + 'get', + 'put', + 'post', + 'delete', + 'options', + 'head', + 'patch', + 'trace', +] as const /** * Whether `value` is an object JSON would see as one: its prototype is null, @@ -34,15 +47,22 @@ export function isRecord(value: unknown): value is Record { return false } const proto: unknown = Object.getPrototypeOf(value) - return proto === null || (Object.getPrototypeOf(proto) === null && Object.keys(proto as object).length === 0) + return ( + proto === null || + (Object.getPrototypeOf(proto) === null && Object.keys(proto as object).length === 0) + ) } // Assigning `__proto__` would set the prototype instead of adding a key. function setOwn(target: Record, key: string, value: unknown): void { if (key === '__proto__') { - Object.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true }) - } - else { + Object.defineProperty(target, key, { + configurable: true, + enumerable: true, + value, + writable: true, + }) + } else { target[key] = value } } @@ -91,7 +111,12 @@ function copy(value: unknown, copies: Map): unknown { * through its converter or is dropped, and any other key is copied. `finish` * then edits the output in place. */ -export function convertObject(value: unknown, ctx: Context, fields: Fields, finish?: Finish): unknown { +export function convertObject( + value: unknown, + ctx: Context, + fields: Fields, + finish?: Finish, +): unknown { if (!isRecord(value)) { return clone(value) } @@ -111,7 +136,8 @@ export function convertObject(value: unknown, ctx: Context, fields: Fields, fini continue } const field = fields.get(key) - const converted = field === undefined ? clone(item) : field === DROP ? DROP : field(item, ctx, value) + const converted = + field === undefined ? clone(item) : field === DROP ? DROP : field(item, ctx, value) if (converted !== DROP) { setOwn(out, key, converted) } @@ -138,7 +164,10 @@ export function map(convert: Convert, isEntry: (key: string) => boolean = () => } export function list(convert: Convert): Convert { - return (value, ctx) => Array.isArray(value) ? value.map(item => convert(item, ctx)).filter(item => item !== DROP) : clone(value) + return (value, ctx) => + Array.isArray(value) + ? value.map((item) => convert(item, ctx)).filter((item) => item !== DROP) + : clone(value) } export function isPath(key: string): boolean { @@ -164,8 +193,7 @@ function find(root: unknown, ref: string): unknown { let pointer: string try { pointer = decodeURIComponent(ref.slice(1)) - } - catch { + } catch { return undefined } if (pointer !== '' && !pointer.startsWith('/')) { diff --git a/packages/downgrader/src/v3.1-to-v3.0.ts b/packages/downgrader/src/v3.1-to-v3.0.ts index 639fcd2..9ed5eb1 100644 --- a/packages/downgrader/src/v3.1-to-v3.0.ts +++ b/packages/downgrader/src/v3.1-to-v3.0.ts @@ -107,7 +107,19 @@ const V30_SCHEMA_KEYWORDS = new Set([ ]) // Keywords that let `unevaluatedProperties` see more than `properties`. -const IN_PLACE_APPLICATORS = ['$dynamicRef', '$ref', 'additionalProperties', 'allOf', 'anyOf', 'dependentSchemas', 'else', 'if', 'oneOf', 'patternProperties', 'then'] +const IN_PLACE_APPLICATORS = [ + '$dynamicRef', + '$ref', + 'additionalProperties', + 'allOf', + 'anyOf', + 'dependentSchemas', + 'else', + 'if', + 'oneOf', + 'patternProperties', + 'then', +] // Converted schemas that lost a restriction, directly or in a subschema. const LOOSE = new WeakSet() @@ -117,7 +129,7 @@ const convertContent = map(convertMediaType) const convertReference = refOr(clone) const SCHEMA_FIELDS = defineFields({ - ...Object.fromEntries(REMOVED_KEYWORDS.map(key => [key, DROP])), + ...Object.fromEntries(REMOVED_KEYWORDS.map((key) => [key, DROP])), // It would reject the properties that `patternProperties` allowed. additionalProperties: (item, ctx, schema) => { if (schema.patternProperties !== undefined) { @@ -128,14 +140,15 @@ const SCHEMA_FIELDS = defineFields({ allOf: list(convertSchema), anyOf: list(convertSchema), // An empty one rejects every value, which `finishSchema` keeps another way. - enum: item => (Array.isArray(item) && item.length === 0 ? DROP : clone(item)), + enum: (item) => (Array.isArray(item) && item.length === 0 ? DROP : clone(item)), // `finishSchema` builds it from `prefixItems`. - items: (item, ctx, schema) => (schema.prefixItems === undefined ? convertSchema(item, ctx) : DROP), + items: (item, ctx, schema) => + schema.prefixItems === undefined ? convertSchema(item, ctx) : DROP, not: convertSchema, oneOf: list(convertSchema), properties: map(convertSchema), // 3.0 requires at least one entry. - required: item => (Array.isArray(item) && item.length === 0 ? DROP : clone(item)), + required: (item) => (Array.isArray(item) && item.length === 0 ? DROP : clone(item)), }) const PARAMETER_FIELDS = defineFields({ @@ -173,7 +186,7 @@ const OPERATION_FIELDS = defineFields({ }) const PATH_ITEM_FIELDS = defineFields({ - ...Object.fromEntries(HTTP_METHODS.map(method => [method, convertOperation])), + ...Object.fromEntries(HTTP_METHODS.map((method) => [method, convertOperation])), parameters: list(refOr(convertParameter)), }) @@ -190,7 +203,9 @@ const COMPONENTS_FIELDS = defineFields({ requestBodies: map(refOr(convertRequestBody)), responses: map(refOr(convertResponse)), schemas: map(convertSchema), - securitySchemes: map((item, ctx) => (schemeType(item, ctx) === 'mutualTLS' ? DROP : convertReference(item, ctx))), + securitySchemes: map((item, ctx) => + schemeType(item, ctx) === 'mutualTLS' ? DROP : convertReference(item, ctx), + ), }) const LICENSE_FIELDS = defineFields({ @@ -221,7 +236,12 @@ const DOCUMENT_FIELDS = defineFields({ // A `$ref` into a removed part, `$defs`, or `definitions` is replaced by its // target, unless it already dangles. function isInlined(ref: string, ctx: Context): boolean { - return (ref.includes('/$defs/') || ref.includes('/definitions/') || REMOVED_PARTS.some(prefix => ref.startsWith(prefix))) && resolvePointer(ref, ctx) !== undefined + return ( + (ref.includes('/$defs/') || + ref.includes('/definitions/') || + REMOVED_PARTS.some((prefix) => ref.startsWith(prefix))) && + resolvePointer(ref, ctx) !== undefined + ) } /** A 3.0 Reference Object holds only `$ref`. */ @@ -249,7 +269,12 @@ function convertSchemaRef(ref: string, ctx: Context): unknown { // them, unless `items: false` or `maxItems` allows none. `items: false` // becomes `maxItems`. Returns whether the result means exactly the same, // as when every item schema is the same and none lost a restriction. -function convertTuple(out: Record, prefixItems: unknown[], schema: Record, ctx: Context): boolean { +function convertTuple( + out: Record, + prefixItems: unknown[], + schema: Record, + ctx: Context, +): boolean { const { items, maxItems } = schema if (items === false && !(typeof maxItems === 'number' && maxItems <= prefixItems.length)) { out.maxItems = prefixItems.length @@ -277,8 +302,7 @@ function convertTuple(out: Record, prefixItems: unknown[], sche function jsonKey(value: unknown): unknown { try { return JSON.stringify(value) - } - catch { + } catch { return value } } @@ -286,8 +310,7 @@ function jsonKey(value: unknown): unknown { function addAnyOf(out: Record, variants: unknown[]): void { if (out.anyOf === undefined) { out.anyOf = variants - } - else { + } else { out.allOf = [...(Array.isArray(out.allOf) ? out.allOf : []), { anyOf: variants }] } } @@ -303,19 +326,30 @@ function isLoose(value: unknown): boolean { // With no in-place applicator beside it, it means exactly `additionalProperties`. function isUnevaluatedAdditional(schema: Record): boolean { - return schema.unevaluatedProperties !== undefined && IN_PLACE_APPLICATORS.every(key => schema[key] === undefined) + return ( + schema.unevaluatedProperties !== undefined && + IN_PLACE_APPLICATORS.every((key) => schema[key] === undefined) + ) } // Whether removing `key` from `schema` lets it accept more values. Property // names are strings anyway, and `unevaluatedProperties` does nothing beside // `additionalProperties`. -function losesRestriction(key: string, schema: Record, exactTuple: boolean): boolean { +function losesRestriction( + key: string, + schema: Record, + exactTuple: boolean, +): boolean { switch (key) { case 'prefixItems': return !exactTuple case 'propertyNames': { const names = schema.propertyNames - return !(names === true || (isRecord(names) && Object.entries(names).every(([name, item]) => name === 'type' && item === 'string'))) + return !( + names === true || + (isRecord(names) && + Object.entries(names).every(([name, item]) => name === 'type' && item === 'string')) + ) } case 'unevaluatedProperties': return !(schema.additionalProperties !== undefined || isUnevaluatedAdditional(schema)) @@ -328,10 +362,18 @@ function losesRestriction(key: string, schema: Record, exactTup // then reject values the original accepts, and so would a `oneOf` whose // branches may now overlap, so the `not` is removed and the `oneOf` becomes // an `anyOf`. Returns whether the schema is loosened itself. -function loosen(out: Record, schema: Record, exactTuple: boolean): boolean { +function loosen( + out: Record, + schema: Record, + exactTuple: boolean, +): boolean { let loose = false for (const key in schema) { - if (RESTRICTING_KEYWORDS.has(key) && schema[key] !== undefined && losesRestriction(key, schema, exactTuple)) { + if ( + RESTRICTING_KEYWORDS.has(key) && + schema[key] !== undefined && + losesRestriction(key, schema, exactTuple) + ) { loose = true } } @@ -344,12 +386,14 @@ function loosen(out: Record, schema: Record, e delete out.oneOf loose = true } - return loose - || isLoose(out.items) - || isLoose(out.additionalProperties) - || (isRecord(out.properties) && Object.values(out.properties).some(isLoose)) - || (Array.isArray(out.allOf) && out.allOf.some(isLoose)) - || (Array.isArray(out.anyOf) && out.anyOf.some(isLoose)) + return ( + loose || + isLoose(out.items) || + isLoose(out.additionalProperties) || + (isRecord(out.properties) && Object.values(out.properties).some(isLoose)) || + (Array.isArray(out.allOf) && out.allOf.some(isLoose)) || + (Array.isArray(out.anyOf) && out.anyOf.some(isLoose)) + ) } // 3.0 takes one type, and marks null with `nullable` instead. @@ -358,29 +402,29 @@ function convertType(out: Record, type: unknown): void { out.type = type return } - const types = (Array.isArray(type) ? type : [type]).filter(item => typeof item === 'string') + const types = (Array.isArray(type) ? type : [type]).filter((item) => typeof item === 'string') const nullable = types.includes('null') - const rest = types.filter(item => item !== 'null') + const rest = types.filter((item) => item !== 'null') if (rest.length === 1) { out.type = rest[0] if (nullable) { out.nullable = true } - } - else if (rest.length > 1) { - addAnyOf(out, rest.map(item => ({ - type: item, - ...(item === 'array' && { items: out.items ?? {} }), - ...(nullable && { nullable: true }), - }))) + } else if (rest.length > 1) { + addAnyOf( + out, + rest.map((item) => ({ + type: item, + ...(item === 'array' && { items: out.items ?? {} }), + ...(nullable && { nullable: true }), + })), + ) delete out.items - } - else if (nullable) { + } else if (nullable) { // 3.0 has no null type, so only null may match, and an `enum` without it matches nothing. if (out.enum === undefined || (Array.isArray(out.enum) && out.enum.includes(null))) { out.enum = [null] - } - else { + } else { out.allOf = [...(Array.isArray(out.allOf) ? out.allOf : []), { not: {} }] } } @@ -395,10 +439,18 @@ function binaryFormat(schema: Record): string | undefined { if (schema.contentEncoding === 'binary') { return 'binary' } - return schema.contentEncoding === undefined && schema.contentMediaType !== undefined && schema.contentSchema === undefined ? 'binary' : undefined + return schema.contentEncoding === undefined && + schema.contentMediaType !== undefined && + schema.contentSchema === undefined + ? 'binary' + : undefined } -function finishSchema(out: Record, schema: Record, ctx: Context): void { +function finishSchema( + out: Record, + schema: Record, + ctx: Context, +): void { // 3.0 ignores the siblings of a `$ref`, but not the members of an `allOf`. if (typeof schema.$ref === 'string') { out.allOf = [convertSchemaRef(schema.$ref, ctx), ...(Array.isArray(out.allOf) ? out.allOf : [])] @@ -409,14 +461,19 @@ function finishSchema(out: Record, schema: Record jsonKey(item) === jsonKey(schema.const)) + const constOutsideEnum = + schema.const !== undefined && + Array.isArray(schema.enum) && + !schema.enum.some((item) => jsonKey(item) === jsonKey(schema.const)) let loose = loosen(out, schema, exactTuple) || constOutsideEnum convertType(out, schema.type) // Written 3.0-style in a 3.1 document, it can only mean what it means in 3.0. @@ -428,11 +485,17 @@ function finishSchema(out: Record, schema: Record exclusiveMinimum)) { + if ( + typeof exclusiveMinimum === 'number' && + !(typeof minimum === 'number' && minimum > exclusiveMinimum) + ) { out.minimum = exclusiveMinimum out.exclusiveMinimum = true } - if (typeof exclusiveMaximum === 'number' && !(typeof maximum === 'number' && maximum < exclusiveMaximum)) { + if ( + typeof exclusiveMaximum === 'number' && + !(typeof maximum === 'number' && maximum < exclusiveMaximum) + ) { out.maximum = exclusiveMaximum out.exclusiveMaximum = true } @@ -506,7 +569,11 @@ function convertOperation(value: unknown, ctx: Context): unknown { } // The target's fields fill in for those the referencing Path Item lacks. -function finishMergedPathItem(out: Record, pathItem: Record, ctx: Context): void { +function finishMergedPathItem( + out: Record, + pathItem: Record, + ctx: Context, +): void { const target = inline(pathItem.$ref as string, ctx, convertPathItem) if (isRecord(target)) { for (const [key, item] of Object.entries(target)) { @@ -537,17 +604,27 @@ function convertSecurity(value: unknown, ctx: Context): unknown { return clone(value) } const schemes = resolvePointer('#/components/securitySchemes', ctx) - const typeOf = (name: string): unknown => (isRecord(schemes) && Object.hasOwn(schemes, name) ? schemeType(schemes[name], ctx) : undefined) + const typeOf = (name: string): unknown => + isRecord(schemes) && Object.hasOwn(schemes, name) ? schemeType(schemes[name], ctx) : undefined const out: unknown[] = [] for (const requirement of value) { if (!isRecord(requirement)) { out.push(clone(requirement)) continue } - const entries = Object.keys(requirement).filter(name => requirement[name] !== undefined).map(name => [name, typeOf(name)] as const) + const entries = Object.keys(requirement) + .filter((name) => requirement[name] !== undefined) + .map((name) => [name, typeOf(name)] as const) const kept = entries.filter(([, type]) => type !== 'mutualTLS') if (kept.length > 0 || entries.length === 0) { - out.push(Object.fromEntries(kept.map(([name, type]) => [name, type === 'apiKey' || type === 'http' ? [] : clone(requirement[name])]))) + out.push( + Object.fromEntries( + kept.map(([name, type]) => [ + name, + type === 'apiKey' || type === 'http' ? [] : clone(requirement[name]), + ]), + ), + ) } } return out.length === 0 && value.length > 0 ? DROP : out @@ -566,6 +643,10 @@ export function downgradeSpecV31ToV30(spec: OpenAPIV3_1.OpenAPIObject): OpenAPIV return downgrade(spec, convertDocument) as OpenAPIV3_0.OpenAPIObject } -export function downgradeSchemaV31ToV30(schema: OpenAPIV3_1.SchemaObject): OpenAPIV3_0.ReferenceObject | OpenAPIV3_0.SchemaObject { - return downgrade(schema, convertSchema) as OpenAPIV3_0.ReferenceObject | OpenAPIV3_0.SchemaObject +export function downgradeSchemaV31ToV30( + schema: OpenAPIV3_1.SchemaObject, +): OpenAPIV3_0.ReferenceObject | OpenAPIV3_0.SchemaObject { + return downgrade(schema, convertSchema) as + | OpenAPIV3_0.ReferenceObject + | OpenAPIV3_0.SchemaObject } diff --git a/packages/downgrader/src/v3.2-to-v3.1.ts b/packages/downgrader/src/v3.2-to-v3.1.ts index fc60963..29fe9b6 100644 --- a/packages/downgrader/src/v3.2-to-v3.1.ts +++ b/packages/downgrader/src/v3.2-to-v3.1.ts @@ -25,7 +25,19 @@ const V31_DIALECT = 'https://spec.openapis.org/oas/3.1/dialect/base' // Both versions use JSON Schema 2020-12, so a schema only changes in // `discriminator` and `xml`. These keywords hold the subschemas to look into. -const SUBSCHEMA_KEYWORDS = ['additionalProperties', 'contains', 'contentSchema', 'else', 'if', 'items', 'not', 'propertyNames', 'then', 'unevaluatedItems', 'unevaluatedProperties'] +const SUBSCHEMA_KEYWORDS = [ + 'additionalProperties', + 'contains', + 'contentSchema', + 'else', + 'if', + 'items', + 'not', + 'propertyNames', + 'then', + 'unevaluatedItems', + 'unevaluatedProperties', +] const SUBSCHEMA_MAP_KEYWORDS = ['$defs', 'dependentSchemas', 'patternProperties', 'properties'] const SUBSCHEMA_LIST_KEYWORDS = ['allOf', 'anyOf', 'oneOf', 'prefixItems'] @@ -38,9 +50,9 @@ const DISCRIMINATOR_FIELDS = defineFields({ }) const SCHEMA_FIELDS = defineFields({ - ...Object.fromEntries(SUBSCHEMA_KEYWORDS.map(key => [key, convertSchema])), - ...Object.fromEntries(SUBSCHEMA_MAP_KEYWORDS.map(key => [key, map(convertSchema)])), - ...Object.fromEntries(SUBSCHEMA_LIST_KEYWORDS.map(key => [key, list(convertSchema)])), + ...Object.fromEntries(SUBSCHEMA_KEYWORDS.map((key) => [key, convertSchema])), + ...Object.fromEntries(SUBSCHEMA_MAP_KEYWORDS.map((key) => [key, map(convertSchema)])), + ...Object.fromEntries(SUBSCHEMA_LIST_KEYWORDS.map((key) => [key, list(convertSchema)])), discriminator: (item, ctx) => convertObject(item, ctx, DISCRIMINATOR_FIELDS), xml: convertXml, }) @@ -65,7 +77,7 @@ const PARAMETER_FIELDS = defineFields({ content: convertContent, examples: map(refOr(convertExample)), schema: convertSchema, - style: item => (item === 'cookie' ? DROP : clone(item)), + style: (item) => (item === 'cookie' ? DROP : clone(item)), }) const ENCODING_FIELDS = defineFields({ @@ -119,7 +131,7 @@ const OPERATION_FIELDS = defineFields({ }) const PATH_ITEM_FIELDS = defineFields({ - ...Object.fromEntries(HTTP_METHODS.map(method => [method, convertOperation])), + ...Object.fromEntries(HTTP_METHODS.map((method) => [method, convertOperation])), additionalOperations: DROP, parameters: list(convertParameterRef), query: DROP, @@ -143,7 +155,8 @@ const COMPONENTS_FIELDS = defineFields({ const DOCUMENT_FIELDS = defineFields({ $self: DROP, components: (item, ctx) => convertObject(item, ctx, COMPONENTS_FIELDS), - jsonSchemaDialect: item => (typeof item === 'string' && item.startsWith(V32_DIALECT_PREFIX) ? V31_DIALECT : clone(item)), + jsonSchemaDialect: (item) => + typeof item === 'string' && item.startsWith(V32_DIALECT_PREFIX) ? V31_DIALECT : clone(item), paths: map(convertPathItem, isPath), servers: convertServers, tags: list(convertTag), @@ -166,8 +179,7 @@ function convertXml(value: unknown, _ctx: Context, schema: Record if (nodeType === 'attribute') { out.attribute = true - } - else if (nodeType === 'element' && hasType(schema.type, 'array')) { + } else if (nodeType === 'element' && hasType(schema.type, 'array')) { out.wrapped = true } return out @@ -233,7 +245,11 @@ function convertEncoding(value: unknown, ctx: Context): unknown { return convertObject(value, ctx, ENCODING_FIELDS) } -function finishMediaType(out: Record, mediaType: Record, ctx: Context): void { +function finishMediaType( + out: Record, + mediaType: Record, + ctx: Context, +): void { if (mediaType.itemSchema !== undefined && mediaType.schema === undefined) { out.schema = { items: convertSchema(mediaType.itemSchema, ctx), type: 'array' } } @@ -292,6 +308,8 @@ export function downgradeSpecV32ToV31(spec: OpenAPIV3_2.OpenAPIObject): OpenAPIV return downgrade(spec, convertDocument) as OpenAPIV3_1.OpenAPIObject } -export function downgradeSchemaV32ToV31(schema: OpenAPIV3_2.SchemaObject): OpenAPIV3_1.SchemaObject { +export function downgradeSchemaV32ToV31( + schema: OpenAPIV3_2.SchemaObject, +): OpenAPIV3_1.SchemaObject { return downgrade(schema, convertSchema) as OpenAPIV3_1.SchemaObject } diff --git a/packages/downgrader/tests/corpus.test.ts b/packages/downgrader/tests/corpus.test.ts index 001a93b..660622f 100644 --- a/packages/downgrader/tests/corpus.test.ts +++ b/packages/downgrader/tests/corpus.test.ts @@ -1,9 +1,8 @@ // Every official document (see corpus.ts) must come out of each step, and of // both steps chained, as a valid document of the older version. -import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' - import { downgradeSpecV31ToV30, downgradeSpecV32ToV31 } from '@openapi-spec/downgrader' +import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' import { doc as mega } from '../../types/tests/schema-tests-3.2/mega' import { corpusV31, corpusV32 } from './corpus' diff --git a/packages/downgrader/tests/orpc-document.ts b/packages/downgrader/tests/orpc-document.ts index c092293..c39eb9a 100644 --- a/packages/downgrader/tests/orpc-document.ts +++ b/packages/downgrader/tests/orpc-document.ts @@ -44,7 +44,8 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { id: { type: 'string', format: 'uuid', - pattern: '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', + pattern: + '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', }, name: { type: 'string', @@ -52,17 +53,12 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { description: 'The planet name', }, description: { - type: [ - 'string', - 'null', - ], + type: ['string', 'null'], }, mass: { type: 'number', exclusiveMinimum: 0, - examples: [ - 5.97e+24, - ], + examples: [5.97e24], }, moons: { type: 'integer', @@ -71,11 +67,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { }, kind: { type: 'string', - enum: [ - 'rocky', - 'gas', - 'ice', - ], + enum: ['rocky', 'gas', 'ice'], }, discoveredAt: { 'type': 'string', @@ -130,11 +122,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'string', }, additionalProperties: { - type: [ - 'string', - 'number', - 'boolean', - ], + type: ['string', 'number', 'boolean'], }, }, population: { @@ -172,11 +160,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { }, data: {}, }, - required: [ - 'defined', - 'code', - 'message', - ], + required: ['defined', 'code', 'message'], }, NotFound: { title: 'NOT_FOUND', @@ -198,18 +182,11 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'string', }, }, - required: [ - 'id', - ], + required: ['id'], additionalProperties: false, }, }, - required: [ - 'defined', - 'code', - 'message', - 'data', - ], + required: ['defined', 'code', 'message', 'data'], }, Conflict: { title: 'CONFLICT', @@ -226,11 +203,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { }, data: {}, }, - required: [ - 'defined', - 'code', - 'message', - ], + required: ['defined', 'code', 'message'], }, BadRequest: { title: 'BAD_REQUEST', @@ -256,36 +229,23 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { path: { type: 'array', items: { - type: [ - 'string', - 'number', - ], + type: ['string', 'number'], }, }, message: { type: 'string', }, }, - required: [ - 'path', - 'message', - ], + required: ['path', 'message'], additionalProperties: false, }, }, }, - required: [ - 'issues', - ], + required: ['issues'], additionalProperties: false, }, }, - required: [ - 'defined', - 'code', - 'message', - 'data', - ], + required: ['defined', 'code', 'message', 'data'], }, Category: { type: 'object', @@ -310,11 +270,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { }, }, }, - required: [ - 'name', - 'parent', - 'children', - ], + required: ['name', 'parent', 'children'], additionalProperties: false, }, }, @@ -330,9 +286,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { get: { operationId: 'planets.list', summary: 'List planets', - tags: [ - 'planets', - ], + tags: ['planets'], parameters: [ { in: 'query', @@ -363,11 +317,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { properties: { kind: { type: 'string', - enum: [ - 'rocky', - 'gas', - 'ice', - ], + enum: ['rocky', 'gas', 'ice'], }, name: { type: 'string', @@ -409,16 +359,10 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { }, }, next: { - type: [ - 'string', - 'null', - ], + type: ['string', 'null'], }, }, - required: [ - 'items', - 'next', - ], + required: ['items', 'next'], additionalProperties: false, }, }, @@ -429,9 +373,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { post: { operationId: 'planets.create', deprecated: true, - tags: [ - 'planets', - ], + tags: ['planets'], requestBody: { required: true, content: { @@ -445,17 +387,12 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { description: 'The planet name', }, description: { - type: [ - 'string', - 'null', - ], + type: ['string', 'null'], }, mass: { type: 'number', exclusiveMinimum: 0, - examples: [ - 5.97e+24, - ], + examples: [5.97e24], }, moons: { type: 'integer', @@ -464,11 +401,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { }, kind: { type: 'string', - enum: [ - 'rocky', - 'gas', - 'ice', - ], + enum: ['rocky', 'gas', 'ice'], }, discoveredAt: { 'type': 'string', @@ -523,11 +456,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'string', }, additionalProperties: { - type: [ - 'string', - 'number', - 'boolean', - ], + type: ['string', 'number', 'boolean'], }, }, population: { @@ -602,9 +531,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { '/planets/{id}': { get: { operationId: 'planets.find', - tags: [ - 'planets', - ], + tags: ['planets'], parameters: [ { in: 'path', @@ -704,7 +631,8 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { id: { type: 'string', format: 'uuid', - pattern: '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', + pattern: + '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', }, name: { type: 'string', @@ -712,17 +640,12 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { description: 'The planet name', }, description: { - type: [ - 'string', - 'null', - ], + type: ['string', 'null'], }, mass: { type: 'number', exclusiveMinimum: 0, - examples: [ - 5.97e+24, - ], + examples: [5.97e24], }, moons: { type: 'integer', @@ -731,11 +654,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { }, kind: { type: 'string', - enum: [ - 'rocky', - 'gas', - 'ice', - ], + enum: ['rocky', 'gas', 'ice'], }, discoveredAt: { 'type': 'string', @@ -790,11 +709,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'string', }, additionalProperties: { - type: [ - 'string', - 'number', - 'boolean', - ], + type: ['string', 'number', 'boolean'], }, }, population: { @@ -837,9 +752,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'string', }, }, - required: [ - 'jobId', - ], + required: ['jobId'], additionalProperties: false, }, }, @@ -878,9 +791,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'string', }, }, - required: [ - 'image', - ], + required: ['image'], }, }, }, @@ -898,9 +809,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { format: 'uri', }, }, - required: [ - 'url', - ], + required: ['url'], additionalProperties: false, }, }, @@ -972,10 +881,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { $ref: '#/components/schemas/Planet', }, }, - required: [ - 'type', - 'planet', - ], + required: ['type', 'planet'], additionalProperties: false, }, id: { @@ -985,10 +891,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'number', }, }, - required: [ - 'event', - 'data', - ], + required: ['event', 'data'], }, { type: 'object', @@ -1003,9 +906,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'number', }, }, - required: [ - 'total', - ], + required: ['total'], additionalProperties: false, }, id: { @@ -1015,10 +916,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'number', }, }, - required: [ - 'event', - 'data', - ], + required: ['event', 'data'], }, { type: 'object', @@ -1034,9 +932,7 @@ export const doc: OpenAPIV3_2.OpenAPIObject = { type: 'number', }, }, - required: [ - 'event', - ], + required: ['event'], }, ], }, diff --git a/packages/downgrader/tests/orpc.test.ts b/packages/downgrader/tests/orpc.test.ts index dfb02cd..7f69d83 100644 --- a/packages/downgrader/tests/orpc.test.ts +++ b/packages/downgrader/tests/orpc.test.ts @@ -1,9 +1,8 @@ // oRPC generates 3.2 and downgrades it for older versions. This checks both // steps on a document it generated (see orpc-document.ts). -import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' - import { downgradeSpecV31ToV30, downgradeSpecV32ToV31 } from '@openapi-spec/downgrader' +import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' import { doc } from './orpc-document' import { expectValidDowngrade } from './validate' @@ -27,19 +26,43 @@ it('converts the oRPC document into a valid 3.0 document', async () => { description: { type: 'string', nullable: true }, mass: { type: 'number', minimum: 0, exclusiveMinimum: true, example: 5.97e24 }, position: { type: 'array', items: { type: 'number' }, minItems: 3, maxItems: 3 }, - aliases: { type: 'array', items: { type: 'array', items: { type: 'string' }, minItems: 2, maxItems: 2 } }, - attributes: { type: 'object', additionalProperties: { anyOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }] } }, + aliases: { + type: 'array', + items: { type: 'array', items: { type: 'string' }, minItems: 2, maxItems: 2 }, + }, + attributes: { + type: 'object', + additionalProperties: { + anyOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }], + }, + }, discoveredAt: { 'type': 'string', 'format': 'date-time', 'x-native-type': 'date' }, }, }) expect(Planet).not.toHaveProperty('properties.attributes.propertyNames') - expect(Category).toMatchObject({ properties: { parent: { anyOf: [{ $ref: '#/components/schemas/Category' }, { enum: [null] }] } } }) - expect(NotFound).toMatchObject({ properties: { defined: { enum: [true] }, code: { enum: ['NOT_FOUND'] } } }) + expect(Category).toMatchObject({ + properties: { + parent: { anyOf: [{ $ref: '#/components/schemas/Category' }, { enum: [null] }] }, + }, + }) + expect(NotFound).toMatchObject({ + properties: { defined: { enum: [true] }, code: { enum: ['NOT_FOUND'] } }, + }) const upload = v30.paths['/planets/{id}/image']?.put?.requestBody - expect(upload).toMatchObject({ content: { 'multipart/form-data': { schema: { properties: { image: { type: 'string', format: 'binary' } } } } } }) + expect(upload).toMatchObject({ + content: { + 'multipart/form-data': { + schema: { properties: { image: { type: 'string', format: 'binary' } } }, + }, + }, + }) expect(v30.paths['/planets/events']?.get?.responses['200']).toMatchObject({ - content: { 'text/event-stream': { schema: { oneOf: [{ properties: { event: { enum: ['message'] } } }, {}, {}] } } }, + content: { + 'text/event-stream': { + schema: { oneOf: [{ properties: { event: { enum: ['message'] } } }, {}, {}] }, + }, + }, }) }) diff --git a/packages/downgrader/tests/v3.1-to-v3.0.test.ts b/packages/downgrader/tests/v3.1-to-v3.0.test.ts index 9cf8e6d..44b56cb 100644 --- a/packages/downgrader/tests/v3.1-to-v3.0.test.ts +++ b/packages/downgrader/tests/v3.1-to-v3.0.test.ts @@ -1,6 +1,5 @@ -import type * as OpenAPIV3_1 from '@openapi-spec/types/v3.1' - import { downgradeSchemaV31ToV30, downgradeSpecV31ToV30 } from '@openapi-spec/downgrader' +import type * as OpenAPIV3_1 from '@openapi-spec/types/v3.1' import { expectValidDowngrade } from './validate' @@ -30,7 +29,11 @@ describe('downgradeSpecV31ToV30', () => { type: 'object', properties: { photo: { type: 'string', contentMediaType: 'image/png' }, - tags: { type: 'array', prefixItems: [{ type: 'string' }, { type: 'integer' }], items: false }, + tags: { + type: 'array', + prefixItems: [{ type: 'string' }, { type: 'integer' }], + items: false, + }, }, }, }, @@ -40,7 +43,14 @@ describe('downgradeSpecV31ToV30', () => { }, }, }, - webhooks: { created: { post: { requestBody: { $ref: '#/components/requestBodies/Pet', summary: 'A pet' }, responses } } }, + webhooks: { + created: { + post: { + requestBody: { $ref: '#/components/requestBodies/Pet', summary: 'A pet' }, + responses, + }, + }, + }, components: { schemas: { Pet: { @@ -52,31 +62,65 @@ describe('downgradeSpecV31ToV30', () => { name: { type: ['string', 'null'] }, age: { type: 'integer', exclusiveMinimum: 0 }, owner: { $ref: '#/components/schemas/Owner', description: 'Who owns it' }, - parent: { anyOf: [{ $ref: '#/components/schemas/Pet/$defs/Self' }, { type: 'null' }] }, - labels: { type: 'object', propertyNames: { pattern: '^[a-z]+$' }, additionalProperties: { type: 'string' } }, + parent: { + anyOf: [{ $ref: '#/components/schemas/Pet/$defs/Self' }, { type: 'null' }], + }, + labels: { + type: 'object', + propertyNames: { pattern: '^[a-z]+$' }, + additionalProperties: { type: 'string' }, + }, }, $defs: { Self: { type: 'object' } }, }, Owner: { type: 'object', properties: { name: { type: 'string' } } }, }, parameters: { Id: { in: 'path', name: 'id', required: true, schema: { type: 'string' } } }, - requestBodies: { Pet: { content: { 'application/json': { schema: { $ref: '#/components/schemas/Pet' } } } } }, - pathItems: { Pet: { parameters: [{ $ref: '#/components/parameters/Id', description: 'The pet id' }], get: { responses } } }, - securitySchemes: { mtls: { type: 'mutualTLS' }, bearer: { type: 'http', scheme: 'bearer' } }, + requestBodies: { + Pet: { + content: { 'application/json': { schema: { $ref: '#/components/schemas/Pet' } } }, + }, + }, + pathItems: { + Pet: { + parameters: [{ $ref: '#/components/parameters/Id', description: 'The pet id' }], + get: { responses }, + }, + }, + securitySchemes: { + mtls: { type: 'mutualTLS' }, + bearer: { type: 'http', scheme: 'bearer' }, + }, }, } await expectValidDowngrade(doc, downgradeSpecV31ToV30, '3.1', '3.0') }) it('sets the version, drops jsonSchemaDialect and webhooks, and adds the paths 3.0 requires', () => { - expect(convert({ jsonSchemaDialect: 'https://example.com/dialect', webhooks: { hook: { post: { responses } } } })) - .toEqual({ openapi: '3.0.4', info, paths: {} }) + expect( + convert({ + jsonSchemaDialect: 'https://example.com/dialect', + webhooks: { hook: { post: { responses } } }, + }), + ).toEqual({ openapi: '3.0.4', info, paths: {} }) }) it('drops Info summary and License identifier, and lets the summary stand in for a missing description', () => { - expect(downgradeSpecV31ToV30({ openapi: '3.1.2', info: { ...info, summary: 's', description: 'd', license: { name: 'MIT', identifier: 'MIT' } }, paths: {} }).info) - .toEqual({ ...info, description: 'd', license: { name: 'MIT' } }) - expect(downgradeSpecV31ToV30({ openapi: '3.1.2', info: { ...info, summary: 's' }, paths: {} }).info).toEqual({ ...info, description: 's' }) + expect( + downgradeSpecV31ToV30({ + openapi: '3.1.2', + info: { + ...info, + summary: 's', + description: 'd', + license: { name: 'MIT', identifier: 'MIT' }, + }, + paths: {}, + }).info, + ).toEqual({ ...info, description: 'd', license: { name: 'MIT' } }) + expect( + downgradeSpecV31ToV30({ openapi: '3.1.2', info: { ...info, summary: 's' }, paths: {} }).info, + ).toEqual({ ...info, description: 's' }) }) it('strips Reference Objects down to $ref', () => { @@ -97,16 +141,36 @@ describe('downgradeSpecV31ToV30', () => { }) it('gives an operation without responses a default one', () => { - expect(convert({ paths: { '/a': { get: {} } } }).paths['/a']?.get).toEqual({ responses: { default: { description: '' } } }) + expect(convert({ paths: { '/a': { get: {} } } }).paths['/a']?.get).toEqual({ + responses: { default: { description: '' } }, + }) }) describe('path items', () => { it('merges a $ref to components.pathItems into the referencing Path Item, whose own fields win', () => { const out = convert({ - paths: { '/a': { $ref: '#/components/pathItems/A', summary: 'own', get: { operationId: 'own', responses } } }, - components: { pathItems: { A: { summary: 'target', get: { operationId: 'target', responses }, post: { responses } } } }, + paths: { + '/a': { + $ref: '#/components/pathItems/A', + summary: 'own', + get: { operationId: 'own', responses }, + }, + }, + components: { + pathItems: { + A: { + summary: 'target', + get: { operationId: 'target', responses }, + post: { responses }, + }, + }, + }, + }) + expect(out.paths['/a']).toEqual({ + summary: 'own', + get: { operationId: 'own', responses }, + post: { responses }, }) - expect(out.paths['/a']).toEqual({ summary: 'own', get: { operationId: 'own', responses }, post: { responses } }) expect(out.components).toEqual({}) }) @@ -114,13 +178,20 @@ describe('downgradeSpecV31ToV30', () => { const out = convert({ paths: { '/a': { - post: { callbacks: { cb: { '{$request.body#/url}': { $ref: '#/components/pathItems/Alias' } } }, responses }, + post: { + callbacks: { + cb: { '{$request.body#/url}': { $ref: '#/components/pathItems/Alias' } }, + }, + responses, + }, }, }, webhooks: { hook: { put: { responses } } }, components: { pathItems: { Alias: { $ref: '#/webhooks/hook', get: { responses } } } }, }) - expect(out.paths['/a']?.post?.callbacks).toEqual({ cb: { '{$request.body#/url}': { get: { responses }, put: { responses } } } }) + expect(out.paths['/a']?.post?.callbacks).toEqual({ + cb: { '{$request.body#/url}': { get: { responses }, put: { responses } } }, + }) }) it('stops where a Path Item refers back to itself', () => { @@ -128,7 +199,12 @@ describe('downgradeSpecV31ToV30', () => { paths: { '/a': { $ref: '#/components/pathItems/Loop' } }, components: { pathItems: { - Loop: { post: { callbacks: { cb: { '{$url}': { $ref: '#/components/pathItems/Loop' } } }, responses } }, + Loop: { + post: { + callbacks: { cb: { '{$url}': { $ref: '#/components/pathItems/Loop' } } }, + responses, + }, + }, }, }, }) @@ -136,17 +212,31 @@ describe('downgradeSpecV31ToV30', () => { }) it('keeps $refs to Path Items that 3.0 keeps, and those that dangle', () => { - const out = convert({ paths: { '/a': { get: { responses } }, '/b': { $ref: '#/paths/~1a' }, '/c': { $ref: '#/components/pathItems/Missing' } } }) + const out = convert({ + paths: { + '/a': { get: { responses } }, + '/b': { $ref: '#/paths/~1a' }, + '/c': { $ref: '#/components/pathItems/Missing' }, + }, + }) expect(out.paths['/b']).toEqual({ $ref: '#/paths/~1a' }) expect(out.paths['/c']).toEqual({ $ref: '#/components/pathItems/Missing' }) }) it('inlines other $refs into removed parts', () => { const out = convert({ - paths: { '/a': { get: { parameters: [{ $ref: '#/webhooks/hook/post/parameters/0' }], responses } } }, - webhooks: { hook: { post: { parameters: [{ in: 'query', name: 'q', schema: { const: 1 } }], responses } } }, + paths: { + '/a': { get: { parameters: [{ $ref: '#/webhooks/hook/post/parameters/0' }], responses } }, + }, + webhooks: { + hook: { + post: { parameters: [{ in: 'query', name: 'q', schema: { const: 1 } }], responses }, + }, + }, }) - expect(out.paths['/a']?.get?.parameters).toEqual([{ in: 'query', name: 'q', schema: { enum: [1] } }]) + expect(out.paths['/a']?.get?.parameters).toEqual([ + { in: 'query', name: 'q', schema: { enum: [1] } }, + ]) }) }) @@ -161,7 +251,9 @@ describe('downgradeSpecV31ToV30', () => { }, }, }) - expect(out.components?.securitySchemes).toEqual({ key: { type: 'apiKey', name: 'k', in: 'header' } }) + expect(out.components?.securitySchemes).toEqual({ + key: { type: 'apiKey', name: 'k', in: 'header' }, + }) }) it('drops their names from security requirements, then emptied requirements and lists', () => { @@ -192,19 +284,38 @@ describe('downgradeSpecV31ToV30', () => { it('empties the scopes of apiKey and http requirements, which 3.0 allows only for OAuth2 and OpenID Connect', () => { const out = convert({ security: [{ key: ['tasks.get'], oidc: ['openid'] }], - paths: { '/a': { get: { security: [{ bearer: ['read:users'] }, { alias: ['x'] }, { oauth: ['write'] }], responses } } }, + paths: { + '/a': { + get: { + security: [{ bearer: ['read:users'] }, { alias: ['x'] }, { oauth: ['write'] }], + responses, + }, + }, + }, components: { securitySchemes: { key: { type: 'apiKey', name: 'k', in: 'header' }, bearer: { type: 'http', scheme: 'bearer' }, alias: { $ref: '#/components/securitySchemes/key' }, - oidc: { type: 'openIdConnect', openIdConnectUrl: 'https://example.com/.well-known/openid-configuration' }, - oauth: { type: 'oauth2', flows: { clientCredentials: { tokenUrl: 'https://example.com/token', scopes: { write: 'w' } } } }, + oidc: { + type: 'openIdConnect', + openIdConnectUrl: 'https://example.com/.well-known/openid-configuration', + }, + oauth: { + type: 'oauth2', + flows: { + clientCredentials: { tokenUrl: 'https://example.com/token', scopes: { write: 'w' } }, + }, + }, }, }, }) expect(out.security).toEqual([{ key: [], oidc: ['openid'] }]) - expect(out.paths['/a']?.get?.security).toEqual([{ bearer: [] }, { alias: [] }, { oauth: ['write'] }]) + expect(out.paths['/a']?.get?.security).toEqual([ + { bearer: [] }, + { alias: [] }, + { oauth: ['write'] }, + ]) }) it('converts schemas everywhere in the document', () => { @@ -214,23 +325,56 @@ describe('downgradeSpecV31ToV30', () => { '/a': { parameters: [{ in: 'query', name: 'q', schema }], get: { - requestBody: { content: { 'multipart/form-data': { schema, encoding: { a: { headers: { H: { schema } } } } } } }, - responses: { 200: { description: 'ok', headers: { H: { schema } }, content: { 'application/json': { schema } } } }, + requestBody: { + content: { + 'multipart/form-data': { schema, encoding: { a: { headers: { H: { schema } } } } }, + }, + }, + responses: { + 200: { + description: 'ok', + headers: { H: { schema } }, + content: { 'application/json': { schema } }, + }, + }, }, }, }, - components: { schemas: { S: schema }, headers: { H: { schema } }, parameters: { P: { in: 'query', name: 'p', content: { 'application/json': { schema } } } } }, + components: { + schemas: { S: schema }, + headers: { H: { schema } }, + parameters: { P: { in: 'query', name: 'p', content: { 'application/json': { schema } } } }, + }, }) const expected = { type: 'string', nullable: true } const get = out.paths['/a']?.get expect(out.paths['/a']?.parameters?.[0]).toMatchObject({ schema: expected }) - expect(get?.requestBody).toMatchObject({ content: { 'multipart/form-data': { schema: expected, encoding: { a: { headers: { H: { schema: expected } } } } } } }) - expect(get?.responses['200']).toMatchObject({ headers: { H: { schema: expected } }, content: { 'application/json': { schema: expected } } }) - expect(out.components).toMatchObject({ schemas: { S: expected }, headers: { H: { schema: expected } }, parameters: { P: { content: { 'application/json': { schema: expected } } } } }) + expect(get?.requestBody).toMatchObject({ + content: { + 'multipart/form-data': { + schema: expected, + encoding: { a: { headers: { H: { schema: expected } } } }, + }, + }, + }) + expect(get?.responses['200']).toMatchObject({ + headers: { H: { schema: expected } }, + content: { 'application/json': { schema: expected } }, + }) + expect(out.components).toMatchObject({ + schemas: { S: expected }, + headers: { H: { schema: expected } }, + parameters: { P: { content: { 'application/json': { schema: expected } } } }, + }) }) it('leaves the input untouched', () => { - const doc: OpenAPIV3_1.OpenAPIObject = { openapi: '3.1.2', info, paths: { '/a': { $ref: '#/components/pathItems/A' } }, components: { pathItems: { A: { get: { responses } } } } } + const doc: OpenAPIV3_1.OpenAPIObject = { + openapi: '3.1.2', + info, + paths: { '/a': { $ref: '#/components/pathItems/A' } }, + components: { pathItems: { A: { get: { responses } } } }, + } const before = structuredClone(doc) downgradeSpecV31ToV30(doc) expect(doc).toEqual(before) @@ -240,38 +384,63 @@ describe('downgradeSpecV31ToV30', () => { describe('downgradeSchemaV31ToV30', () => { describe('type', () => { it('marks null with nullable', () => { - expect(downgradeSchemaV31ToV30({ type: ['string', 'null'] })).toEqual({ type: 'string', nullable: true }) + expect(downgradeSchemaV31ToV30({ type: ['string', 'null'] })).toEqual({ + type: 'string', + nullable: true, + }) expect(downgradeSchemaV31ToV30({ type: 'integer' })).toEqual({ type: 'integer' }) }) it('keeps a 3.0-style nullable written beside a type, which only 3.0 gives meaning', () => { - const schema = (fields: Record) => downgradeSchemaV31ToV30(fields as OpenAPIV3_1.SchemaObject) + const schema = (fields: Record) => + downgradeSchemaV31ToV30(fields as OpenAPIV3_1.SchemaObject) expect(schema({ type: 'string', nullable: true })).toEqual({ type: 'string', nullable: true }) expect(schema({ nullable: true })).toEqual({}) expect(schema({ type: 'string', nullable: false })).toEqual({ type: 'string' }) // It admits null, which the 3.1 schema did not, so the branches can overlap. - expect(schema({ oneOf: [{ type: 'string', nullable: true }, { type: 'null' }] })).toEqual({ anyOf: [{ type: 'string', nullable: true }, { enum: [null] }] }) + expect(schema({ oneOf: [{ type: 'string', nullable: true }, { type: 'null' }] })).toEqual({ + anyOf: [{ type: 'string', nullable: true }, { enum: [null] }], + }) }) it('turns several types into anyOf, moving items into the array branch', () => { - expect(downgradeSchemaV31ToV30({ type: ['array', 'string', 'null'], items: { type: 'number' }, maxLength: 3 })).toEqual({ + expect( + downgradeSchemaV31ToV30({ + type: ['array', 'string', 'null'], + items: { type: 'number' }, + maxLength: 3, + }), + ).toEqual({ maxLength: 3, - anyOf: [{ type: 'array', items: { type: 'number' }, nullable: true }, { type: 'string', nullable: true }], + anyOf: [ + { type: 'array', items: { type: 'number' }, nullable: true }, + { type: 'string', nullable: true }, + ], }) }) it('nests the type anyOf in allOf when the schema has its own anyOf', () => { - expect(downgradeSchemaV31ToV30({ type: ['string', 'number'], anyOf: [{ minLength: 1 }, { minimum: 1 }] })).toEqual({ + expect( + downgradeSchemaV31ToV30({ + type: ['string', 'number'], + anyOf: [{ minLength: 1 }, { minimum: 1 }], + }), + ).toEqual({ anyOf: [{ minLength: 1 }, { minimum: 1 }], allOf: [{ anyOf: [{ type: 'string' }, { type: 'number' }] }], }) }) it('turns type null into enum: [null]', () => { - expect(downgradeSchemaV31ToV30({ anyOf: [{ type: 'string' }, { type: 'null' }] })).toEqual({ anyOf: [{ type: 'string' }, { enum: [null] }] }) + expect(downgradeSchemaV31ToV30({ anyOf: [{ type: 'string' }, { type: 'null' }] })).toEqual({ + anyOf: [{ type: 'string' }, { enum: [null] }], + }) expect(downgradeSchemaV31ToV30({ type: 'null', enum: [null, 'a'] })).toEqual({ enum: [null] }) // Only null may match the type, and the enum rules it out. - expect(downgradeSchemaV31ToV30({ type: 'null', enum: ['a'] })).toEqual({ enum: ['a'], allOf: [{ not: {} }] }) + expect(downgradeSchemaV31ToV30({ type: 'null', enum: ['a'] })).toEqual({ + enum: ['a'], + allOf: [{ not: {} }], + }) }) it('adds the items 3.0 requires on arrays', () => { @@ -280,14 +449,25 @@ describe('downgradeSchemaV31ToV30', () => { }) it('turns const into a single-value enum', () => { - expect(downgradeSchemaV31ToV30({ type: 'string', const: 'a' })).toEqual({ type: 'string', enum: ['a'] }) + expect(downgradeSchemaV31ToV30({ type: 'string', const: 'a' })).toEqual({ + type: 'string', + enum: ['a'], + }) expect(downgradeSchemaV31ToV30({ const: null })).toEqual({ enum: [null] }) }) it('turns numeric exclusive bounds into boolean ones, keeping the stricter bound', () => { - expect(downgradeSchemaV31ToV30({ exclusiveMinimum: 0, exclusiveMaximum: 10 })).toEqual({ minimum: 0, exclusiveMinimum: true, maximum: 10, exclusiveMaximum: true }) + expect(downgradeSchemaV31ToV30({ exclusiveMinimum: 0, exclusiveMaximum: 10 })).toEqual({ + minimum: 0, + exclusiveMinimum: true, + maximum: 10, + exclusiveMaximum: true, + }) expect(downgradeSchemaV31ToV30({ minimum: 5, exclusiveMinimum: 0 })).toEqual({ minimum: 5 }) - expect(downgradeSchemaV31ToV30({ minimum: 0, exclusiveMinimum: 5 })).toEqual({ minimum: 5, exclusiveMinimum: true }) + expect(downgradeSchemaV31ToV30({ minimum: 0, exclusiveMinimum: 5 })).toEqual({ + minimum: 5, + exclusiveMinimum: true, + }) }) it('turns examples into example', () => { @@ -297,41 +477,106 @@ describe('downgradeSchemaV31ToV30', () => { it('turns tuples into arrays whose items match any item schema', () => { const prefixItems = [{ type: 'string' }, { type: 'integer' }] as const - expect(downgradeSchemaV31ToV30({ type: 'array', prefixItems: [...prefixItems], items: false, minItems: 2, maxItems: 2 })) - .toEqual({ type: 'array', items: { anyOf: prefixItems }, minItems: 2, maxItems: 2 }) - expect(downgradeSchemaV31ToV30({ type: 'array', prefixItems: [{ type: 'string' }], items: { type: 'number' } })) - .toEqual({ type: 'array', items: { anyOf: [{ type: 'string' }, { type: 'number' }] } }) - expect(downgradeSchemaV31ToV30({ type: 'array', prefixItems: [{ type: 'string' }], items: false })).toEqual({ type: 'array', items: { type: 'string' }, maxItems: 1 }) - expect(downgradeSchemaV31ToV30({ type: 'array', prefixItems: [{ type: 'string' }] })).toEqual({ type: 'array', items: {} }) + expect( + downgradeSchemaV31ToV30({ + type: 'array', + prefixItems: [...prefixItems], + items: false, + minItems: 2, + maxItems: 2, + }), + ).toEqual({ type: 'array', items: { anyOf: prefixItems }, minItems: 2, maxItems: 2 }) + expect( + downgradeSchemaV31ToV30({ + type: 'array', + prefixItems: [{ type: 'string' }], + items: { type: 'number' }, + }), + ).toEqual({ type: 'array', items: { anyOf: [{ type: 'string' }, { type: 'number' }] } }) + expect( + downgradeSchemaV31ToV30({ type: 'array', prefixItems: [{ type: 'string' }], items: false }), + ).toEqual({ type: 'array', items: { type: 'string' }, maxItems: 1 }) + expect(downgradeSchemaV31ToV30({ type: 'array', prefixItems: [{ type: 'string' }] })).toEqual({ + type: 'array', + items: {}, + }) // As zod emits a Map entry, and a tuple of one type. - expect(downgradeSchemaV31ToV30({ type: 'array', prefixItems: [{ type: 'string' }, { type: 'number' }], minItems: 2, maxItems: 2 })) - .toEqual({ type: 'array', items: { anyOf: [{ type: 'string' }, { type: 'number' }] }, minItems: 2, maxItems: 2 }) - expect(downgradeSchemaV31ToV30({ type: 'array', prefixItems: [{ type: 'number' }, { type: 'number' }], items: false })) - .toEqual({ type: 'array', items: { type: 'number' }, maxItems: 2 }) + expect( + downgradeSchemaV31ToV30({ + type: 'array', + prefixItems: [{ type: 'string' }, { type: 'number' }], + minItems: 2, + maxItems: 2, + }), + ).toEqual({ + type: 'array', + items: { anyOf: [{ type: 'string' }, { type: 'number' }] }, + minItems: 2, + maxItems: 2, + }) + expect( + downgradeSchemaV31ToV30({ + type: 'array', + prefixItems: [{ type: 'number' }, { type: 'number' }], + items: false, + }), + ).toEqual({ type: 'array', items: { type: 'number' }, maxItems: 2 }) }) it('marks binary strings with format', () => { - expect(downgradeSchemaV31ToV30({ type: 'string', contentEncoding: 'base64' })).toEqual({ type: 'string', format: 'byte' }) - expect(downgradeSchemaV31ToV30({ type: 'string', contentMediaType: 'image/png' })).toEqual({ type: 'string', format: 'binary' }) - expect(downgradeSchemaV31ToV30({ contentMediaType: 'image/png' })).toEqual({ type: 'string', format: 'binary' }) - expect(downgradeSchemaV31ToV30({ type: 'string', format: 'binary', contentEncoding: 'binary', contentMediaType: 'image/png' })).toEqual({ type: 'string', format: 'binary' }) + expect(downgradeSchemaV31ToV30({ type: 'string', contentEncoding: 'base64' })).toEqual({ + type: 'string', + format: 'byte', + }) + expect(downgradeSchemaV31ToV30({ type: 'string', contentMediaType: 'image/png' })).toEqual({ + type: 'string', + format: 'binary', + }) + expect(downgradeSchemaV31ToV30({ contentMediaType: 'image/png' })).toEqual({ + type: 'string', + format: 'binary', + }) + expect( + downgradeSchemaV31ToV30({ + type: 'string', + format: 'binary', + contentEncoding: 'binary', + contentMediaType: 'image/png', + }), + ).toEqual({ type: 'string', format: 'binary' }) // A string with a contentSchema holds structured text, such as JSON in a server-sent event. - expect(downgradeSchemaV31ToV30({ type: 'string', contentMediaType: 'application/json', contentSchema: { type: 'object' } })).toEqual({ type: 'string' }) + expect( + downgradeSchemaV31ToV30({ + type: 'string', + contentMediaType: 'application/json', + contentSchema: { type: 'object' }, + }), + ).toEqual({ type: 'string' }) }) describe('$ref', () => { it('wraps a $ref with siblings in allOf, which 3.0 does not ignore', () => { - expect(downgradeSchemaV31ToV30({ $ref: '#/components/schemas/User', description: 'The owner' })) - .toEqual({ description: 'The owner', allOf: [{ $ref: '#/components/schemas/User' }] }) - expect(downgradeSchemaV31ToV30({ $ref: '#/components/schemas/User' })).toEqual({ $ref: '#/components/schemas/User' }) + expect( + downgradeSchemaV31ToV30({ $ref: '#/components/schemas/User', description: 'The owner' }), + ).toEqual({ description: 'The owner', allOf: [{ $ref: '#/components/schemas/User' }] }) + expect(downgradeSchemaV31ToV30({ $ref: '#/components/schemas/User' })).toEqual({ + $ref: '#/components/schemas/User', + }) }) it('inlines $refs into $defs, cutting recursion with {}', () => { - expect(downgradeSchemaV31ToV30({ - type: 'object', - properties: { tree: { $ref: '#/$defs/Tree' }, root: { $ref: '#', description: 'kept' } }, - $defs: { Tree: { type: 'object', properties: { children: { type: 'array', items: { $ref: '#/$defs/Tree' } } } } }, - })).toEqual({ + expect( + downgradeSchemaV31ToV30({ + type: 'object', + properties: { tree: { $ref: '#/$defs/Tree' }, root: { $ref: '#', description: 'kept' } }, + $defs: { + Tree: { + type: 'object', + properties: { children: { type: 'array', items: { $ref: '#/$defs/Tree' } } }, + }, + }, + }), + ).toEqual({ type: 'object', properties: { tree: { type: 'object', properties: { children: { type: 'array', items: {} } } }, @@ -341,103 +586,208 @@ describe('downgradeSchemaV31ToV30', () => { }) it('reads definitions, the draft-07 name of $defs, as $defs', () => { - expect(downgradeSchemaV31ToV30({ type: 'object', properties: { b: { $ref: '#/definitions/B' } }, definitions: { B: { type: ['string', 'null'] } } } as OpenAPIV3_1.SchemaObject)) - .toEqual({ type: 'object', properties: { b: { type: 'string', nullable: true } } }) + expect( + downgradeSchemaV31ToV30({ + type: 'object', + properties: { b: { $ref: '#/definitions/B' } }, + definitions: { B: { type: ['string', 'null'] } }, + } as OpenAPIV3_1.SchemaObject), + ).toEqual({ type: 'object', properties: { b: { type: 'string', nullable: true } } }) }) it('leaves a $ref into $defs that does not resolve as written', () => { - expect(downgradeSchemaV31ToV30({ $ref: '#/$defs/Missing' })).toEqual({ $ref: '#/$defs/Missing' }) + expect(downgradeSchemaV31ToV30({ $ref: '#/$defs/Missing' })).toEqual({ + $ref: '#/$defs/Missing', + }) }) }) it('drops keywords that 3.0 lacks', () => { - expect(downgradeSchemaV31ToV30({ - $schema: 'https://json-schema.org/draft/2020-12/schema', - $id: 'https://example.com/pet', - $anchor: 'pet', - $comment: 'c', - $dynamicAnchor: 'node', - type: 'object', - if: { required: ['a'] }, - then: { required: ['b'] }, - else: { required: ['c'] }, - dependentRequired: { a: ['b'] }, - dependentSchemas: { a: { required: ['b'] } }, - propertyNames: { pattern: '^[a-z]+$' }, - unevaluatedProperties: false, - additionalProperties: { type: 'string' }, - contentSchema: { type: 'object' }, - })).toEqual({ type: 'object', additionalProperties: { type: 'string' } }) - expect(downgradeSchemaV31ToV30({ type: 'array', contains: { type: 'string' }, minContains: 1, maxContains: 2, unevaluatedItems: false })) - .toEqual({ type: 'array', items: {} }) + expect( + downgradeSchemaV31ToV30({ + $schema: 'https://json-schema.org/draft/2020-12/schema', + $id: 'https://example.com/pet', + $anchor: 'pet', + $comment: 'c', + $dynamicAnchor: 'node', + type: 'object', + if: { required: ['a'] }, + then: { required: ['b'] }, + else: { required: ['c'] }, + dependentRequired: { a: ['b'] }, + dependentSchemas: { a: { required: ['b'] } }, + propertyNames: { pattern: '^[a-z]+$' }, + unevaluatedProperties: false, + additionalProperties: { type: 'string' }, + contentSchema: { type: 'object' }, + }), + ).toEqual({ type: 'object', additionalProperties: { type: 'string' } }) + expect( + downgradeSchemaV31ToV30({ + type: 'array', + contains: { type: 'string' }, + minContains: 1, + maxContains: 2, + unevaluatedItems: false, + }), + ).toEqual({ type: 'array', items: {} }) }) it('turns unevaluatedProperties into additionalProperties where nothing else evaluates properties', () => { const properties = { name: { type: 'string' } } as const - expect(downgradeSchemaV31ToV30({ type: 'object', properties, unevaluatedProperties: false })).toEqual({ type: 'object', properties, additionalProperties: false }) - expect(downgradeSchemaV31ToV30({ properties, unevaluatedProperties: { type: ['integer', 'null'] } })).toEqual({ properties, additionalProperties: { type: 'integer', nullable: true } }) + expect( + downgradeSchemaV31ToV30({ type: 'object', properties, unevaluatedProperties: false }), + ).toEqual({ type: 'object', properties, additionalProperties: false }) + expect( + downgradeSchemaV31ToV30({ properties, unevaluatedProperties: { type: ['integer', 'null'] } }), + ).toEqual({ properties, additionalProperties: { type: 'integer', nullable: true } }) // The variants of a closed union stay exclusive. - expect(downgradeSchemaV31ToV30({ oneOf: [{ properties, unevaluatedProperties: false }, { properties: { id: { type: 'integer' } }, unevaluatedProperties: false }] })) - .toEqual({ oneOf: [{ properties, additionalProperties: false }, { properties: { id: { type: 'integer' } }, additionalProperties: false }] }) + expect( + downgradeSchemaV31ToV30({ + oneOf: [ + { properties, unevaluatedProperties: false }, + { properties: { id: { type: 'integer' } }, unevaluatedProperties: false }, + ], + }), + ).toEqual({ + oneOf: [ + { properties, additionalProperties: false }, + { properties: { id: { type: 'integer' } }, additionalProperties: false }, + ], + }) // Beside allOf it also sees the properties allOf evaluates, which 3.0 cannot express. - expect(downgradeSchemaV31ToV30({ allOf: [{ $ref: '#/components/schemas/Base' }], properties, unevaluatedProperties: false })) - .toEqual({ allOf: [{ $ref: '#/components/schemas/Base' }], properties }) + expect( + downgradeSchemaV31ToV30({ + allOf: [{ $ref: '#/components/schemas/Base' }], + properties, + unevaluatedProperties: false, + }), + ).toEqual({ allOf: [{ $ref: '#/components/schemas/Base' }], properties }) }) it('keeps meaning an empty enum, which 3.0 forbids, as a schema that rejects every value', () => { - expect(downgradeSchemaV31ToV30({ type: 'string', enum: [] })).toEqual({ type: 'string', allOf: [{ not: {} }] }) + expect(downgradeSchemaV31ToV30({ type: 'string', enum: [] })).toEqual({ + type: 'string', + allOf: [{ not: {} }], + }) }) it('drops additionalProperties beside patternProperties, which it would contradict', () => { - expect(downgradeSchemaV31ToV30({ type: 'object', patternProperties: { '^x-': { type: 'string' } }, additionalProperties: false })).toEqual({ type: 'object' }) + expect( + downgradeSchemaV31ToV30({ + type: 'object', + patternProperties: { '^x-': { type: 'string' } }, + additionalProperties: false, + }), + ).toEqual({ type: 'object' }) }) describe('a schema that lost a restriction', () => { it('is no longer negated by not', () => { expect(downgradeSchemaV31ToV30({ not: { contains: { type: 'string' } } })).toEqual({}) - expect(downgradeSchemaV31ToV30({ type: 'object', not: { patternProperties: { '^x-': { type: 'string' } } } })).toEqual({ type: 'object' }) - expect(downgradeSchemaV31ToV30({ not: { properties: { a: { if: { minimum: 1 }, then: { maximum: 2 } } } } })).toEqual({}) - expect(downgradeSchemaV31ToV30({ not: { type: 'string', minLength: 3 } })).toEqual({ not: { type: 'string', minLength: 3 } }) + expect( + downgradeSchemaV31ToV30({ + type: 'object', + not: { patternProperties: { '^x-': { type: 'string' } } }, + }), + ).toEqual({ type: 'object' }) + expect( + downgradeSchemaV31ToV30({ + not: { properties: { a: { if: { minimum: 1 }, then: { maximum: 2 } } } }, + }), + ).toEqual({}) + expect(downgradeSchemaV31ToV30({ not: { type: 'string', minLength: 3 } })).toEqual({ + not: { type: 'string', minLength: 3 }, + }) }) it('turns an enclosing oneOf into anyOf, since branches may now overlap', () => { - const branches = [{ type: 'object', propertyNames: { pattern: '^a' } }, { type: 'object', propertyNames: { pattern: '^b' } }] as const - expect(downgradeSchemaV31ToV30({ oneOf: [...branches] })).toEqual({ anyOf: [{ type: 'object' }, { type: 'object' }] }) - expect(downgradeSchemaV31ToV30({ oneOf: [{ type: 'string' }, { type: 'number' }] })).toEqual({ oneOf: [{ type: 'string' }, { type: 'number' }] }) - expect(downgradeSchemaV31ToV30({ anyOf: [{ minimum: 0 }], oneOf: [{ prefixItems: [true] }, {}] })) - .toEqual({ anyOf: [{ minimum: 0 }], allOf: [{ anyOf: [{ items: {} }, {}] }] }) + const branches = [ + { type: 'object', propertyNames: { pattern: '^a' } }, + { type: 'object', propertyNames: { pattern: '^b' } }, + ] as const + expect(downgradeSchemaV31ToV30({ oneOf: [...branches] })).toEqual({ + anyOf: [{ type: 'object' }, { type: 'object' }], + }) + expect(downgradeSchemaV31ToV30({ oneOf: [{ type: 'string' }, { type: 'number' }] })).toEqual({ + oneOf: [{ type: 'string' }, { type: 'number' }], + }) + expect( + downgradeSchemaV31ToV30({ anyOf: [{ minimum: 0 }], oneOf: [{ prefixItems: [true] }, {}] }), + ).toEqual({ anyOf: [{ minimum: 0 }], allOf: [{ anyOf: [{ items: {} }, {}] }] }) }) it('excludes keywords that restrict nothing, and tuples converted exactly', () => { // As zod emits a discriminated union whose member holds a record or a tuple. - const record: OpenAPIV3_1.SchemaObject = { type: 'object', propertyNames: { type: 'string' }, additionalProperties: { type: 'string' } } - const tuple: OpenAPIV3_1.SchemaObject = { type: 'array', prefixItems: [{ type: 'number' }, { type: 'number' }], items: false, minItems: 2, maxItems: 2 } - expect(downgradeSchemaV31ToV30({ oneOf: [{ properties: { meta: record } }, { properties: { point: tuple } }] })).toEqual({ + const record: OpenAPIV3_1.SchemaObject = { + type: 'object', + propertyNames: { type: 'string' }, + additionalProperties: { type: 'string' }, + } + const tuple: OpenAPIV3_1.SchemaObject = { + type: 'array', + prefixItems: [{ type: 'number' }, { type: 'number' }], + items: false, + minItems: 2, + maxItems: 2, + } + expect( + downgradeSchemaV31ToV30({ + oneOf: [{ properties: { meta: record } }, { properties: { point: tuple } }], + }), + ).toEqual({ oneOf: [ { properties: { meta: { type: 'object', additionalProperties: { type: 'string' } } } }, - { properties: { point: { type: 'array', items: { type: 'number' }, minItems: 2, maxItems: 2 } } }, + { + properties: { + point: { type: 'array', items: { type: 'number' }, minItems: 2, maxItems: 2 }, + }, + }, ], }) }) it('includes a tuple with an item that lost a restriction, even beside an equal item', () => { - const tuple: OpenAPIV3_1.SchemaObject = { type: 'array', prefixItems: [{ type: 'object', propertyNames: { pattern: '^a' } }, { type: 'object' }], items: false } + const tuple: OpenAPIV3_1.SchemaObject = { + type: 'array', + prefixItems: [{ type: 'object', propertyNames: { pattern: '^a' } }, { type: 'object' }], + items: false, + } expect(downgradeSchemaV31ToV30({ not: tuple })).toEqual({}) - expect(downgradeSchemaV31ToV30({ oneOf: [tuple, { type: 'array', items: { type: 'object' } }] })) - .toEqual({ anyOf: [{ type: 'array', items: { anyOf: [{ type: 'object' }, { type: 'object' }] }, maxItems: 2 }, { type: 'array', items: { type: 'object' } }] }) - expect(downgradeSchemaV31ToV30({ $defs: { P: { type: 'array', prefixItems: [{ $ref: '#/$defs/P' }, {}], items: false } }, not: { $ref: '#/$defs/P' } })).toEqual({}) + expect( + downgradeSchemaV31ToV30({ oneOf: [tuple, { type: 'array', items: { type: 'object' } }] }), + ).toEqual({ + anyOf: [ + { + type: 'array', + items: { anyOf: [{ type: 'object' }, { type: 'object' }] }, + maxItems: 2, + }, + { type: 'array', items: { type: 'object' } }, + ], + }) + expect( + downgradeSchemaV31ToV30({ + $defs: { P: { type: 'array', prefixItems: [{ $ref: '#/$defs/P' }, {}], items: false } }, + not: { $ref: '#/$defs/P' }, + }), + ).toEqual({}) }) it('includes a const outside the enum beside it, which matched nothing', () => { expect(downgradeSchemaV31ToV30({ not: { const: 'a', enum: ['b'] } })).toEqual({}) - expect(downgradeSchemaV31ToV30({ not: { const: 'a', enum: ['a', 'b'] } })).toEqual({ not: { enum: ['a'] } }) + expect(downgradeSchemaV31ToV30({ not: { const: 'a', enum: ['a', 'b'] } })).toEqual({ + not: { enum: ['a'] }, + }) }) it('includes a $defs target cut at recursion', () => { - expect(downgradeSchemaV31ToV30({ - not: { $ref: '#/$defs/Tree' }, - $defs: { Tree: { type: 'object', properties: { child: { $ref: '#/$defs/Tree' } } } }, - })).toEqual({}) + expect( + downgradeSchemaV31ToV30({ + not: { $ref: '#/$defs/Tree' }, + $defs: { Tree: { type: 'object', properties: { child: { $ref: '#/$defs/Tree' } } } }, + }), + ).toEqual({}) }) }) @@ -446,17 +796,39 @@ describe('downgradeSchemaV31ToV30', () => { }) it('turns boolean subschemas into objects, except additionalProperties', () => { - expect(downgradeSchemaV31ToV30({ properties: { any: true, none: false }, additionalProperties: false, not: true })) - .toEqual({ properties: { any: {}, none: { not: {} } }, additionalProperties: false, not: {} }) + expect( + downgradeSchemaV31ToV30({ + properties: { any: true, none: false }, + additionalProperties: false, + not: true, + }), + ).toEqual({ properties: { any: {}, none: { not: {} } }, additionalProperties: false, not: {} }) }) it('keeps extensions, and turns unknown keywords, which 3.0 forbids, into extensions', () => { - expect(downgradeSchemaV31ToV30({ 'type': 'string', 'x-native-type': 'date', 'format': 'date-time' } as OpenAPIV3_1.SchemaObject)) - .toEqual({ 'type': 'string', 'x-native-type': 'date', 'format': 'date-time' }) + expect( + downgradeSchemaV31ToV30({ + 'type': 'string', + 'x-native-type': 'date', + 'format': 'date-time', + } as OpenAPIV3_1.SchemaObject), + ).toEqual({ 'type': 'string', 'x-native-type': 'date', 'format': 'date-time' }) // As zod `.meta()` keys and generators' custom keywords arrive. - expect(downgradeSchemaV31ToV30({ 'type': 'string', 'label': 'Name', 'placeholder': 'Jane', 'x-label': 'kept' } as OpenAPIV3_1.SchemaObject)) - .toEqual({ 'type': 'string', 'x-label': 'kept', 'x-placeholder': 'Jane' }) - expect(downgradeSchemaV31ToV30({ 'type': 'string', 'label': 'Name', 'x-label': null } as OpenAPIV3_1.SchemaObject)).toEqual({ 'type': 'string', 'x-label': null }) + expect( + downgradeSchemaV31ToV30({ + 'type': 'string', + 'label': 'Name', + 'placeholder': 'Jane', + 'x-label': 'kept', + } as OpenAPIV3_1.SchemaObject), + ).toEqual({ 'type': 'string', 'x-label': 'kept', 'x-placeholder': 'Jane' }) + expect( + downgradeSchemaV31ToV30({ + 'type': 'string', + 'label': 'Name', + 'x-label': null, + } as OpenAPIV3_1.SchemaObject), + ).toEqual({ 'type': 'string', 'x-label': null }) }) it('converts a shared object once, and keeps a cycle as a cycle', () => { @@ -479,20 +851,44 @@ describe('downgradeSchemaV31ToV30', () => { describe('unusual input', () => { it('converts valid schemas that combine keywords unusually', () => { - expect(downgradeSchemaV31ToV30({ $ref: '#/components/schemas/A', allOf: [{ minLength: 1 }], type: ['string', 'number'], anyOf: [{ maxLength: 3 }, { maximum: 3 }] })).toEqual({ - allOf: [{ $ref: '#/components/schemas/A' }, { minLength: 1 }, { anyOf: [{ type: 'string' }, { type: 'number' }] }], + expect( + downgradeSchemaV31ToV30({ + $ref: '#/components/schemas/A', + allOf: [{ minLength: 1 }], + type: ['string', 'number'], + anyOf: [{ maxLength: 3 }, { maximum: 3 }], + }), + ).toEqual({ + allOf: [ + { $ref: '#/components/schemas/A' }, + { minLength: 1 }, + { anyOf: [{ type: 'string' }, { type: 'number' }] }, + ], anyOf: [{ maxLength: 3 }, { maximum: 3 }], }) - expect(downgradeSchemaV31ToV30({ type: 'null', enum: ['a'], allOf: [{ minLength: 1 }] })).toEqual({ enum: ['a'], allOf: [{ minLength: 1 }, { not: {} }] }) - expect(downgradeSchemaV31ToV30({ enum: [], allOf: [{ minimum: 0 }] })).toEqual({ allOf: [{ minimum: 0 }, { not: {} }] }) - expect(downgradeSchemaV31ToV30({ type: ['array', 'string'] })).toEqual({ anyOf: [{ type: 'array', items: {} }, { type: 'string' }] }) + expect( + downgradeSchemaV31ToV30({ type: 'null', enum: ['a'], allOf: [{ minLength: 1 }] }), + ).toEqual({ enum: ['a'], allOf: [{ minLength: 1 }, { not: {} }] }) + expect(downgradeSchemaV31ToV30({ enum: [], allOf: [{ minimum: 0 }] })).toEqual({ + allOf: [{ minimum: 0 }, { not: {} }], + }) + expect(downgradeSchemaV31ToV30({ type: ['array', 'string'] })).toEqual({ + anyOf: [{ type: 'array', items: {} }, { type: 'string' }], + }) expect(downgradeSchemaV31ToV30({ type: ['string'] })).toEqual({ type: 'string' }) expect(downgradeSchemaV31ToV30({ maximum: 5, exclusiveMaximum: 10 })).toEqual({ maximum: 5 }) }) it('keeps own __proto__ keys as keys', () => { - const out = downgradeSchemaV31ToV30(JSON.parse('{"type":"object","properties":{"__proto__":{"type":["string","null"]}},"example":{"__proto__":1}}')) as Record - expect(Object.getOwnPropertyDescriptor(out.properties, '__proto__')?.value).toEqual({ type: 'string', nullable: true }) + const out = downgradeSchemaV31ToV30( + JSON.parse( + '{"type":"object","properties":{"__proto__":{"type":["string","null"]}},"example":{"__proto__":1}}', + ), + ) as Record + expect(Object.getOwnPropertyDescriptor(out.properties, '__proto__')?.value).toEqual({ + type: 'string', + nullable: true, + }) expect(Object.getOwnPropertyDescriptor(out.example, '__proto__')?.value).toBe(1) expect(Object.getPrototypeOf(out.example)).toBe(Object.prototype) }) @@ -500,7 +896,11 @@ describe('unusual input', () => { it('merges a cyclic tuple item schema with itself', () => { const item: Record = { type: 'object', properties: {} } item.properties.self = item - const out = downgradeSchemaV31ToV30({ type: 'array', prefixItems: [item, item], items: false }) as Record + const out = downgradeSchemaV31ToV30({ + type: 'array', + prefixItems: [item, item], + items: false, + }) as Record expect(out.items.properties.self).toBe(out.items) }) @@ -519,7 +919,11 @@ describe('unusual input', () => { }, }) expect(out.security).toEqual([{ anchor: ['a'], loop: ['b'], missing: ['c'] }]) - expect(Object.keys(out.components?.securitySchemes ?? {})).toEqual(['anchor', 'loop', 'missing']) + expect(Object.keys(out.components?.securitySchemes ?? {})).toEqual([ + 'anchor', + 'loop', + 'missing', + ]) }) it('tolerates malformed input without throwing', () => { @@ -528,11 +932,17 @@ describe('unusual input', () => { info, security: 'all', paths: { '/a': { get: { security: [null, 'x'], parameters: 'none', responses: [] } } }, - components: { schemas: { S: { properties: 'none', allOf: {}, example: { a: 1, b: undefined } } } }, + components: { + schemas: { S: { properties: 'none', allOf: {}, example: { a: 1, b: undefined } } }, + }, } const out = downgradeSpecV31ToV30(doc as any) expect(out.security).toBe('all') - expect(out.paths['/a']?.get).toEqual({ security: [null, 'x'], parameters: 'none', responses: [] }) + expect(out.paths['/a']?.get).toEqual({ + security: [null, 'x'], + parameters: 'none', + responses: [], + }) expect(out.components?.schemas?.S).toEqual({ properties: 'none', allOf: {}, example: { a: 1 } }) }) }) diff --git a/packages/downgrader/tests/v3.2-to-v3.1.test.ts b/packages/downgrader/tests/v3.2-to-v3.1.test.ts index 4ec6bc4..6bbbbfb 100644 --- a/packages/downgrader/tests/v3.2-to-v3.1.test.ts +++ b/packages/downgrader/tests/v3.2-to-v3.1.test.ts @@ -1,8 +1,7 @@ -import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' - import { runInNewContext } from 'node:vm' import { downgradeSchemaV32ToV31, downgradeSpecV32ToV31 } from '@openapi-spec/downgrader' +import type * as OpenAPIV3_2 from '@openapi-spec/types/v3.2' import { expectValidDowngrade } from './validate' @@ -25,23 +24,39 @@ describe('downgradeSpecV32ToV31', () => { info, jsonSchemaDialect: 'https://spec.openapis.org/oas/3.2/dialect/2025-09-17', servers: [{ url: 'https://example.com', name: 'production' }], - tags: [{ name: 'pets', summary: 'Pets', kind: 'nav' }, { name: 'cats', parent: 'pets' }], + tags: [ + { name: 'pets', summary: 'Pets', kind: 'nav' }, + { name: 'cats', parent: 'pets' }, + ], paths: { '/pets': { query: { responses: { 200: { description: 'ok' } } }, additionalOperations: { PURGE: { responses: { 204: { description: 'purged' } } } }, get: { parameters: [ - { in: 'querystring', name: 'q', content: { 'application/x-www-form-urlencoded': { schema: { type: 'object' } } } }, + { + in: 'querystring', + name: 'q', + content: { 'application/x-www-form-urlencoded': { schema: { type: 'object' } } }, + }, { in: 'cookie', name: 'session', style: 'cookie', schema: { type: 'string' } }, - { in: 'cookie', name: 'pref', style: 'form', allowReserved: true, schema: { type: 'string' } }, + { + in: 'cookie', + name: 'pref', + style: 'form', + allowReserved: true, + schema: { type: 'string' }, + }, { $ref: '#/components/parameters/Search' }, ], responses: { 200: { summary: 'The pets', content: { - 'application/jsonl': { description: 'One pet per line', itemSchema: { $ref: '#/components/schemas/Pet' } }, + 'application/jsonl': { + description: 'One pet per line', + itemSchema: { $ref: '#/components/schemas/Pet' }, + }, 'application/json': { $ref: '#/components/mediaTypes/Pets' }, }, }, @@ -55,12 +70,21 @@ describe('downgradeSpecV32ToV31', () => { type: 'object', xml: { nodeType: 'element' }, discriminator: { propertyName: 'kind', defaultMapping: '#/components/schemas/Pet' }, - properties: { kind: { type: 'string' }, id: { type: 'string', xml: { nodeType: 'attribute' } } }, + properties: { + kind: { type: 'string' }, + id: { type: 'string', xml: { nodeType: 'attribute' } }, + }, }, }, - mediaTypes: { Pets: { schema: { type: 'array', items: { $ref: '#/components/schemas/Pet' } } } }, + mediaTypes: { + Pets: { schema: { type: 'array', items: { $ref: '#/components/schemas/Pet' } } }, + }, parameters: { - Search: { in: 'querystring', name: 'search', content: { 'application/json': { schema: { type: 'object' } } } }, + Search: { + in: 'querystring', + name: 'search', + content: { 'application/json': { schema: { type: 'object' } } }, + }, }, examples: { Pet: { dataValue: { kind: 'cat' }, serializedValue: '{"kind":"cat"}' } }, securitySchemes: { @@ -69,7 +93,11 @@ describe('downgradeSpecV32ToV31', () => { deprecated: true, oauth2MetadataUrl: 'https://example.com/.well-known/oauth-authorization-server', flows: { - deviceAuthorization: { deviceAuthorizationUrl: 'https://example.com/device', tokenUrl: 'https://example.com/token', scopes: {} }, + deviceAuthorization: { + deviceAuthorizationUrl: 'https://example.com/device', + tokenUrl: 'https://example.com/token', + scopes: {}, + }, clientCredentials: { tokenUrl: 'https://example.com/token', scopes: {} }, }, }, @@ -80,9 +108,18 @@ describe('downgradeSpecV32ToV31', () => { }) it('sets the version, drops $self, and points the 3.2 dialect at the 3.1 one', () => { - const out = convert({ $self: 'https://example.com/openapi.json', jsonSchemaDialect: 'https://spec.openapis.org/oas/3.2/dialect/2025-09-17' }) - expect(out).toEqual({ openapi: '3.1.2', info, jsonSchemaDialect: 'https://spec.openapis.org/oas/3.1/dialect/base' }) - expect(convert({ jsonSchemaDialect: 'https://example.com/dialect' }).jsonSchemaDialect).toBe('https://example.com/dialect') + const out = convert({ + $self: 'https://example.com/openapi.json', + jsonSchemaDialect: 'https://spec.openapis.org/oas/3.2/dialect/2025-09-17', + }) + expect(out).toEqual({ + openapi: '3.1.2', + info, + jsonSchemaDialect: 'https://spec.openapis.org/oas/3.1/dialect/base', + }) + expect(convert({ jsonSchemaDialect: 'https://example.com/dialect' }).jsonSchemaDialect).toBe( + 'https://example.com/dialect', + ) }) it('drops Server name wherever servers appear', () => { @@ -94,7 +131,9 @@ describe('downgradeSpecV32ToV31', () => { servers: [server], get: { servers: [server], - responses: { 200: { description: 'ok', links: { self: { operationId: 'a', server } } } }, + responses: { + 200: { description: 'ok', links: { self: { operationId: 'a', server } } }, + }, }, }, }, @@ -103,17 +142,36 @@ describe('downgradeSpecV32ToV31', () => { expect(out.servers).toEqual([expected]) expect(out.paths?.['/a']?.servers).toEqual([expected]) expect(out.paths?.['/a']?.get?.servers).toEqual([expected]) - expect(out.paths?.['/a']?.get?.responses?.['200']).toMatchObject({ links: { self: { server: expected } } }) + expect(out.paths?.['/a']?.get?.responses?.['200']).toMatchObject({ + links: { self: { server: expected } }, + }) }) it('drops Tag summary, parent, and kind, and lets the summary stand in for a missing description', () => { - expect(convert({ tags: [{ name: 'cats', summary: 'Cats', parent: 'pets', kind: 'nav', description: 'd' }, { name: 'dogs', summary: 'Dogs' }] }).tags) - .toEqual([{ name: 'cats', description: 'd' }, { name: 'dogs', description: 'Dogs' }]) + expect( + convert({ + tags: [ + { name: 'cats', summary: 'Cats', parent: 'pets', kind: 'nav', description: 'd' }, + { name: 'dogs', summary: 'Dogs' }, + ], + }).tags, + ).toEqual([ + { name: 'cats', description: 'd' }, + { name: 'dogs', description: 'Dogs' }, + ]) }) it('drops the query method and additionalOperations', () => { const responses = { 200: { description: 'ok' } } - const out = convert({ paths: { '/a': { get: { responses }, query: { responses }, additionalOperations: { PURGE: { responses } } } } }) + const out = convert({ + paths: { + '/a': { + get: { responses }, + query: { responses }, + additionalOperations: { PURGE: { responses } }, + }, + }, + }) expect(out.paths).toEqual({ '/a': { get: { responses } } }) }) @@ -158,15 +216,36 @@ describe('downgradeSpecV32ToV31', () => { }) it('drops style: cookie', () => { - expect(convertOperation({ parameters: [{ in: 'cookie', name: 'c', style: 'cookie' }, { in: 'cookie', name: 'f', style: 'form' }] })?.parameters) - .toEqual([{ in: 'cookie', name: 'c' }, { in: 'cookie', name: 'f', style: 'form' }]) + expect( + convertOperation({ + parameters: [ + { in: 'cookie', name: 'c', style: 'cookie' }, + { in: 'cookie', name: 'f', style: 'form' }, + ], + })?.parameters, + ).toEqual([ + { in: 'cookie', name: 'c' }, + { in: 'cookie', name: 'f', style: 'form' }, + ]) }) it('drops the fields 3.1 allows only beside schema from a parameter with content', () => { const content = { 'application/json': { example: 1 } } // As oRPC emits a query parameter whose queryStyles entry is 'json'. - const parameter = { in: 'query', name: 'q', content, allowEmptyValue: true, allowReserved: true, style: 'form', explode: true, example: 1, examples: { a: { value: 1 } } } as const - expect(convertOperation({ parameters: [parameter] })?.parameters).toEqual([{ in: 'query', name: 'q', content, allowEmptyValue: true }]) + const parameter = { + in: 'query', + name: 'q', + content, + allowEmptyValue: true, + allowReserved: true, + style: 'form', + explode: true, + example: 1, + examples: { a: { value: 1 } }, + } as const + expect(convertOperation({ parameters: [parameter] })?.parameters).toEqual([ + { in: 'query', name: 'q', content, allowEmptyValue: true }, + ]) }) }) @@ -175,11 +254,18 @@ describe('downgradeSpecV32ToV31', () => { const out = convertOperation({ requestBody: { content: { - 'multipart/mixed': { description: 'd', schema: { type: 'array' }, prefixEncoding: [{ contentType: 'a/b' }], itemEncoding: { contentType: 'a/b' } }, + 'multipart/mixed': { + description: 'd', + schema: { type: 'array' }, + prefixEncoding: [{ contentType: 'a/b' }], + itemEncoding: { contentType: 'a/b' }, + }, }, }, }) - expect(out?.requestBody).toEqual({ content: { 'multipart/mixed': { schema: { type: 'array' } } } }) + expect(out?.requestBody).toEqual({ + content: { 'multipart/mixed': { schema: { type: 'array' } } }, + }) }) it('turns a lone itemSchema into an array schema, and drops it beside schema', () => { @@ -188,7 +274,9 @@ describe('downgradeSpecV32ToV31', () => { 200: { description: 'ok', content: { - 'application/jsonl': { itemSchema: { type: 'string', xml: { nodeType: 'attribute' } } }, + 'application/jsonl': { + itemSchema: { type: 'string', xml: { nodeType: 'attribute' } }, + }, 'text/event-stream': { schema: { type: 'string' }, itemSchema: { type: 'object' } }, }, }, @@ -197,21 +285,45 @@ describe('downgradeSpecV32ToV31', () => { expect(out?.responses?.['200']).toEqual({ description: 'ok', content: { - 'application/jsonl': { schema: { type: 'array', items: { type: 'string', xml: { attribute: true } } } }, + 'application/jsonl': { + schema: { type: 'array', items: { type: 'string', xml: { attribute: true } } }, + }, 'text/event-stream': { schema: { type: 'string' } }, }, }) }) it('drops nested encodings inside an Encoding Object', () => { - const encoding = { contentType: 'multipart/mixed', encoding: { a: {} }, prefixEncoding: [{}], itemEncoding: {} } - const out = convertOperation({ requestBody: { content: { 'multipart/form-data': { encoding: { part: encoding } } } } }) - expect(out?.requestBody).toEqual({ content: { 'multipart/form-data': { encoding: { part: { contentType: 'multipart/mixed' } } } } }) + const encoding = { + contentType: 'multipart/mixed', + encoding: { a: {} }, + prefixEncoding: [{}], + itemEncoding: {}, + } + const out = convertOperation({ + requestBody: { content: { 'multipart/form-data': { encoding: { part: encoding } } } }, + }) + expect(out?.requestBody).toEqual({ + content: { + 'multipart/form-data': { encoding: { part: { contentType: 'multipart/mixed' } } }, + }, + }) }) it('inlines $refs to components.mediaTypes, following chains, and drops the components', () => { const out = convert({ - paths: { '/a': { get: { responses: { 200: { description: 'ok', content: { 'application/json': { $ref: '#/components/mediaTypes/Alias' } } } } } } }, + paths: { + '/a': { + get: { + responses: { + 200: { + description: 'ok', + content: { 'application/json': { $ref: '#/components/mediaTypes/Alias' } }, + }, + }, + }, + }, + }, components: { mediaTypes: { Alias: { $ref: '#/components/mediaTypes/Pet' }, @@ -248,7 +360,11 @@ describe('downgradeSpecV32ToV31', () => { 204: {}, }, }) - expect(out?.responses).toEqual({ 200: { description: 'Everything went fine' }, 201: { description: 'Created' }, 204: { description: '' } }) + expect(out?.responses).toEqual({ + 200: { description: 'Everything went fine' }, + 201: { description: 'Created' }, + 204: { description: '' }, + }) }) it('fills Example value from dataValue, or else serializedValue', () => { @@ -280,32 +396,54 @@ describe('downgradeSpecV32ToV31', () => { deprecated: true, oauth2MetadataUrl: 'https://example.com/meta', flows: { - deviceAuthorization: { deviceAuthorizationUrl: 'https://example.com/device', tokenUrl, scopes: {} }, + deviceAuthorization: { + deviceAuthorizationUrl: 'https://example.com/device', + tokenUrl, + scopes: {}, + }, clientCredentials: { tokenUrl, scopes: {} }, }, }, }, }, }) - expect(out.components?.securitySchemes).toEqual({ oauth: { type: 'oauth2', flows: { clientCredentials: { tokenUrl, scopes: {} } } } }) + expect(out.components?.securitySchemes).toEqual({ + oauth: { type: 'oauth2', flows: { clientCredentials: { tokenUrl, scopes: {} } } }, + }) }) it('converts schemas everywhere in the document', () => { const schema: OpenAPIV3_2.SchemaObject = { type: 'string', xml: { nodeType: 'attribute' } } const out = convert({ paths: { '/a': { parameters: [{ in: 'query', name: 'q', schema }] } }, - webhooks: { hook: { post: { requestBody: { content: { 'application/json': { schema } } } } } }, - components: { schemas: { S: schema }, headers: { H: { schema } }, pathItems: { P: { parameters: [{ in: 'query', name: 'q', schema }] } } }, + webhooks: { + hook: { post: { requestBody: { content: { 'application/json': { schema } } } } }, + }, + components: { + schemas: { S: schema }, + headers: { H: { schema } }, + pathItems: { P: { parameters: [{ in: 'query', name: 'q', schema }] } }, + }, }) const expected = { type: 'string', xml: { attribute: true } } expect(out.paths?.['/a']?.parameters?.[0]).toMatchObject({ schema: expected }) - expect(out.webhooks?.hook?.post?.requestBody).toMatchObject({ content: { 'application/json': { schema: expected } } }) - expect(out.components).toMatchObject({ schemas: { S: expected }, headers: { H: { schema: expected } }, pathItems: { P: { parameters: [{ schema: expected }] } } }) + expect(out.webhooks?.hook?.post?.requestBody).toMatchObject({ + content: { 'application/json': { schema: expected } }, + }) + expect(out.components).toMatchObject({ + schemas: { S: expected }, + headers: { H: { schema: expected } }, + pathItems: { P: { parameters: [{ schema: expected }] } }, + }) }) it('leaves the input untouched and shares no objects with it', () => { const example = { nested: { a: 1 } } - const doc: OpenAPIV3_2.OpenAPIObject = { openapi: '3.2.0', info: { ...info, 'x-meta': example }, paths: {} } + const doc: OpenAPIV3_2.OpenAPIObject = { + openapi: '3.2.0', + info: { ...info, 'x-meta': example }, + paths: {}, + } const before = structuredClone(doc) const out = downgradeSpecV32ToV31(doc) expect(doc).toEqual(before) @@ -313,14 +451,30 @@ describe('downgradeSpecV32ToV31', () => { expect(out.info['x-meta']).not.toBe(example) }) - it('reads null-prototype and other-realm objects as JSON would, such as oRPC\'s generated documents', () => { + it("reads null-prototype and other-realm objects as JSON would, such as oRPC's generated documents", () => { function NullProto() {} NullProto.prototype = Object.freeze(Object.create(null)) const object = (fields: object) => Object.assign(new (NullProto as any)(), fields) - const doc = object({ openapi: '3.2.0', info: object(info), tags: [object({ name: 'a', kind: 'nav' })], paths: object({}) }) - expect(downgradeSpecV32ToV31(doc)).toEqual({ openapi: '3.1.2', info, tags: [{ name: 'a' }], paths: {} }) - const other = runInNewContext(`(${JSON.stringify({ openapi: '3.2.0', info, servers: [{ url: '/', name: 'main' }] })})`) - expect(downgradeSpecV32ToV31(other)).toEqual({ openapi: '3.1.2', info, servers: [{ url: '/' }] }) + const doc = object({ + openapi: '3.2.0', + info: object(info), + tags: [object({ name: 'a', kind: 'nav' })], + paths: object({}), + }) + expect(downgradeSpecV32ToV31(doc)).toEqual({ + openapi: '3.1.2', + info, + tags: [{ name: 'a' }], + paths: {}, + }) + const other = runInNewContext( + `(${JSON.stringify({ openapi: '3.2.0', info, servers: [{ url: '/', name: 'main' }] })})`, + ) + expect(downgradeSpecV32ToV31(other)).toEqual({ + openapi: '3.1.2', + info, + servers: [{ url: '/' }], + }) // Keys an object inherits are not part of it as JSON sees it, so such an object is kept as it is. const inherits = Object.create(Object.assign(Object.create(null), { type: 'string' })) expect(downgradeSchemaV32ToV31(inherits)).toBe(inherits) @@ -328,7 +482,11 @@ describe('downgradeSpecV32ToV31', () => { it('treats keys holding undefined as missing, and keeps non-plain values as they are', () => { const date = new Date(0) - const out = convertOperation({ 'summary': undefined, 'responses': { 200: { summary: 'OK', description: undefined } }, 'x-date': date }) + const out = convertOperation({ + 'summary': undefined, + 'responses': { 200: { summary: 'OK', description: undefined } }, + 'x-date': date, + }) expect(out).toEqual({ 'responses': { 200: { description: 'OK' } }, 'x-date': date }) expect(out?.['x-date']).toBe(date) }) @@ -336,15 +494,21 @@ describe('downgradeSpecV32ToV31', () => { describe('downgradeSchemaV32ToV31', () => { it('turns XML nodeType into attribute or wrapped, in every subschema', () => { - expect(downgradeSchemaV32ToV31({ - type: 'object', - xml: { name: 'pet', nodeType: 'element' }, - properties: { - id: { type: 'string', xml: { nodeType: 'attribute' } }, - tags: { type: 'array', xml: { nodeType: 'element' }, items: { type: 'string', xml: { nodeType: 'text' } } }, - }, - $defs: { Note: { anyOf: [{ xml: { nodeType: 'cdata' } }] } }, - })).toEqual({ + expect( + downgradeSchemaV32ToV31({ + type: 'object', + xml: { name: 'pet', nodeType: 'element' }, + properties: { + id: { type: 'string', xml: { nodeType: 'attribute' } }, + tags: { + type: 'array', + xml: { nodeType: 'element' }, + items: { type: 'string', xml: { nodeType: 'text' } }, + }, + }, + $defs: { Note: { anyOf: [{ xml: { nodeType: 'cdata' } }] } }, + }), + ).toEqual({ type: 'object', xml: { name: 'pet' }, properties: { @@ -356,8 +520,11 @@ describe('downgradeSchemaV32ToV31', () => { }) it('drops discriminator defaultMapping', () => { - expect(downgradeSchemaV32ToV31({ discriminator: { propertyName: 'kind', defaultMapping: 'Cat', mapping: { dog: 'Dog' } } })) - .toEqual({ discriminator: { propertyName: 'kind', mapping: { dog: 'Dog' } } }) + expect( + downgradeSchemaV32ToV31({ + discriminator: { propertyName: 'kind', defaultMapping: 'Cat', mapping: { dog: 'Dog' } }, + }), + ).toEqual({ discriminator: { propertyName: 'kind', mapping: { dog: 'Dog' } } }) }) it('passes everything else through, including properties named like keywords', () => { @@ -385,10 +552,16 @@ describe('downgradeSchemaV32ToV31', () => { describe('unusual input', () => { it('reads a type list when deciding whether an XML element wraps an array', () => { - expect(downgradeSchemaV32ToV31({ type: ['array', 'null'], xml: { nodeType: 'element' } })).toEqual({ type: ['array', 'null'], xml: { wrapped: true } }) + expect( + downgradeSchemaV32ToV31({ type: ['array', 'null'], xml: { nodeType: 'element' } }), + ).toEqual({ type: ['array', 'null'], xml: { wrapped: true } }) }) it('tolerates malformed input without throwing', () => { - expect(downgradeSchemaV32ToV31({ xml: true, allOf: {}, properties: 'none' } as any)).toEqual({ xml: true, allOf: {}, properties: 'none' }) + expect(downgradeSchemaV32ToV31({ xml: true, allOf: {}, properties: 'none' } as any)).toEqual({ + xml: true, + allOf: {}, + properties: 'none', + }) }) }) diff --git a/packages/downgrader/tests/validate.ts b/packages/downgrader/tests/validate.ts index 15c32cb..510c345 100644 --- a/packages/downgrader/tests/validate.ts +++ b/packages/downgrader/tests/validate.ts @@ -19,8 +19,7 @@ function resolvePointer(root: unknown, ref: string): unknown { let pointer: string try { pointer = decodeURIComponent(ref.slice(1)) - } - catch { + } catch { return undefined } if (pointer === '') { @@ -40,10 +39,13 @@ function resolvePointer(root: unknown, ref: string): unknown { function collectLocalRefs(value: unknown, refs: Set): Set { if (typeof value === 'object' && value !== null) { for (const [key, item] of Object.entries(value)) { - if ((key === '$ref' || key === 'operationRef') && typeof item === 'string' && item.startsWith('#')) { + if ( + (key === '$ref' || key === 'operationRef') && + typeof item === 'string' && + item.startsWith('#') + ) { refs.add(item) - } - else { + } else { collectLocalRefs(item, refs) } } diff --git a/packages/types/src/namespace.test.ts b/packages/types/src/namespace.test.ts index 6b868ac..5f8592b 100644 --- a/packages/types/src/namespace.test.ts +++ b/packages/types/src/namespace.test.ts @@ -1,5 +1,6 @@ import { readFileSync } from 'node:fs' import { fileURLToPath } from 'node:url' + import ts from 'typescript' const testFile = fileURLToPath(new URL('./namespace.test-d.ts', import.meta.url)) @@ -13,7 +14,7 @@ const program = ts.createProgram([testFile], { const checker = program.getTypeChecker() const source = program.getSourceFile(testFile)! -const namespaces = new Map }>() +const namespaces = new Map }>() const specifiers: string[] = [] for (const statement of source.statements) { @@ -23,7 +24,10 @@ for (const statement of source.statements) { const module = checker.getSymbolAtLocation(specifier)! specifiers.push(specifier.text) namespaces.set(bindings.name.text, { - exported: checker.getExportsOfModule(module).map(symbol => symbol.name).sort(), + exported: checker + .getExportsOfModule(module) + .map((symbol) => symbol.name) + .sort(), referenced: new Set(), }) } @@ -37,8 +41,8 @@ source.forEachChild(function visit(node) { it('imports every version entry as a namespace', () => { const entries = Object.keys(pkg.exports) - .filter(entry => entry !== './package.json') - .map(entry => `${pkg.name}/${entry.slice(2)}`) + .filter((entry) => entry !== './package.json') + .map((entry) => `${pkg.name}/${entry.slice(2)}`) expect(specifiers.sort()).toEqual(entries.sort()) }) diff --git a/packages/types/src/v3.0.test-d.ts b/packages/types/src/v3.0.test-d.ts index ccd02f1..8609816 100644 --- a/packages/types/src/v3.0.test-d.ts +++ b/packages/types/src/v3.0.test-d.ts @@ -68,10 +68,7 @@ export const petstore = { }, propertyName: 'petType', }, - oneOf: [ - { $ref: '#/components/schemas/Cat' }, - { $ref: '#/components/schemas/Dog' }, - ], + oneOf: [{ $ref: '#/components/schemas/Cat' }, { $ref: '#/components/schemas/Dog' }], }, AnyOfExample: { anyOf: [{ pattern: '^[a-z]+$', type: 'string' }, { type: 'integer' }], @@ -144,8 +141,7 @@ export const petstore = { basicAuth: { scheme: 'basic', type: 'http' }, bearerAuth: { bearerFormat: 'JWT', scheme: 'bearer', type: 'http' }, oidc: { - openIdConnectUrl: - 'https://example.com/.well-known/openid-configuration', + openIdConnectUrl: 'https://example.com/.well-known/openid-configuration', type: 'openIdConnect', }, petstoreAuth: { diff --git a/packages/types/src/v3.0.ts b/packages/types/src/v3.0.ts index c1f9777..7036666 100644 --- a/packages/types/src/v3.0.ts +++ b/packages/types/src/v3.0.ts @@ -475,14 +475,14 @@ export type ParameterLocation = 'cookie' | 'header' | 'path' | 'query' * * @see {@link https://spec.openapis.org/oas/v3.0.4.html#style-values} */ -export type ParameterStyle - = | 'deepObject' - | 'form' - | 'label' - | 'matrix' - | 'pipeDelimited' - | 'simple' - | 'spaceDelimited' +export type ParameterStyle = + | 'deepObject' + | 'form' + | 'label' + | 'matrix' + | 'pipeDelimited' + | 'simple' + | 'spaceDelimited' /** * The subset of `style` values that is defined for `query` parameters. The @@ -491,11 +491,7 @@ export type ParameterStyle * * @see {@link https://spec.openapis.org/oas/v3.0.4.html#style-values} */ -export type QueryParameterStyle - = | 'deepObject' - | 'form' - | 'pipeDelimited' - | 'spaceDelimited' +export type QueryParameterStyle = 'deepObject' | 'form' | 'pipeDelimited' | 'spaceDelimited' /** * Describes a single operation parameter. @@ -766,9 +762,7 @@ export interface ResponsesObject extends SpecificationExtensions { * explicit code definition takes precedence over the range definition for * that code. */ - [statusCode: `${1 | 2 | 3 | 4 | 5}${string}`]: - | ResponseObject - | ReferenceObject + [statusCode: `${1 | 2 | 3 | 4 | 5}${string}`]: ResponseObject | ReferenceObject } /** @@ -1035,13 +1029,7 @@ export interface ReferenceObject { * * @see {@link https://spec.openapis.org/oas/v3.0.4.html#data-types} */ -export type SchemaObjectType - = | 'array' - | 'boolean' - | 'integer' - | 'number' - | 'object' - | 'string' +export type SchemaObjectType = 'array' | 'boolean' | 'integer' | 'number' | 'object' | 'string' /** * The Schema Object allows the definition of input and output data types. @@ -1491,11 +1479,11 @@ export interface OpenIdConnectSecuritySchemeObject extends SpecificationExtensio * * @see {@link https://spec.openapis.org/oas/v3.0.4.html#security-scheme-object} */ -export type SecuritySchemeObject - = | ApiKeySecuritySchemeObject - | HttpSecuritySchemeObject - | OAuth2SecuritySchemeObject - | OpenIdConnectSecuritySchemeObject +export type SecuritySchemeObject = + | ApiKeySecuritySchemeObject + | HttpSecuritySchemeObject + | OAuth2SecuritySchemeObject + | OpenIdConnectSecuritySchemeObject /** * Allows configuration of the supported OAuth Flows. @@ -1604,11 +1592,11 @@ export interface AuthorizationCodeOAuthFlowObject extends OAuthFlowObjectBase { * * @see {@link https://spec.openapis.org/oas/v3.0.4.html#oauth-flow-object} */ -export type OAuthFlowObject - = | AuthorizationCodeOAuthFlowObject - | ClientCredentialsOAuthFlowObject - | ImplicitOAuthFlowObject - | PasswordOAuthFlowObject +export type OAuthFlowObject = + | AuthorizationCodeOAuthFlowObject + | ClientCredentialsOAuthFlowObject + | ImplicitOAuthFlowObject + | PasswordOAuthFlowObject /** * Lists the required security schemes to execute this operation or the API as diff --git a/packages/types/src/v3.1.ts b/packages/types/src/v3.1.ts index a4e2422..96c90cd 100644 --- a/packages/types/src/v3.1.ts +++ b/packages/types/src/v3.1.ts @@ -757,9 +757,7 @@ export interface ResponsesObject extends SpecificationExtensions { * explicit code definition takes precedence over the range definition for * that code. */ - [statusCode: `${1 | 2 | 3 | 4 | 5}${string}`]: - | ResponseObject - | ReferenceObject + [statusCode: `${1 | 2 | 3 | 4 | 5}${string}`]: ResponseObject | ReferenceObject } /** @@ -987,14 +985,14 @@ export interface ReferenceObject { * * @see {@link https://spec.openapis.org/oas/v3.1.2.html#data-types} */ -export type SchemaObjectType - = | 'array' - | 'boolean' - | 'integer' - | 'null' - | 'number' - | 'object' - | 'string' +export type SchemaObjectType = + | 'array' + | 'boolean' + | 'integer' + | 'null' + | 'number' + | 'object' + | 'string' /** * The object form of the Schema Object: every JSON Schema Draft 2020-12 @@ -1438,12 +1436,7 @@ export interface DiscriminatorObject extends SpecificationExtensions { * * @see {@link https://spec.openapis.org/oas/v3.1.2.html#security-scheme-object} */ -export type SecuritySchemeType - = | 'apiKey' - | 'http' - | 'mutualTLS' - | 'oauth2' - | 'openIdConnect' +export type SecuritySchemeType = 'apiKey' | 'http' | 'mutualTLS' | 'oauth2' | 'openIdConnect' /** * Defines a mutual TLS security scheme (use of a client certificate) that can @@ -1477,12 +1470,12 @@ export interface MutualTlsSecuritySchemeObject extends SpecificationExtensions { * * @see {@link https://spec.openapis.org/oas/v3.1.2.html#security-scheme-object} */ -export type SecuritySchemeObject - = | ApiKeySecuritySchemeObject - | HttpSecuritySchemeObject - | MutualTlsSecuritySchemeObject - | OAuth2SecuritySchemeObject - | OpenIdConnectSecuritySchemeObject +export type SecuritySchemeObject = + | ApiKeySecuritySchemeObject + | HttpSecuritySchemeObject + | MutualTlsSecuritySchemeObject + | OAuth2SecuritySchemeObject + | OpenIdConnectSecuritySchemeObject /** * Lists the required security schemes to execute this operation or the API as diff --git a/packages/types/src/v3.2.test-d.ts b/packages/types/src/v3.2.test-d.ts index b60de10..b9baa70 100644 --- a/packages/types/src/v3.2.test-d.ts +++ b/packages/types/src/v3.2.test-d.ts @@ -85,8 +85,7 @@ export const streamingApi = { tokenUrl: 'https://auth.example.com/token', }, }, - oauth2MetadataUrl: - 'https://auth.example.com/.well-known/oauth-authorization-server', + oauth2MetadataUrl: 'https://auth.example.com/.well-known/oauth-authorization-server', type: 'oauth2', }, legacy: { @@ -193,10 +192,7 @@ export const streamingApi = { }, ], schema: { - prefixItems: [ - { type: 'string' }, - { contentEncoding: 'base64', type: 'string' }, - ], + prefixItems: [{ type: 'string' }, { contentEncoding: 'base64', type: 'string' }], type: 'array', }, }, diff --git a/packages/types/src/v3.2.ts b/packages/types/src/v3.2.ts index 0f015d8..3d3c823 100644 --- a/packages/types/src/v3.2.ts +++ b/packages/types/src/v3.2.ts @@ -414,12 +414,7 @@ export interface OperationObject extends SpecificationExtensions { * * @see {@link https://spec.openapis.org/oas/v3.2.0.html#parameter-locations} */ -export type ParameterLocation - = | 'cookie' - | 'header' - | 'path' - | 'query' - | 'querystring' +export type ParameterLocation = 'cookie' | 'header' | 'path' | 'query' | 'querystring' /** * Describes how a parameter value will be serialized depending on the type of @@ -442,15 +437,15 @@ export type ParameterLocation * * @see {@link https://spec.openapis.org/oas/v3.2.0.html#style-values} */ -export type ParameterStyle - = | 'cookie' - | 'deepObject' - | 'form' - | 'label' - | 'matrix' - | 'pipeDelimited' - | 'simple' - | 'spaceDelimited' +export type ParameterStyle = + | 'cookie' + | 'deepObject' + | 'form' + | 'label' + | 'matrix' + | 'pipeDelimited' + | 'simple' + | 'spaceDelimited' /** * Describes a single operation parameter. @@ -802,9 +797,7 @@ export interface ResponsesObject extends SpecificationExtensions { * `5XX`. If a response is defined using an explicit code, the explicit code * definition takes precedence over the range definition for that code. */ - [statusCode: `${1 | 2 | 3 | 4 | 5}${string}`]: - | ResponseObject - | ReferenceObject + [statusCode: `${1 | 2 | 3 | 4 | 5}${string}`]: ResponseObject | ReferenceObject } /** @@ -1796,12 +1789,12 @@ export interface OpenIdConnectSecuritySchemeObject extends SpecificationExtensio * * @see {@link https://spec.openapis.org/oas/v3.2.0.html#security-scheme-object} */ -export type SecuritySchemeObject - = | ApiKeySecuritySchemeObject - | HttpSecuritySchemeObject - | MutualTlsSecuritySchemeObject - | OAuth2SecuritySchemeObject - | OpenIdConnectSecuritySchemeObject +export type SecuritySchemeObject = + | ApiKeySecuritySchemeObject + | HttpSecuritySchemeObject + | MutualTlsSecuritySchemeObject + | OAuth2SecuritySchemeObject + | OpenIdConnectSecuritySchemeObject /** * Allows configuration of the supported OAuth Flows. @@ -1857,12 +1850,12 @@ export interface DeviceAuthorizationOAuthFlowObject extends OAuthFlowObjectBase * * @see {@link https://spec.openapis.org/oas/v3.2.0.html#oauth-flow-object} */ -export type OAuthFlowObject - = | AuthorizationCodeOAuthFlowObject - | ClientCredentialsOAuthFlowObject - | DeviceAuthorizationOAuthFlowObject - | ImplicitOAuthFlowObject - | PasswordOAuthFlowObject +export type OAuthFlowObject = + | AuthorizationCodeOAuthFlowObject + | ClientCredentialsOAuthFlowObject + | DeviceAuthorizationOAuthFlowObject + | ImplicitOAuthFlowObject + | PasswordOAuthFlowObject /** * Lists the required security schemes to execute this operation or the API as diff --git a/packages/types/tests/examples/callback-example-3-0.ts b/packages/types/tests/examples/callback-example-3-0.ts index a1fc609..27bbe41 100644 --- a/packages/types/tests/examples/callback-example-3-0.ts +++ b/packages/types/tests/examples/callback-example-3-0.ts @@ -37,8 +37,7 @@ export const doc: OpenAPIObject = { required: ['subscriptionId'], properties: { subscriptionId: { - description: - 'this unique identifier allows management of the subscription', + description: 'this unique identifier allows management of the subscription', type: 'string', example: '2531329f-fb09-4ef7-887e-84e648214436', }, diff --git a/packages/types/tests/examples/non-oauth-scopes-3-1.ts b/packages/types/tests/examples/non-oauth-scopes-3-1.ts index 683c2e5..eecaa1d 100644 --- a/packages/types/tests/examples/non-oauth-scopes-3-1.ts +++ b/packages/types/tests/examples/non-oauth-scopes-3-1.ts @@ -25,8 +25,7 @@ export const doc: OpenAPIObject = { type: 'http', scheme: 'bearer', bearerFormat: 'jwt', - description: - 'note: non-oauth scopes are not defined at the securityScheme level', + description: 'note: non-oauth scopes are not defined at the securityScheme level', }, }, }, diff --git a/packages/types/tests/examples/tictactoe-3-1.ts b/packages/types/tests/examples/tictactoe-3-1.ts index 0507b89..bbf39ee 100644 --- a/packages/types/tests/examples/tictactoe-3-1.ts +++ b/packages/types/tests/examples/tictactoe-3-1.ts @@ -186,8 +186,7 @@ export const doc: OpenAPIObject = { mark: { type: 'string', enum: ['.', 'X', 'O'], - description: - 'Possible values for a board square. `.` means empty square.', + description: 'Possible values for a board square. `.` means empty square.', example: '.', }, board: { diff --git a/packages/types/tests/examples/uspto-3-0.ts b/packages/types/tests/examples/uspto-3-0.ts index 48bddbb..079b5af 100644 --- a/packages/types/tests/examples/uspto-3-0.ts +++ b/packages/types/tests/examples/uspto-3-0.ts @@ -57,16 +57,14 @@ export const doc: OpenAPIObject = { { apiKey: 'oa_citations', apiVersionNumber: 'v1', - apiUrl: - 'https://developer.uspto.gov/ds-api/oa_citations/v1/fields', + apiUrl: 'https://developer.uspto.gov/ds-api/oa_citations/v1/fields', apiDocumentationUrl: 'https://developer.uspto.gov/ds-api-docs/index.html?url=https://developer.uspto.gov/ds-api/swagger/docs/oa_citations.json', }, { apiKey: 'cancer_moonshot', apiVersionNumber: 'v1', - apiUrl: - 'https://developer.uspto.gov/ds-api/cancer_moonshot/v1/fields', + apiUrl: 'https://developer.uspto.gov/ds-api/cancer_moonshot/v1/fields', apiDocumentationUrl: 'https://developer.uspto.gov/ds-api-docs/index.html?url=https://developer.uspto.gov/ds-api/swagger/docs/cancer_moonshot.json', }, @@ -84,7 +82,7 @@ export const doc: OpenAPIObject = { summary: 'Provides the general information about the API and the list of fields that can be used to query the dataset.', description: - 'This GET API returns the list of all the searchable field names that are in the oa_citations. Please see the \'fields\' attribute which returns an array of field names. Each field or a combination of fields can be searched using the syntax options shown below.', + "This GET API returns the list of all the searchable field names that are in the oa_citations. Please see the 'fields' attribute which returns an array of field names. Each field or a combination of fields can be searched using the syntax options shown below.", operationId: 'list-searchable-fields', parameters: [ { @@ -137,10 +135,9 @@ export const doc: OpenAPIObject = { '/{dataset}/{version}/records': { post: { tags: ['search'], - summary: - 'Provides search capability for the data set with the given search criteria.', + summary: 'Provides search capability for the data set with the given search criteria.', description: - 'This API is based on Solr/Lucene Search. The data is indexed using SOLR. This GET API returns the list of all the searchable field names that are in the Solr Index. Please see the \'fields\' attribute which returns an array of field names. Each field or a combination of fields can be searched using the Solr/Lucene Syntax. Please refer https://lucene.apache.org/core/3_6_2/queryparsersyntax.html#Overview for the query syntax. List of field names that are searchable can be determined using above GET api.', + "This API is based on Solr/Lucene Search. The data is indexed using SOLR. This GET API returns the list of all the searchable field names that are in the Solr Index. Please see the 'fields' attribute which returns an array of field names. Each field or a combination of fields can be searched using the Solr/Lucene Syntax. Please refer https://lucene.apache.org/core/3_6_2/queryparsersyntax.html#Overview for the query syntax. List of field names that are searchable can be determined using above GET api.", operationId: 'perform-search', parameters: [ { @@ -156,8 +153,7 @@ export const doc: OpenAPIObject = { { name: 'dataset', in: 'path', - description: - 'Name of the dataset. In this case, the default value is oa_citations', + description: 'Name of the dataset. In this case, the default value is oa_citations', required: true, schema: { type: 'string', @@ -194,7 +190,7 @@ export const doc: OpenAPIObject = { properties: { criteria: { description: - 'Uses Lucene Query Syntax in the format of propertyName:value, propertyName:[num1 TO num2] and date range format: propertyName:[yyyyMMdd TO yyyyMMdd]. In the response please see the \'docs\' element which has the list of record objects. Each record structure would consist of all the fields and their corresponding values.', + "Uses Lucene Query Syntax in the format of propertyName:value, propertyName:[num1 TO num2] and date range format: propertyName:[yyyyMMdd TO yyyyMMdd]. In the response please see the 'docs' element which has the list of record objects. Each record structure would consist of all the fields and their corresponding values.", type: 'string', default: '*:*', }, @@ -205,7 +201,7 @@ export const doc: OpenAPIObject = { }, rows: { description: - 'Specify number of rows to be returned. If you run the search with default values, in the response you will see \'numFound\' attribute which will tell the number of records available in the dataset.', + "Specify number of rows to be returned. If you run the search with default values, in the response you will see 'numFound' attribute which will tell the number of records available in the dataset.", type: 'integer', default: 100, }, @@ -242,7 +238,7 @@ export const doc: OpenAPIObject = { apiUrl: { type: 'string', format: 'uri-reference', - description: 'The URL describing the dataset\'s fields', + description: "The URL describing the dataset's fields", }, apiDocumentationUrl: { type: 'string', diff --git a/packages/types/tests/examples/webhook-example-3-1.ts b/packages/types/tests/examples/webhook-example-3-1.ts index 5b8d907..f637527 100644 --- a/packages/types/tests/examples/webhook-example-3-1.ts +++ b/packages/types/tests/examples/webhook-example-3-1.ts @@ -23,8 +23,7 @@ export const doc: OpenAPIObject = { }, responses: { 200: { - description: - 'Return a 200 status to indicate that the data was received successfully', + description: 'Return a 200 status to indicate that the data was received successfully', }, }, }, diff --git a/packages/types/tests/schema-tests-3.1/example-object-examples.ts b/packages/types/tests/schema-tests-3.1/example-object-examples.ts index f383d6a..3711176 100644 --- a/packages/types/tests/schema-tests-3.1/example-object-examples.ts +++ b/packages/types/tests/schema-tests-3.1/example-object-examples.ts @@ -43,8 +43,7 @@ export const doc: OpenAPIObject = { examples: { xmlExample: { summary: 'This is an example in XML', - externalValue: - 'https://example.org/examples/address-example.xml', + externalValue: 'https://example.org/examples/address-example.xml', }, }, }, diff --git a/packages/types/tests/schema-tests-3.1/json-schema-dialect.ts b/packages/types/tests/schema-tests-3.1/json-schema-dialect.ts index 2d0f6a5..953dc14 100644 --- a/packages/types/tests/schema-tests-3.1/json-schema-dialect.ts +++ b/packages/types/tests/schema-tests-3.1/json-schema-dialect.ts @@ -13,8 +13,7 @@ export const doc: OpenAPIObject = { identifier: 'Apache-2.0', }, }, - jsonSchemaDialect: - 'https://spec.openapis.org/oas/3.1/dialect/WORK-IN-PROGRESS', + jsonSchemaDialect: 'https://spec.openapis.org/oas/3.1/dialect/WORK-IN-PROGRESS', components: { schemas: { WithDollarSchema: { diff --git a/packages/types/tests/schema-tests-3.1/link-object-examples.ts b/packages/types/tests/schema-tests-3.1/link-object-examples.ts index c9ee20f..4f35629 100644 --- a/packages/types/tests/schema-tests-3.1/link-object-examples.ts +++ b/packages/types/tests/schema-tests-3.1/link-object-examples.ts @@ -91,7 +91,7 @@ export const doc: OpenAPIObject = { operationId: 'getUserAddress', responses: { 200: { - description: 'the user\'s address', + description: "the user's address", }, }, }, diff --git a/packages/types/tests/schema-tests-3.1/media-type-examples.ts b/packages/types/tests/schema-tests-3.1/media-type-examples.ts index d75e31b..ad9ef36 100644 --- a/packages/types/tests/schema-tests-3.1/media-type-examples.ts +++ b/packages/types/tests/schema-tests-3.1/media-type-examples.ts @@ -38,7 +38,7 @@ export const doc: OpenAPIObject = { }, }, dog: { - summary: 'An example of a dog with a cat\'s name', + summary: "An example of a dog with a cat's name", value: { name: 'Puma', petType: 'Dog', @@ -141,8 +141,7 @@ export const doc: OpenAPIObject = { contentType: 'image/png, image/jpeg', headers: { 'X-Rate-Limit-Limit': { - description: - 'The number of allowed requests in the current period', + description: 'The number of allowed requests in the current period', schema: { type: 'integer', }, diff --git a/packages/types/tests/schema-tests-3.1/mega.ts b/packages/types/tests/schema-tests-3.1/mega.ts index cbe4cb9..d402731 100644 --- a/packages/types/tests/schema-tests-3.1/mega.ts +++ b/packages/types/tests/schema-tests-3.1/mega.ts @@ -5,7 +5,7 @@ import type { OpenAPIObject } from '../../src/v3.1' export const doc: OpenAPIObject = { openapi: '3.1.0', info: { - summary: 'My API\'s summary', + summary: "My API's summary", title: 'My API', version: '1.0.0', license: { diff --git a/packages/types/tests/schema-tests-3.1/non-oauth-scopes.ts b/packages/types/tests/schema-tests-3.1/non-oauth-scopes.ts index 83baae6..55d0add 100644 --- a/packages/types/tests/schema-tests-3.1/non-oauth-scopes.ts +++ b/packages/types/tests/schema-tests-3.1/non-oauth-scopes.ts @@ -25,8 +25,7 @@ export const doc: OpenAPIObject = { type: 'http', scheme: 'bearer', bearerFormat: 'jwt', - description: - 'note: non-oauth scopes are not defined at the securityScheme level', + description: 'note: non-oauth scopes are not defined at the securityScheme level', }, }, }, diff --git a/packages/types/tests/schema-tests-3.1/paths-object-example.ts b/packages/types/tests/schema-tests-3.1/paths-object-example.ts index e887e0f..1917689 100644 --- a/packages/types/tests/schema-tests-3.1/paths-object-example.ts +++ b/packages/types/tests/schema-tests-3.1/paths-object-example.ts @@ -16,8 +16,7 @@ export const doc: OpenAPIObject = { paths: { '/pets': { get: { - description: - 'Returns all pets from the system that the user has access to', + description: 'Returns all pets from the system that the user has access to', responses: { 200: { description: 'A list of pets.', diff --git a/packages/types/tests/schema-tests-3.1/request-body-examples.ts b/packages/types/tests/schema-tests-3.1/request-body-examples.ts index 54e1eb5..f6badce 100644 --- a/packages/types/tests/schema-tests-3.1/request-body-examples.ts +++ b/packages/types/tests/schema-tests-3.1/request-body-examples.ts @@ -53,8 +53,7 @@ export const doc: OpenAPIObject = { examples: { user: { summary: 'User example in other format', - externalValue: - 'https://foo.bar/examples/user-example.whatever', + externalValue: 'https://foo.bar/examples/user-example.whatever', }, }, }, diff --git a/packages/types/tests/schema-tests-3.1/response-object-examples.ts b/packages/types/tests/schema-tests-3.1/response-object-examples.ts index f8ee32e..dd3491a 100644 --- a/packages/types/tests/schema-tests-3.1/response-object-examples.ts +++ b/packages/types/tests/schema-tests-3.1/response-object-examples.ts @@ -51,8 +51,7 @@ export const doc: OpenAPIObject = { }, }, 'X-Rate-Limit-Remaining': { - description: - 'The number of remaining requests in the current period', + description: 'The number of remaining requests in the current period', schema: { type: 'integer', }, diff --git a/packages/types/tests/schema-tests-3.1/schema.ts b/packages/types/tests/schema-tests-3.1/schema.ts index 0cad3de..0bfbfd6 100644 --- a/packages/types/tests/schema-tests-3.1/schema.ts +++ b/packages/types/tests/schema-tests-3.1/schema.ts @@ -19,11 +19,11 @@ export const doc: OpenAPIObject = { type: ['integer', 'string'], }, two: { - description: 'type \'null\'', + description: "type 'null'", type: 'null', }, three: { - description: 'type array including \'null\'', + description: "type array including 'null'", type: ['string', 'null'], }, four: { diff --git a/packages/types/tests/schema-tests-3.1/servers.ts b/packages/types/tests/schema-tests-3.1/servers.ts index 1152dc9..ed6b357 100644 --- a/packages/types/tests/schema-tests-3.1/servers.ts +++ b/packages/types/tests/schema-tests-3.1/servers.ts @@ -24,8 +24,7 @@ export const doc: OpenAPIObject = { variables: { username: { default: 'demo', - description: - 'A user-specific subdomain. Use `demo` for a free sandbox environment.', + description: 'A user-specific subdomain. Use `demo` for a free sandbox environment.', }, port: { enum: ['8443', '443'], diff --git a/packages/types/tests/schema-tests-3.1/style-defaults.ts b/packages/types/tests/schema-tests-3.1/style-defaults.ts index 3d33719..f2ac509 100644 --- a/packages/types/tests/schema-tests-3.1/style-defaults.ts +++ b/packages/types/tests/schema-tests-3.1/style-defaults.ts @@ -22,18 +22,15 @@ export const doc: OpenAPIObject = { 'style, explode and allowReserved are not present, so contentType is used; no defaults expected as default contentType cannot be determined by the schema', }, style_form: { - 'x-comment': - 'expecting defaults: explode=true, allowReserved=false', + 'x-comment': 'expecting defaults: explode=true, allowReserved=false', 'style': 'form', }, style_spaceDelimited: { - 'x-comment': - 'expecting defaults: explode=false, allowReserved=false', + 'x-comment': 'expecting defaults: explode=false, allowReserved=false', 'style': 'spaceDelimited', }, explode: { - 'x-comment': - 'expecting defaults: style=form, allowReserved=false', + 'x-comment': 'expecting defaults: style=form, allowReserved=false', 'explode': false, }, allowReserved: { @@ -64,8 +61,7 @@ export const doc: OpenAPIObject = { 'schema': {}, }, path_matrix: { - 'x-comment': - 'expecting defaults: deprecated=false, explode=false, allowReserved=false', + 'x-comment': 'expecting defaults: deprecated=false, explode=false, allowReserved=false', 'name': 'path_matrix', 'in': 'path', 'required': true, @@ -73,8 +69,7 @@ export const doc: OpenAPIObject = { 'schema': {}, }, path_label: { - 'x-comment': - 'expecting defaults: deprecated=false, explode=false, allowReserved=false', + 'x-comment': 'expecting defaults: deprecated=false, explode=false, allowReserved=false', 'name': 'path_label', 'in': 'path', 'required': true, @@ -82,8 +77,7 @@ export const doc: OpenAPIObject = { 'schema': {}, }, query_media_type: { - 'x-comment': - 'expecting defaults: required=false, deprecated=false, allowEmptyValue=false', + 'x-comment': 'expecting defaults: required=false, deprecated=false, allowEmptyValue=false', 'name': 'query_media_type', 'in': 'query', 'content': { diff --git a/packages/types/tests/schema-tests-3.1/webhook-example.ts b/packages/types/tests/schema-tests-3.1/webhook-example.ts index 9b5593b..24e97f2 100644 --- a/packages/types/tests/schema-tests-3.1/webhook-example.ts +++ b/packages/types/tests/schema-tests-3.1/webhook-example.ts @@ -23,8 +23,7 @@ export const doc: OpenAPIObject = { }, responses: { 200: { - description: - 'Return a 200 status to indicate that the data was received successfully', + description: 'Return a 200 status to indicate that the data was received successfully', }, }, }, diff --git a/packages/types/tests/schema-tests-3.2/example-object-examples.ts b/packages/types/tests/schema-tests-3.2/example-object-examples.ts index 3344922..5dbbb79 100644 --- a/packages/types/tests/schema-tests-3.2/example-object-examples.ts +++ b/packages/types/tests/schema-tests-3.2/example-object-examples.ts @@ -43,8 +43,7 @@ export const doc: OpenAPIObject = { examples: { xmlExample: { summary: 'This is an example in XML', - externalValue: - 'https://example.org/examples/address-example.xml', + externalValue: 'https://example.org/examples/address-example.xml', }, }, }, diff --git a/packages/types/tests/schema-tests-3.2/json-schema-dialect.ts b/packages/types/tests/schema-tests-3.2/json-schema-dialect.ts index 03cecb0..4d947fd 100644 --- a/packages/types/tests/schema-tests-3.2/json-schema-dialect.ts +++ b/packages/types/tests/schema-tests-3.2/json-schema-dialect.ts @@ -13,8 +13,7 @@ export const doc: OpenAPIObject = { identifier: 'Apache-2.0', }, }, - jsonSchemaDialect: - 'https://spec.openapis.org/oas/3.2/dialect/WORK-IN-PROGRESS', + jsonSchemaDialect: 'https://spec.openapis.org/oas/3.2/dialect/WORK-IN-PROGRESS', components: { schemas: { WithDollarSchema: { diff --git a/packages/types/tests/schema-tests-3.2/link-object-examples.ts b/packages/types/tests/schema-tests-3.2/link-object-examples.ts index 501bfed..67e6075 100644 --- a/packages/types/tests/schema-tests-3.2/link-object-examples.ts +++ b/packages/types/tests/schema-tests-3.2/link-object-examples.ts @@ -91,7 +91,7 @@ export const doc: OpenAPIObject = { operationId: 'getUserAddress', responses: { 200: { - description: 'the user\'s address', + description: "the user's address", }, }, }, diff --git a/packages/types/tests/schema-tests-3.2/media-type-examples.ts b/packages/types/tests/schema-tests-3.2/media-type-examples.ts index 2768244..be33499 100644 --- a/packages/types/tests/schema-tests-3.2/media-type-examples.ts +++ b/packages/types/tests/schema-tests-3.2/media-type-examples.ts @@ -47,7 +47,7 @@ export const doc: OpenAPIObject = { }, }, dog: { - summary: 'An example of a dog with a cat\'s name', + summary: "An example of a dog with a cat's name", value: { name: 'Puma', petType: 'Dog', @@ -192,8 +192,7 @@ export const doc: OpenAPIObject = { contentType: 'image/png, image/jpeg', headers: { 'X-Rate-Limit-Limit': { - description: - 'The number of allowed requests in the current period', + description: 'The number of allowed requests in the current period', schema: { type: 'integer', }, diff --git a/packages/types/tests/schema-tests-3.2/mega.ts b/packages/types/tests/schema-tests-3.2/mega.ts index 2949436..28f5ee9 100644 --- a/packages/types/tests/schema-tests-3.2/mega.ts +++ b/packages/types/tests/schema-tests-3.2/mega.ts @@ -5,7 +5,7 @@ import type { OpenAPIObject } from '../../src/v3.2' export const doc: OpenAPIObject = { openapi: '3.2.0', info: { - summary: 'My API\'s summary', + summary: "My API's summary", title: 'My API', version: '1.0.0', license: { diff --git a/packages/types/tests/schema-tests-3.2/non-oauth-scopes.ts b/packages/types/tests/schema-tests-3.2/non-oauth-scopes.ts index 79d93af..584d960 100644 --- a/packages/types/tests/schema-tests-3.2/non-oauth-scopes.ts +++ b/packages/types/tests/schema-tests-3.2/non-oauth-scopes.ts @@ -25,8 +25,7 @@ export const doc: OpenAPIObject = { type: 'http', scheme: 'bearer', bearerFormat: 'jwt', - description: - 'note: non-oauth scopes are not defined at the securityScheme level', + description: 'note: non-oauth scopes are not defined at the securityScheme level', }, }, }, diff --git a/packages/types/tests/schema-tests-3.2/parameter-object-cookie-form-allow-reserved.ts b/packages/types/tests/schema-tests-3.2/parameter-object-cookie-form-allow-reserved.ts index e03eecb..4b62219 100644 --- a/packages/types/tests/schema-tests-3.2/parameter-object-cookie-form-allow-reserved.ts +++ b/packages/types/tests/schema-tests-3.2/parameter-object-cookie-form-allow-reserved.ts @@ -5,8 +5,7 @@ import type { OpenAPIObject } from '../../src/v3.2' export const doc: OpenAPIObject = { openapi: '3.2.0', info: { - title: - 'allowReserved only permitted with in and style values that percent-encode', + title: 'allowReserved only permitted with in and style values that percent-encode', version: '1.0.0', }, components: { diff --git a/packages/types/tests/schema-tests-3.2/parameter-object-query-allow-reserved.ts b/packages/types/tests/schema-tests-3.2/parameter-object-query-allow-reserved.ts index 17399c1..7a58314 100644 --- a/packages/types/tests/schema-tests-3.2/parameter-object-query-allow-reserved.ts +++ b/packages/types/tests/schema-tests-3.2/parameter-object-query-allow-reserved.ts @@ -5,8 +5,7 @@ import type { OpenAPIObject } from '../../src/v3.2' export const doc: OpenAPIObject = { openapi: '3.2.0', info: { - title: - 'allowReserved only permitted with in and style values that percent-encode', + title: 'allowReserved only permitted with in and style values that percent-encode', version: '1.0.0', }, components: { diff --git a/packages/types/tests/schema-tests-3.2/paths-object-example.ts b/packages/types/tests/schema-tests-3.2/paths-object-example.ts index 92cd832..9194ae4 100644 --- a/packages/types/tests/schema-tests-3.2/paths-object-example.ts +++ b/packages/types/tests/schema-tests-3.2/paths-object-example.ts @@ -16,8 +16,7 @@ export const doc: OpenAPIObject = { paths: { '/pets': { get: { - description: - 'Returns all pets from the system that the user has access to', + description: 'Returns all pets from the system that the user has access to', responses: { 200: { description: 'A list of pets.', diff --git a/packages/types/tests/schema-tests-3.2/request-body-examples.ts b/packages/types/tests/schema-tests-3.2/request-body-examples.ts index bd0e24e..f27d160 100644 --- a/packages/types/tests/schema-tests-3.2/request-body-examples.ts +++ b/packages/types/tests/schema-tests-3.2/request-body-examples.ts @@ -53,8 +53,7 @@ export const doc: OpenAPIObject = { examples: { user: { summary: 'User example in other format', - externalValue: - 'https://foo.bar/examples/user-example.whatever', + externalValue: 'https://foo.bar/examples/user-example.whatever', }, }, }, diff --git a/packages/types/tests/schema-tests-3.2/response-object-examples.ts b/packages/types/tests/schema-tests-3.2/response-object-examples.ts index 55597dd..06ae0af 100644 --- a/packages/types/tests/schema-tests-3.2/response-object-examples.ts +++ b/packages/types/tests/schema-tests-3.2/response-object-examples.ts @@ -52,8 +52,7 @@ export const doc: OpenAPIObject = { }, }, 'X-Rate-Limit-Remaining': { - description: - 'The number of remaining requests in the current period', + description: 'The number of remaining requests in the current period', schema: { type: 'integer', }, diff --git a/packages/types/tests/schema-tests-3.2/schema.ts b/packages/types/tests/schema-tests-3.2/schema.ts index 010c783..5b7d8d5 100644 --- a/packages/types/tests/schema-tests-3.2/schema.ts +++ b/packages/types/tests/schema-tests-3.2/schema.ts @@ -19,11 +19,11 @@ export const doc: OpenAPIObject = { type: ['integer', 'string'], }, two: { - description: 'type \'null\'', + description: "type 'null'", type: 'null', }, three: { - description: 'type array including \'null\'', + description: "type array including 'null'", type: ['string', 'null'], }, four: { diff --git a/packages/types/tests/schema-tests-3.2/servers.ts b/packages/types/tests/schema-tests-3.2/servers.ts index d5941c4..0c70a83 100644 --- a/packages/types/tests/schema-tests-3.2/servers.ts +++ b/packages/types/tests/schema-tests-3.2/servers.ts @@ -25,8 +25,7 @@ export const doc: OpenAPIObject = { variables: { username: { default: 'demo', - description: - 'A user-specific subdomain. Use `demo` for a free sandbox environment.', + description: 'A user-specific subdomain. Use `demo` for a free sandbox environment.', }, port: { enum: ['8443', '443'], diff --git a/packages/types/tests/schema-tests-3.2/style-defaults.ts b/packages/types/tests/schema-tests-3.2/style-defaults.ts index aedcac5..794e3da 100644 --- a/packages/types/tests/schema-tests-3.2/style-defaults.ts +++ b/packages/types/tests/schema-tests-3.2/style-defaults.ts @@ -18,13 +18,11 @@ export const doc: OpenAPIObject = { 'style, explode and allowReserved are not present, so contentType is used; no defaults expected as default contentType cannot be determined by the schema', }, style_form: { - 'x-comment': - 'expecting defaults: explode=true, allowReserved=false', + 'x-comment': 'expecting defaults: explode=true, allowReserved=false', 'style': 'form', }, style_spaceDelimited: { - 'x-comment': - 'expecting defaults: explode=false, allowReserved=false', + 'x-comment': 'expecting defaults: explode=false, allowReserved=false', 'style': 'spaceDelimited', }, explode: { @@ -59,8 +57,7 @@ export const doc: OpenAPIObject = { 'schema': {}, }, path_matrix: { - 'x-comment': - 'expecting defaults: deprecated=false, explode=false, allowReserved=false', + 'x-comment': 'expecting defaults: deprecated=false, explode=false, allowReserved=false', 'name': 'path_matrix', 'in': 'path', 'required': true, @@ -68,8 +65,7 @@ export const doc: OpenAPIObject = { 'schema': {}, }, path_label: { - 'x-comment': - 'expecting defaults: deprecated=false, explode=false, allowReserved=false', + 'x-comment': 'expecting defaults: deprecated=false, explode=false, allowReserved=false', 'name': 'path_label', 'in': 'path', 'required': true, @@ -77,8 +73,7 @@ export const doc: OpenAPIObject = { 'schema': {}, }, query_media_type: { - 'x-comment': - 'expecting defaults: required=false, deprecated=false, allowEmptyValue=false', + 'x-comment': 'expecting defaults: required=false, deprecated=false, allowEmptyValue=false', 'name': 'query_media_type', 'in': 'query', 'content': { @@ -144,8 +139,7 @@ export const doc: OpenAPIObject = { 'schema': {}, }, cookie_cookie: { - 'x-comment': - 'expecting defaults: required=false, deprecated=false, explode=true', + 'x-comment': 'expecting defaults: required=false, deprecated=false, explode=true', 'name': 'cookie_cookie', 'in': 'cookie', 'style': 'cookie', diff --git a/packages/types/tests/schema-tests-3.2/webhook-example.ts b/packages/types/tests/schema-tests-3.2/webhook-example.ts index 536aca9..f19375c 100644 --- a/packages/types/tests/schema-tests-3.2/webhook-example.ts +++ b/packages/types/tests/schema-tests-3.2/webhook-example.ts @@ -23,8 +23,7 @@ export const doc: OpenAPIObject = { }, responses: { 200: { - description: - 'Return a 200 status to indicate that the data was received successfully', + description: 'Return a 200 status to indicate that the data was received successfully', }, }, }, From cf0d52caff1ff09fe9c70d8d766de598be975d8e Mon Sep 17 00:00:00 2001 From: Dinh Le Date: Sat, 3 Oct 2026 14:25:19 +0700 Subject: [PATCH 3/3] chore: exempt uncheck@0.1.0 from the minimum release age --- pnpm-workspace.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2b7e14c..f0aaf51 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,3 +10,5 @@ preferWorkspacePackages: true allowBuilds: esbuild: true +minimumReleaseAgeExclude: + - uncheck@0.1.0