From 751ff77b7c4fc1728b444705dc94405f37907527 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Thu, 5 Mar 2026 08:05:58 -0300 Subject: [PATCH] fix: extract validation helpers to fix webpack barrel-file resolution bug Extracted validateBody, isValidationFailure, and loginSchema from the 935-line schemas.ts barrel file into a dedicated helpers.ts module. Updated 70 API route files to import directly from helpers.ts. Root cause: webpack on certain environments fails to resolve exports from the bottom of large barrel files (schemas.ts), causing '(0, O.Jb) is not a function' errors in production builds. Fix: Split validation helpers into a small dedicated module (helpers.ts) so webpack can correctly resolve all exports regardless of file size. - TypeScript compiles with 0 errors - All API routes updated to import from helpers.ts - schemas.ts re-exports from helpers.ts for backward compatibility --- src/app/api/auth/login/route.ts | 2 +- .../cli-tools/antigravity-mitm/alias/route.ts | 7 +-- .../api/cli-tools/antigravity-mitm/route.ts | 8 +-- src/app/api/cli-tools/backups/route.ts | 7 +-- .../api/cli-tools/claude-settings/route.ts | 7 +-- src/app/api/cli-tools/cline-settings/route.ts | 7 +-- src/app/api/cli-tools/codex-profiles/route.ts | 8 +-- src/app/api/cli-tools/codex-settings/route.ts | 7 +-- src/app/api/cli-tools/droid-settings/route.ts | 7 +-- .../guide-settings/[toolId]/route.ts | 7 +-- src/app/api/cli-tools/kilo-settings/route.ts | 7 +-- .../api/cli-tools/openclaw-settings/route.ts | 7 +-- src/app/api/cloud/credentials/update/route.ts | 3 +- src/app/api/cloud/model/resolve/route.ts | 3 +- src/app/api/cloud/models/alias/route.ts | 3 +- src/app/api/combos/[id]/route.ts | 3 +- src/app/api/combos/route.ts | 3 +- src/app/api/combos/test/route.ts | 3 +- src/app/api/db-backups/route.ts | 7 +-- src/app/api/evals/route.ts | 3 +- src/app/api/fallback/chains/route.ts | 8 +-- src/app/api/keys/[id]/route.ts | 7 +-- src/app/api/keys/route.ts | 3 +- src/app/api/models/alias/route.ts | 7 +-- src/app/api/models/availability/route.ts | 7 +-- src/app/api/models/route.ts | 7 +-- .../api/oauth/[provider]/[action]/route.ts | 3 +- src/app/api/oauth/cursor/import/route.ts | 3 +- src/app/api/oauth/kiro/import/route.ts | 3 +- .../api/oauth/kiro/social-exchange/route.ts | 7 +-- src/app/api/policies/route.ts | 3 +- src/app/api/pricing/route.ts | 7 +-- src/app/api/provider-models/route.ts | 7 +-- src/app/api/provider-nodes/[id]/route.ts | 7 +-- src/app/api/provider-nodes/route.ts | 7 +-- src/app/api/provider-nodes/validate/route.ts | 7 +-- src/app/api/providers/[id]/route.ts | 7 +-- src/app/api/providers/route.ts | 7 +-- src/app/api/providers/test-batch/route.ts | 7 +-- src/app/api/providers/validate/route.ts | 7 +-- src/app/api/rate-limits/route.ts | 7 +-- src/app/api/resilience/route.ts | 7 +-- .../settings/background-degradation/route.ts | 8 +-- src/app/api/settings/combo-defaults/route.ts | 7 +-- src/app/api/settings/ip-filter/route.ts | 7 +-- src/app/api/settings/model-aliases/route.ts | 3 +- src/app/api/settings/proxy/route.ts | 7 +-- src/app/api/settings/proxy/test/route.ts | 3 +- src/app/api/settings/require-login/route.ts | 7 +-- src/app/api/settings/route.ts | 7 +-- src/app/api/settings/system-prompt/route.ts | 7 +-- src/app/api/settings/thinking-budget/route.ts | 7 +-- src/app/api/sync/cloud/route.ts | 3 +- src/app/api/translator/detect/route.ts | 7 +-- src/app/api/translator/save/route.ts | 7 +-- src/app/api/translator/send/route.ts | 7 +-- src/app/api/translator/translate/route.ts | 7 +-- src/app/api/usage/budget/route.ts | 3 +- src/app/api/v1/audio/speech/route.ts | 7 +-- src/app/api/v1/embeddings/route.ts | 3 +- src/app/api/v1/images/generations/route.ts | 7 +-- src/app/api/v1/messages/count_tokens/route.ts | 7 +-- src/app/api/v1/moderations/route.ts | 3 +- src/app/api/v1/music/generations/route.ts | 7 +-- .../[provider]/chat/completions/route.ts | 7 +-- .../providers/[provider]/embeddings/route.ts | 3 +- .../[provider]/images/generations/route.ts | 7 +-- src/app/api/v1/rerank/route.ts | 3 +- src/app/api/v1/videos/generations/route.ts | 7 +-- src/app/api/v1beta/models/[...path]/route.ts | 7 +-- src/shared/validation/helpers.ts | 60 +++++++++++++++++++ src/shared/validation/schemas.ts | 58 ++---------------- 72 files changed, 201 insertions(+), 326 deletions(-) create mode 100644 src/shared/validation/helpers.ts diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index f8976e6613..690cf566f7 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -3,7 +3,7 @@ import { getSettings } from "@/lib/localDb"; import bcrypt from "bcryptjs"; import { SignJWT } from "jose"; import { cookies } from "next/headers"; -import { isValidationFailure, loginSchema, validateBody } from "@/shared/validation/schemas"; +import { loginSchema, isValidationFailure, validateBody } from "@/shared/validation/helpers"; // SECURITY: No hardcoded fallback — JWT_SECRET must be configured. if (!process.env.JWT_SECRET) { diff --git a/src/app/api/cli-tools/antigravity-mitm/alias/route.ts b/src/app/api/cli-tools/antigravity-mitm/alias/route.ts index 0b35a4b9d1..67e6babefd 100644 --- a/src/app/api/cli-tools/antigravity-mitm/alias/route.ts +++ b/src/app/api/cli-tools/antigravity-mitm/alias/route.ts @@ -2,11 +2,8 @@ import { NextResponse } from "next/server"; import { getMitmAlias, setMitmAliasAll } from "@/models"; -import { - cliMitmAliasUpdateSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliMitmAliasUpdateSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET - Get MITM aliases for a tool export async function GET(request) { diff --git a/src/app/api/cli-tools/antigravity-mitm/route.ts b/src/app/api/cli-tools/antigravity-mitm/route.ts index 2ae3a8db9f..3b7263b96b 100644 --- a/src/app/api/cli-tools/antigravity-mitm/route.ts +++ b/src/app/api/cli-tools/antigravity-mitm/route.ts @@ -8,12 +8,8 @@ import { getCachedPassword, setCachedPassword, } from "@/mitm/manager"; -import { - cliMitmStartSchema, - cliMitmStopSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliMitmStartSchema, cliMitmStopSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET - Check MITM status export async function GET() { diff --git a/src/app/api/cli-tools/backups/route.ts b/src/app/api/cli-tools/backups/route.ts index 98ad1ab21d..968297faed 100644 --- a/src/app/api/cli-tools/backups/route.ts +++ b/src/app/api/cli-tools/backups/route.ts @@ -3,11 +3,8 @@ import { NextResponse } from "next/server"; import { listBackups, restoreBackup, deleteBackup } from "@/shared/services/backupService"; import { ensureCliConfigWriteAllowed } from "@/shared/services/cliRuntime"; -import { - cliBackupMutationSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliBackupMutationSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const VALID_TOOLS = ["claude", "codex", "droid", "openclaw", "cline", "kilo"]; diff --git a/src/app/api/cli-tools/claude-settings/route.ts b/src/app/api/cli-tools/claude-settings/route.ts index f9f82d1d19..5490296cbf 100644 --- a/src/app/api/cli-tools/claude-settings/route.ts +++ b/src/app/api/cli-tools/claude-settings/route.ts @@ -10,11 +10,8 @@ import { } from "@/shared/services/cliRuntime"; import { createBackup } from "@/shared/services/backupService"; import { saveCliToolLastConfigured, deleteCliToolLastConfigured } from "@/lib/db/cliToolState"; -import { - cliSettingsEnvSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliSettingsEnvSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // Get claude settings path based on OS const getClaudeSettingsPath = () => getCliPrimaryConfigPath("claude"); diff --git a/src/app/api/cli-tools/cline-settings/route.ts b/src/app/api/cli-tools/cline-settings/route.ts index 3848de9f39..8796065ea5 100644 --- a/src/app/api/cli-tools/cline-settings/route.ts +++ b/src/app/api/cli-tools/cline-settings/route.ts @@ -7,11 +7,8 @@ import os from "os"; import { ensureCliConfigWriteAllowed, getCliRuntimeStatus } from "@/shared/services/cliRuntime"; import { createBackup } from "@/shared/services/backupService"; import { saveCliToolLastConfigured, deleteCliToolLastConfigured } from "@/lib/db/cliToolState"; -import { - cliModelConfigSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliModelConfigSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const CLINE_DATA_DIR = path.join(os.homedir(), ".cline", "data"); const GLOBAL_STATE_PATH = path.join(CLINE_DATA_DIR, "globalState.json"); diff --git a/src/app/api/cli-tools/codex-profiles/route.ts b/src/app/api/cli-tools/codex-profiles/route.ts index 29efa2c599..18192217f3 100644 --- a/src/app/api/cli-tools/codex-profiles/route.ts +++ b/src/app/api/cli-tools/codex-profiles/route.ts @@ -5,12 +5,8 @@ import fs from "fs/promises"; import path from "path"; import { ensureCliConfigWriteAllowed, getCliConfigPaths } from "@/shared/services/cliRuntime"; import { resolveDataDir } from "@/lib/dataPaths"; -import { - codexProfileIdSchema, - codexProfileNameSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { codexProfileIdSchema, codexProfileNameSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const PROFILES_DIR = path.join(resolveDataDir(), "codex-profiles"); diff --git a/src/app/api/cli-tools/codex-settings/route.ts b/src/app/api/cli-tools/codex-settings/route.ts index 9158c0895f..1d852de62e 100644 --- a/src/app/api/cli-tools/codex-settings/route.ts +++ b/src/app/api/cli-tools/codex-settings/route.ts @@ -10,11 +10,8 @@ import { } from "@/shared/services/cliRuntime"; import { createMultiBackup } from "@/shared/services/backupService"; import { saveCliToolLastConfigured, deleteCliToolLastConfigured } from "@/lib/db/cliToolState"; -import { - cliModelConfigSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliModelConfigSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const getCodexConfigPath = () => getCliConfigPaths("codex").config; const getCodexAuthPath = () => getCliConfigPaths("codex").auth; diff --git a/src/app/api/cli-tools/droid-settings/route.ts b/src/app/api/cli-tools/droid-settings/route.ts index 25e0ae5aee..8bbec50c17 100644 --- a/src/app/api/cli-tools/droid-settings/route.ts +++ b/src/app/api/cli-tools/droid-settings/route.ts @@ -10,11 +10,8 @@ import { } from "@/shared/services/cliRuntime"; import { createBackup } from "@/shared/services/backupService"; import { saveCliToolLastConfigured, deleteCliToolLastConfigured } from "@/lib/db/cliToolState"; -import { - cliModelConfigSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliModelConfigSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const getDroidSettingsPath = () => getCliPrimaryConfigPath("droid"); const getDroidDir = () => path.dirname(getDroidSettingsPath()); diff --git a/src/app/api/cli-tools/guide-settings/[toolId]/route.ts b/src/app/api/cli-tools/guide-settings/[toolId]/route.ts index 2c5e93aa2b..9927a960eb 100644 --- a/src/app/api/cli-tools/guide-settings/[toolId]/route.ts +++ b/src/app/api/cli-tools/guide-settings/[toolId]/route.ts @@ -3,11 +3,8 @@ import fs from "fs/promises"; import path from "path"; import os from "os"; import { getRuntimePorts } from "@/lib/runtime/ports"; -import { - guideSettingsSaveSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { guideSettingsSaveSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * POST /api/cli-tools/guide-settings/:toolId diff --git a/src/app/api/cli-tools/kilo-settings/route.ts b/src/app/api/cli-tools/kilo-settings/route.ts index 5d829069fe..983b96a75f 100644 --- a/src/app/api/cli-tools/kilo-settings/route.ts +++ b/src/app/api/cli-tools/kilo-settings/route.ts @@ -7,11 +7,8 @@ import os from "os"; import { ensureCliConfigWriteAllowed, getCliRuntimeStatus } from "@/shared/services/cliRuntime"; import { createBackup } from "@/shared/services/backupService"; import { saveCliToolLastConfigured, deleteCliToolLastConfigured } from "@/lib/db/cliToolState"; -import { - cliModelConfigSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliModelConfigSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const KILO_DATA_DIR = path.join(os.homedir(), ".local", "share", "kilo"); const AUTH_PATH = path.join(KILO_DATA_DIR, "auth.json"); diff --git a/src/app/api/cli-tools/openclaw-settings/route.ts b/src/app/api/cli-tools/openclaw-settings/route.ts index 3009d9d31f..510e7fd21f 100644 --- a/src/app/api/cli-tools/openclaw-settings/route.ts +++ b/src/app/api/cli-tools/openclaw-settings/route.ts @@ -10,11 +10,8 @@ import { } from "@/shared/services/cliRuntime"; import { createBackup } from "@/shared/services/backupService"; import { saveCliToolLastConfigured, deleteCliToolLastConfigured } from "@/lib/db/cliToolState"; -import { - cliModelConfigSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cliModelConfigSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const getOpenClawSettingsPath = () => getCliPrimaryConfigPath("openclaw"); const getOpenClawDir = () => path.dirname(getOpenClawSettingsPath()); diff --git a/src/app/api/cloud/credentials/update/route.ts b/src/app/api/cloud/credentials/update/route.ts index 689c2550ab..25b492e082 100644 --- a/src/app/api/cloud/credentials/update/route.ts +++ b/src/app/api/cloud/credentials/update/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { validateApiKey, getProviderConnections, updateProviderConnection } from "@/models"; -import { cloudCredentialUpdateSchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { cloudCredentialUpdateSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // Update provider credentials (for cloud token refresh) export async function PUT(request: Request) { diff --git a/src/app/api/cloud/model/resolve/route.ts b/src/app/api/cloud/model/resolve/route.ts index e1bfe12da5..908abdc3c0 100644 --- a/src/app/api/cloud/model/resolve/route.ts +++ b/src/app/api/cloud/model/resolve/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { validateApiKey, getModelAliases } from "@/models"; -import { cloudResolveAliasSchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { cloudResolveAliasSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // Resolve model alias to provider/model export async function POST(request: Request) { diff --git a/src/app/api/cloud/models/alias/route.ts b/src/app/api/cloud/models/alias/route.ts index 44dd544198..cbc7a2923f 100644 --- a/src/app/api/cloud/models/alias/route.ts +++ b/src/app/api/cloud/models/alias/route.ts @@ -2,7 +2,8 @@ import { NextResponse } from "next/server"; import { validateApiKey, getModelAliases, setModelAlias, isCloudEnabled } from "@/models"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { cloudModelAliasUpdateSchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { cloudModelAliasUpdateSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // PUT /api/cloud/models/alias - Set model alias (for cloud/CLI) export async function PUT(request: Request) { diff --git a/src/app/api/combos/[id]/route.ts b/src/app/api/combos/[id]/route.ts index 9cd8bff87c..09a25946b6 100644 --- a/src/app/api/combos/[id]/route.ts +++ b/src/app/api/combos/[id]/route.ts @@ -10,7 +10,8 @@ import { import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; import { validateComboDAG } from "@omniroute/open-sse/services/combo.ts"; -import { isValidationFailure, updateComboSchema, validateBody } from "@/shared/validation/schemas"; +import { updateComboSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/combos/[id] - Get combo by ID export async function GET(request, { params }) { diff --git a/src/app/api/combos/route.ts b/src/app/api/combos/route.ts index 58a0257031..4429dc4d28 100644 --- a/src/app/api/combos/route.ts +++ b/src/app/api/combos/route.ts @@ -3,7 +3,8 @@ import { getCombos, createCombo, getComboByName, isCloudEnabled } from "@/lib/lo import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; import { validateComboDAG } from "@omniroute/open-sse/services/combo.ts"; -import { createComboSchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { createComboSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/combos - Get all combos export async function GET() { diff --git a/src/app/api/combos/test/route.ts b/src/app/api/combos/test/route.ts index eadd73d7a1..a21aaad98e 100644 --- a/src/app/api/combos/test/route.ts +++ b/src/app/api/combos/test/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { getComboByName } from "@/lib/localDb"; -import { isValidationFailure, testComboSchema, validateBody } from "@/shared/validation/schemas"; +import { testComboSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * POST /api/combos/test - Quick test a combo diff --git a/src/app/api/db-backups/route.ts b/src/app/api/db-backups/route.ts index 6d25246b97..c816d4b8db 100644 --- a/src/app/api/db-backups/route.ts +++ b/src/app/api/db-backups/route.ts @@ -1,10 +1,7 @@ import { NextResponse } from "next/server"; import { listDbBackups, restoreDbBackup, backupDbFile } from "@/lib/localDb"; -import { - dbBackupRestoreSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { dbBackupRestoreSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * PUT /api/db-backups — Trigger a manual backup snapshot. diff --git a/src/app/api/evals/route.ts b/src/app/api/evals/route.ts index bc62637e19..dc2dba0f92 100644 --- a/src/app/api/evals/route.ts +++ b/src/app/api/evals/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { listSuites, runSuite } from "@/lib/evals/evalRunner"; -import { evalRunSuiteSchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { evalRunSuiteSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/fallback/chains/route.ts b/src/app/api/fallback/chains/route.ts index 97cdecec25..bbb7bd4a67 100644 --- a/src/app/api/fallback/chains/route.ts +++ b/src/app/api/fallback/chains/route.ts @@ -1,11 +1,7 @@ import { NextResponse } from "next/server"; import { getAllFallbackChains, registerFallback, removeFallback } from "@/domain/fallbackPolicy"; -import { - isValidationFailure, - registerFallbackSchema, - removeFallbackSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { registerFallbackSchema, removeFallbackSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/keys/[id]/route.ts b/src/app/api/keys/[id]/route.ts index 5091192b36..6c8ed0907d 100644 --- a/src/app/api/keys/[id]/route.ts +++ b/src/app/api/keys/[id]/route.ts @@ -7,11 +7,8 @@ import { } from "@/lib/localDb"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { - isValidationFailure, - updateKeyPermissionsSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateKeyPermissionsSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/keys/[id] - Get single API key export async function GET(request, { params }) { diff --git a/src/app/api/keys/route.ts b/src/app/api/keys/route.ts index d5070a9d10..fc4393d2ac 100644 --- a/src/app/api/keys/route.ts +++ b/src/app/api/keys/route.ts @@ -2,7 +2,8 @@ import { NextResponse } from "next/server"; import { getApiKeys, createApiKey, isCloudEnabled } from "@/lib/localDb"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { createKeySchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { createKeySchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/keys - List API keys export async function GET() { diff --git a/src/app/api/models/alias/route.ts b/src/app/api/models/alias/route.ts index 5a2625336c..6c42b9dc67 100644 --- a/src/app/api/models/alias/route.ts +++ b/src/app/api/models/alias/route.ts @@ -3,11 +3,8 @@ import { getModelAliases, setModelAlias, deleteModelAlias, isCloudEnabled } from import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; import { isAuthenticated } from "@/shared/utils/apiAuth"; -import { - cloudModelAliasUpdateSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { cloudModelAliasUpdateSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/models/alias - Get all aliases export async function GET(request) { diff --git a/src/app/api/models/availability/route.ts b/src/app/api/models/availability/route.ts index 7acb463a31..9ef7418c54 100644 --- a/src/app/api/models/availability/route.ts +++ b/src/app/api/models/availability/route.ts @@ -4,11 +4,8 @@ import { clearModelUnavailability, getUnavailableCount, } from "@/domain/modelAvailability"; -import { - clearModelAvailabilitySchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { clearModelAvailabilitySchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/models/route.ts b/src/app/api/models/route.ts index ef972953c0..d0153ac65d 100644 --- a/src/app/api/models/route.ts +++ b/src/app/api/models/route.ts @@ -1,11 +1,8 @@ import { NextResponse } from "next/server"; import { getModelAliases, setModelAlias, getProviderConnections } from "@/models"; import { AI_MODELS } from "@/shared/constants/config"; -import { - isValidationFailure, - updateModelAliasSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateModelAliasSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/models - Get models with aliases (only from active providers by default) export async function GET(request: Request) { diff --git a/src/app/api/oauth/[provider]/[action]/route.ts b/src/app/api/oauth/[provider]/[action]/route.ts index 430f5bbc2c..f16aa66105 100644 --- a/src/app/api/oauth/[provider]/[action]/route.ts +++ b/src/app/api/oauth/[provider]/[action]/route.ts @@ -18,12 +18,11 @@ import { startLocalServer } from "@/lib/oauth/utils/server"; import { getProxyConfig } from "@/lib/localDb"; import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts"; import { - isValidationFailure, jsonObjectSchema, oauthExchangeSchema, oauthPollSchema, - validateBody, } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // Use globalThis to persist callback server state across Next.js HMR reloads if (!globalThis.__codexCallbackState) { diff --git a/src/app/api/oauth/cursor/import/route.ts b/src/app/api/oauth/cursor/import/route.ts index c7bfa3dd26..10bb55d12a 100644 --- a/src/app/api/oauth/cursor/import/route.ts +++ b/src/app/api/oauth/cursor/import/route.ts @@ -3,7 +3,8 @@ import { CursorService } from "@/lib/oauth/services/cursor"; import { createProviderConnection, isCloudEnabled } from "@/models"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { cursorImportSchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { cursorImportSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * POST /api/oauth/cursor/import diff --git a/src/app/api/oauth/kiro/import/route.ts b/src/app/api/oauth/kiro/import/route.ts index 771c6bbc19..69979afe11 100644 --- a/src/app/api/oauth/kiro/import/route.ts +++ b/src/app/api/oauth/kiro/import/route.ts @@ -3,7 +3,8 @@ import { KiroService } from "@/lib/oauth/services/kiro"; import { createProviderConnection, isCloudEnabled } from "@/models"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { isValidationFailure, kiroImportSchema, validateBody } from "@/shared/validation/schemas"; +import { kiroImportSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * POST /api/oauth/kiro/import diff --git a/src/app/api/oauth/kiro/social-exchange/route.ts b/src/app/api/oauth/kiro/social-exchange/route.ts index af9484a7da..dade4a67d6 100644 --- a/src/app/api/oauth/kiro/social-exchange/route.ts +++ b/src/app/api/oauth/kiro/social-exchange/route.ts @@ -3,11 +3,8 @@ import { KiroService } from "@/lib/oauth/services/kiro"; import { createProviderConnection, isCloudEnabled } from "@/models"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { - isValidationFailure, - kiroSocialExchangeSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { kiroSocialExchangeSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * POST /api/oauth/kiro/social-exchange diff --git a/src/app/api/policies/route.ts b/src/app/api/policies/route.ts index 1d90b1d097..dc74eb76f6 100644 --- a/src/app/api/policies/route.ts +++ b/src/app/api/policies/route.ts @@ -1,7 +1,8 @@ import { NextResponse } from "next/server"; import { getAllCircuitBreakerStatuses } from "@/shared/utils/circuitBreaker"; import { getLockedIdentifiers, forceUnlock } from "@/domain/lockoutPolicy"; -import { isValidationFailure, policyActionSchema, validateBody } from "@/shared/validation/schemas"; +import { policyActionSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/pricing/route.ts b/src/app/api/pricing/route.ts index 0c083d54b2..ebd1dd7bc5 100644 --- a/src/app/api/pricing/route.ts +++ b/src/app/api/pricing/route.ts @@ -1,10 +1,7 @@ import { NextResponse } from "next/server"; import { getPricing, updatePricing, resetPricing, resetAllPricing } from "@/lib/localDb"; -import { - isValidationFailure, - updatePricingSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updatePricingSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * GET /api/pricing diff --git a/src/app/api/provider-models/route.ts b/src/app/api/provider-models/route.ts index eed7d7bdbf..c7d23d9be9 100644 --- a/src/app/api/provider-models/route.ts +++ b/src/app/api/provider-models/route.ts @@ -5,11 +5,8 @@ import { removeCustomModel, } from "@/lib/localDb"; import { isAuthenticated } from "@/shared/utils/apiAuth"; -import { - isValidationFailure, - providerModelMutationSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { providerModelMutationSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * GET /api/provider-models?provider= diff --git a/src/app/api/provider-nodes/[id]/route.ts b/src/app/api/provider-nodes/[id]/route.ts index 768fe7e1c8..36b2d1105f 100644 --- a/src/app/api/provider-nodes/[id]/route.ts +++ b/src/app/api/provider-nodes/[id]/route.ts @@ -7,11 +7,8 @@ import { updateProviderConnection, updateProviderNode, } from "@/models"; -import { - isValidationFailure, - updateProviderNodeSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateProviderNodeSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; type JsonRecord = Record; diff --git a/src/app/api/provider-nodes/route.ts b/src/app/api/provider-nodes/route.ts index 2f616a2cc9..c0f0cacbdd 100644 --- a/src/app/api/provider-nodes/route.ts +++ b/src/app/api/provider-nodes/route.ts @@ -5,11 +5,8 @@ import { ANTHROPIC_COMPATIBLE_PREFIX, } from "@/shared/constants/providers"; import { generateId } from "@/shared/utils"; -import { - createProviderNodeSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { createProviderNodeSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const OPENAI_COMPATIBLE_DEFAULTS = { baseUrl: "https://api.openai.com/v1", diff --git a/src/app/api/provider-nodes/validate/route.ts b/src/app/api/provider-nodes/validate/route.ts index 48831c0a5e..8d0ac61225 100644 --- a/src/app/api/provider-nodes/validate/route.ts +++ b/src/app/api/provider-nodes/validate/route.ts @@ -1,9 +1,6 @@ import { NextResponse } from "next/server"; -import { - isValidationFailure, - providerNodeValidateSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { providerNodeValidateSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // POST /api/provider-nodes/validate - Validate API key against base URL export async function POST(request) { diff --git a/src/app/api/providers/[id]/route.ts b/src/app/api/providers/[id]/route.ts index 3b5cd35f71..56d82719b5 100644 --- a/src/app/api/providers/[id]/route.ts +++ b/src/app/api/providers/[id]/route.ts @@ -7,11 +7,8 @@ import { } from "@/models"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { - isValidationFailure, - updateProviderConnectionSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateProviderConnectionSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/providers/[id] - Get single connection export async function GET(request: Request, { params }: { params: Promise<{ id: string }> }) { diff --git a/src/app/api/providers/route.ts b/src/app/api/providers/route.ts index c4a256eb96..b3e620f7ee 100644 --- a/src/app/api/providers/route.ts +++ b/src/app/api/providers/route.ts @@ -12,11 +12,8 @@ import { } from "@/shared/constants/providers"; import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; -import { - createProviderSchema, - isValidationFailure, - validateBody, -} from "@/shared/validation/schemas"; +import { createProviderSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // GET /api/providers - List all connections export async function GET() { diff --git a/src/app/api/providers/test-batch/route.ts b/src/app/api/providers/test-batch/route.ts index b61a7aca4d..9140f3d5bd 100644 --- a/src/app/api/providers/test-batch/route.ts +++ b/src/app/api/providers/test-batch/route.ts @@ -8,11 +8,8 @@ import { ANTHROPIC_COMPATIBLE_PREFIX, } from "@/shared/constants/providers"; import { testSingleConnection } from "../[id]/test/route"; -import { - isValidationFailure, - providersBatchTestSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { providersBatchTestSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // Determine auth type group for a provider id function getAuthGroup(providerId) { diff --git a/src/app/api/providers/validate/route.ts b/src/app/api/providers/validate/route.ts index 7facec108b..d75a69af41 100644 --- a/src/app/api/providers/validate/route.ts +++ b/src/app/api/providers/validate/route.ts @@ -5,11 +5,8 @@ import { isAnthropicCompatibleProvider, } from "@/shared/constants/providers"; import { validateProviderApiKey } from "@/lib/providers/validation"; -import { - isValidationFailure, - validateBody, - validateProviderApiKeySchema, -} from "@/shared/validation/schemas"; +import { validateProviderApiKeySchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; // POST /api/providers/validate - Validate API key with provider export async function POST(request) { diff --git a/src/app/api/rate-limits/route.ts b/src/app/api/rate-limits/route.ts index f1c87d5aab..8a1b7a0156 100644 --- a/src/app/api/rate-limits/route.ts +++ b/src/app/api/rate-limits/route.ts @@ -8,11 +8,8 @@ import { getRateLimitStatus, getAllRateLimitStatus, } from "@omniroute/open-sse/services/rateLimitManager.ts"; -import { - isValidationFailure, - toggleRateLimitSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { toggleRateLimitSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; type JsonRecord = Record; diff --git a/src/app/api/resilience/route.ts b/src/app/api/resilience/route.ts index edc6906b7c..0e36fac80f 100644 --- a/src/app/api/resilience/route.ts +++ b/src/app/api/resilience/route.ts @@ -1,10 +1,7 @@ import { NextResponse } from "next/server"; import { getSettings, updateSettings } from "@/lib/localDb"; -import { - isValidationFailure, - updateResilienceSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateResilienceSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; type JsonRecord = Record; diff --git a/src/app/api/settings/background-degradation/route.ts b/src/app/api/settings/background-degradation/route.ts index 75a285d869..6fb7021c91 100644 --- a/src/app/api/settings/background-degradation/route.ts +++ b/src/app/api/settings/background-degradation/route.ts @@ -5,12 +5,8 @@ import { resetStats, } from "@omniroute/open-sse/services/backgroundTaskDetector.ts"; import { updateSettings } from "@/lib/db/settings"; -import { - isValidationFailure, - jsonObjectSchema, - resetStatsActionSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { jsonObjectSchema, resetStatsActionSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * GET /api/settings/background-degradation diff --git a/src/app/api/settings/combo-defaults/route.ts b/src/app/api/settings/combo-defaults/route.ts index a484dd3a34..bcfafa6a27 100644 --- a/src/app/api/settings/combo-defaults/route.ts +++ b/src/app/api/settings/combo-defaults/route.ts @@ -1,10 +1,7 @@ import { NextResponse } from "next/server"; import { getSettings, updateSettings } from "@/lib/localDb"; -import { - isValidationFailure, - updateComboDefaultsSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateComboDefaultsSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * GET /api/settings/combo-defaults diff --git a/src/app/api/settings/ip-filter/route.ts b/src/app/api/settings/ip-filter/route.ts index b7b4932077..b955a544bb 100644 --- a/src/app/api/settings/ip-filter/route.ts +++ b/src/app/api/settings/ip-filter/route.ts @@ -9,11 +9,8 @@ import { tempBanIP, removeTempBan, } from "@omniroute/open-sse/services/ipFilter.ts"; -import { - isValidationFailure, - updateIpFilterSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateIpFilterSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/settings/model-aliases/route.ts b/src/app/api/settings/model-aliases/route.ts index 010e5d3029..5530dbb924 100644 --- a/src/app/api/settings/model-aliases/route.ts +++ b/src/app/api/settings/model-aliases/route.ts @@ -10,11 +10,10 @@ import { import { getSettings, updateSettings } from "@/lib/db/settings"; import { addModelAliasSchema, - isValidationFailure, removeModelAliasSchema, updateModelAliasesSchema, - validateBody, } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * GET /api/settings/model-aliases diff --git a/src/app/api/settings/proxy/route.ts b/src/app/api/settings/proxy/route.ts index d9bd8792f8..8748cd41b2 100644 --- a/src/app/api/settings/proxy/route.ts +++ b/src/app/api/settings/proxy/route.ts @@ -6,11 +6,8 @@ import { resolveProxyForConnection, } from "../../../../lib/localDb"; import { clearDispatcherCache } from "@omniroute/open-sse/utils/proxyDispatcher"; -import { - isValidationFailure, - updateProxyConfigSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateProxyConfigSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; import type { z } from "zod"; const BASE_SUPPORTED_PROXY_TYPES = new Set(["http", "https"]); diff --git a/src/app/api/settings/proxy/test/route.ts b/src/app/api/settings/proxy/test/route.ts index 786e8989d1..727573f9c0 100644 --- a/src/app/api/settings/proxy/test/route.ts +++ b/src/app/api/settings/proxy/test/route.ts @@ -5,7 +5,8 @@ import { proxyConfigToUrl, proxyUrlForLogs, } from "@omniroute/open-sse/utils/proxyDispatcher.ts"; -import { isValidationFailure, testProxySchema, validateBody } from "@/shared/validation/schemas"; +import { testProxySchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; const BASE_SUPPORTED_PROXY_TYPES = new Set(["http", "https"]); diff --git a/src/app/api/settings/require-login/route.ts b/src/app/api/settings/require-login/route.ts index 6b23e9c129..29dfa6b128 100644 --- a/src/app/api/settings/require-login/route.ts +++ b/src/app/api/settings/require-login/route.ts @@ -1,11 +1,8 @@ import { NextResponse } from "next/server"; import { getSettings, updateSettings } from "@/lib/localDb"; import bcrypt from "bcryptjs"; -import { - isValidationFailure, - updateRequireLoginSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateRequireLoginSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/settings/route.ts b/src/app/api/settings/route.ts index 29da7de1e1..1de8ff3105 100644 --- a/src/app/api/settings/route.ts +++ b/src/app/api/settings/route.ts @@ -3,11 +3,8 @@ import { getSettings, updateSettings } from "@/lib/localDb"; import { clearHealthCheckLogCache } from "@/lib/tokenHealthCheck"; import bcrypt from "bcryptjs"; import { getRuntimePorts } from "@/lib/runtime/ports"; -import { - isValidationFailure, - updateSettingsSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateSettingsSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/settings/system-prompt/route.ts b/src/app/api/settings/system-prompt/route.ts index 9fc16786c0..31860ee09c 100644 --- a/src/app/api/settings/system-prompt/route.ts +++ b/src/app/api/settings/system-prompt/route.ts @@ -4,11 +4,8 @@ import { getSystemPromptConfig, } from "@omniroute/open-sse/services/systemPrompt.ts"; import { updateSettings } from "@/lib/localDb"; -import { - isValidationFailure, - updateSystemPromptSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateSystemPromptSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/settings/thinking-budget/route.ts b/src/app/api/settings/thinking-budget/route.ts index 7b98f411fa..bbeee426b7 100644 --- a/src/app/api/settings/thinking-budget/route.ts +++ b/src/app/api/settings/thinking-budget/route.ts @@ -5,11 +5,8 @@ import { getThinkingBudgetConfig, ThinkingMode, } from "@omniroute/open-sse/services/thinkingBudget.ts"; -import { - isValidationFailure, - updateThinkingBudgetSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { updateThinkingBudgetSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET() { try { diff --git a/src/app/api/sync/cloud/route.ts b/src/app/api/sync/cloud/route.ts index 0faaa7d51d..857e8fb5e1 100644 --- a/src/app/api/sync/cloud/route.ts +++ b/src/app/api/sync/cloud/route.ts @@ -5,7 +5,8 @@ import { syncToCloud, fetchWithTimeout, CLOUD_URL } from "@/lib/cloudSync"; import fs from "fs/promises"; import path from "path"; import os from "os"; -import { cloudSyncActionSchema, isValidationFailure, validateBody } from "@/shared/validation/schemas"; +import { cloudSyncActionSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * GET /api/sync/cloud diff --git a/src/app/api/translator/detect/route.ts b/src/app/api/translator/detect/route.ts index b252dd339e..e7224e0e3b 100644 --- a/src/app/api/translator/detect/route.ts +++ b/src/app/api/translator/detect/route.ts @@ -1,10 +1,7 @@ import { NextResponse } from "next/server"; import { detectFormat } from "@omniroute/open-sse/services/provider.ts"; -import { - isValidationFailure, - translatorDetectSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { translatorDetectSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * POST /api/translator/detect diff --git a/src/app/api/translator/save/route.ts b/src/app/api/translator/save/route.ts index 52fec48eed..dd96df4603 100644 --- a/src/app/api/translator/save/route.ts +++ b/src/app/api/translator/save/route.ts @@ -1,11 +1,8 @@ import { NextResponse } from "next/server"; import fs from "fs"; import path from "path"; -import { - isValidationFailure, - translatorSaveSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { translatorSaveSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function POST(request) { let rawBody; diff --git a/src/app/api/translator/send/route.ts b/src/app/api/translator/send/route.ts index 4f38e762da..2e5c6ad1a6 100644 --- a/src/app/api/translator/send/route.ts +++ b/src/app/api/translator/send/route.ts @@ -8,11 +8,8 @@ import { import { getProviderConnections } from "@/lib/localDb"; import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; import { logTranslationEvent } from "@/lib/translatorEvents"; -import { - isValidationFailure, - translatorSendSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { translatorSendSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; function getProviderBaseUrl(providerSpecificData: unknown): string | undefined { if (!providerSpecificData || typeof providerSpecificData !== "object") return undefined; diff --git a/src/app/api/translator/translate/route.ts b/src/app/api/translator/translate/route.ts index 99d1283240..b824b261b5 100644 --- a/src/app/api/translator/translate/route.ts +++ b/src/app/api/translator/translate/route.ts @@ -8,11 +8,8 @@ import { import { translateRequest } from "@omniroute/open-sse/translator/index.ts"; import { FORMATS } from "@omniroute/open-sse/translator/formats.ts"; import { getProviderConnections } from "@/lib/localDb"; -import { - isValidationFailure, - translatorTranslateSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { translatorTranslateSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; type JsonRecord = Record; diff --git a/src/app/api/usage/budget/route.ts b/src/app/api/usage/budget/route.ts index e3b484eedf..12b2638a02 100644 --- a/src/app/api/usage/budget/route.ts +++ b/src/app/api/usage/budget/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { getCostSummary, setBudget, checkBudget } from "@/domain/costRules"; -import { isValidationFailure, setBudgetSchema, validateBody } from "@/shared/validation/schemas"; +import { setBudgetSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; export async function GET(request) { try { diff --git a/src/app/api/v1/audio/speech/route.ts b/src/app/api/v1/audio/speech/route.ts index 92f7cd38a2..4ade1612da 100644 --- a/src/app/api/v1/audio/speech/route.ts +++ b/src/app/api/v1/audio/speech/route.ts @@ -5,11 +5,8 @@ import { parseSpeechModel, getSpeechProvider } from "@omniroute/open-sse/config/ import { errorResponse } from "@omniroute/open-sse/utils/error.ts"; import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { - isValidationFailure, - v1AudioSpeechSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { v1AudioSpeechSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/embeddings/route.ts b/src/app/api/v1/embeddings/route.ts index 8ba758f8e3..9fb22eb90e 100644 --- a/src/app/api/v1/embeddings/route.ts +++ b/src/app/api/v1/embeddings/route.ts @@ -10,7 +10,8 @@ import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import * as log from "@/sse/utils/logger"; import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { isValidationFailure, v1EmbeddingsSchema, validateBody } from "@/shared/validation/schemas"; +import { v1EmbeddingsSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/images/generations/route.ts b/src/app/api/v1/images/generations/route.ts index 3c78848101..c9b0b65ee7 100644 --- a/src/app/api/v1/images/generations/route.ts +++ b/src/app/api/v1/images/generations/route.ts @@ -11,11 +11,8 @@ import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import * as log from "@/sse/utils/logger"; import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { - isValidationFailure, - v1ImageGenerationSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { v1ImageGenerationSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/messages/count_tokens/route.ts b/src/app/api/v1/messages/count_tokens/route.ts index 5c35c94dcf..55316f9ece 100644 --- a/src/app/api/v1/messages/count_tokens/route.ts +++ b/src/app/api/v1/messages/count_tokens/route.ts @@ -1,9 +1,6 @@ import { CORS_HEADERS } from "@/shared/utils/cors"; -import { - isValidationFailure, - v1CountTokensSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { v1CountTokensSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/moderations/route.ts b/src/app/api/v1/moderations/route.ts index 5299af8613..e3f5534592 100644 --- a/src/app/api/v1/moderations/route.ts +++ b/src/app/api/v1/moderations/route.ts @@ -5,7 +5,8 @@ import { parseModerationModel } from "@omniroute/open-sse/config/moderationRegis import { errorResponse } from "@omniroute/open-sse/utils/error.ts"; import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { isValidationFailure, v1ModerationSchema, validateBody } from "@/shared/validation/schemas"; +import { v1ModerationSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/music/generations/route.ts b/src/app/api/v1/music/generations/route.ts index a5cec68c50..1f5eb2367a 100644 --- a/src/app/api/v1/music/generations/route.ts +++ b/src/app/api/v1/music/generations/route.ts @@ -11,11 +11,8 @@ import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import * as log from "@/sse/utils/logger"; import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { - isValidationFailure, - v1ImageGenerationSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { v1ImageGenerationSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/providers/[provider]/chat/completions/route.ts b/src/app/api/v1/providers/[provider]/chat/completions/route.ts index f94a884247..c111e2e3e6 100644 --- a/src/app/api/v1/providers/[provider]/chat/completions/route.ts +++ b/src/app/api/v1/providers/[provider]/chat/completions/route.ts @@ -4,11 +4,8 @@ import { initTranslators } from "@omniroute/open-sse/translator/index.ts"; import { errorResponse } from "@omniroute/open-sse/utils/error.ts"; import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import { getRegistryEntry } from "@omniroute/open-sse/config/providerRegistry.ts"; -import { - isValidationFailure, - providerChatCompletionSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { providerChatCompletionSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; let initialized = false; diff --git a/src/app/api/v1/providers/[provider]/embeddings/route.ts b/src/app/api/v1/providers/[provider]/embeddings/route.ts index dea6fc2e81..1928303adb 100644 --- a/src/app/api/v1/providers/[provider]/embeddings/route.ts +++ b/src/app/api/v1/providers/[provider]/embeddings/route.ts @@ -6,7 +6,8 @@ import { getProviderCredentials, extractApiKey, isValidApiKey } from "@/sse/serv import { handleEmbedding } from "@omniroute/open-sse/handlers/embeddings.ts"; import * as log from "@/sse/utils/logger"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { isValidationFailure, v1EmbeddingsSchema, validateBody } from "@/shared/validation/schemas"; +import { v1EmbeddingsSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/providers/[provider]/images/generations/route.ts b/src/app/api/v1/providers/[provider]/images/generations/route.ts index 6f73046f02..ff6db542b1 100644 --- a/src/app/api/v1/providers/[provider]/images/generations/route.ts +++ b/src/app/api/v1/providers/[provider]/images/generations/route.ts @@ -7,11 +7,8 @@ import { getImageProvider } from "@omniroute/open-sse/config/imageRegistry.ts"; import * as log from "@/sse/utils/logger"; import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { - isValidationFailure, - v1ImageGenerationSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { v1ImageGenerationSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/rerank/route.ts b/src/app/api/v1/rerank/route.ts index 42bb9b3e04..a8371f135d 100644 --- a/src/app/api/v1/rerank/route.ts +++ b/src/app/api/v1/rerank/route.ts @@ -5,7 +5,8 @@ import { parseRerankModel } from "@omniroute/open-sse/config/rerankRegistry.ts"; import { errorResponse } from "@omniroute/open-sse/utils/error.ts"; import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { isValidationFailure, v1RerankSchema, validateBody } from "@/shared/validation/schemas"; +import { v1RerankSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1/videos/generations/route.ts b/src/app/api/v1/videos/generations/route.ts index 7c348f2d22..8184d3e874 100644 --- a/src/app/api/v1/videos/generations/route.ts +++ b/src/app/api/v1/videos/generations/route.ts @@ -11,11 +11,8 @@ import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import * as log from "@/sse/utils/logger"; import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; -import { - isValidationFailure, - v1ImageGenerationSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { v1ImageGenerationSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; /** * Handle CORS preflight diff --git a/src/app/api/v1beta/models/[...path]/route.ts b/src/app/api/v1beta/models/[...path]/route.ts index 7ba3ac50aa..9b60596e78 100644 --- a/src/app/api/v1beta/models/[...path]/route.ts +++ b/src/app/api/v1beta/models/[...path]/route.ts @@ -1,11 +1,8 @@ import { CORS_ORIGIN } from "@/shared/utils/cors"; import { handleChat } from "@/sse/handlers/chat"; import { initTranslators } from "@omniroute/open-sse/translator/index.ts"; -import { - isValidationFailure, - v1betaGeminiGenerateSchema, - validateBody, -} from "@/shared/validation/schemas"; +import { v1betaGeminiGenerateSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; let initialized = false; diff --git a/src/shared/validation/helpers.ts b/src/shared/validation/helpers.ts new file mode 100644 index 0000000000..486b5de8f6 --- /dev/null +++ b/src/shared/validation/helpers.ts @@ -0,0 +1,60 @@ +import { z } from "zod"; + +export const loginSchema = z.object({ + password: z.string().min(1, "Password is required").max(200), +}); + +type ValidationErrorDetail = { + field: string; + message: string; +}; + +type ValidationErrorPayload = { + message: string; + details: ValidationErrorDetail[]; +}; + +type ValidationSuccess = { + success: true; + data: TData; +}; + +type ValidationFailure = { + success: false; + error: ValidationErrorPayload; +}; + +export type ValidationResult = ValidationSuccess | ValidationFailure; + +// ──── Helper ──── + +/** + * Parse and validate request body with a Zod schema. + * Returns { success: true, data } or { success: false, error }. + */ +export function validateBody( + schema: TSchema, + body: unknown +): ValidationResult> { + const result = schema.safeParse(body); + if (result.success) { + return { success: true, data: result.data }; + } + const issues = Array.isArray(result.error?.issues) ? result.error.issues : []; + return { + success: false, + error: { + message: "Invalid request", + details: issues.map((e) => ({ + field: e.path.join("."), + message: e.message, + })), + }, + }; +} + +export function isValidationFailure( + validation: ValidationResult +): validation is ValidationFailure { + return validation.success === false; +} diff --git a/src/shared/validation/schemas.ts b/src/shared/validation/schemas.ts index be208f4a0e..c8a0bf18d8 100644 --- a/src/shared/validation/schemas.ts +++ b/src/shared/validation/schemas.ts @@ -1,26 +1,9 @@ import { z } from "zod"; -type ValidationErrorDetail = { - field: string; - message: string; -}; - -type ValidationErrorPayload = { - message: string; - details: ValidationErrorDetail[]; -}; - -type ValidationSuccess = { - success: true; - data: TData; -}; - -type ValidationFailure = { - success: false; - error: ValidationErrorPayload; -}; - -export type ValidationResult = ValidationSuccess | ValidationFailure; +// Re-export validation helpers from dedicated module to avoid webpack barrel-file +// optimization bug that truncates exports from large files. +export { validateBody, isValidationFailure } from "./helpers"; +export type { ValidationResult } from "./helpers"; // ──── Provider Schemas ──── @@ -899,36 +882,3 @@ export const guideSettingsSaveSchema = z.object({ apiKey: z.string().optional(), model: z.string().trim().min(1, "Model is required"), }); - -// ──── Helper ──── - -/** - * Parse and validate request body with a Zod schema. - * Returns { success: true, data } or { success: false, error }. - */ -export function validateBody( - schema: TSchema, - body: unknown -): ValidationResult> { - const result = schema.safeParse(body); - if (result.success) { - return { success: true, data: result.data }; - } - const issues = Array.isArray(result.error?.issues) ? result.error.issues : []; - return { - success: false, - error: { - message: "Invalid request", - details: issues.map((e) => ({ - field: e.path.join("."), - message: e.message, - })), - }, - }; -} - -export function isValidationFailure( - validation: ValidationResult -): validation is ValidationFailure { - return validation.success === false; -}