diff --git a/.changeset/pink-lemons-buy.md b/.changeset/pink-lemons-buy.md new file mode 100644 index 000000000..d297779d7 --- /dev/null +++ b/.changeset/pink-lemons-buy.md @@ -0,0 +1,6 @@ +--- +"@lingo.dev/_compiler": minor +"lingo.dev": minor +--- + +Upgrade Compiler and CLI to AI SDK v5. diff --git a/packages/cli/package.json b/packages/cli/package.json index b387a7c13..04e515c6f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -122,10 +122,10 @@ "author": "", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "^1.2.11", - "@ai-sdk/google": "^1.2.19", - "@ai-sdk/mistral": "^1.2.8", - "@ai-sdk/openai": "^1.3.22", + "@ai-sdk/anthropic": "^2.0.42", + "@ai-sdk/google": "^2.0.29", + "@ai-sdk/mistral": "^2.0.23", + "@ai-sdk/openai": "^2.0.64", "@babel/generator": "^7.27.1", "@babel/parser": "^7.27.1", "@babel/traverse": "^7.27.4", @@ -143,10 +143,10 @@ "@lingo.dev/_spec": "workspace:*", "@markdoc/markdoc": "^0.5.4", "@modelcontextprotocol/sdk": "^1.5.0", - "@openrouter/ai-sdk-provider": "^0.7.1", + "@openrouter/ai-sdk-provider": "^1.2.1", "@paralleldrive/cuid2": "^2.2.2", "@types/ejs": "^3.1.5", - "ai": "^4.3.15", + "ai": "^5.0.89", "bitbucket": "^2.12.0", "chalk": "^5.4.1", "chokidar": "^4.0.3", @@ -189,7 +189,7 @@ "node-webvtt": "^1.9.4", "object-hash": "^3.0.0", "octokit": "^4.0.2", - "ollama-ai-provider": "^1.2.0", + "ollama-ai-provider-v2": "^1.5.3", "open": "^10.2.0", "ora": "^8.1.1", "p-limit": "^6.2.0", @@ -216,7 +216,7 @@ "xml2js": "^0.6.2", "xpath": "^0.0.34", "yaml": "^2.7.0", - "zod": "^3.25.76" + "zod": "^4.1.12" }, "devDependencies": { "@types/babel__generator": "^7.27.0", diff --git a/packages/cli/src/cli/cmd/i18n.ts b/packages/cli/src/cli/cmd/i18n.ts index 3a47fd5a1..728c413d0 100644 --- a/packages/cli/src/cli/cmd/i18n.ts +++ b/packages/cli/src/cli/cmd/i18n.ts @@ -637,8 +637,8 @@ function parseFlags(options: any) { strict: Z.boolean().optional(), key: Z.string().optional(), file: Z.array(Z.string()).optional(), - interactive: Z.boolean().default(false), - debug: Z.boolean().default(false), + interactive: Z.boolean().prefault(false), + debug: Z.boolean().prefault(false), }).parse(options); } diff --git a/packages/cli/src/cli/cmd/lockfile.ts b/packages/cli/src/cli/cmd/lockfile.ts index 75178b813..23fcf1bc5 100644 --- a/packages/cli/src/cli/cmd/lockfile.ts +++ b/packages/cli/src/cli/cmd/lockfile.ts @@ -61,5 +61,5 @@ export default new Command() }); const flagsSchema = Z.object({ - force: Z.boolean().default(false), + force: Z.boolean().prefault(false), }); diff --git a/packages/cli/src/cli/cmd/mcp.ts b/packages/cli/src/cli/cmd/mcp.ts index 9ecf046e7..f7d216983 100644 --- a/packages/cli/src/cli/cmd/mcp.ts +++ b/packages/cli/src/cli/cmd/mcp.ts @@ -48,8 +48,8 @@ export default new Command() "translate", "Detect language and translate text with Lingo.dev.", { - text: Z.string(), - targetLocale: Z.string().regex(/^[a-z]{2}(-[A-Z]{2})?$/), + text: Z.string() as any, + targetLocale: Z.string().regex(/^[a-z]{2}(-[A-Z]{2})?$/) as any, }, async ({ text, targetLocale }) => { const sourceLocale = await replexicaEngine.recognizeLocale(text); diff --git a/packages/cli/src/cli/cmd/run/_types.ts b/packages/cli/src/cli/cmd/run/_types.ts index d5ea1316d..2bf8054c7 100644 --- a/packages/cli/src/cli/cmd/run/_types.ts +++ b/packages/cli/src/cli/cmd/run/_types.ts @@ -45,13 +45,13 @@ export const flagsSchema = z.object({ frozen: z.boolean().optional(), verbose: z.boolean().optional(), strict: z.boolean().optional(), - interactive: z.boolean().default(false), - concurrency: z.number().positive().default(10), - debug: z.boolean().default(false), + interactive: z.boolean().prefault(false), + concurrency: z.number().positive().prefault(10), + debug: z.boolean().prefault(false), sourceLocale: z.string().optional(), targetLocale: z.array(z.string()).optional(), - watch: z.boolean().default(false), - debounce: z.number().positive().default(5000), // 5 seconds default + watch: z.boolean().prefault(false), + debounce: z.number().positive().prefault(5000), // 5 seconds default sound: z.boolean().optional(), }); export type CmdRunFlags = z.infer; diff --git a/packages/cli/src/cli/localizer/explicit.ts b/packages/cli/src/cli/localizer/explicit.ts index c055f56e3..6fa6a98b3 100644 --- a/packages/cli/src/cli/localizer/explicit.ts +++ b/packages/cli/src/cli/localizer/explicit.ts @@ -7,10 +7,10 @@ import { I18nConfig } from "@lingo.dev/_spec"; import chalk from "chalk"; import dedent from "dedent"; import { ILocalizer, LocalizerData } from "./_types"; -import { LanguageModel, Message, generateText } from "ai"; +import { LanguageModel, ModelMessage, generateText } from "ai"; import { colors } from "../constants"; import { jsonrepair } from "jsonrepair"; -import { createOllama } from "ollama-ai-provider"; +import { createOllama } from "ollama-ai-provider-v2"; export default function createExplicitLocalizer( provider: NonNullable, @@ -207,7 +207,7 @@ function createAiSdkLocalizer(params: { [ { role: "user", content: JSON.stringify(userShot) }, { role: "assistant", content: JSON.stringify(assistantShot) }, - ] as Message[], + ] as ModelMessage[], ), { role: "user", content: JSON.stringify(payload) }, ], diff --git a/packages/cli/src/cli/processor/basic.ts b/packages/cli/src/cli/processor/basic.ts index c51f5c003..ed962adf6 100644 --- a/packages/cli/src/cli/processor/basic.ts +++ b/packages/cli/src/cli/processor/basic.ts @@ -1,4 +1,4 @@ -import { generateText, LanguageModelV1 } from "ai"; +import { generateText, LanguageModel } from "ai"; import { LocalizerInput, LocalizerProgressFn } from "./_base"; import _ from "lodash"; @@ -7,7 +7,7 @@ type ModelSettings = { }; export function createBasicTranslator( - model: LanguageModelV1, + model: LanguageModel, systemPrompt: string, settings: ModelSettings = {}, ) { diff --git a/packages/cli/src/cli/processor/index.ts b/packages/cli/src/cli/processor/index.ts index 3f898d04a..1a92fe2f0 100644 --- a/packages/cli/src/cli/processor/index.ts +++ b/packages/cli/src/cli/processor/index.ts @@ -10,7 +10,7 @@ import { createAnthropic } from "@ai-sdk/anthropic"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; import { createOpenRouter } from "@openrouter/ai-sdk-provider"; import { createMistral } from "@ai-sdk/mistral"; -import { createOllama } from "ollama-ai-provider"; +import { createOllama } from "ollama-ai-provider-v2"; export default function createProcessor( provider: I18nConfig["provider"], diff --git a/packages/cli/src/cli/utils/delta.ts b/packages/cli/src/cli/utils/delta.ts index 4950a70b6..7104d7748 100644 --- a/packages/cli/src/cli/utils/delta.ts +++ b/packages/cli/src/cli/utils/delta.ts @@ -6,7 +6,7 @@ import * as path from "path"; import YAML from "yaml"; const LockSchema = z.object({ - version: z.literal(1).default(1), + version: z.literal(1).prefault(1), checksums: z .record( z.string(), // localizable files' keys @@ -18,9 +18,9 @@ const LockSchema = z.object({ // checksum of the key's value in the source locale z.string(), ) - .default({}), + .prefault({}), ) - .default({}), + .prefault({}), }); export type LockData = z.infer; diff --git a/packages/cli/src/cli/utils/exec.ts b/packages/cli/src/cli/utils/exec.ts index 4f2d98eb0..6c9028e09 100644 --- a/packages/cli/src/cli/utils/exec.ts +++ b/packages/cli/src/cli/utils/exec.ts @@ -65,20 +65,20 @@ export async function execWithRetry( // Helpers const ExecAsyncSchema = Z.object({ - delay: Z.number().nonnegative().default(1000), - concurrency: Z.number().positive().default(1), - onProgress: Z.function( - Z.tuple([ + delay: Z.number().nonnegative().prefault(1000), + concurrency: Z.number().positive().prefault(1), + onProgress: Z.function({ + input: Z.tuple([ Z.number().positive(), // completed count Z.number().positive(), // total count ]), - Z.void(), - ).optional(), + output: Z.void(), + }).optional(), }); const ExecWithRetrySchema = Z.object({ - delay: Z.number().nonnegative().default(0), - attempts: Z.number().positive().default(3), + delay: Z.number().nonnegative().prefault(0), + attempts: Z.number().positive().prefault(3), }); function delay(ms: number) { diff --git a/packages/cli/src/cli/utils/lockfile.ts b/packages/cli/src/cli/utils/lockfile.ts index f1e7dee6e..a78c5bc21 100644 --- a/packages/cli/src/cli/utils/lockfile.ts +++ b/packages/cli/src/cli/utils/lockfile.ts @@ -84,13 +84,13 @@ export function createLockfileHelper() { } const LockfileSchema = Z.object({ - version: Z.literal(1).default(1), + version: Z.literal(1).prefault(1), checksums: Z.record( Z.string(), // localizable files' keys Z.record( // checksums hashmap Z.string(), // key Z.string(), // checksum of the key's value in the source locale - ).default({}), - ).default({}), + ).prefault({}), + ).prefault({}), }); diff --git a/packages/cli/src/cli/utils/settings.ts b/packages/cli/src/cli/utils/settings.ts index 8d3db2928..64257aa2e 100644 --- a/packages/cli/src/cli/utils/settings.ts +++ b/packages/cli/src/cli/utils/settings.ts @@ -96,7 +96,7 @@ function _loadDefaults(): CliSettings { } function _loadEnv() { - return Z.object({ + return Z.looseObject({ LINGODOTDEV_API_KEY: Z.string().optional(), LINGODOTDEV_API_URL: Z.string().optional(), LINGODOTDEV_WEB_URL: Z.string().optional(), @@ -106,9 +106,7 @@ function _loadEnv() { GOOGLE_API_KEY: Z.string().optional(), OPENROUTER_API_KEY: Z.string().optional(), MISTRAL_API_KEY: Z.string().optional(), - }) - .passthrough() - .parse(process.env); + }).parse(process.env); } function _loadSystemFile() { @@ -118,13 +116,13 @@ function _loadSystemFile() { : ""; const data = Ini.parse(content); - return Z.object({ - auth: Z.object({ + return Z.looseObject({ + auth: Z.looseObject({ apiKey: Z.string().optional(), apiUrl: Z.string().optional(), webUrl: Z.string().optional(), }).optional(), - llm: Z.object({ + llm: Z.looseObject({ openaiApiKey: Z.string().optional(), anthropicApiKey: Z.string().optional(), groqApiKey: Z.string().optional(), @@ -132,9 +130,7 @@ function _loadSystemFile() { openrouterApiKey: Z.string().optional(), mistralApiKey: Z.string().optional(), }).optional(), - }) - .passthrough() - .parse(data); + }).parse(data); } function _saveSystemFile(settings: CliSettings) { diff --git a/packages/compiler/package.json b/packages/compiler/package.json index 4c849a82b..820bb9a0f 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -45,30 +45,32 @@ "vitest": "^2.1.4" }, "dependencies": { - "@ai-sdk/anthropic": "^1.0.11", - "@ai-sdk/google": "^1.2.19", - "@ai-sdk/groq": "^1.2.3", - "@ai-sdk/mistral": "^1.2.8", - "@ai-sdk/openai": "^1.3.22", + "@ai-sdk/anthropic": "^2.0.45", + "@ai-sdk/google": "^2.0.29", + "@ai-sdk/groq": "^2.0.28", + "@ai-sdk/mistral": "^2.0.23", + "@ai-sdk/openai": "^2.0.68", "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/traverse": "^7.27.4", "@babel/types": "^7.26.7", "@lingo.dev/_sdk": "workspace:*", "@lingo.dev/_spec": "workspace:*", - "@openrouter/ai-sdk-provider": "^0.7.1", - "ai": "^4.2.10", + "@openrouter/ai-sdk-provider": "^1.2.1", + "@prettier/sync": "^0.6.1", + "ai": "^5.0.89", "dedent": "^1.6.0", "dotenv": "^16.4.5", "fast-xml-parser": "^5.0.8", "ini": "^5.0.0", "lodash": "^4.17.21", + "node-machine-id": "^1.1.12", "object-hash": "^3.0.0", - "ollama-ai-provider": "^1.2.0", - "unplugin": "^2.1.2", - "zod": "^3.25.76", + "ollama-ai-provider-v2": "^1.5.3", "posthog-node": "^5.5.1", - "node-machine-id": "^1.1.12" + "prettier": "^3.4.2", + "unplugin": "^2.1.2", + "zod": "^4.1.12" }, "packageManager": "pnpm@9.12.3" } diff --git a/packages/compiler/src/lib/lcp/api/index.ts b/packages/compiler/src/lib/lcp/api/index.ts index 6b7a1b8cf..635ceb98f 100644 --- a/packages/compiler/src/lib/lcp/api/index.ts +++ b/packages/compiler/src/lib/lcp/api/index.ts @@ -1,7 +1,7 @@ import { createGroq } from "@ai-sdk/groq"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; import { createOpenRouter } from "@openrouter/ai-sdk-provider"; -import { createOllama } from "ollama-ai-provider"; +import { createOllama } from "ollama-ai-provider-v2"; import { createMistral } from "@ai-sdk/mistral"; import { createOpenAI } from "@ai-sdk/openai"; import { createAnthropic } from "@ai-sdk/anthropic"; diff --git a/packages/compiler/src/lib/lcp/schema.ts b/packages/compiler/src/lib/lcp/schema.ts index 21a4fc1a4..874558a52 100644 --- a/packages/compiler/src/lib/lcp/schema.ts +++ b/packages/compiler/src/lib/lcp/schema.ts @@ -20,7 +20,7 @@ export const lcpFile = z.object({ export type LCPFile = z.infer; export const lcpSchema = z.object({ - version: z.number().default(0.1), + version: z.number().prefault(0.1), files: z.record(z.string(), lcpFile).optional(), }); @@ -35,7 +35,7 @@ export const dictionaryFile = z.object({ export type DictionaryFile = z.infer; export const dictionarySchema = z.object({ - version: z.number().default(0.1), + version: z.number().prefault(0.1), locale: z.string(), files: z.record(z.string(), dictionaryFile), }); @@ -55,7 +55,7 @@ export const dictionaryCacheFile = z.object({ }); export const dictionaryCacheSchema = z.object({ - version: z.number().default(0.1), + version: z.number().prefault(0.1), files: z.record(z.string(), dictionaryCacheFile), }); diff --git a/packages/sdk/package.json b/packages/sdk/package.json index decb91d4e..8330c7329 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -27,7 +27,7 @@ "@lingo.dev/_spec": "workspace:*", "@paralleldrive/cuid2": "^2.2.2", "jsdom": "^25.0.1", - "zod": "^3.25.76" + "zod": "^4.1.12" }, "devDependencies": { "@types/jsdom": "^21.1.7", diff --git a/packages/spec/package.json b/packages/spec/package.json index 059267215..c5c523c82 100644 --- a/packages/spec/package.json +++ b/packages/spec/package.json @@ -26,8 +26,7 @@ "license": "Apache-2.0", "dependencies": { "@lingo.dev/_locales": "workspace:*", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.5" + "zod": "^4.1.12" }, "devDependencies": { "@types/node": "^22.13.5", diff --git a/packages/spec/src/config.ts b/packages/spec/src/config.ts index 34ab0aaa8..91a5542bd 100644 --- a/packages/spec/src/config.ts +++ b/packages/spec/src/config.ts @@ -63,7 +63,7 @@ const extendConfigDefinition = < return safeResult.data; } - const localeErrors = safeResult.error.errors + const localeErrors = safeResult.error.issues .filter((issue) => issue.message.includes("Invalid locale code")) .map((issue) => { let unsupportedLocale = ""; @@ -142,7 +142,7 @@ export const configV1Definition = extendConfigDefinition(configV0Definition, { export const configV1_1Definition = extendConfigDefinition(configV1Definition, { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record( + buckets: Z.partialRecord( bucketTypeSchema, Z.object({ include: Z.array(Z.string()) @@ -151,7 +151,6 @@ export const configV1_1Definition = extendConfigDefinition(configV1Definition, { "File paths or glob patterns to include for this bucket.", ), exclude: Z.array(Z.string()) - .default([]) .optional() .describe( "File paths or glob patterns to exclude from this bucket.", @@ -235,7 +234,6 @@ export const bucketValueSchemaV1_3 = Z.object({ .default([]) .describe("Glob patterns or bucket items to include for this bucket."), exclude: Z.array(Z.union([Z.string(), bucketItemSchema])) - .default([]) .optional() .describe("Glob patterns or bucket items to exclude from this bucket."), injectLocale: Z.array(Z.string()) @@ -250,7 +248,10 @@ export const configV1_3Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_3).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_3, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, @@ -328,7 +329,6 @@ export const configV1_5Definition = extendConfigDefinition( // Changes: Add "lockedKeys" string array to bucket config export const bucketValueSchemaV1_6 = bucketValueSchemaV1_3.extend({ lockedKeys: Z.array(Z.string()) - .default([]) .optional() .describe( "Keys that must remain unchanged and should never be overwritten by translations.", @@ -340,7 +340,10 @@ export const configV1_6Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_6).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_6, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, @@ -356,7 +359,6 @@ export const configV1_6Definition = extendConfigDefinition( // Changes: Add "lockedPatterns" string array of regex patterns to bucket config export const bucketValueSchemaV1_7 = bucketValueSchemaV1_6.extend({ lockedPatterns: Z.array(Z.string()) - .default([]) .optional() .describe( "Regular expression patterns whose matched content should remain locked during translation.", @@ -368,7 +370,10 @@ export const configV1_7Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_7).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_7, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, @@ -385,7 +390,6 @@ export const configV1_7Definition = extendConfigDefinition( // Changes: Add "ignoredKeys" string array to bucket config export const bucketValueSchemaV1_8 = bucketValueSchemaV1_7.extend({ ignoredKeys: Z.array(Z.string()) - .default([]) .optional() .describe( "Keys that should be completely ignored by translation processes.", @@ -397,7 +401,10 @@ export const configV1_8Definition = extendConfigDefinition( { createSchema: (baseSchema) => baseSchema.extend({ - buckets: Z.record(bucketTypeSchema, bucketValueSchemaV1_8).default({}), + buckets: Z.partialRecord( + bucketTypeSchema, + bucketValueSchemaV1_8, + ).default({}), }), createDefaultValue: (baseDefaultValue) => ({ ...baseDefaultValue, diff --git a/packages/spec/src/json-schema.ts b/packages/spec/src/json-schema.ts index 805948f2b..f5c5e3923 100644 --- a/packages/spec/src/json-schema.ts +++ b/packages/spec/src/json-schema.ts @@ -1,11 +1,11 @@ import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; -import { zodToJsonSchema } from "zod-to-json-schema"; +import { toJSONSchema } from "zod"; import { LATEST_CONFIG_DEFINITION } from "./config"; export default function buildJsonSchema() { - const configSchema = zodToJsonSchema(LATEST_CONFIG_DEFINITION.schema); + const configSchema = toJSONSchema(LATEST_CONFIG_DEFINITION.schema); const currentDir = path.dirname(fileURLToPath(import.meta.url)); fs.writeFileSync( `${currentDir}/../build/i18n.schema.json`, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be077d9ff..f60dd22ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -336,17 +336,17 @@ importers: packages/cli: dependencies: '@ai-sdk/anthropic': - specifier: ^1.2.11 - version: 1.2.11(zod@3.25.76) + specifier: ^2.0.42 + version: 2.0.42(zod@4.1.12) '@ai-sdk/google': - specifier: ^1.2.19 - version: 1.2.19(zod@3.25.76) + specifier: ^2.0.29 + version: 2.0.29(zod@4.1.12) '@ai-sdk/mistral': - specifier: ^1.2.8 - version: 1.2.8(zod@3.25.76) + specifier: ^2.0.23 + version: 2.0.23(zod@4.1.12) '@ai-sdk/openai': - specifier: ^1.3.22 - version: 1.3.22(zod@3.25.76) + specifier: ^2.0.64 + version: 2.0.64(zod@4.1.12) '@babel/generator': specifier: ^7.27.1 version: 7.27.1 @@ -399,8 +399,8 @@ importers: specifier: ^1.5.0 version: 1.5.0 '@openrouter/ai-sdk-provider': - specifier: ^0.7.1 - version: 0.7.1(ai@4.3.15(react@18.3.1)(zod@3.25.76))(zod@3.25.76) + specifier: ^1.2.1 + version: 1.2.1(ai@5.0.89(zod@4.1.12))(zod@4.1.12) '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 @@ -408,8 +408,8 @@ importers: specifier: ^3.1.5 version: 3.1.5 ai: - specifier: ^4.3.15 - version: 4.3.15(react@18.3.1)(zod@3.25.76) + specifier: ^5.0.89 + version: 5.0.89(zod@4.1.12) bitbucket: specifier: ^2.12.0 version: 2.12.0(encoding@0.1.13) @@ -536,9 +536,9 @@ importers: octokit: specifier: ^4.0.2 version: 4.1.2 - ollama-ai-provider: - specifier: ^1.2.0 - version: 1.2.0(zod@3.25.76) + ollama-ai-provider-v2: + specifier: ^1.5.3 + version: 1.5.3(zod@4.1.12) open: specifier: ^10.2.0 version: 10.2.0 @@ -618,8 +618,8 @@ importers: specifier: ^2.7.0 version: 2.7.0 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.1.12 + version: 4.1.12 devDependencies: '@types/babel__generator': specifier: ^7.27.0 @@ -694,20 +694,20 @@ importers: packages/compiler: dependencies: '@ai-sdk/anthropic': - specifier: ^1.0.11 - version: 1.2.11(zod@3.25.76) + specifier: ^2.0.45 + version: 2.0.45(zod@4.1.12) '@ai-sdk/google': - specifier: ^1.2.19 - version: 1.2.19(zod@3.25.76) + specifier: ^2.0.29 + version: 2.0.29(zod@4.1.12) '@ai-sdk/groq': - specifier: ^1.2.3 - version: 1.2.9(zod@3.25.76) + specifier: ^2.0.28 + version: 2.0.28(zod@4.1.12) '@ai-sdk/mistral': - specifier: ^1.2.8 - version: 1.2.8(zod@3.25.76) + specifier: ^2.0.23 + version: 2.0.23(zod@4.1.12) '@ai-sdk/openai': - specifier: ^1.3.22 - version: 1.3.22(zod@3.25.76) + specifier: ^2.0.68 + version: 2.0.68(zod@4.1.12) '@babel/generator': specifier: ^7.26.5 version: 7.27.1 @@ -727,11 +727,14 @@ importers: specifier: workspace:* version: link:../spec '@openrouter/ai-sdk-provider': - specifier: ^0.7.1 - version: 0.7.1(ai@4.3.15(react@19.1.0)(zod@3.25.76))(zod@3.25.76) + specifier: ^1.2.1 + version: 1.2.1(ai@5.0.89(zod@4.1.12))(zod@4.1.12) + '@prettier/sync': + specifier: ^0.6.1 + version: 0.6.1(prettier@3.6.2) ai: - specifier: ^4.2.10 - version: 4.3.15(react@19.1.0)(zod@3.25.76) + specifier: ^5.0.89 + version: 5.0.89(zod@4.1.12) dedent: specifier: ^1.6.0 version: 1.6.0 @@ -753,18 +756,21 @@ importers: object-hash: specifier: ^3.0.0 version: 3.0.0 - ollama-ai-provider: - specifier: ^1.2.0 - version: 1.2.0(zod@3.25.76) + ollama-ai-provider-v2: + specifier: ^1.5.3 + version: 1.5.3(zod@4.1.12) posthog-node: specifier: ^5.5.1 version: 5.5.1 + prettier: + specifier: ^3.4.2 + version: 3.6.2 unplugin: specifier: ^2.1.2 version: 2.3.5 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.1.12 + version: 4.1.12 devDependencies: '@types/babel__generator': specifier: ^7.6.8 @@ -905,8 +911,8 @@ importers: specifier: ^25.0.1 version: 25.0.1 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.1.12 + version: 4.1.12 devDependencies: '@types/jsdom': specifier: ^21.1.7 @@ -927,11 +933,8 @@ importers: specifier: workspace:* version: link:../locales zod: - specifier: ^3.25.76 - version: 3.25.76 - zod-to-json-schema: - specifier: ^3.24.5 - version: 3.24.5(zod@3.25.76) + specifier: ^4.1.12 + version: 4.1.12 devDependencies: '@types/node': specifier: ^22.13.5 @@ -949,11 +952,8 @@ importers: scripts/docs: dependencies: zod: - specifier: ^3.25.76 - version: 3.25.76 - zod-to-json-schema: - specifier: ^3.24.5 - version: 3.24.5(zod@3.25.76) + specifier: ^4.1.12 + version: 4.1.12 devDependencies: '@lingo.dev/_spec': specifier: workspace:* @@ -1236,61 +1236,69 @@ packages: edge.js: optional: true - '@ai-sdk/anthropic@1.2.11': - resolution: {integrity: sha512-lZLcEMh8MXY4NVSrN/7DyI2rnid8k7cn/30nMmd3bwJrnIsOuIuuFvY8f0nj+pFcTi6AYK7ujLdqW5dQVz1YQw==} + '@ai-sdk/anthropic@2.0.42': + resolution: {integrity: sha512-5BcXMx6VTYPeA4csd1SvJgpCn5Nu9qHqsNqOr1e/R7UHq83Vv4j4OcgbFwdWgaW/wihNla5B+y4OGqTFIw216w==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@1.2.19': - resolution: {integrity: sha512-Xgl6eftIRQ4srUdCzxM112JuewVMij5q4JLcNmHcB68Bxn9dpr3MVUSPlJwmameuiQuISIA8lMB+iRiRbFsaqA==} + '@ai-sdk/anthropic@2.0.45': + resolution: {integrity: sha512-Ipv62vavDCmrV/oE/lXehL9FzwQuZOnnlhPEftWizx464Wb6lvnBTJx8uhmEYruFSzOWTI95Z33ncZ4tA8E6RQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/groq@1.2.9': - resolution: {integrity: sha512-7MoDaxm8yWtiRbD1LipYZG0kBl+Xe0sv/EeyxnHnGPZappXdlgtdOgTZVjjXkT3nWP30jjZi9A45zoVrBMb3Xg==} + '@ai-sdk/gateway@2.0.7': + resolution: {integrity: sha512-/AI5AKi4vOK9SEb8Z1dfXkhsJ5NAfWsoJQc96B/mzn2KIrjw5occOjIwD06scuhV9xWlghCoXJT1sQD9QH/tyg==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/mistral@1.2.8': - resolution: {integrity: sha512-lv857D9UJqCVxiq2Fcu7mSPTypEHBUqLl1K+lCaP6X/7QAkcaxI36QDONG+tOhGHJOXTsS114u8lrUTaEiGXbg==} + '@ai-sdk/google@2.0.29': + resolution: {integrity: sha512-wH8eEN5mUPOpbENsCkO3dBumWZ2FUbkh3iWj1ypYIVQNuJFvNxqHuWTb5t8C/F+5FoPM14McmeI/ceQ9qZ4lyw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@1.3.22': - resolution: {integrity: sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw==} + '@ai-sdk/groq@2.0.28': + resolution: {integrity: sha512-910ACt1kUA6+en9hjfhQFo+/yaUDe3xaAf7+l2N6jrfUNNciHe5DoW0GAJwGMnYK2li9CVcWNNXsmQ6TCzPnDA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@2.2.8': - resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + '@ai-sdk/mistral@2.0.23': + resolution: {integrity: sha512-np2bTlL5ZDi7iAOPCF5SZ5xKqls059iOvsigbgd9VNUCIrWSf6GYOaPvoWEgJ650TUOZitTfMo9MiEhLgutPfA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@1.1.3': - resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + '@ai-sdk/openai@2.0.64': + resolution: {integrity: sha512-+1mqxn42uB32DPZ6kurSyGAmL3MgCaDpkYU7zNDWI4NLy3Zg97RxTsI1jBCGIqkEVvRZKJlIMYtb89OvMnq3AQ==} engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/react@1.2.12': - resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} + '@ai-sdk/openai@2.0.68': + resolution: {integrity: sha512-qUSLFkqgUoFArzBwttu0KWVAZYjbsdZGOklSJXpfZ2nDC61yseHxtcnuG8u6tqKnGXDh4eakEgREDWU2sRht7A==} engines: {node: '>=18'} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.16': + resolution: {integrity: sha512-lsWQY9aDXHitw7C1QRYIbVGmgwyT98TF3MfM8alNIXKpdJdi+W782Rzd9f1RyOfgRmZ08gJ2EYNDhWNK7RqpEA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/ui-utils@1.2.11': - resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + '@ai-sdk/provider-utils@3.0.17': + resolution: {integrity: sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} '@alcalzone/ansi-tokenize@0.1.3': resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} @@ -3361,12 +3369,12 @@ packages: resolution: {integrity: sha512-f386XyLTieQbgKPKS6ZMlH4dq8eLsxNddwofiKRZCq0bZ2gikoFwMD99K6l1oAwqe/KZNzrEziGicRgnzplplQ==} engines: {node: '>= 18'} - '@openrouter/ai-sdk-provider@0.7.1': - resolution: {integrity: sha512-jppCJErJ13KKnr0rOJrElmrlGul+0G5OO45Tqn1II2uIVcJLjyuzyS1hkCWD3fmlKVAuwVbyumTh6JQsS4e+4g==} + '@openrouter/ai-sdk-provider@1.2.1': + resolution: {integrity: sha512-sDc+/tlEM9VTsYlZ3YMwD9AHinSNusdLFGQhtb50eo5r68U/yBixEHRsKEevqSspiX3V6J06hU7C25t4KE9iag==} engines: {node: '>=18'} peerDependencies: - ai: ^4.3.16 - zod: ^3.25.34 + ai: ^5.0.0 + zod: ^3.24.1 || ^v4 '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} @@ -3452,6 +3460,11 @@ packages: '@posthog/core@1.0.2': resolution: {integrity: sha512-hWk3rUtJl2crQK0WNmwg13n82hnTwB99BT99/XI5gZSvIlYZ1TPmMZE8H2dhJJ98J/rm9vYJ/UXNzw3RV5HTpQ==} + '@prettier/sync@0.6.1': + resolution: {integrity: sha512-yF9G8vK/LYUTF3Cijd7VC9La3b20F20/J/fgoR4H0B8JGOWnZVZX6+I6+vODPosjmMcpdlUV+gUqJQZp3kLOcw==} + peerDependencies: + prettier: '*' + '@react-router/dev@7.8.2': resolution: {integrity: sha512-9ilgQoNhvgvUyQKDapALt9qVO3GpSw9ng5X2BwIhLIwqh8CTyRM/jz5cK53p5yzGiVeyx9njXXfeuxUlvQgJuA==} engines: {node: '>=20.0.0'} @@ -3850,6 +3863,9 @@ packages: '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@stylistic/eslint-plugin@5.3.1': resolution: {integrity: sha512-Ykums1VYonM0TgkD0VteVq9mrlO2FhF48MDJnPyv3MktIB2ydtuhlO0AfWm7xnW1kyf5bjOqA6xc7JjviuVTxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4210,9 +4226,6 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/diff-match-patch@1.0.36': - resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - '@types/diff@7.0.0': resolution: {integrity: sha512-sVpkpbnTJL9CYoDf4U+tHaQLe5HiTaHWY7m9FuYA7oMCHwC9ie0Vh9eIGapyzYrU3+pILlSY2fAc4elfw5m4dg==} @@ -4586,6 +4599,10 @@ packages: peerDependencies: vite: ^2.8.1 || 3 || 4 || 5 || 6 + '@vercel/oidc@3.0.3': + resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} + engines: {node: '>= 20'} + '@vinejs/compiler@3.0.0': resolution: {integrity: sha512-v9Lsv59nR56+bmy2p0+czjZxsLHwaibJ+SV5iK9JJfehlJMa501jUJQqqz4X/OqKXrxtE3uTQmSqjUqzF3B2mw==} engines: {node: '>=18.0.0'} @@ -4800,15 +4817,11 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} - ai@4.3.15: - resolution: {integrity: sha512-TYKRzbWg6mx/pmTadlAEIhuQtzfHUV0BbLY72+zkovXwq/9xhcH24IlQmkyBpElK6/4ArS0dHdOOtR1jOPVwtg==} + ai@5.0.89: + resolution: {integrity: sha512-8Nq+ZojGacQrupoJEQLrTDzT5VtR3gyp5AaqFSV3tzsAXlYQ9Igb7QE3yeoEdzOk5IRfDwWL7mDCUD+oBg1hDA==} engines: {node: '>=18'} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - react: - optional: true + zod: ^3.25.76 || ^4.1.8 ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -5800,9 +5813,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -6252,6 +6262,10 @@ packages: resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} engines: {node: '>=18.0.0'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + eventsource@3.0.5: resolution: {integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==} engines: {node: '>=18.0.0'} @@ -7260,11 +7274,6 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsondiffpatch@0.6.0: - resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -7561,6 +7570,9 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-synchronized@0.8.0: + resolution: {integrity: sha512-DZu4lwc0ffoFz581BSQa/BJl+1ZqIkoRQ+VejMlH0VrP4E86StAODnZujZ4sepumQj8rcP7wUnUBGM8Gu+zKUA==} + markdown-it-front-matter@0.2.4: resolution: {integrity: sha512-25GUs0yjS2hLl8zAemVndeEzThB1p42yxuDEKbd4JlL3jiz+jsm6e56Ya8B0VREOkNxLYB4TTwaoPJ3ElMmW+w==} @@ -8119,14 +8131,11 @@ packages: resolution: {integrity: sha512-0kcTxJOK3yQrJsRb8wKa28hlTze4QOz4sLuUnfXXnhboDhFKgv8LxS86tFwbsafDW9JZ08ByuVAE8kQbYJIZkA==} engines: {node: '>= 18'} - ollama-ai-provider@1.2.0: - resolution: {integrity: sha512-jTNFruwe3O/ruJeppI/quoOUxG7NA6blG3ZyQj3lei4+NnJo7bi3eIRWqlVpRlu/mbzbFXeJSBuYQWF6pzGKww==} + ollama-ai-provider-v2@1.5.3: + resolution: {integrity: sha512-LnpvKuxNJyE+cB03cfUjFJnaiBJoUqz3X97GFc71gz09gOdrxNh1AsVBxrpw3uX5aiMxRIWPOZ8god0dHSChsg==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true + zod: ^4.0.16 on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} @@ -8309,9 +8318,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - partial-json@0.1.7: - resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} - patch-console@2.0.0: resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -9297,9 +9303,6 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - secure-json-parse@4.0.0: resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} @@ -9699,11 +9702,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - swr@2.3.3: - resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -9757,10 +9755,6 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - throttleit@2.1.0: - resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} - engines: {node: '>=18'} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -10191,11 +10185,6 @@ packages: url-template@2.0.8: resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} - use-sync-external-store@1.5.0: - resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -10726,20 +10715,15 @@ packages: peerDependencies: zod: ^3.24.1 - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} - peerDependencies: - zod: ^3.24.1 - zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -11052,73 +11036,72 @@ snapshots: '@adonisjs/shield': 8.2.0(@adonisjs/core@6.19.0(@adonisjs/assembler@7.8.2(typescript@5.8.3))(@vinejs/vine@3.0.1)(edge.js@6.3.0))(@adonisjs/session@7.5.1(@adonisjs/core@6.19.0(@adonisjs/assembler@7.8.2(typescript@5.8.3))(@vinejs/vine@3.0.1)(edge.js@6.3.0))(edge.js@6.3.0))(edge.js@6.3.0) edge.js: 6.3.0 - '@ai-sdk/anthropic@1.2.11(zod@3.25.76)': + '@ai-sdk/anthropic@2.0.42(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + zod: 4.1.12 - '@ai-sdk/google@1.2.19(zod@3.25.76)': + '@ai-sdk/anthropic@2.0.45(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@4.1.12) + zod: 4.1.12 - '@ai-sdk/groq@1.2.9(zod@3.25.76)': + '@ai-sdk/gateway@2.0.7(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + '@vercel/oidc': 3.0.3 + zod: 4.1.12 - '@ai-sdk/mistral@1.2.8(zod@3.25.76)': + '@ai-sdk/google@2.0.29(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + zod: 4.1.12 - '@ai-sdk/openai@1.3.22(zod@3.25.76)': + '@ai-sdk/groq@2.0.28(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + zod: 4.1.12 - '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': + '@ai-sdk/mistral@2.0.23(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.11 - secure-json-parse: 2.7.0 - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + zod: 4.1.12 - '@ai-sdk/provider@1.1.3': + '@ai-sdk/openai@2.0.64(zod@4.1.12)': dependencies: - json-schema: 0.4.0 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + zod: 4.1.12 - '@ai-sdk/react@1.2.12(react@18.3.1)(zod@3.25.76)': + '@ai-sdk/openai@2.0.68(zod@4.1.12)': dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - react: 18.3.1 - swr: 2.3.3(react@18.3.1) - throttleit: 2.1.0 - optionalDependencies: - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@4.1.12) + zod: 4.1.12 - '@ai-sdk/react@1.2.12(react@19.1.0)(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.16(zod@4.1.12)': dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - react: 19.1.0 - swr: 2.3.3(react@19.1.0) - throttleit: 2.1.0 - optionalDependencies: - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.12 - '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.17(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.12 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 '@alcalzone/ansi-tokenize@0.1.3': dependencies: @@ -13315,19 +13298,10 @@ snapshots: '@octokit/request-error': 6.1.7 '@octokit/webhooks-methods': 5.1.1 - '@openrouter/ai-sdk-provider@0.7.1(ai@4.3.15(react@18.3.1)(zod@3.25.76))(zod@3.25.76)': + '@openrouter/ai-sdk-provider@1.2.1(ai@5.0.89(zod@4.1.12))(zod@4.1.12)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - ai: 4.3.15(react@18.3.1)(zod@3.25.76) - zod: 3.25.76 - - '@openrouter/ai-sdk-provider@0.7.1(ai@4.3.15(react@19.1.0)(zod@3.25.76))(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - ai: 4.3.15(react@19.1.0)(zod@3.25.76) - zod: 3.25.76 + ai: 5.0.89(zod@4.1.12) + zod: 4.1.12 '@opentelemetry/api@1.9.0': {} @@ -13441,6 +13415,11 @@ snapshots: '@posthog/core@1.0.2': {} + '@prettier/sync@0.6.1(prettier@3.6.2)': + dependencies: + make-synchronized: 0.8.0 + prettier: 3.6.2 + '@react-router/dev@7.8.2(@react-router/serve@7.8.2(react-router@7.8.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(typescript@5.8.3))(@types/node@20.19.13)(jiti@2.5.1)(lightningcss@1.30.1)(react-dom@19.1.0(react@19.1.0))(react-router@7.8.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(terser@5.36.0)(tsx@4.20.3)(typescript@5.8.3)(vite@6.3.5(@types/node@20.19.13)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@babel/core': 7.28.4 @@ -13530,7 +13509,7 @@ snapshots: jsdom: 25.0.1 typescript: 5.8.3 vitest: 2.1.9(@types/node@24.2.0)(jsdom@25.0.1)(lightningcss@1.30.1)(terser@5.36.0) - zod: 3.24.1 + zod: 3.25.76 transitivePeerDependencies: - '@edge-runtime/vm' - '@types/node' @@ -13826,6 +13805,8 @@ snapshots: '@speed-highlight/core@1.2.7': {} + '@standard-schema/spec@1.0.0': {} + '@stylistic/eslint-plugin@5.3.1(eslint@9.35.0(jiti@2.5.1))': dependencies: '@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0(jiti@2.5.1)) @@ -14155,8 +14136,6 @@ snapshots: '@types/deep-eql@4.0.2': {} - '@types/diff-match-patch@1.0.36': {} - '@types/diff@7.0.0': {} '@types/ejs@3.1.5': {} @@ -14558,6 +14537,8 @@ snapshots: picocolors: 1.1.1 vite: 6.3.5(@types/node@22.17.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) + '@vercel/oidc@3.0.3': {} + '@vinejs/compiler@3.0.0': {} '@vinejs/vine@3.0.1': @@ -14893,29 +14874,13 @@ snapshots: transitivePeerDependencies: - supports-color - ai@4.3.15(react@18.3.1)(zod@3.25.76): - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/react': 1.2.12(react@18.3.1)(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.25.76 - optionalDependencies: - react: 18.3.1 - - ai@4.3.15(react@19.1.0)(zod@3.25.76): + ai@5.0.89(zod@4.1.12): dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/react': 1.2.12(react@19.1.0)(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@ai-sdk/gateway': 2.0.7(zod@4.1.12) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.25.76 - optionalDependencies: - react: 19.1.0 + zod: 4.1.12 ajv@6.12.6: dependencies: @@ -15939,8 +15904,6 @@ snapshots: dependencies: dequal: 2.0.3 - diff-match-patch@1.0.5: {} - diff@4.0.2: {} diff@7.0.0: {} @@ -16622,6 +16585,8 @@ snapshots: eventsource-parser@3.0.0: {} + eventsource-parser@3.0.6: {} + eventsource@3.0.5: dependencies: eventsource-parser: 3.0.0 @@ -17748,12 +17713,6 @@ snapshots: jsonc-parser@3.3.1: {} - jsondiffpatch@0.6.0: - dependencies: - '@types/diff-match-patch': 1.0.36 - chalk: 5.4.1 - diff-match-patch: 1.0.5 - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -17932,7 +17891,7 @@ snapshots: xmldom: 0.6.0 xpath: 0.0.34 yaml: 2.6.1 - zod: 3.24.1 + zod: 3.25.76 transitivePeerDependencies: - '@edge-runtime/vm' - '@types/node' @@ -18070,6 +18029,8 @@ snapshots: make-error@1.3.6: {} + make-synchronized@0.8.0: {} + markdown-it-front-matter@0.2.4: {} markdown-it@14.1.0: @@ -18871,13 +18832,11 @@ snapshots: '@octokit/request-error': 6.1.7 '@octokit/types': 13.8.0 - ollama-ai-provider@1.2.0(zod@3.25.76): + ollama-ai-provider-v2@1.5.3(zod@4.1.12): dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - partial-json: 0.1.7 - optionalDependencies: - zod: 3.25.76 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + zod: 4.1.12 on-exit-leak-free@2.1.2: {} @@ -19080,8 +19039,6 @@ snapshots: parseurl@1.3.3: {} - partial-json@0.1.7: {} - patch-console@2.0.0: {} path-browserify@1.0.1: {} @@ -20114,8 +20071,6 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 - secure-json-parse@2.7.0: {} - secure-json-parse@4.0.0: {} semver@6.3.1: {} @@ -20613,18 +20568,6 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 - swr@2.3.3(react@18.3.1): - dependencies: - dequal: 2.0.3 - react: 18.3.1 - use-sync-external-store: 1.5.0(react@18.3.1) - - swr@2.3.3(react@19.1.0): - dependencies: - dequal: 2.0.3 - react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) - symbol-tree@3.2.4: {} synckit@0.11.11: @@ -20673,8 +20616,6 @@ snapshots: dependencies: real-require: 0.2.0 - throttleit@2.1.0: {} - through@2.3.8: {} tildify@2.0.0: {} @@ -21185,14 +21126,6 @@ snapshots: url-template@2.0.8: {} - use-sync-external-store@1.5.0(react@18.3.1): - dependencies: - react: 18.3.1 - - use-sync-external-store@1.5.0(react@19.1.0): - dependencies: - react: 19.1.0 - util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -22034,14 +21967,10 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.24.5(zod@3.25.76): - dependencies: - zod: 3.25.76 - zod@3.23.8: {} - zod@3.24.1: {} - zod@3.25.76: {} + zod@4.1.12: {} + zwitch@2.0.4: {} diff --git a/scripts/docs/package.json b/scripts/docs/package.json index 78ad3bc51..9be32aee8 100644 --- a/scripts/docs/package.json +++ b/scripts/docs/package.json @@ -24,7 +24,6 @@ "vitest": "^3.2.4" }, "dependencies": { - "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.5" + "zod": "^4.1.12" } } diff --git a/scripts/docs/src/generate-config-docs.ts b/scripts/docs/src/generate-config-docs.ts index 463d9d8f4..862419afa 100644 --- a/scripts/docs/src/generate-config-docs.ts +++ b/scripts/docs/src/generate-config-docs.ts @@ -6,7 +6,7 @@ import { mkdirSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import remarkStringify from "remark-stringify"; import { unified } from "unified"; -import { zodToJsonSchema } from "zod-to-json-schema"; +import { toJSONSchema } from "zod"; import { renderMarkdown } from "./json-schema/markdown-renderer"; import { parseSchema } from "./json-schema/parser"; import type { JSONSchemaObject } from "./json-schema/types"; @@ -62,9 +62,8 @@ async function main() { const outputArg = process.argv[2]; - const schema = zodToJsonSchema(LATEST_CONFIG_DEFINITION.schema, { - name: "I18nConfig", - markdownDescription: true, + const schema = toJSONSchema(LATEST_CONFIG_DEFINITION.schema, { + target: "openapi-3.0", }); console.log("🔄 Generating i18n.json reference docs...");