chore(deps): refresh runtimes and adopt ESLint 10 (#11259)

Co-authored-by: backryun <backryun@daonlab.local>
This commit is contained in:
backryun
2026-09-01 23:05:45 +09:00
committed by GitHub
parent 9629d78ece
commit c818655b5a
6 changed files with 2987 additions and 1209 deletions

View File

@@ -1,5 +1,5 @@
# ── Multi-stage Dockerfile for Native Bun Runtime (web-latest-bun) ───────────
FROM oven/bun:1.3.14-slim AS base
FROM oven/bun:1.4.0-slim AS base
WORKDIR /app
RUN apt-get update \
@@ -58,7 +58,7 @@ ENV NODE_ENV=production
RUN bun run --quiet build
# ── Runner Base stage (100% Bun Native Production Runtime) ──────────────────
FROM oven/bun:1.3.14-slim AS runner-base
FROM oven/bun:1.4.0-slim AS runner-base
LABEL org.opencontainers.image.title="omniroute" \
org.opencontainers.image.description="Unified AI proxy — route any LLM through one endpoint (Bun Native)" \

View File

@@ -13,6 +13,7 @@
"@dnd-kit/core",
"@dnd-kit/sortable",
"@dnd-kit/utilities",
"@eslint/compat",
"@huggingface/transformers",
"@lobehub/icons",
"@modelcontextprotocol/sdk",
@@ -65,6 +66,7 @@
"eslint-config-next",
"eslint-plugin-react-hooks",
"eslint-plugin-sonarjs",
"espree",
"express",
"fast-check",
"fetch-socks",

View File

@@ -297,11 +297,6 @@
"count": 1
}
},
"open-sse/handlers/videoGeneration/openai.ts": {
"@typescript-eslint/no-unused-vars": {
"count": 1
}
},
"open-sse/mcp-server/__tests__/a2aLifecycle.test.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 1
@@ -806,11 +801,6 @@
"count": 1
}
},
"open-sse/utils/streamPayloadCollector.ts": {
"no-restricted-syntax": {
"count": 1
}
},
"open-sse/utils/usageTracking.ts": {
"@typescript-eslint/no-unused-vars": {
"count": 1
@@ -1519,11 +1509,6 @@
"count": 2
}
},
"src/lib/credentialHealth/scheduler.ts": {
"@typescript-eslint/no-unused-vars": {
"count": 1
}
},
"src/lib/db/apiKeys.ts": {
"@typescript-eslint/no-unused-vars": {
"count": 3
@@ -3130,9 +3115,6 @@
"tests/unit/cli-nodes-commands.test.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 15
},
"@typescript-eslint/no-unused-vars": {
"count": 2
}
},
"tests/unit/cli-oauth-commands.test.ts": {
@@ -5116,11 +5098,6 @@
"count": 1
}
},
"tests/unit/stream-payload-collector.test.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 2
}
},
"tests/unit/stream-prompt-tokens-zero-upstream.test.ts": {
"@typescript-eslint/no-unused-vars": {
"count": 1
@@ -5265,11 +5242,6 @@
"count": 5
}
},
"tests/unit/translator-antigravity-to-openai.test.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 4
}
},
"tests/unit/translator-claude-helper-thinking.test.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 21

View File

@@ -1,4 +1,6 @@
import { fixupConfigRules } from "@eslint/compat";
import nextVitals from "eslint-config-next/core-web-vitals";
import * as espree from "espree";
import tseslint from "typescript-eslint";
// #7879: bar NEW local `toNumber` definitions outside the canonical helper.
@@ -37,7 +39,22 @@ const IMPORT_BOUNDARY_RESTRICTIONS = {
/** @type {import("eslint").Linter.Config[]} */
const eslintConfig = [
...nextVitals,
...fixupConfigRules(nextVitals),
// eslint-config-next's Babel parser has not adopted ESLint 10's ScopeManager
// finalize contract yet. Plain JS/JSX does not need that parser, so use the
// ESLint-native parser while retaining Next's plugins and rules.
{
files: ["**/*.{js,jsx,mjs,cjs}"],
languageOptions: {
parser: espree,
},
},
{
files: ["**/*.{mts,cts}"],
languageOptions: {
parser: tseslint.parser,
},
},
// Pacote 4 (plano mestre testes+CI, 2026-07-04) — zero-warning policy: TODA regra roda
// como "error" e a dívida pré-existente vive congelada por arquivo+regra em
// config/quality/eslint-suppressions.json (ESLint bulk suppressions nativo). Violação
@@ -133,28 +150,45 @@ const eslintConfig = [
"no-restricted-syntax": "off",
},
},
// Relaxed rules for open-sse and tests (incremental adoption)
// Relaxed rules for TypeScript in open-sse and tests (incremental adoption).
// eslint-config-next already registers @typescript-eslint for every TS file;
// registering a second plugin object is rejected by ESLint 10.
{
files: ["open-sse/**/*.ts", "tests/**/*.mjs", "tests/**/*.ts"],
plugins: {
"@typescript-eslint": tseslint.plugin,
},
files: ["open-sse/**/*.ts", "tests/**/*.ts"],
rules: {
"@typescript-eslint/no-explicit-any": "error",
"@next/next/no-assign-module-variable": "off",
"react-hooks/rules-of-hooks": "off",
},
},
{
files: ["tests/**/*.mjs"],
plugins: {
"@typescript-eslint": tseslint.plugin,
},
rules: {
"@next/next/no-assign-module-variable": "off",
"react-hooks/rules-of-hooks": "off",
},
},
// JS/JSX files do not match eslint-config-next's TypeScript block. Register
// the plugin only for that disjoint scope so the shared unused-vars ratchet
// works without redefining the plugin for TS/TSX under ESLint 10.
{
files: ["src/**/*.{js,jsx}"],
plugins: {
"@typescript-eslint": tseslint.plugin,
},
},
// Ratchet: bar NEW unused vars/args/catches outside the `_` escape hatch.
// Pre-existing violations are frozen via config/quality/eslint-suppressions.json
// (same pattern as #7879 toNumber); only genuinely NEW unused bindings fail
// lint. `args: "all"` (not `after-used`) so a leading unused param is never
// silently skipped, e.g. `function handle(req, _opts, next)` must flag `req`.
// eslint-config-next already registers @typescript-eslint; registering it again
// in this block is rejected by ESLint 10.
{
files: ["src/**/*.{ts,tsx,js,jsx}", "open-sse/**/*.ts", "tests/**/*.{ts,tsx,mjs}"],
plugins: {
"@typescript-eslint": tseslint.plugin,
},
rules: {
"@typescript-eslint/no-unused-vars": [
"error",

4047
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -270,7 +270,7 @@
"alibaba:sync-allowlist": "node --import tsx/esm scripts/ops/sync-alibaba-allowlist.mjs"
},
"dependencies": {
"@aws-sdk/client-bedrock-runtime": "^3.1116.0",
"@aws-sdk/client-bedrock-runtime": "^3.1120.0",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
@@ -281,10 +281,10 @@
"@swc/helpers": "0.5.23",
"@toon-format/toon": "^4.1.1",
"@types/mdx": "^2.0.13",
"@xyflow/react": "^12.11.3",
"@xyflow/react": "^12.11.5",
"ajv": "^8.20.0",
"ajv-formats": "^3.0.1",
"axios": "^1.19.0",
"axios": "^1.20.0",
"bcryptjs": "^3.0.3",
"bottleneck": "^2.19.5",
"clsx": "^2.1.1",
@@ -295,8 +295,8 @@
"express": "^5.2.1",
"fetch-socks": "^1.3.3",
"fflate": "^0.8.3",
"fumadocs-core": "^16.15.0",
"fumadocs-ui": "^16.15.0",
"fumadocs-core": "^16.15.4",
"fumadocs-ui": "^16.15.4",
"http-proxy-middleware": "^4.0.0",
"https-proxy-agent": "^9.0.0",
"ink": "^7.0.3",
@@ -304,17 +304,17 @@
"ink-text-input": "^6.0.0",
"ioredis": "^5.10.1",
"jose": "^6.2.10",
"js-yaml": "^5.3.0",
"js-yaml": "^5.4.1",
"jsonc-parser": "^3.3.1",
"lowdb": "^7.0.1",
"lucide-react": "^1.33.0",
"marked": "^18.0.10",
"marked": "^18.0.11",
"marked-terminal": "^7.3.0",
"material-symbols": "^0.46.0",
"mermaid": "^11.17.0",
"mermaid": "^11.17.2",
"monaco-editor": "^0.56.0",
"next": "16.3.2",
"next-intl": "^4.13.7",
"next": "16.3.3",
"next-intl": "^4.14.0",
"next-themes": "^0.4.6",
"node-machine-id": "^1.1.12",
"omniglyph": "^1.4.0",
@@ -335,7 +335,7 @@
"recharts": "^3.8.1",
"safe-regex": "^2.1.1",
"selfsigned": "^5.5.0",
"sharp": "^0.35.3",
"sharp": "^0.35.4",
"smol-toml": "1.8.0",
"socks": "^2.8.7",
"sql.js": "^1.14.2",
@@ -346,7 +346,7 @@
"turndown-plugin-gfm": "1.0.2",
"undici": "^8.10.0",
"update-notifier": "^7.3.1",
"uuid": "^14.0.0",
"uuid": "^14.0.2",
"ws": "^8.21.3",
"xxhash-wasm": "^1.1.0",
"yazl": "^3.3.1",
@@ -362,11 +362,12 @@
"onnxruntime-node": "1.24.3",
"sqlite-vec": "^0.1.9",
"tls-client-node": "^0.2.0",
"wreq-js": "^3.1.0"
"wreq-js": "^3.2.0"
},
"devDependencies": {
"@axe-core/playwright": "^4.13.0",
"@cyclonedx/cyclonedx-npm": "6.0.1",
"@eslint/compat": "^2.1.0",
"@playwright/test": "^1.62.1",
"@size-limit/file": "^13.0.3",
"@stryker-mutator/core": "^10.0.0",
@@ -374,13 +375,13 @@
"@tailwindcss/postcss": "^4.3.0",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^7.0.1",
"@testing-library/react": "^16.3.2",
"@testing-library/react": "^16.3.3",
"@testing-library/user-event": "^14.6.6",
"@types/better-sqlite3": "^9.6.0",
"@types/bun": "latest",
"@types/node": "^26.2.0",
"@types/bun": "1.4.0",
"@types/node": "^26.4.0",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4",
"@types/react-dom": "^19.2.5",
"@types/safe-regex": "^1.1.6",
"@types/ws": "^8.18.0",
"@vitejs/plugin-react": "^6.1.0",
@@ -391,32 +392,33 @@
"ctrf": "^0.3.0",
"dpdm": "^4.3.0",
"esbuild": "0.28.2",
"eslint": "^9.39.4",
"eslint-config-next": "16.3.2",
"eslint": "^10.9.0",
"eslint-config-next": "16.3.3",
"eslint-plugin-react-hooks": "7.0.1",
"eslint-plugin-sonarjs": "^4.1.0",
"espree": "^11.2.0",
"fast-check": "^4.8.0",
"fumadocs-mdx": "^15.3.1",
"fumadocs-mdx": "^15.4.0",
"glob": "^13.0.6",
"httpyac": "^6.16.7",
"husky": "^9.1.7",
"jscpd": "^4.3.0",
"jsdom": "^30.0.1",
"junit-to-ctrf": "^0.0.14",
"knip": "^6.32.2",
"knip": "^6.32.3",
"license-checker-rseidelsohn": "^5.0.1",
"lint-staged": "^17.3.0",
"lint-staged": "^17.4.1",
"lockfile-lint": "^5.0.1",
"node-loader": "^2.1.0",
"opencode-ai": "1.18.21",
"opencode-ai": "1.18.23",
"playwright-ctrf-json-reporter": "^0.0.29",
"prettier": "^3.9.6",
"promptfoo": "^0.122.0",
"promptfoo": "^0.122.1",
"size-limit": "^13.0.3",
"tailwindcss": "^4.3.0",
"type-coverage": "^2.30.1",
"typescript": "^6.0.3",
"typescript-eslint": "^8.67.0",
"typescript-eslint": "^8.68.0",
"vitest": "^4.1.11",
"wait-on": "^9.1.0",
"wtfnode": "^0.10.1"
@@ -451,12 +453,13 @@
},
"overrides": {
"onnxruntime-node": "1.24.3",
"eslint-plugin-react-hooks": "7.0.1",
"fast-xml-parser": "^5.10.1",
"sharp": "^0.35.3",
"sharp": "^0.35.4",
"postcss": "^8.5.18",
"ip-address": "^10.3.1",
"qs": "^6.15.2",
"uuid": "^14.0.0",
"uuid": "^14.0.2",
"form-data": "^4.0.6",
"vite": "^8.0.16",
"protobufjs": "^7.6.5",
@@ -484,10 +487,6 @@
},
"socket.io-parser": "^4.2.7",
"tar": "^7.5.21",
"brace-expansion": "^5.0.9",
"minimatch": {
"brace-expansion": "^1.1.18"
},
"libxmljs2": {
"minimatch": {
"brace-expansion": "^2.1.4"
@@ -512,7 +511,7 @@
},
"nanoid": "^3.3.17",
"monaco-editor": {
"dompurify": "^3.4.13"
"dompurify": "^3.4.14"
}
}
}