translate-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/flatten.ts","../src/diff.ts","../src/translate.ts","../src/writer.ts","../src/scanner/parser.ts","../src/scanner/filters.ts","../src/utils/ast-helpers.ts","../src/scanner/extractor.ts","../src/scanner/key-generator.ts","../src/logger.ts","../src/scanner/index.ts","../src/scanner/key-ai.ts","../src/codegen/transform.ts","../src/codegen/index.ts","../src/templates/t-component.ts","../src/init.ts","../src/cli.ts"],"sourcesContent":["import { loadConfig } from \"c12\";\nimport { z } from \"zod\";\nimport type { TranslateKitConfig } from \"./types.js\";\n\nconst configSchema = z\n .object({\n model: z.custom<TranslateKitConfig[\"model\"]>(\n (val) => val != null && typeof val === \"object\",\n { message: \"model must be an AI SDK LanguageModel instance\" },\n ),\n mode: z.enum([\"keys\", \"inline\"]).default(\"keys\"),\n sourceLocale: z.string().min(1),\n targetLocales: z.array(z.string().min(1)).min(1),\n messagesDir: z.string().min(1),\n translation: z\n .object({\n batchSize: z.number().int().positive().default(50),\n context: z.string().optional(),\n glossary: z.record(z.string()).optional(),\n tone: z.string().optional(),\n retries: z.number().int().min(0).default(2),\n concurrency: z.number().int().positive().default(3),\n })\n .optional(),\n scan: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\n keyStrategy: z.enum([\"hash\", \"path\"]).default(\"hash\"),\n translatableProps: z\n .array(z.string())\n .default([\"placeholder\", \"title\", \"alt\", \"aria-label\"]),\n i18nImport: z.string().default(\"next-intl\"),\n })\n .optional(),\n inline: z\n .object({\n componentPath: z.string().min(1),\n })\n .optional(),\n })\n .refine((data) => data.mode !== \"inline\" || data.inline != null, {\n message: \"inline options are required when mode is 'inline'\",\n path: [\"inline\"],\n });\n\nexport function defineConfig(config: TranslateKitConfig) {\n return config as TranslateKitConfig;\n}\n\nexport async function loadTranslateKitConfig(): Promise<TranslateKitConfig> {\n const { config } = await loadConfig({\n name: \"translate-kit\",\n });\n\n if (!config || Object.keys(config).length === 0) {\n throw new Error(\n \"No config found. Create a translate-kit.config.ts file or run `translate-kit init`.\",\n );\n }\n\n const result = configSchema.safeParse(config);\n if (!result.success) {\n const errors = result.error.issues\n .map((i) => ` - ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid config:\\n${errors}`);\n }\n\n return result.data as TranslateKitConfig;\n}\n","export function flatten(\n obj: Record<string, unknown>,\n prefix = \"\",\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (typeof value === \"string\") {\n result[fullKey] = value;\n } else if (\n value != null &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n Object.assign(result, flatten(value as Record<string, unknown>, fullKey));\n }\n }\n\n return result;\n}\n\nexport function unflatten(\n obj: Record<string, string>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const parts = key.split(\".\");\n let current: Record<string, unknown> = result;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part in current && typeof current[part] !== \"object\") {\n console.warn(\n `[translate-kit] Key conflict: \"${parts.slice(0, i + 1).join(\".\")}\" is a value but \"${key}\" expects it to be an object`,\n );\n current[part] = {};\n } else if (!(part in current)) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n current[parts[parts.length - 1]] = value;\n }\n\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { flatten } from \"./flatten.js\";\nimport type { DiffResult, LockFile } from \"./types.js\";\n\nexport function hashValue(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16);\n}\n\nfunction isFileNotFound(err: unknown): boolean {\n return (\n err instanceof Error &&\n \"code\" in err &&\n (err as NodeJS.ErrnoException).code === \"ENOENT\"\n );\n}\n\nexport async function loadJsonFile(\n filePath: string,\n): Promise<Record<string, unknown>> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch (err) {\n if (isFileNotFound(err)) return {};\n throw new Error(\n `Failed to load ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\nexport async function loadLockFile(messagesDir: string): Promise<LockFile> {\n const lockPath = join(messagesDir, \".translate-lock.json\");\n try {\n const content = await readFile(lockPath, \"utf-8\");\n return JSON.parse(content);\n } catch (err) {\n if (isFileNotFound(err)) return {};\n throw new Error(\n `Failed to load lock file: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\nexport function computeDiff(\n sourceFlat: Record<string, string>,\n targetFlat: Record<string, string>,\n lockData: LockFile,\n): DiffResult {\n const added: Record<string, string> = {};\n const modified: Record<string, string> = {};\n const removed: string[] = [];\n const unchanged: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(sourceFlat)) {\n const currentHash = hashValue(value);\n const lockedHash = lockData[key];\n\n if (!(key in targetFlat)) {\n added[key] = value;\n } else if (!lockedHash || lockedHash !== currentHash) {\n modified[key] = value;\n } else {\n unchanged[key] = targetFlat[key];\n }\n }\n\n for (const key of Object.keys(targetFlat)) {\n if (!(key in sourceFlat)) {\n removed.push(key);\n }\n }\n\n return { added, modified, removed, unchanged };\n}\n\nexport async function diff(\n sourceFile: string,\n targetFile: string,\n messagesDir: string,\n): Promise<DiffResult> {\n const [sourceRaw, targetRaw, lockData] = await Promise.all([\n loadJsonFile(sourceFile),\n loadJsonFile(targetFile),\n loadLockFile(messagesDir),\n ]);\n\n const sourceFlat = flatten(sourceRaw);\n const targetFlat = flatten(targetRaw);\n\n return computeDiff(sourceFlat, targetFlat, lockData);\n}\n","import { generateObject, type LanguageModel } from \"ai\";\nimport { z } from \"zod\";\nimport pLimit from \"p-limit\";\nimport type { TranslationOptions } from \"./types.js\";\n\ninterface TranslateBatchInput {\n model: LanguageModel;\n entries: Record<string, string>;\n sourceLocale: string;\n targetLocale: string;\n options?: TranslationOptions;\n}\n\nfunction buildPrompt(\n entries: Record<string, string>,\n sourceLocale: string,\n targetLocale: string,\n options?: TranslationOptions,\n): string {\n const lines = [\n `Translate the following strings from \"${sourceLocale}\" to \"${targetLocale}\".`,\n \"\",\n \"Rules:\",\n \"- Preserve all placeholders like {name}, {{count}}, %s, %d exactly as-is\",\n \"- Preserve HTML tags and markdown formatting\",\n \"- Do NOT translate proper nouns, brand names, or technical identifiers\",\n \"- Maintain the same level of formality and register\",\n \"- Return natural, fluent translations (not word-for-word)\",\n ];\n\n if (options?.tone) {\n lines.push(`- Use a ${options.tone} tone`);\n }\n\n if (options?.context) {\n lines.push(`\\nContext: ${options.context}`);\n }\n\n if (options?.glossary && Object.keys(options.glossary).length > 0) {\n lines.push(\"\\nGlossary (use these exact translations):\");\n for (const [term, translation] of Object.entries(options.glossary)) {\n lines.push(` \"${term}\" → \"${translation}\"`);\n }\n }\n\n lines.push(\"\\nStrings to translate:\");\n for (const [key, value] of Object.entries(entries)) {\n lines.push(` \"${key}\": \"${value}\"`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildSchema(keys: string[]): z.ZodObject<Record<string, z.ZodString>> {\n const shape: Record<string, z.ZodString> = {};\n for (const key of keys) {\n shape[key] = z.string();\n }\n return z.object(shape);\n}\n\nasync function translateBatchWithRetry(\n input: TranslateBatchInput,\n retries: number,\n): Promise<Record<string, string>> {\n const { model, entries, sourceLocale, targetLocale, options } = input;\n const keys = Object.keys(entries);\n const prompt = buildPrompt(entries, sourceLocale, targetLocale, options);\n const schema = buildSchema(keys);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const { object } = await generateObject({\n model,\n prompt,\n schema,\n });\n return object;\n } catch (error) {\n lastError = error as Error;\n if (attempt < retries) {\n const delay = Math.min(Math.pow(2, attempt) * 1000, 30_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError;\n}\n\nexport interface TranslateAllInput {\n model: LanguageModel;\n entries: Record<string, string>;\n sourceLocale: string;\n targetLocale: string;\n options?: TranslationOptions;\n onBatchComplete?: (translated: Record<string, string>) => void;\n}\n\nexport async function translateAll(\n input: TranslateAllInput,\n): Promise<Record<string, string>> {\n const {\n model,\n entries,\n sourceLocale,\n targetLocale,\n options,\n onBatchComplete,\n } = input;\n\n const keys = Object.keys(entries);\n if (keys.length === 0) return {};\n\n const batchSize = options?.batchSize ?? 50;\n const concurrency = options?.concurrency ?? 3;\n const retries = options?.retries ?? 2;\n const limit = pLimit(concurrency);\n\n const batches: Record<string, string>[] = [];\n for (let i = 0; i < keys.length; i += batchSize) {\n const batchKeys = keys.slice(i, i + batchSize);\n const batch: Record<string, string> = {};\n for (const key of batchKeys) {\n batch[key] = entries[key];\n }\n batches.push(batch);\n }\n\n const results: Record<string, string> = {};\n\n await Promise.all(\n batches.map((batch) =>\n limit(async () => {\n const translated = await translateBatchWithRetry(\n { model, entries: batch, sourceLocale, targetLocale, options },\n retries,\n );\n Object.assign(results, translated);\n onBatchComplete?.(translated);\n }),\n ),\n );\n\n return results;\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { unflatten } from \"./flatten.js\";\nimport { hashValue } from \"./diff.js\";\nimport type { LockFile } from \"./types.js\";\n\nexport async function writeTranslation(\n filePath: string,\n flatEntries: Record<string, string>,\n options?: { flat?: boolean },\n): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n const data = options?.flat ? flatEntries : unflatten(flatEntries);\n const content = JSON.stringify(data, null, 2) + \"\\n\";\n await writeFile(filePath, content, \"utf-8\");\n}\n\nexport async function writeLockFile(\n messagesDir: string,\n sourceFlat: Record<string, string>,\n existingLock: LockFile,\n translatedKeys: string[],\n): Promise<void> {\n const lock: LockFile = { ...existingLock };\n\n for (const key of translatedKeys) {\n if (key in sourceFlat) {\n lock[key] = hashValue(sourceFlat[key]);\n }\n }\n\n // Remove keys that no longer exist in source\n for (const key of Object.keys(lock)) {\n if (!(key in sourceFlat)) {\n delete lock[key];\n }\n }\n\n const lockPath = join(messagesDir, \".translate-lock.json\");\n await mkdir(dirname(lockPath), { recursive: true });\n const content = JSON.stringify(lock, null, 2) + \"\\n\";\n await writeFile(lockPath, content, \"utf-8\");\n}\n","import { parse, type ParserPlugin } from \"@babel/parser\";\nimport type { File } from \"@babel/types\";\n\nconst plugins: ParserPlugin[] = [\"typescript\", \"jsx\", \"decorators-legacy\"];\n\nexport function parseFile(code: string, filename: string): File {\n return parse(code, {\n sourceType: \"module\",\n plugins:\n filename.endsWith(\".tsx\") || filename.endsWith(\".ts\")\n ? plugins\n : plugins.filter((p) => p !== \"typescript\"),\n sourceFilename: filename,\n });\n}\n","const DEFAULT_TRANSLATABLE_PROPS = [\n \"placeholder\",\n \"title\",\n \"alt\",\n \"aria-label\",\n \"aria-description\",\n \"aria-placeholder\",\n \"label\",\n];\n\nconst NEVER_TRANSLATE_PROPS = [\n \"className\",\n \"class\",\n \"id\",\n \"key\",\n \"ref\",\n \"href\",\n \"src\",\n \"type\",\n \"name\",\n \"value\",\n \"htmlFor\",\n \"for\",\n \"role\",\n \"style\",\n \"data-testid\",\n \"data-cy\",\n \"onClick\",\n \"onChange\",\n \"onSubmit\",\n \"onFocus\",\n \"onBlur\",\n];\n\nconst IGNORE_TAGS = [\n \"script\",\n \"style\",\n \"code\",\n \"pre\",\n \"svg\",\n \"path\",\n \"circle\",\n \"rect\",\n \"line\",\n \"polyline\",\n \"polygon\",\n];\n\nconst IGNORE_PATTERNS = [\n /^\\s*$/, // Whitespace only\n /^https?:\\/\\//, // URLs\n /^[a-z]+(-[a-z]+)+$/, // kebab-case identifiers\n /^[A-Z_]+$/, // CONSTANT_CASE\n /^[\\d.,%$€£¥]+$/, // Numbers, currency\n /^[^a-zA-Z]*$/, // No letters at all\n];\n\nconst CONTENT_PROPERTY_NAMES = [\n \"title\",\n \"description\",\n \"label\",\n \"text\",\n \"content\",\n \"heading\",\n \"subtitle\",\n \"caption\",\n \"summary\",\n \"message\",\n \"placeholder\",\n \"alt\",\n];\n\nexport function isContentProperty(propName: string): boolean {\n return CONTENT_PROPERTY_NAMES.includes(propName);\n}\n\nexport function isTranslatableProp(\n propName: string,\n customProps?: string[],\n): boolean {\n if (NEVER_TRANSLATE_PROPS.includes(propName)) return false;\n const allowed = customProps ?? DEFAULT_TRANSLATABLE_PROPS;\n return allowed.includes(propName);\n}\n\nexport function isIgnoredTag(tagName: string): boolean {\n return IGNORE_TAGS.includes(tagName.toLowerCase());\n}\n\nexport function shouldIgnore(text: string): boolean {\n const trimmed = text.trim();\n if (trimmed.length === 0) return true;\n return IGNORE_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n","import type { NodePath } from \"@babel/traverse\";\nimport type { Node } from \"@babel/types\";\n\n/**\n * Resolve CJS/ESM interop for babel packages.\n * Some environments return the module as `{ default: fn }` instead of `fn`.\n */\nexport function resolveDefault<T>(mod: T): T {\n if (typeof mod === \"function\") return mod;\n return (mod as unknown as { default: T }).default;\n}\n\n/**\n * Check if a path is inside a function scope (component body).\n */\nexport function isInsideFunction(path: NodePath<Node>): boolean {\n let current = path.parentPath;\n while (current) {\n if (\n current.isFunctionDeclaration() ||\n current.isFunctionExpression() ||\n current.isArrowFunctionExpression()\n ) {\n return true;\n }\n current = current.parentPath;\n }\n return false;\n}\n\n/**\n * Walk up the AST to find the enclosing React component name.\n */\nexport function getComponentName(path: NodePath<Node>): string | undefined {\n let current: NodePath<Node> | null = path;\n while (current) {\n if (current.isFunctionDeclaration() && current.node.id) {\n return current.node.id.name;\n }\n if (\n current.isVariableDeclarator() &&\n current.node.id?.type === \"Identifier\"\n ) {\n // Only treat as component name if the init is a function (arrow/expression).\n // Skip plain variables like `const items = [...]`.\n const init = current.node.init;\n if (\n init &&\n (init.type === \"ArrowFunctionExpression\" ||\n init.type === \"FunctionExpression\")\n ) {\n return current.node.id.name;\n }\n }\n if (current.isExportDefaultDeclaration()) {\n const decl = current.node.declaration;\n if (decl.type === \"FunctionDeclaration\" && decl.id) {\n return decl.id.name;\n }\n }\n current = current.parentPath;\n }\n return undefined;\n}\n\n/**\n * Walk up the AST to find the nearest parent JSX element tag name.\n */\nexport function getParentTagName(path: NodePath<Node>): string | undefined {\n let current = path.parentPath;\n while (current) {\n if (current.isJSXElement()) {\n const opening = current.node.openingElement;\n if (opening.name.type === \"JSXIdentifier\") {\n return opening.name.name;\n }\n if (\n opening.name.type === \"JSXMemberExpression\" &&\n opening.name.object.type === \"JSXIdentifier\"\n ) {\n return `${opening.name.object.name}.${opening.name.property.name}`;\n }\n }\n current = current.parentPath;\n }\n return undefined;\n}\n","import _traverse from \"@babel/traverse\";\nimport type { NodePath } from \"@babel/traverse\";\nimport type {\n File,\n JSXText,\n JSXAttribute,\n JSXExpressionContainer,\n ObjectProperty,\n CallExpression,\n JSXElement,\n} from \"@babel/types\";\nimport {\n isTranslatableProp,\n isIgnoredTag,\n isContentProperty,\n shouldIgnore,\n} from \"./filters.js\";\nimport {\n resolveDefault,\n isInsideFunction,\n getComponentName,\n getParentTagName,\n} from \"../utils/ast-helpers.js\";\nimport type { ExtractedString } from \"../types.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraverseFn = (ast: File, opts: Record<string, any>) => void;\nconst traverse = resolveDefault(_traverse) as unknown as TraverseFn;\n\nexport function extractStrings(\n ast: File,\n filePath: string,\n translatableProps?: string[],\n): ExtractedString[] {\n const results: ExtractedString[] = [];\n\n traverse(ast, {\n JSXText(path: NodePath<JSXText>) {\n const text = path.node.value.trim();\n if (shouldIgnore(text)) return;\n\n const parentTag = getParentTagName(path);\n if (parentTag && isIgnoredTag(parentTag)) return;\n\n if (parentTag === \"T\") return;\n\n results.push({\n text,\n type: \"jsx-text\",\n file: filePath,\n line: path.node.loc?.start.line ?? 0,\n column: path.node.loc?.start.column ?? 0,\n componentName: getComponentName(path),\n parentTag,\n });\n },\n\n JSXAttribute(path: NodePath<JSXAttribute>) {\n const name = path.node.name;\n const propName =\n name.type === \"JSXIdentifier\" ? name.name : name.name.name;\n\n if (!isTranslatableProp(propName, translatableProps)) return;\n\n const value = path.node.value;\n if (!value) return;\n\n let text: string | undefined;\n\n if (value.type === \"StringLiteral\") {\n text = value.value;\n } else if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"StringLiteral\"\n ) {\n text = value.expression.value;\n }\n\n if (!text || shouldIgnore(text)) return;\n\n const parentTag = getParentTagName(path);\n if (parentTag && isIgnoredTag(parentTag)) return;\n\n results.push({\n text,\n type: \"jsx-attribute\",\n file: filePath,\n line: path.node.loc?.start.line ?? 0,\n column: path.node.loc?.start.column ?? 0,\n componentName: getComponentName(path),\n propName,\n parentTag,\n });\n },\n\n JSXExpressionContainer(path: NodePath<JSXExpressionContainer>) {\n const expr = path.node.expression;\n if (expr.type !== \"StringLiteral\") return;\n\n const text = expr.value.trim();\n if (shouldIgnore(text)) return;\n\n if (path.parent.type === \"JSXAttribute\") return;\n\n const parentTag = getParentTagName(path);\n if (parentTag && isIgnoredTag(parentTag)) return;\n\n results.push({\n text,\n type: \"jsx-expression\",\n file: filePath,\n line: path.node.loc?.start.line ?? 0,\n column: path.node.loc?.start.column ?? 0,\n componentName: getComponentName(path),\n parentTag,\n });\n },\n\n ObjectProperty(path: NodePath<ObjectProperty>) {\n if (!isInsideFunction(path)) return;\n\n const keyNode = path.node.key;\n if (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n return;\n\n const propName =\n keyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n if (!isContentProperty(propName)) return;\n\n const valueNode = path.node.value;\n if (valueNode.type !== \"StringLiteral\") return;\n\n const text = valueNode.value.trim();\n if (shouldIgnore(text)) return;\n\n results.push({\n text,\n type: \"object-property\",\n file: filePath,\n line: valueNode.loc?.start.line ?? 0,\n column: valueNode.loc?.start.column ?? 0,\n componentName: getComponentName(path),\n propName,\n });\n },\n\n CallExpression(path: NodePath<CallExpression>) {\n const callee = path.node.callee;\n if (callee.type !== \"Identifier\" || callee.name !== \"t\") return;\n\n const args = path.node.arguments;\n if (args.length === 0) return;\n\n const firstArg = args[0];\n if (firstArg.type !== \"StringLiteral\") return;\n\n if (args.length >= 2 && args[1].type === \"StringLiteral\") {\n results.push({\n text: firstArg.value,\n type: \"t-call\",\n file: filePath,\n line: path.node.loc?.start.line ?? 0,\n column: path.node.loc?.start.column ?? 0,\n componentName: getComponentName(path),\n parentTag: getParentTagName(path),\n id: args[1].value,\n });\n return;\n }\n\n results.push({\n text: firstArg.value,\n type: \"t-call\",\n file: filePath,\n line: path.node.loc?.start.line ?? 0,\n column: path.node.loc?.start.column ?? 0,\n componentName: getComponentName(path),\n parentTag: getParentTagName(path),\n });\n },\n\n JSXElement(path: NodePath<JSXElement>) {\n const opening = path.node.openingElement;\n if (opening.name.type !== \"JSXIdentifier\" || opening.name.name !== \"T\")\n return;\n\n let id: string | undefined;\n for (const attr of opening.attributes) {\n if (\n attr.type === \"JSXAttribute\" &&\n attr.name.type === \"JSXIdentifier\" &&\n attr.name.name === \"id\" &&\n attr.value?.type === \"StringLiteral\"\n ) {\n id = attr.value.value;\n }\n }\n\n let text = \"\";\n for (const child of path.node.children) {\n if (child.type === \"JSXText\") {\n text += child.value;\n }\n }\n text = text.trim();\n if (!text) return;\n\n results.push({\n text,\n type: \"T-component\",\n file: filePath,\n line: path.node.loc?.start.line ?? 0,\n column: path.node.loc?.start.column ?? 0,\n componentName: getComponentName(path),\n parentTag: getParentTagName(path),\n id,\n });\n },\n });\n\n return results;\n}\n","import { createHash } from \"node:crypto\";\nimport type { ExtractedString } from \"../types.js\";\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_|_$/g, \"\")\n .slice(0, 32);\n}\n\nexport function generateKey(\n extracted: ExtractedString,\n strategy: \"hash\" | \"path\",\n): string {\n if (strategy === \"hash\") {\n const hash = createHash(\"sha256\")\n .update(extracted.text)\n .digest(\"hex\")\n .slice(0, 12);\n return hash;\n }\n\n // \"path\" strategy\n const parts: string[] = [];\n\n if (extracted.componentName) {\n parts.push(extracted.componentName);\n }\n\n if (extracted.parentTag) {\n parts.push(extracted.parentTag);\n }\n\n const slug = slugify(extracted.text);\n parts.push(slug);\n\n return parts.join(\".\");\n}\n","import pc from \"picocolors\";\nimport type { TranslationResult } from \"./types.js\";\n\nexport function logStart(sourceLocale: string, targetLocales: string[]): void {\n console.log(\n `\\n${pc.bold(\"translate-kit\")} ${pc.dim(\"·\")} ${sourceLocale} ${pc.dim(\"→\")} ${targetLocales.join(\", \")}\\n`,\n );\n}\n\nexport function logLocaleStart(locale: string): void {\n console.log(`${pc.cyan(\"●\")} ${pc.bold(locale)}`);\n}\n\nexport function logLocaleResult(result: TranslationResult): void {\n const parts: string[] = [];\n\n if (result.translated > 0) {\n parts.push(pc.green(`${result.translated} translated`));\n }\n if (result.cached > 0) {\n parts.push(pc.dim(`${result.cached} cached`));\n }\n if (result.removed > 0) {\n parts.push(pc.yellow(`${result.removed} removed`));\n }\n if (result.errors > 0) {\n parts.push(pc.red(`${result.errors} errors`));\n }\n\n const time = pc.dim(`${(result.duration / 1000).toFixed(1)}s`);\n console.log(` ${parts.join(pc.dim(\" · \"))} ${time}`);\n}\n\nexport function logSummary(results: TranslationResult[]): void {\n const totalTranslated = results.reduce((s, r) => s + r.translated, 0);\n const totalCached = results.reduce((s, r) => s + r.cached, 0);\n const totalDuration = results.reduce((s, r) => s + r.duration, 0);\n\n console.log(\n `\\n${pc.bold(\"Done!\")} ${totalTranslated} keys translated, ${totalCached} cached ${pc.dim(`(${(totalDuration / 1000).toFixed(1)}s)`)}\\n`,\n );\n}\n\nexport function logDryRun(\n locale: string,\n added: number,\n modified: number,\n removed: number,\n unchanged: number,\n): void {\n console.log(`${pc.cyan(\"●\")} ${pc.bold(locale)} ${pc.dim(\"(dry run)\")}`);\n console.log(\n ` ${pc.green(`+${added}`)} added, ${pc.yellow(`~${modified}`)} modified, ${pc.red(`-${removed}`)} removed, ${pc.dim(`${unchanged} unchanged`)}`,\n );\n}\n\nexport function logScanResult(total: number, files: number): void {\n console.log(\n `\\n${pc.bold(\"Scan complete:\")} ${pc.green(`${total} strings`)} from ${files} files\\n`,\n );\n}\n\nexport function logError(message: string): void {\n console.error(`${pc.red(\"✖\")} ${message}`);\n}\n\nexport function logWarning(message: string): void {\n console.log(`${pc.yellow(\"⚠\")} ${message}`);\n}\n\nexport function logInfo(message: string): void {\n console.log(` ${message}`);\n}\n\nexport function logSuccess(message: string): void {\n console.log(`${pc.green(\"✔\")} ${message}`);\n}\n\nexport function logVerbose(message: string, verbose: boolean): void {\n if (verbose) {\n console.log(pc.dim(` ${message}`));\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { glob } from \"tinyglobby\";\nimport { parseFile } from \"./parser.js\";\nimport { extractStrings } from \"./extractor.js\";\nimport { generateKey } from \"./key-generator.js\";\nimport { logVerbose } from \"../logger.js\";\nimport type { ExtractedString, ScanOptions } from \"../types.js\";\n\nexport interface ScanResult {\n strings: ExtractedString[];\n messages: Record<string, string>;\n fileCount: number;\n}\n\nexport async function scan(\n options: ScanOptions,\n cwd: string = process.cwd(),\n): Promise<ScanResult> {\n const files = await glob(options.include, {\n ignore: options.exclude ?? [],\n cwd,\n absolute: true,\n });\n\n const allStrings: ExtractedString[] = [];\n const messages: Record<string, string> = {};\n const keyStrategy = options.keyStrategy ?? \"hash\";\n\n for (const filePath of files) {\n const code = await readFile(filePath, \"utf-8\");\n\n let ast;\n try {\n ast = parseFile(code, filePath);\n } catch (err) {\n logVerbose(\n `Skipping unparseable file ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n continue;\n }\n\n const strings = extractStrings(ast, filePath, options.translatableProps);\n\n for (const str of strings) {\n const key = generateKey(str, keyStrategy);\n if (!(key in messages)) {\n messages[key] = str.text;\n }\n allStrings.push(str);\n }\n }\n\n return {\n strings: allStrings,\n messages,\n fileCount: files.length,\n };\n}\n","import { generateObject, type LanguageModel } from \"ai\";\nimport { z } from \"zod\";\nimport pLimit from \"p-limit\";\nimport type { ExtractedString } from \"../types.js\";\n\ninterface KeyGenInput {\n model: LanguageModel;\n strings: ExtractedString[];\n existingMap?: Record<string, string>;\n batchSize?: number;\n concurrency?: number;\n retries?: number;\n}\n\nfunction buildPrompt(strings: ExtractedString[]): string {\n const lines = [\n \"Generate semantic i18n keys for these UI strings.\",\n \"\",\n \"Rules:\",\n \"- Use dot notation with max 2 levels (namespace.key)\",\n \"- Group by feature/section based on file path and component\",\n \"- Use camelCase for key segments\",\n '- Common UI strings use \"common.\" prefix (Save, Cancel, Loading, Submit, Close, Delete, Edit, Back, Next, etc.)',\n '- Auth-related use \"auth.\" prefix (Sign in, Log out, Register, Forgot password, etc.)',\n '- Navigation use \"nav.\" prefix',\n '- Form-related use \"form.\" prefix for generic form labels',\n '- Error messages use \"error.\" prefix',\n \"- Be consistent: same text should always get the same key\",\n \"- Keys should be concise but descriptive\",\n \"\",\n \"Strings:\",\n ];\n\n for (let i = 0; i < strings.length; i++) {\n const str = strings[i];\n const parts: string[] = [`[${i}] \"${str.text}\"`];\n if (str.componentName) parts.push(`component: ${str.componentName}`);\n if (str.parentTag) parts.push(`tag: ${str.parentTag}`);\n if (str.propName) parts.push(`prop: ${str.propName}`);\n if (str.file) parts.push(`file: ${str.file}`);\n lines.push(` ${parts.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function generateKeysBatchWithRetry(\n model: LanguageModel,\n strings: ExtractedString[],\n retries: number,\n): Promise<Record<string, string>> {\n const prompt = buildPrompt(strings);\n const texts = strings.map((s) => s.text);\n\n const schema = z.object({\n mappings: z.array(\n z.object({\n index: z.number().describe(\"Zero-based index of the string\"),\n key: z.string().describe(\"Semantic i18n key\"),\n }),\n ),\n });\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const { object } = await generateObject({\n model,\n prompt,\n schema,\n });\n\n const result: Record<string, string> = {};\n for (const mapping of object.mappings) {\n if (mapping.index >= 0 && mapping.index < texts.length) {\n result[texts[mapping.index]] = mapping.key;\n }\n }\n return result;\n } catch (error) {\n lastError = error as Error;\n if (attempt < retries) {\n const delay = Math.min(Math.pow(2, attempt) * 1000, 30_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError;\n}\n\nfunction resolveCollisions(\n newKeys: Record<string, string>,\n existingMap: Record<string, string>,\n): Record<string, string> {\n const usedKeys = new Set(Object.values(existingMap));\n const result: Record<string, string> = {};\n\n for (const [text, key] of Object.entries(newKeys)) {\n let finalKey = key;\n let suffix = 2;\n while (usedKeys.has(finalKey)) {\n finalKey = `${key}${suffix}`;\n suffix++;\n }\n usedKeys.add(finalKey);\n result[text] = finalKey;\n }\n\n return result;\n}\n\nexport async function generateSemanticKeys(\n input: KeyGenInput,\n): Promise<Record<string, string>> {\n const {\n model,\n strings,\n existingMap = {},\n batchSize = 50,\n concurrency = 3,\n retries = 2,\n } = input;\n\n const newStrings = strings.filter((s) => !(s.text in existingMap));\n if (newStrings.length === 0) return { ...existingMap };\n\n const uniqueMap = new Map<string, ExtractedString>();\n for (const str of newStrings) {\n if (!uniqueMap.has(str.text)) {\n uniqueMap.set(str.text, str);\n }\n }\n const uniqueStrings = Array.from(uniqueMap.values());\n\n const limit = pLimit(concurrency);\n const batches: ExtractedString[][] = [];\n\n for (let i = 0; i < uniqueStrings.length; i += batchSize) {\n batches.push(uniqueStrings.slice(i, i + batchSize));\n }\n\n const allNewKeys: Record<string, string> = {};\n\n await Promise.all(\n batches.map((batch) =>\n limit(async () => {\n const keys = await generateKeysBatchWithRetry(model, batch, retries);\n Object.assign(allNewKeys, keys);\n }),\n ),\n );\n\n const resolved = resolveCollisions(allNewKeys, existingMap);\n\n return { ...existingMap, ...resolved };\n}\n","import _traverse from \"@babel/traverse\";\nimport _generate from \"@babel/generator\";\nimport * as t from \"@babel/types\";\nimport type { File } from \"@babel/types\";\nimport type { NodePath } from \"@babel/traverse\";\nimport { isContentProperty } from \"../scanner/filters.js\";\nimport {\n resolveDefault,\n isInsideFunction,\n getComponentName,\n} from \"../utils/ast-helpers.js\";\nimport { logWarning } from \"../logger.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraverseFn = (ast: File, opts: Record<string, any>) => void;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype GenerateFn = (ast: File, opts?: Record<string, any>) => { code: string };\n\nconst traverse = resolveDefault(_traverse) as unknown as TraverseFn;\nconst generate = resolveDefault(_generate) as unknown as GenerateFn;\n\ntype JSXChild =\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment;\n\nfunction findLastImportIndex(ast: File): number {\n let idx = -1;\n for (let i = 0; i < ast.program.body.length; i++) {\n if (ast.program.body[i].type === \"ImportDeclaration\") {\n idx = i;\n }\n }\n return idx;\n}\n\nexport interface TransformResult {\n code: string;\n stringsWrapped: number;\n modified: boolean;\n}\n\nexport interface TransformOptions {\n i18nImport?: string;\n mode?: \"keys\" | \"inline\";\n componentPath?: string;\n}\n\nfunction hasUseTranslationsImport(ast: File, importSource: string): boolean {\n for (const node of ast.program.body) {\n if (\n node.type === \"ImportDeclaration\" &&\n node.source.value === importSource\n ) {\n for (const spec of node.specifiers) {\n if (\n spec.type === \"ImportSpecifier\" &&\n spec.imported.type === \"Identifier\" &&\n spec.imported.name === \"useTranslations\"\n ) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\nfunction hasUseTranslationsCall(ast: File): boolean {\n let found = false;\n traverse(ast, {\n VariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n const init = path.node.init;\n if (\n init?.type === \"CallExpression\" &&\n init.callee.type === \"Identifier\" &&\n init.callee.name === \"useTranslations\"\n ) {\n found = true;\n path.stop();\n }\n },\n noScope: true,\n });\n return found;\n}\n\nexport function transform(\n ast: File,\n textToKey: Record<string, string>,\n options: TransformOptions = {},\n): TransformResult {\n if (options.mode === \"inline\") {\n return transformInline(ast, textToKey, options);\n }\n\n const importSource = options.i18nImport ?? \"next-intl\";\n let stringsWrapped = 0;\n const componentsNeedingT = new Set<string>();\n\n traverse(ast, {\n JSXText(path: NodePath<t.JSXText>) {\n const text = path.node.value.trim();\n if (!text || !(text in textToKey)) return;\n\n const parent = path.parentPath;\n if (!parent?.isJSXElement()) return;\n\n const key = textToKey[text];\n const tCall = t.jsxExpressionContainer(\n t.callExpression(t.identifier(\"t\"), [t.stringLiteral(key)]),\n );\n\n const siblings = parent.node.children.filter((child: JSXChild) => {\n if (child.type === \"JSXText\") return child.value.trim().length > 0;\n return true;\n });\n\n if (siblings.length === 1) {\n path.replaceWith(tCall);\n } else {\n const raw = path.node.value;\n const hasLeading = raw !== raw.trimStart();\n const hasTrailing = raw !== raw.trimEnd();\n const nodes: t.Node[] = [];\n if (hasLeading) {\n nodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n }\n nodes.push(tCall);\n if (hasTrailing) {\n nodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n }\n path.replaceWithMultiple(nodes);\n }\n\n stringsWrapped++;\n\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n },\n\n JSXAttribute(path: NodePath<t.JSXAttribute>) {\n const value = path.node.value;\n if (!value) return;\n\n let text: string | undefined;\n\n if (value.type === \"StringLiteral\") {\n text = value.value;\n } else if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"StringLiteral\"\n ) {\n text = value.expression.value;\n }\n\n if (!text || !(text in textToKey)) return;\n\n if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"CallExpression\" &&\n value.expression.callee.type === \"Identifier\" &&\n value.expression.callee.name === \"t\"\n ) {\n return;\n }\n\n const key = textToKey[text];\n path.node.value = t.jsxExpressionContainer(\n t.callExpression(t.identifier(\"t\"), [t.stringLiteral(key)]),\n );\n stringsWrapped++;\n\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n },\n\n ObjectProperty(path: NodePath<t.ObjectProperty>) {\n if (!isInsideFunction(path)) return;\n\n const keyNode = path.node.key;\n if (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n return;\n const propName =\n keyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n if (!isContentProperty(propName)) return;\n\n const valueNode = path.node.value;\n if (valueNode.type !== \"StringLiteral\") return;\n\n const text = valueNode.value;\n if (!text || !(text in textToKey)) return;\n\n const key = textToKey[text];\n path.node.value = t.callExpression(t.identifier(\"t\"), [\n t.stringLiteral(key),\n ]);\n stringsWrapped++;\n\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n },\n });\n\n if (stringsWrapped === 0) {\n return { code: generate(ast).code, stringsWrapped: 0, modified: false };\n }\n\n if (!hasUseTranslationsImport(ast, importSource)) {\n const importDecl = t.importDeclaration(\n [\n t.importSpecifier(\n t.identifier(\"useTranslations\"),\n t.identifier(\"useTranslations\"),\n ),\n ],\n t.stringLiteral(importSource),\n );\n\n const lastImportIndex = findLastImportIndex(ast);\n if (lastImportIndex >= 0) {\n ast.program.body.splice(lastImportIndex + 1, 0, importDecl);\n } else {\n ast.program.body.unshift(importDecl);\n }\n }\n\n if (!hasUseTranslationsCall(ast)) {\n traverse(ast, {\n FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n const name = path.node.id?.name;\n if (!name || !componentsNeedingT.has(name)) return;\n injectTDeclaration(path);\n },\n VariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n if (path.node.id.type !== \"Identifier\") return;\n const name = path.node.id.name;\n if (!componentsNeedingT.has(name)) return;\n\n const init = path.node.init;\n if (!init) return;\n\n if (\n init.type === \"ArrowFunctionExpression\" ||\n init.type === \"FunctionExpression\"\n ) {\n if (init.body.type === \"BlockStatement\") {\n injectTIntoBlock(init.body);\n }\n }\n },\n noScope: true,\n });\n }\n\n const output = generate(ast, { retainLines: false });\n return { code: output.code, stringsWrapped, modified: true };\n}\n\nfunction injectTDeclaration(path: NodePath<t.FunctionDeclaration>): void {\n const body = path.node.body;\n if (body.type !== \"BlockStatement\") return;\n injectTIntoBlock(body);\n}\n\nfunction injectTIntoBlock(block: t.BlockStatement): void {\n for (const stmt of block.body) {\n if (\n stmt.type === \"VariableDeclaration\" &&\n stmt.declarations.some(\n (d) =>\n d.id.type === \"Identifier\" &&\n d.id.name === \"t\" &&\n d.init?.type === \"CallExpression\" &&\n d.init.callee.type === \"Identifier\" &&\n d.init.callee.name === \"useTranslations\",\n )\n ) {\n return;\n }\n }\n\n const tDecl = t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(\"t\"),\n t.callExpression(t.identifier(\"useTranslations\"), []),\n ),\n ]);\n\n block.body.unshift(tDecl);\n}\n\nfunction isClientFile(ast: File): boolean {\n if (ast.program.directives) {\n for (const directive of ast.program.directives) {\n if (directive.value?.value === \"use client\") {\n return true;\n }\n }\n }\n for (const node of ast.program.body) {\n if (\n node.type === \"ExpressionStatement\" &&\n node.expression.type === \"StringLiteral\" &&\n node.expression.value === \"use client\"\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction hasInlineImport(\n ast: File,\n componentPath: string,\n): { hasT: boolean; hasHook: boolean } {\n let hasT = false;\n let hasHook = false;\n for (const node of ast.program.body) {\n if (node.type !== \"ImportDeclaration\") continue;\n const src = node.source.value;\n if (\n src !== componentPath &&\n src !== `${componentPath}-server` &&\n src !== `${componentPath}/t-server`\n )\n continue;\n for (const spec of node.specifiers) {\n if (\n spec.type === \"ImportSpecifier\" &&\n spec.imported.type === \"Identifier\"\n ) {\n if (spec.imported.name === \"T\") hasT = true;\n if (spec.imported.name === \"useT\" || spec.imported.name === \"createT\")\n hasHook = true;\n }\n }\n }\n return { hasT, hasHook };\n}\n\nfunction hasInlineHookCall(ast: File, hookName: string): boolean {\n let found = false;\n traverse(ast, {\n VariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n const init = path.node.init;\n if (\n init?.type === \"CallExpression\" &&\n init.callee.type === \"Identifier\" &&\n init.callee.name === hookName\n ) {\n found = true;\n path.stop();\n }\n },\n noScope: true,\n });\n return found;\n}\n\nfunction transformInline(\n ast: File,\n textToKey: Record<string, string>,\n options: TransformOptions,\n): TransformResult {\n const componentPath = options.componentPath ?? \"@/components/t\";\n const isClient = isClientFile(ast);\n let stringsWrapped = 0;\n const componentsNeedingT = new Set<string>();\n let needsTComponent = false;\n let repaired = false;\n\n if (!isClient) {\n traverse(ast, {\n CallExpression(path: NodePath<t.CallExpression>) {\n if (\n path.node.callee.type === \"Identifier\" &&\n path.node.callee.name === \"createT\" &&\n path.node.arguments.length > 0 &&\n path.node.arguments[0].type === \"Identifier\"\n ) {\n const argName = (path.node.arguments[0] as t.Identifier).name;\n if (!path.scope.hasBinding(argName)) {\n logWarning(\n `Repaired createT(${argName}) → createT() — \"${argName}\" was not in scope`,\n );\n path.node.arguments = [];\n repaired = true;\n }\n }\n },\n });\n }\n\n traverse(ast, {\n JSXText(path: NodePath<t.JSXText>) {\n const text = path.node.value.trim();\n if (!text || !(text in textToKey)) return;\n\n const parent = path.parentPath;\n if (!parent?.isJSXElement()) return;\n\n const parentOpening = parent.node.openingElement;\n if (\n parentOpening.name.type === \"JSXIdentifier\" &&\n parentOpening.name.name === \"T\"\n ) {\n return;\n }\n\n const key = textToKey[text];\n needsTComponent = true;\n\n const tElement = t.jsxElement(\n t.jsxOpeningElement(t.jsxIdentifier(\"T\"), [\n t.jsxAttribute(t.jsxIdentifier(\"id\"), t.stringLiteral(key)),\n ]),\n t.jsxClosingElement(t.jsxIdentifier(\"T\")),\n [t.jsxText(text)],\n false,\n );\n\n const siblings = parent.node.children.filter((child: JSXChild) => {\n if (child.type === \"JSXText\") return child.value.trim().length > 0;\n return true;\n });\n\n if (siblings.length === 1) {\n path.replaceWith(tElement);\n } else {\n const raw = path.node.value;\n const hasLeading = raw !== raw.trimStart();\n const hasTrailing = raw !== raw.trimEnd();\n const nodes: t.Node[] = [];\n if (hasLeading) {\n nodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n }\n nodes.push(tElement);\n if (hasTrailing) {\n nodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n }\n path.replaceWithMultiple(nodes);\n }\n\n stringsWrapped++;\n },\n\n JSXAttribute(path: NodePath<t.JSXAttribute>) {\n const value = path.node.value;\n if (!value) return;\n\n let text: string | undefined;\n\n if (value.type === \"StringLiteral\") {\n text = value.value;\n } else if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"StringLiteral\"\n ) {\n text = value.expression.value;\n }\n\n if (!text || !(text in textToKey)) return;\n\n if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"CallExpression\" &&\n value.expression.callee.type === \"Identifier\" &&\n value.expression.callee.name === \"t\"\n ) {\n return;\n }\n\n const key = textToKey[text];\n path.node.value = t.jsxExpressionContainer(\n t.callExpression(t.identifier(\"t\"), [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ]),\n );\n stringsWrapped++;\n\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n },\n\n ObjectProperty(path: NodePath<t.ObjectProperty>) {\n if (!isInsideFunction(path)) return;\n\n const keyNode = path.node.key;\n if (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n return;\n const propName =\n keyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n if (!isContentProperty(propName)) return;\n\n const valueNode = path.node.value;\n if (valueNode.type !== \"StringLiteral\") return;\n\n const text = valueNode.value;\n if (!text || !(text in textToKey)) return;\n\n const key = textToKey[text];\n path.node.value = t.callExpression(t.identifier(\"t\"), [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ]);\n stringsWrapped++;\n\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n },\n });\n\n if (stringsWrapped === 0 && !repaired) {\n return { code: generate(ast).code, stringsWrapped: 0, modified: false };\n }\n\n if (stringsWrapped === 0 && repaired) {\n const output = generate(ast, { retainLines: false });\n return { code: output.code, stringsWrapped: 0, modified: true };\n }\n\n const needsHook = componentsNeedingT.size > 0;\n const hookName = isClient ? \"useT\" : \"createT\";\n const importPath = isClient ? componentPath : `${componentPath}-server`;\n const existing = hasInlineImport(ast, componentPath);\n\n const specifiers: t.ImportSpecifier[] = [];\n if (needsTComponent && !existing.hasT) {\n specifiers.push(t.importSpecifier(t.identifier(\"T\"), t.identifier(\"T\")));\n }\n if (needsHook && !existing.hasHook) {\n specifiers.push(\n t.importSpecifier(t.identifier(hookName), t.identifier(hookName)),\n );\n }\n\n if (specifiers.length > 0) {\n let appended = false;\n for (const node of ast.program.body) {\n if (\n node.type === \"ImportDeclaration\" &&\n (node.source.value === importPath ||\n node.source.value === componentPath)\n ) {\n node.specifiers.push(...specifiers);\n node.source.value = importPath;\n appended = true;\n break;\n }\n }\n\n if (!appended) {\n const importDecl = t.importDeclaration(\n specifiers,\n t.stringLiteral(importPath),\n );\n const lastImportIndex = findLastImportIndex(ast);\n\n if (lastImportIndex >= 0) {\n ast.program.body.splice(lastImportIndex + 1, 0, importDecl);\n } else {\n let insertIdx = 0;\n if (\n ast.program.body[0]?.type === \"ExpressionStatement\" &&\n (ast.program.body[0] as t.ExpressionStatement).expression.type ===\n \"StringLiteral\" &&\n (\n (ast.program.body[0] as t.ExpressionStatement)\n .expression as t.StringLiteral\n ).value === \"use client\"\n ) {\n insertIdx = 1;\n }\n ast.program.body.splice(insertIdx, 0, importDecl);\n }\n }\n }\n\n if (needsHook && !hasInlineHookCall(ast, hookName)) {\n const hookCall = isClient\n ? t.callExpression(t.identifier(\"useT\"), [])\n : t.callExpression(t.identifier(\"createT\"), []);\n\n traverse(ast, {\n FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n const name = path.node.id?.name;\n if (!name || !componentsNeedingT.has(name)) return;\n const body = path.node.body;\n if (body.type !== \"BlockStatement\") return;\n injectInlineHookIntoBlock(body, hookCall);\n },\n VariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n if (path.node.id.type !== \"Identifier\") return;\n const name = path.node.id.name;\n if (!componentsNeedingT.has(name)) return;\n\n const init = path.node.init;\n if (!init) return;\n\n if (\n init.type === \"ArrowFunctionExpression\" ||\n init.type === \"FunctionExpression\"\n ) {\n if (init.body.type === \"BlockStatement\") {\n injectInlineHookIntoBlock(init.body, hookCall);\n }\n }\n },\n noScope: true,\n });\n }\n\n const output = generate(ast, { retainLines: false });\n return { code: output.code, stringsWrapped, modified: true };\n}\n\nfunction injectInlineHookIntoBlock(\n block: t.BlockStatement,\n hookCall: t.CallExpression,\n): void {\n for (const stmt of block.body) {\n if (\n stmt.type === \"VariableDeclaration\" &&\n stmt.declarations.some(\n (d) =>\n d.id.type === \"Identifier\" &&\n d.id.name === \"t\" &&\n d.init?.type === \"CallExpression\" &&\n d.init.callee.type === \"Identifier\" &&\n (d.init.callee.name === \"useT\" || d.init.callee.name === \"createT\"),\n )\n ) {\n return;\n }\n }\n\n const tDecl = t.variableDeclaration(\"const\", [\n t.variableDeclarator(t.identifier(\"t\"), hookCall),\n ]);\n\n block.body.unshift(tDecl);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { glob } from \"tinyglobby\";\nimport { parseFile } from \"../scanner/parser.js\";\nimport { transform, type TransformOptions } from \"./transform.js\";\nimport { logVerbose } from \"../logger.js\";\n\nexport interface CodegenOptions {\n include: string[];\n exclude?: string[];\n textToKey: Record<string, string>;\n i18nImport?: string;\n mode?: \"keys\" | \"inline\";\n componentPath?: string;\n}\n\nexport interface CodegenResult {\n filesModified: number;\n stringsWrapped: number;\n filesProcessed: number;\n}\n\nexport async function codegen(\n options: CodegenOptions,\n cwd: string = process.cwd(),\n): Promise<CodegenResult> {\n const files = await glob(options.include, {\n ignore: options.exclude ?? [],\n cwd,\n absolute: true,\n });\n\n let filesModified = 0;\n let stringsWrapped = 0;\n\n const transformOpts: TransformOptions = {\n i18nImport: options.i18nImport,\n mode: options.mode,\n componentPath: options.componentPath,\n };\n\n for (const filePath of files) {\n const code = await readFile(filePath, \"utf-8\");\n\n let ast;\n try {\n ast = parseFile(code, filePath);\n } catch (err) {\n logVerbose(\n `Skipping unparseable file ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n true,\n );\n continue;\n }\n\n const result = transform(ast, options.textToKey, transformOpts);\n\n if (result.modified) {\n await writeFile(filePath, result.code, \"utf-8\");\n filesModified++;\n stringsWrapped += result.stringsWrapped;\n }\n }\n\n return {\n filesModified,\n stringsWrapped,\n filesProcessed: files.length,\n };\n}\n","export const CLIENT_TEMPLATE = `\"use client\";\nimport { createContext, useContext, type ReactNode } from \"react\";\n\ntype Messages = Record<string, string>;\nconst I18nCtx = createContext<Messages>({});\n\nexport function I18nProvider({ messages = {}, children }: { messages?: Messages; children: ReactNode }) {\n return <I18nCtx.Provider value={messages}>{children}</I18nCtx.Provider>;\n}\n\nexport function T({ id, children }: { id?: string; children: ReactNode }) {\n const msgs = useContext(I18nCtx);\n if (!id) return <>{children}</>;\n return <>{msgs[id] ?? children}</>;\n}\n\nexport function useT() {\n const msgs = useContext(I18nCtx);\n return (text: string, id?: string): string => {\n if (!id) return text;\n return msgs[id] ?? text;\n };\n}\n`;\n\nexport const SERVER_TEMPLATE = `import type { ReactNode } from \"react\";\n\ntype Messages = Record<string, string>;\n\nexport function T({ id, children, messages = {} }: { id?: string; children: ReactNode; messages?: Messages }) {\n if (!id) return <>{children}</>;\n return <>{messages[id] ?? children}</>;\n}\n\nexport function createT(messages: Messages = {}) {\n return (text: string, id?: string): string => {\n if (!id) return text;\n return messages[id] ?? text;\n };\n}\n`;\n\nexport function generateI18nHelper(opts: {\n sourceLocale: string;\n targetLocales: string[];\n messagesDir: string;\n}): string {\n const allLocales = [opts.sourceLocale, ...opts.targetLocales];\n const allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n return `import { headers } from \"next/headers\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nconst supported = [${allLocalesStr}] as const;\ntype Locale = (typeof supported)[number];\nconst defaultLocale: Locale = \"${opts.sourceLocale}\";\n\nfunction parseAcceptLanguage(header: string): Locale {\n const langs = header\n .split(\",\")\n .map((part) => {\n const [lang, q] = part.trim().split(\";q=\");\n return { lang: lang.split(\"-\")[0].toLowerCase(), q: q ? parseFloat(q) : 1 };\n })\n .sort((a, b) => b.q - a.q);\n\n for (const { lang } of langs) {\n if (supported.includes(lang as Locale)) return lang as Locale;\n }\n return defaultLocale;\n}\n\nexport async function getLocale(): Promise<Locale> {\n const h = await headers();\n const acceptLang = h.get(\"accept-language\") ?? \"\";\n return parseAcceptLanguage(acceptLang);\n}\n\nexport async function getMessages(locale: string): Promise<Record<string, string>> {\n if (locale === defaultLocale) return {};\n try {\n const filePath = join(process.cwd(), \"${opts.messagesDir}\", \\`\\${locale}.json\\`);\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {};\n }\n}\n`;\n}\n","import * as p from \"@clack/prompts\";\nimport { existsSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport { scan } from \"./scanner/index.js\";\nimport { generateSemanticKeys } from \"./scanner/key-ai.js\";\nimport { codegen } from \"./codegen/index.js\";\nimport { translateAll } from \"./translate.js\";\nimport { writeTranslation, writeLockFile } from \"./writer.js\";\nimport { loadLockFile } from \"./diff.js\";\nimport { unflatten } from \"./flatten.js\";\nimport {\n CLIENT_TEMPLATE,\n SERVER_TEMPLATE,\n generateI18nHelper,\n} from \"./templates/t-component.js\";\nimport { parseFile } from \"./scanner/parser.js\";\n\nconst AI_PROVIDERS = {\n openai: {\n pkg: \"@ai-sdk/openai\",\n fn: \"openai\",\n defaultModel: \"gpt-4o-mini\",\n },\n anthropic: {\n pkg: \"@ai-sdk/anthropic\",\n fn: \"anthropic\",\n defaultModel: \"claude-sonnet-4-20250514\",\n },\n google: {\n pkg: \"@ai-sdk/google\",\n fn: \"google\",\n defaultModel: \"gemini-2.0-flash\",\n },\n mistral: {\n pkg: \"@ai-sdk/mistral\",\n fn: \"mistral\",\n defaultModel: \"mistral-large-latest\",\n },\n groq: {\n pkg: \"@ai-sdk/groq\",\n fn: \"groq\",\n defaultModel: \"llama-3.3-70b-versatile\",\n },\n} as const;\n\ntype ProviderKey = keyof typeof AI_PROVIDERS;\n\nconst LOCALE_OPTIONS = [\n { value: \"es\", label: \"Spanish (es)\" },\n { value: \"fr\", label: \"French (fr)\" },\n { value: \"de\", label: \"German (de)\" },\n { value: \"pt\", label: \"Portuguese (pt)\" },\n { value: \"ja\", label: \"Japanese (ja)\" },\n { value: \"zh\", label: \"Chinese (zh)\" },\n { value: \"ko\", label: \"Korean (ko)\" },\n { value: \"ru\", label: \"Russian (ru)\" },\n { value: \"ar\", label: \"Arabic (ar)\" },\n { value: \"it\", label: \"Italian (it)\" },\n];\n\nfunction detectIncludePatterns(cwd: string): string[] {\n const patterns: string[] = [];\n if (existsSync(join(cwd, \"app\")))\n patterns.push(\"app/**/*.tsx\", \"app/**/*.jsx\");\n if (existsSync(join(cwd, \"src\")))\n patterns.push(\"src/**/*.tsx\", \"src/**/*.jsx\");\n if (existsSync(join(cwd, \"pages\")))\n patterns.push(\"pages/**/*.tsx\", \"pages/**/*.jsx\");\n if (existsSync(join(cwd, \"src\", \"app\"))) {\n return patterns.filter((p) => !p.startsWith(\"app/\"));\n }\n return patterns.length > 0 ? patterns : [\"**/*.tsx\", \"**/*.jsx\"];\n}\n\nfunction cancel(): never {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n}\n\nfunction findPackageInNodeModules(cwd: string, pkg: string): boolean {\n let dir = cwd;\n const parts = pkg.split(\"/\");\n while (true) {\n if (existsSync(join(dir, \"node_modules\", ...parts, \"package.json\"))) {\n return true;\n }\n const parent = join(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n return false;\n}\n\nasync function ensurePackageInstalled(\n cwd: string,\n pkg: string,\n label: string,\n): Promise<void> {\n while (!findPackageInNodeModules(cwd, pkg)) {\n p.log.warn(`${label} (${pkg}) is not installed.`);\n const retry = await p.confirm({\n message: `Install it now with your package manager, then press Enter. Continue?`,\n });\n if (p.isCancel(retry) || !retry) cancel();\n }\n p.log.success(`${label} found.`);\n}\n\nfunction generateConfigFile(opts: {\n providerKey: ProviderKey;\n modelName: string;\n sourceLocale: string;\n targetLocales: string[];\n messagesDir: string;\n includePatterns: string[];\n i18nImport: string;\n context: string;\n tone: string;\n mode: \"keys\" | \"inline\";\n componentPath?: string;\n}): string {\n const provider = AI_PROVIDERS[opts.providerKey];\n const lines: string[] = [];\n\n lines.push(`import { ${provider.fn} } from \"${provider.pkg}\";`);\n lines.push(``);\n lines.push(`export default {`);\n lines.push(` model: ${provider.fn}(\"${opts.modelName}\"),`);\n if (opts.mode === \"inline\") {\n lines.push(` mode: \"inline\",`);\n }\n lines.push(` sourceLocale: \"${opts.sourceLocale}\",`);\n lines.push(\n ` targetLocales: [${opts.targetLocales.map((l) => `\"${l}\"`).join(\", \")}],`,\n );\n lines.push(` messagesDir: \"${opts.messagesDir}\",`);\n\n const hasTranslation = opts.context || opts.tone !== \"neutral\";\n if (hasTranslation) {\n lines.push(` translation: {`);\n if (opts.context) {\n lines.push(` context: \"${opts.context}\",`);\n }\n if (opts.tone !== \"neutral\") {\n lines.push(` tone: \"${opts.tone}\",`);\n }\n lines.push(` },`);\n }\n\n lines.push(` scan: {`);\n lines.push(\n ` include: [${opts.includePatterns.map((p) => `\"${p}\"`).join(\", \")}],`,\n );\n lines.push(` exclude: [\"**/*.test.*\", \"**/*.spec.*\"],`);\n if (opts.mode === \"keys\" && opts.i18nImport) {\n lines.push(` i18nImport: \"${opts.i18nImport}\",`);\n }\n lines.push(` },`);\n\n if (opts.mode === \"inline\" && opts.componentPath) {\n lines.push(` inline: {`);\n lines.push(` componentPath: \"${opts.componentPath}\",`);\n lines.push(` },`);\n }\n\n lines.push(`};`);\n lines.push(``);\n\n return lines.join(\"\\n\");\n}\n\nfunction canParse(content: string, filePath: string): boolean {\n try {\n parseFile(content, filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function safeWriteModifiedFile(\n filePath: string,\n original: string,\n modified: string,\n label: string,\n): Promise<boolean> {\n if (!canParse(modified, filePath)) {\n p.log.warn(\n `Could not safely modify ${label}. Please apply changes manually:\\n` +\n ` File: ${filePath}`,\n );\n return false;\n }\n await writeFile(filePath, modified, \"utf-8\");\n return true;\n}\n\nfunction detectSrcDir(cwd: string): boolean {\n return existsSync(join(cwd, \"src\", \"app\"));\n}\n\nfunction resolveComponentPath(cwd: string, componentPath: string): string {\n if (componentPath.startsWith(\"@/\")) {\n const rel = componentPath.slice(2);\n const useSrc = existsSync(join(cwd, \"src\"));\n return join(cwd, useSrc ? \"src\" : \"\", rel);\n }\n if (componentPath.startsWith(\"~/\")) {\n return join(cwd, componentPath.slice(2));\n }\n return join(cwd, componentPath);\n}\n\nfunction findLayoutFile(base: string): string | undefined {\n for (const ext of [\"tsx\", \"jsx\", \"ts\", \"js\"]) {\n const candidate = join(base, \"app\", `layout.${ext}`);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\nasync function createEmptyMessageFiles(\n msgDir: string,\n locales: string[],\n): Promise<void> {\n await mkdir(msgDir, { recursive: true });\n for (const locale of locales) {\n const msgFile = join(msgDir, `${locale}.json`);\n if (!existsSync(msgFile)) {\n await writeFile(msgFile, \"{}\\n\", \"utf-8\");\n }\n }\n}\n\nfunction insertImportsAfterLast(content: string, importLines: string): string {\n const lastImportIdx = content.lastIndexOf(\"import \");\n const endOfLastImport = content.indexOf(\"\\n\", lastImportIdx);\n return (\n content.slice(0, endOfLastImport + 1) +\n importLines +\n content.slice(endOfLastImport + 1)\n );\n}\n\nfunction ensureAsyncLayout(content: string): string {\n if (content.match(/async\\s+function\\s+\\w*Layout/)) return content;\n return content.replace(\n /export\\s+default\\s+function\\s+(\\w*Layout)/,\n \"export default async function $1\",\n );\n}\n\nasync function setupNextIntl(\n cwd: string,\n sourceLocale: string,\n targetLocales: string[],\n messagesDir: string,\n): Promise<void> {\n const useSrc = detectSrcDir(cwd);\n const base = useSrc ? join(cwd, \"src\") : cwd;\n const allLocales = [sourceLocale, ...targetLocales];\n const filesCreated: string[] = [];\n\n const i18nDir = join(base, \"i18n\");\n await mkdir(i18nDir, { recursive: true });\n\n const requestFile = join(i18nDir, \"request.ts\");\n if (!existsSync(requestFile)) {\n const relMessages = relative(i18nDir, join(cwd, messagesDir));\n const allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n await writeFile(\n requestFile,\n `import { getRequestConfig } from \"next-intl/server\";\nimport { headers } from \"next/headers\";\n\nconst supported = [${allLocalesStr}] as const;\ntype Locale = (typeof supported)[number];\nconst defaultLocale: Locale = \"${sourceLocale}\";\n\nfunction parseAcceptLanguage(header: string): Locale {\n const langs = header\n .split(\",\")\n .map((part) => {\n const [lang, q] = part.trim().split(\";q=\");\n return { lang: lang.split(\"-\")[0].toLowerCase(), q: q ? parseFloat(q) : 1 };\n })\n .sort((a, b) => b.q - a.q);\n\n for (const { lang } of langs) {\n if (supported.includes(lang as Locale)) return lang as Locale;\n }\n return defaultLocale;\n}\n\nexport default getRequestConfig(async () => {\n const h = await headers();\n const acceptLang = h.get(\"accept-language\") ?? \"\";\n const locale = parseAcceptLanguage(acceptLang);\n\n return {\n locale,\n messages: (await import(\\`${relMessages}/\\${locale}.json\\`)).default,\n };\n});\n`,\n \"utf-8\",\n );\n filesCreated.push(relative(cwd, requestFile));\n }\n\n const nextConfigPath = join(cwd, \"next.config.ts\");\n if (existsSync(nextConfigPath)) {\n const content = await readFile(nextConfigPath, \"utf-8\");\n if (!content.includes(\"next-intl\")) {\n const importLine = `import createNextIntlPlugin from \"next-intl/plugin\";\\n`;\n const pluginLine = `const withNextIntl = createNextIntlPlugin();\\n`;\n\n const wrapped = content.replace(\n /export default (.+?);/,\n \"export default withNextIntl($1);\",\n );\n\n const updated = importLine + \"\\n\" + pluginLine + \"\\n\" + wrapped;\n if (\n await safeWriteModifiedFile(\n nextConfigPath,\n content,\n updated,\n \"next.config.ts\",\n )\n ) {\n filesCreated.push(\"next.config.ts (updated)\");\n }\n }\n }\n\n const layoutPath = findLayoutFile(base);\n\n if (layoutPath) {\n let layoutContent = await readFile(layoutPath, \"utf-8\");\n if (!layoutContent.includes(\"NextIntlClientProvider\")) {\n const original = layoutContent;\n const importLines =\n 'import { NextIntlClientProvider } from \"next-intl\";\\n' +\n 'import { getMessages } from \"next-intl/server\";\\n';\n\n layoutContent = insertImportsAfterLast(layoutContent, importLines);\n layoutContent = ensureAsyncLayout(layoutContent);\n\n layoutContent = layoutContent.replace(\n /return\\s*\\(/,\n \"const messages = await getMessages();\\n\\n return (\",\n );\n\n layoutContent = layoutContent.replace(\n /(<body[^>]*>)/,\n \"$1\\n <NextIntlClientProvider messages={messages}>\",\n );\n layoutContent = layoutContent.replace(\n /<\\/body>/,\n \" </NextIntlClientProvider>\\n </body>\",\n );\n\n if (\n await safeWriteModifiedFile(\n layoutPath,\n original,\n layoutContent,\n \"root layout\",\n )\n ) {\n filesCreated.push(relative(cwd, layoutPath) + \" (updated)\");\n }\n }\n }\n\n await createEmptyMessageFiles(join(cwd, messagesDir), allLocales);\n\n if (filesCreated.length > 0) {\n p.log.success(`next-intl configured: ${filesCreated.join(\", \")}`);\n }\n}\n\nasync function dropInlineComponents(\n cwd: string,\n componentPath: string,\n): Promise<void> {\n const fsPath = resolveComponentPath(cwd, componentPath);\n const dir = join(fsPath, \"..\");\n await mkdir(dir, { recursive: true });\n\n const clientFile = `${fsPath}.tsx`;\n const serverFile = `${fsPath}-server.tsx`;\n\n await writeFile(clientFile, CLIENT_TEMPLATE, \"utf-8\");\n await writeFile(serverFile, SERVER_TEMPLATE, \"utf-8\");\n\n const relClient = relative(cwd, clientFile);\n const relServer = relative(cwd, serverFile);\n p.log.success(`Created inline components: ${relClient}, ${relServer}`);\n}\n\nasync function setupInlineI18n(\n cwd: string,\n componentPath: string,\n sourceLocale: string,\n targetLocales: string[],\n messagesDir: string,\n): Promise<void> {\n const useSrc = existsSync(join(cwd, \"src\"));\n const base = useSrc ? join(cwd, \"src\") : cwd;\n const filesCreated: string[] = [];\n\n const i18nDir = join(base, \"i18n\");\n await mkdir(i18nDir, { recursive: true });\n\n const helperFile = join(i18nDir, \"index.ts\");\n if (!existsSync(helperFile)) {\n const helperContent = generateI18nHelper({\n sourceLocale,\n targetLocales,\n messagesDir,\n });\n await writeFile(helperFile, helperContent, \"utf-8\");\n filesCreated.push(relative(cwd, helperFile));\n }\n\n const layoutPath = findLayoutFile(base);\n\n if (layoutPath) {\n let layoutContent = await readFile(layoutPath, \"utf-8\");\n if (!layoutContent.includes(\"I18nProvider\")) {\n const original = layoutContent;\n const importLines =\n `import { I18nProvider } from \"${componentPath}\";\\n` +\n `import { getLocale, getMessages } from \"@/i18n\";\\n`;\n\n layoutContent = insertImportsAfterLast(layoutContent, importLines);\n layoutContent = ensureAsyncLayout(layoutContent);\n\n layoutContent = layoutContent.replace(\n /return\\s*\\(/,\n \"const locale = await getLocale();\\n\\tconst messages = await getMessages(locale);\\n\\n\\treturn (\",\n );\n\n layoutContent = layoutContent.replace(\n /(<body[^>]*>)/,\n \"$1\\n\\t\\t\\t\\t<I18nProvider messages={messages}>\",\n );\n layoutContent = layoutContent.replace(\n /<\\/body>/,\n \"\\t</I18nProvider>\\n\\t\\t\\t</body>\",\n );\n\n if (\n await safeWriteModifiedFile(\n layoutPath,\n original,\n layoutContent,\n \"root layout\",\n )\n ) {\n filesCreated.push(relative(cwd, layoutPath) + \" (updated)\");\n }\n }\n }\n\n await createEmptyMessageFiles(join(cwd, messagesDir), [\n sourceLocale,\n ...targetLocales,\n ]);\n\n if (filesCreated.length > 0) {\n p.log.success(`Inline i18n configured: ${filesCreated.join(\", \")}`);\n }\n}\n\n// --- Main wizard ---\n\nexport async function runInitWizard(): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, \"translate-kit.config.ts\");\n\n p.intro(\"translate-kit setup\");\n\n if (existsSync(configPath)) {\n const overwrite = await p.confirm({\n message: \"translate-kit.config.ts already exists. Overwrite?\",\n });\n if (p.isCancel(overwrite)) cancel();\n if (!overwrite) {\n p.outro(\"Keeping existing config.\");\n return;\n }\n }\n\n const mode = await p.select({\n message: \"Translation mode:\",\n options: [\n {\n value: \"keys\" as const,\n label: \"Keys mode\",\n hint: \"t('key') + JSON files\",\n },\n {\n value: \"inline\" as const,\n label: \"Inline mode\",\n hint: \"<T id='key'>text</T>, text stays in code\",\n },\n ],\n });\n if (p.isCancel(mode)) cancel();\n\n const providerKey = await p.select({\n message: \"AI provider:\",\n options: Object.entries(AI_PROVIDERS).map(([key, val]) => ({\n value: key as ProviderKey,\n label: key.charAt(0).toUpperCase() + key.slice(1),\n hint: val.pkg,\n })),\n });\n if (p.isCancel(providerKey)) cancel();\n\n const provider = AI_PROVIDERS[providerKey];\n\n const modelName = await p.text({\n message: \"Model:\",\n initialValue: provider.defaultModel,\n });\n if (p.isCancel(modelName)) cancel();\n\n const sourceLocale = await p.text({\n message: \"Source locale:\",\n initialValue: \"en\",\n });\n if (p.isCancel(sourceLocale)) cancel();\n\n const targetLocales = await p.multiselect({\n message: \"Target locales:\",\n options: LOCALE_OPTIONS.filter((o) => o.value !== sourceLocale),\n required: true,\n });\n if (p.isCancel(targetLocales)) cancel();\n\n const messagesDir = await p.text({\n message: \"Messages directory:\",\n initialValue: \"./messages\",\n });\n if (p.isCancel(messagesDir)) cancel();\n\n const detected = detectIncludePatterns(cwd);\n let includePatterns: string[];\n\n const useDetected = await p.confirm({\n message: `Detected: ${detected.join(\", \")} — Use these patterns?`,\n });\n if (p.isCancel(useDetected)) cancel();\n\n if (useDetected) {\n includePatterns = detected;\n } else {\n const customPatterns = await p.text({\n message: \"Include patterns (comma-separated):\",\n initialValue: \"src/**/*.tsx, src/**/*.jsx\",\n });\n if (p.isCancel(customPatterns)) cancel();\n includePatterns = customPatterns.split(\",\").map((s) => s.trim());\n }\n\n let i18nImport = \"\";\n let componentPath: string | undefined;\n\n if (mode === \"inline\") {\n const cp = await p.text({\n message: \"Component import path:\",\n initialValue: \"@/components/t\",\n });\n if (p.isCancel(cp)) cancel();\n componentPath = cp;\n } else {\n const lib = await p.text({\n message: \"i18n library:\",\n initialValue: \"next-intl\",\n });\n if (p.isCancel(lib)) cancel();\n i18nImport = lib;\n }\n\n const context = await p.text({\n message: \"Project context (optional, for better translations):\",\n placeholder: \"e.g. E-commerce platform, SaaS dashboard\",\n });\n if (p.isCancel(context)) cancel();\n\n const tone = await p.select({\n message: \"Tone:\",\n options: [\n { value: \"neutral\", label: \"Neutral\" },\n { value: \"formal\", label: \"Formal\" },\n { value: \"casual\", label: \"Casual\" },\n ],\n });\n if (p.isCancel(tone)) cancel();\n\n await ensurePackageInstalled(cwd, provider.pkg, \"AI provider\");\n\n if (i18nImport) {\n await ensurePackageInstalled(cwd, i18nImport, \"i18n library\");\n }\n\n const configContent = generateConfigFile({\n providerKey,\n modelName,\n sourceLocale,\n targetLocales,\n messagesDir,\n includePatterns,\n i18nImport,\n context: context ?? \"\",\n tone,\n mode,\n componentPath,\n });\n\n await writeFile(configPath, configContent, \"utf-8\");\n p.log.success(\"Created translate-kit.config.ts\");\n\n if (mode === \"inline\" && componentPath) {\n await dropInlineComponents(cwd, componentPath);\n await setupInlineI18n(\n cwd,\n componentPath,\n sourceLocale,\n targetLocales,\n messagesDir,\n );\n } else if (i18nImport === \"next-intl\") {\n await setupNextIntl(cwd, sourceLocale, targetLocales, messagesDir);\n }\n\n const runPipeline = await p.confirm({\n message: \"Run the full pipeline now?\",\n });\n if (p.isCancel(runPipeline)) cancel();\n\n if (!runPipeline) {\n p.outro(\"You're all set! Run translate-kit scan when ready.\");\n return;\n }\n\n let config;\n try {\n config = await loadTranslateKitConfig();\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n p.log.error(`Failed to load config: ${errMsg}`);\n p.outro(\"Config created but pipeline skipped.\");\n return;\n }\n\n const { model } = config;\n\n const scanOptions = {\n include: includePatterns,\n exclude: [\"**/*.test.*\", \"**/*.spec.*\"],\n i18nImport,\n };\n\n const s1 = p.spinner();\n s1.start(\"Scanning...\");\n const scanResult = await scan(scanOptions, cwd);\n const transformableStrings = scanResult.strings.filter(\n (s) =>\n s.type === \"jsx-text\" ||\n s.type === \"jsx-attribute\" ||\n s.type === \"object-property\",\n );\n s1.stop(\n `Scanning... ${transformableStrings.length} strings from ${scanResult.fileCount} files`,\n );\n\n if (transformableStrings.length === 0) {\n p.log.warn(\"No translatable strings found. Check your include patterns.\");\n p.outro(\"Config created, but no strings to process.\");\n return;\n }\n\n const resolvedMessagesDir = join(cwd, messagesDir);\n await mkdir(resolvedMessagesDir, { recursive: true });\n\n let existingMap: Record<string, string> = {};\n const mapPath = join(resolvedMessagesDir, \".translate-map.json\");\n try {\n existingMap = JSON.parse(await readFile(mapPath, \"utf-8\"));\n } catch {\n // No existing map file — fresh start\n }\n\n const s2 = p.spinner();\n s2.start(\"Generating keys...\");\n const textToKey = await generateSemanticKeys({\n model,\n strings: transformableStrings,\n existingMap,\n batchSize: config.translation?.batchSize ?? 50,\n concurrency: config.translation?.concurrency ?? 3,\n retries: config.translation?.retries ?? 2,\n });\n s2.stop(\"Generating keys... done\");\n\n await writeFile(mapPath, JSON.stringify(textToKey, null, 2) + \"\\n\", \"utf-8\");\n\n const messages: Record<string, string> = {};\n for (const [text, key] of Object.entries(textToKey)) {\n messages[key] = text;\n }\n\n let sourceFlat: Record<string, string>;\n\n if (mode === \"inline\") {\n sourceFlat = messages;\n } else {\n const sourceFile = join(resolvedMessagesDir, `${sourceLocale}.json`);\n const nested = unflatten(messages);\n await writeFile(\n sourceFile,\n JSON.stringify(nested, null, 2) + \"\\n\",\n \"utf-8\",\n );\n sourceFlat = messages;\n }\n\n const s3 = p.spinner();\n s3.start(\"Codegen...\");\n const codegenResult = await codegen(\n {\n include: includePatterns,\n exclude: [\"**/*.test.*\", \"**/*.spec.*\"],\n textToKey,\n i18nImport,\n mode,\n componentPath,\n },\n cwd,\n );\n s3.stop(\n `Codegen... ${codegenResult.stringsWrapped} strings wrapped in ${codegenResult.filesModified} files`,\n );\n\n const postScan = await scan(scanOptions, cwd);\n\n const keyToText: Record<string, string> = {};\n for (const [text, key] of Object.entries(textToKey)) {\n keyToText[key] = text;\n }\n\n const reconciledMessages: Record<string, string> = {};\n\n if (mode === \"inline\") {\n const tComponents = postScan.strings.filter(\n (s) => s.type === \"T-component\" && s.id,\n );\n const inlineTCalls = postScan.strings.filter(\n (s) => s.type === \"t-call\" && s.id,\n );\n for (const tc of tComponents) {\n if (tc.id && tc.id in keyToText) {\n reconciledMessages[tc.id] = keyToText[tc.id];\n }\n }\n for (const tc of inlineTCalls) {\n if (tc.id && tc.id in keyToText) {\n reconciledMessages[tc.id] = keyToText[tc.id];\n }\n }\n } else {\n const tCalls = postScan.strings.filter((s) => s.type === \"t-call\");\n for (const tCall of tCalls) {\n const key = tCall.text;\n if (key in keyToText) {\n reconciledMessages[key] = keyToText[key];\n }\n }\n\n const sourceFile = join(resolvedMessagesDir, `${sourceLocale}.json`);\n const reconciledNested = unflatten(reconciledMessages);\n await writeFile(\n sourceFile,\n JSON.stringify(reconciledNested, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n\n sourceFlat = reconciledMessages;\n\n const translationOpts = config.translation ?? {};\n\n for (const locale of targetLocales) {\n const st = p.spinner();\n st.start(`Translating ${locale}...`);\n\n const translated = await translateAll({\n model,\n entries: sourceFlat,\n sourceLocale,\n targetLocale: locale,\n options: translationOpts,\n });\n\n const targetFile = join(resolvedMessagesDir, `${locale}.json`);\n await writeTranslation(targetFile, translated, { flat: mode === \"inline\" });\n\n const lockData = await loadLockFile(resolvedMessagesDir);\n await writeLockFile(\n resolvedMessagesDir,\n sourceFlat,\n lockData,\n Object.keys(translated),\n );\n\n st.stop(`Translating ${locale}... done`);\n }\n\n p.outro(\"You're all set!\");\n}\n\n//force deploy\n","import \"dotenv/config\";\nimport { defineCommand, runMain } from \"citty\";\nimport { join } from \"node:path\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport { flatten, unflatten } from \"./flatten.js\";\nimport { loadJsonFile, loadLockFile, computeDiff } from \"./diff.js\";\nimport { translateAll } from \"./translate.js\";\nimport { writeTranslation, writeLockFile } from \"./writer.js\";\nimport { scan } from \"./scanner/index.js\";\nimport { generateSemanticKeys } from \"./scanner/key-ai.js\";\nimport { codegen } from \"./codegen/index.js\";\nimport {\n logStart,\n logLocaleStart,\n logLocaleResult,\n logSummary,\n logDryRun,\n logScanResult,\n logError,\n logInfo,\n logSuccess,\n logVerbose,\n logWarning,\n} from \"./logger.js\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport type { TranslationResult } from \"./types.js\";\n\nasync function loadMapFile(\n messagesDir: string,\n): Promise<Record<string, string>> {\n const mapPath = join(messagesDir, \".translate-map.json\");\n try {\n const content = await readFile(mapPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {};\n }\n}\n\nasync function writeMapFile(\n messagesDir: string,\n map: Record<string, string>,\n): Promise<void> {\n const mapPath = join(messagesDir, \".translate-map.json\");\n await mkdir(messagesDir, { recursive: true });\n const content = JSON.stringify(map, null, 2) + \"\\n\";\n await writeFile(mapPath, content, \"utf-8\");\n}\n\nconst translateCommand = defineCommand({\n meta: {\n name: \"translate\",\n description: \"Translate messages to target locales\",\n },\n args: {\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would be translated without executing\",\n default: false,\n },\n force: {\n type: \"boolean\",\n description: \"Ignore cache, re-translate everything\",\n default: false,\n },\n locale: {\n type: \"string\",\n description: \"Only translate a specific locale\",\n },\n verbose: {\n type: \"boolean\",\n description: \"Verbose output\",\n default: false,\n },\n },\n async run({ args }) {\n const config = await loadTranslateKitConfig();\n const { sourceLocale, targetLocales, messagesDir, model } = config;\n const opts = config.translation ?? {};\n const verbose = args.verbose;\n const mode = config.mode ?? \"keys\";\n\n const locales = args.locale ? [args.locale] : targetLocales;\n\n if (args.locale && !targetLocales.includes(args.locale)) {\n logWarning(\n `Locale \"${args.locale}\" is not in targetLocales [${targetLocales.join(\", \")}]`,\n );\n }\n\n let sourceFlat: Record<string, string>;\n\n if (mode === \"inline\") {\n const mapData = await loadMapFile(messagesDir);\n sourceFlat = {};\n for (const [text, key] of Object.entries(mapData)) {\n sourceFlat[key] = text;\n }\n } else {\n const sourceFile = join(messagesDir, `${sourceLocale}.json`);\n const sourceRaw = await loadJsonFile(sourceFile);\n sourceFlat = flatten(sourceRaw);\n }\n\n if (Object.keys(sourceFlat).length === 0) {\n logError(\n mode === \"inline\"\n ? `No keys found in .translate-map.json. Run 'translate-kit scan' first.`\n : `No keys found in ${join(messagesDir, `${sourceLocale}.json`)}`,\n );\n process.exit(1);\n }\n\n logStart(sourceLocale, locales);\n\n const results: TranslationResult[] = [];\n\n for (const locale of locales) {\n const start = Date.now();\n const targetFile = join(messagesDir, `${locale}.json`);\n\n logLocaleStart(locale);\n\n const targetRaw = await loadJsonFile(targetFile);\n const targetFlat = flatten(targetRaw);\n\n let lockData = await loadLockFile(messagesDir);\n\n if (args.force) {\n lockData = {};\n }\n\n const diffResult = computeDiff(sourceFlat, targetFlat, lockData);\n const toTranslate = { ...diffResult.added, ...diffResult.modified };\n\n if (args[\"dry-run\"]) {\n logDryRun(\n locale,\n Object.keys(diffResult.added).length,\n Object.keys(diffResult.modified).length,\n diffResult.removed.length,\n Object.keys(diffResult.unchanged).length,\n );\n continue;\n }\n\n let translated: Record<string, string> = {};\n let errors = 0;\n\n if (Object.keys(toTranslate).length > 0) {\n try {\n translated = await translateAll({\n model,\n entries: toTranslate,\n sourceLocale,\n targetLocale: locale,\n options: opts,\n onBatchComplete: (batch) => {\n logVerbose(\n `Batch complete: ${Object.keys(batch).length} keys`,\n verbose,\n );\n },\n });\n } catch (err) {\n errors = Object.keys(toTranslate).length;\n logError(\n `Translation failed for ${locale}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const finalFlat: Record<string, string> = {\n ...diffResult.unchanged,\n ...translated,\n };\n\n await writeTranslation(targetFile, finalFlat, {\n flat: mode === \"inline\",\n });\n\n const allTranslatedKeys = Object.keys(finalFlat);\n const currentLock = await loadLockFile(messagesDir);\n await writeLockFile(\n messagesDir,\n sourceFlat,\n currentLock,\n allTranslatedKeys,\n );\n\n const result: TranslationResult = {\n locale,\n translated: Object.keys(translated).length,\n cached: Object.keys(diffResult.unchanged).length,\n removed: diffResult.removed.length,\n errors,\n duration: Date.now() - start,\n };\n\n logLocaleResult(result);\n results.push(result);\n }\n\n if (!args[\"dry-run\"]) {\n logSummary(results);\n }\n },\n});\n\nconst scanCommand = defineCommand({\n meta: {\n name: \"scan\",\n description: \"Scan source code for translatable strings\",\n },\n args: {\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show found strings without writing files\",\n default: false,\n },\n },\n async run({ args }) {\n const config = await loadTranslateKitConfig();\n const mode = config.mode ?? \"keys\";\n\n if (!config.scan) {\n logError(\n \"No scan configuration found. Add a 'scan' section to your config.\",\n );\n process.exit(1);\n }\n\n const result = await scan(config.scan);\n\n const bareStrings = result.strings.filter((s) => {\n if (s.type === \"t-call\") return false;\n if (s.type === \"T-component\" && s.id) return false;\n return true;\n });\n\n logScanResult(bareStrings.length, result.fileCount);\n\n if (args[\"dry-run\"]) {\n for (const str of bareStrings) {\n logInfo(\n `\"${str.text}\" (${str.componentName ?? \"unknown\"}, ${str.file})`,\n );\n }\n if (mode === \"inline\") {\n logInfo(\n \"\\n Inline mode: no source locale JSON will be created. Source text remains in code.\",\n );\n }\n return;\n }\n\n const existingMap = await loadMapFile(config.messagesDir);\n\n if (mode === \"inline\") {\n const existingTComponents = result.strings.filter(\n (s) => s.type === \"T-component\" && s.id,\n );\n for (const tc of existingTComponents) {\n if (tc.id && !(tc.text in existingMap)) {\n existingMap[tc.text] = tc.id;\n }\n }\n const existingInlineTCalls = result.strings.filter(\n (s) => s.type === \"t-call\" && s.id,\n );\n for (const tc of existingInlineTCalls) {\n if (tc.id && !(tc.text in existingMap)) {\n existingMap[tc.text] = tc.id;\n }\n }\n }\n\n logInfo(\"Generating semantic keys...\");\n const textToKey = await generateSemanticKeys({\n model: config.model,\n strings: bareStrings,\n existingMap,\n batchSize: config.translation?.batchSize ?? 50,\n concurrency: config.translation?.concurrency ?? 3,\n retries: config.translation?.retries ?? 2,\n });\n\n await writeMapFile(config.messagesDir, textToKey);\n logSuccess(\n `Written .translate-map.json (${Object.keys(textToKey).length} keys)`,\n );\n\n if (mode === \"inline\") {\n logInfo(\n \"Inline mode: source text stays in code, no source locale JSON created.\",\n );\n } else {\n const messages: Record<string, string> = {};\n for (const [text, key] of Object.entries(textToKey)) {\n messages[key] = text;\n }\n\n const sourceFile = join(\n config.messagesDir,\n `${config.sourceLocale}.json`,\n );\n await mkdir(config.messagesDir, { recursive: true });\n const nested = unflatten(messages);\n const content = JSON.stringify(nested, null, 2) + \"\\n\";\n await writeFile(sourceFile, content, \"utf-8\");\n\n logSuccess(`Written to ${sourceFile}`);\n }\n },\n});\n\nconst codegenCommand = defineCommand({\n meta: {\n name: \"codegen\",\n description: \"Replace strings in source code with t() calls\",\n },\n args: {\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would be changed without modifying files\",\n default: false,\n },\n },\n async run({ args }) {\n const config = await loadTranslateKitConfig();\n const mode = config.mode ?? \"keys\";\n\n if (!config.scan) {\n logError(\n \"No scan configuration found. Add a 'scan' section to your config.\",\n );\n process.exit(1);\n }\n\n const textToKey = await loadMapFile(config.messagesDir);\n\n if (Object.keys(textToKey).length === 0) {\n logError(\"No .translate-map.json found. Run 'translate-kit scan' first.\");\n process.exit(1);\n }\n\n if (args[\"dry-run\"]) {\n if (mode === \"inline\") {\n logInfo(\n `\\n Would wrap ${Object.keys(textToKey).length} strings with <T> components\\n`,\n );\n for (const [text, key] of Object.entries(textToKey)) {\n logInfo(`\"${text}\" → <T id=\"${key}\">${text}</T>`);\n }\n } else {\n logInfo(\n `\\n Would replace ${Object.keys(textToKey).length} strings with t() calls\\n`,\n );\n for (const [text, key] of Object.entries(textToKey)) {\n logInfo(`\"${text}\" → t(\"${key}\")`);\n }\n }\n return;\n }\n\n const result = await codegen({\n include: config.scan.include,\n exclude: config.scan.exclude,\n textToKey,\n i18nImport: config.scan.i18nImport,\n mode,\n componentPath: config.inline?.componentPath,\n });\n\n logSuccess(\n `Codegen complete: ${result.stringsWrapped} strings wrapped in ${result.filesModified} files (${result.filesProcessed} files processed)`,\n );\n },\n});\n\nconst initCommand = defineCommand({\n meta: {\n name: \"init\",\n description: \"Interactive setup wizard for translate-kit\",\n },\n async run() {\n const { runInitWizard } = await import(\"./init.js\");\n await runInitWizard();\n },\n});\n\nconst main = defineCommand({\n meta: {\n name: \"translate-kit\",\n version: \"0.1.0\",\n description: \"AI-powered translation SDK for build time\",\n },\n subCommands: {\n translate: translateCommand,\n scan: scanCommand,\n codegen: codegenCommand,\n init: initCommand,\n },\n // Default to translate command\n async run({ rawArgs }) {\n if (rawArgs.length === 0 || rawArgs[0]?.startsWith(\"-\")) {\n await translateCommand.run!({\n args: {\n _: rawArgs,\n \"dry-run\": false,\n force: false,\n verbose: false,\n locale: \"\",\n },\n rawArgs,\n cmd: translateCommand,\n });\n }\n },\n});\n\nrunMain(main);\n"],"mappings":"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","names":["z","join","p","text","text","createHash","text","readFile","generateObject","z","pLimit","buildPrompt","text","_traverse","traverse","text","output","readFile","writeFile","glob","join","readFile","writeFile","mkdir","p","cancel","text","join","readFile","writeFile","mkdir","text","runInitWizard"]}
@@ -0,0 +1,62 @@
1
+ import { LanguageModel } from 'ai';
2
+
3
+ interface TranslationOptions {
4
+ batchSize?: number;
5
+ context?: string;
6
+ glossary?: Record<string, string>;
7
+ tone?: string;
8
+ retries?: number;
9
+ concurrency?: number;
10
+ }
11
+ interface ScanOptions {
12
+ include: string[];
13
+ exclude?: string[];
14
+ keyStrategy?: "hash" | "path";
15
+ translatableProps?: string[];
16
+ i18nImport?: string;
17
+ }
18
+ interface InlineOptions {
19
+ componentPath: string;
20
+ }
21
+ interface TranslateKitConfig {
22
+ model: LanguageModel;
23
+ mode?: "keys" | "inline";
24
+ sourceLocale: string;
25
+ targetLocales: string[];
26
+ messagesDir: string;
27
+ translation?: TranslationOptions;
28
+ scan?: ScanOptions;
29
+ inline?: InlineOptions;
30
+ }
31
+ interface DiffResult {
32
+ added: Record<string, string>;
33
+ modified: Record<string, string>;
34
+ removed: string[];
35
+ unchanged: Record<string, string>;
36
+ }
37
+ interface LockFile {
38
+ [key: string]: string;
39
+ }
40
+ interface ExtractedString {
41
+ text: string;
42
+ type: "jsx-text" | "jsx-attribute" | "jsx-expression" | "object-property" | "t-call" | "T-component";
43
+ file: string;
44
+ line: number;
45
+ column: number;
46
+ componentName?: string;
47
+ propName?: string;
48
+ parentTag?: string;
49
+ id?: string;
50
+ }
51
+ interface TranslationResult {
52
+ locale: string;
53
+ translated: number;
54
+ cached: number;
55
+ removed: number;
56
+ errors: number;
57
+ duration: number;
58
+ }
59
+
60
+ declare function defineConfig(config: TranslateKitConfig): TranslateKitConfig;
61
+
62
+ export { type DiffResult, type ExtractedString, type InlineOptions, type LockFile, type ScanOptions, type TranslateKitConfig, type TranslationOptions, type TranslationResult, defineConfig };
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ // src/config.ts
2
+ import { loadConfig } from "c12";
3
+ import { z } from "zod";
4
+ var configSchema = z.object({
5
+ model: z.custom(
6
+ (val) => val != null && typeof val === "object",
7
+ { message: "model must be an AI SDK LanguageModel instance" }
8
+ ),
9
+ mode: z.enum(["keys", "inline"]).default("keys"),
10
+ sourceLocale: z.string().min(1),
11
+ targetLocales: z.array(z.string().min(1)).min(1),
12
+ messagesDir: z.string().min(1),
13
+ translation: z.object({
14
+ batchSize: z.number().int().positive().default(50),
15
+ context: z.string().optional(),
16
+ glossary: z.record(z.string()).optional(),
17
+ tone: z.string().optional(),
18
+ retries: z.number().int().min(0).default(2),
19
+ concurrency: z.number().int().positive().default(3)
20
+ }).optional(),
21
+ scan: z.object({
22
+ include: z.array(z.string()),
23
+ exclude: z.array(z.string()).optional(),
24
+ keyStrategy: z.enum(["hash", "path"]).default("hash"),
25
+ translatableProps: z.array(z.string()).default(["placeholder", "title", "alt", "aria-label"]),
26
+ i18nImport: z.string().default("next-intl")
27
+ }).optional(),
28
+ inline: z.object({
29
+ componentPath: z.string().min(1)
30
+ }).optional()
31
+ }).refine((data) => data.mode !== "inline" || data.inline != null, {
32
+ message: "inline options are required when mode is 'inline'",
33
+ path: ["inline"]
34
+ });
35
+ function defineConfig(config) {
36
+ return config;
37
+ }
38
+ export {
39
+ defineConfig
40
+ };
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { loadConfig } from \"c12\";\nimport { z } from \"zod\";\nimport type { TranslateKitConfig } from \"./types.js\";\n\nconst configSchema = z\n .object({\n model: z.custom<TranslateKitConfig[\"model\"]>(\n (val) => val != null && typeof val === \"object\",\n { message: \"model must be an AI SDK LanguageModel instance\" },\n ),\n mode: z.enum([\"keys\", \"inline\"]).default(\"keys\"),\n sourceLocale: z.string().min(1),\n targetLocales: z.array(z.string().min(1)).min(1),\n messagesDir: z.string().min(1),\n translation: z\n .object({\n batchSize: z.number().int().positive().default(50),\n context: z.string().optional(),\n glossary: z.record(z.string()).optional(),\n tone: z.string().optional(),\n retries: z.number().int().min(0).default(2),\n concurrency: z.number().int().positive().default(3),\n })\n .optional(),\n scan: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\n keyStrategy: z.enum([\"hash\", \"path\"]).default(\"hash\"),\n translatableProps: z\n .array(z.string())\n .default([\"placeholder\", \"title\", \"alt\", \"aria-label\"]),\n i18nImport: z.string().default(\"next-intl\"),\n })\n .optional(),\n inline: z\n .object({\n componentPath: z.string().min(1),\n })\n .optional(),\n })\n .refine((data) => data.mode !== \"inline\" || data.inline != null, {\n message: \"inline options are required when mode is 'inline'\",\n path: [\"inline\"],\n });\n\nexport function defineConfig(config: TranslateKitConfig) {\n return config as TranslateKitConfig;\n}\n\nexport async function loadTranslateKitConfig(): Promise<TranslateKitConfig> {\n const { config } = await loadConfig({\n name: \"translate-kit\",\n });\n\n if (!config || Object.keys(config).length === 0) {\n throw new Error(\n \"No config found. Create a translate-kit.config.ts file or run `translate-kit init`.\",\n );\n }\n\n const result = configSchema.safeParse(config);\n if (!result.success) {\n const errors = result.error.issues\n .map((i) => ` - ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid config:\\n${errors}`);\n }\n\n return result.data as TranslateKitConfig;\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAC3B,SAAS,SAAS;AAGlB,IAAM,eAAe,EAClB,OAAO;AAAA,EACN,OAAO,EAAE;AAAA,IACP,CAAC,QAAQ,OAAO,QAAQ,OAAO,QAAQ;AAAA,IACvC,EAAE,SAAS,iDAAiD;AAAA,EAC9D;AAAA,EACA,MAAM,EAAE,KAAK,CAAC,QAAQ,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAAA,EAC/C,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAC/C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,aAAa,EACV,OAAO;AAAA,IACN,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,IACjD,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACxC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAC1C,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpD,CAAC,EACA,SAAS;AAAA,EACZ,MAAM,EACH,OAAO;AAAA,IACN,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IAC3B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACtC,aAAa,EAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA,IACpD,mBAAmB,EAChB,MAAM,EAAE,OAAO,CAAC,EAChB,QAAQ,CAAC,eAAe,SAAS,OAAO,YAAY,CAAC;AAAA,IACxD,YAAY,EAAE,OAAO,EAAE,QAAQ,WAAW;AAAA,EAC5C,CAAC,EACA,SAAS;AAAA,EACZ,QAAQ,EACL,OAAO;AAAA,IACN,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,CAAC,EACA,SAAS;AACd,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,SAAS,YAAY,KAAK,UAAU,MAAM;AAAA,EAC/D,SAAS;AAAA,EACT,MAAM,CAAC,QAAQ;AACjB,CAAC;AAEI,SAAS,aAAa,QAA4B;AACvD,SAAO;AACT;","names":[]}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "translate-kit",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered translation SDK for build time. Compatible with next-intl.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "guillermolg00",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/guillermolg00/translate-kit.git"
11
+ },
12
+ "homepage": "https://github.com/guillermolg00/translate-kit",
13
+ "bugs": "https://github.com/guillermolg00/translate-kit/issues",
14
+ "keywords": [
15
+ "translate",
16
+ "i18n",
17
+ "internationalization",
18
+ "next-intl",
19
+ "ai",
20
+ "translation",
21
+ "build-time",
22
+ "vercel-ai-sdk",
23
+ "localization"
24
+ ],
25
+ "engines": {
26
+ "node": ">=18"
27
+ },
28
+ "bin": {
29
+ "translate-kit": "./dist/cli.js"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "import": "./dist/index.js",
34
+ "types": "./dist/index.d.ts"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "scripts": {
41
+ "build": "tsup",
42
+ "dev": "tsup --watch",
43
+ "test": "vitest run",
44
+ "test:watch": "vitest",
45
+ "typecheck": "tsc --noEmit",
46
+ "prepublishOnly": "bun run build"
47
+ },
48
+ "dependencies": {
49
+ "@babel/generator": "^7.24.0",
50
+ "@babel/parser": "^7.24.0",
51
+ "@babel/traverse": "^7.24.0",
52
+ "@babel/types": "^7.24.0",
53
+ "@clack/prompts": "^0.10.0",
54
+ "c12": "^2.0.0",
55
+ "citty": "^0.1.6",
56
+ "dotenv": "^17.2.4",
57
+ "p-limit": "^6.1.0",
58
+ "picocolors": "^1.1.0",
59
+ "tinyglobby": "^0.2.15",
60
+ "zod": "^3.23.0"
61
+ },
62
+ "devDependencies": {
63
+ "@types/babel__generator": "^7.6.0",
64
+ "@types/babel__traverse": "^7.20.0",
65
+ "@types/node": "^22.0.0",
66
+ "tsup": "^8.0.0",
67
+ "typescript": "^5.5.0",
68
+ "vitest": "^2.0.0"
69
+ },
70
+ "peerDependencies": {
71
+ "ai": ">=4.0.0"
72
+ }
73
+ }