translate-kit 0.3.0 → 0.4.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.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/flatten.ts","../src/diff.ts","../src/scanner/parser.ts","../src/scanner/filters.ts","../src/utils/ast-helpers.ts","../src/utils/template-literal.ts","../src/scanner/extractor.ts","../src/scanner/context-enricher.ts","../src/logger.ts","../src/scanner/index.ts","../src/scanner/key-ai.ts","../src/codegen/transform.ts","../src/codegen/index.ts","../src/validate.ts","../src/translate.ts","../src/writer.ts","../src/pipeline.ts","../src/usage.ts","../src/cli-utils.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 validatePlaceholders: z.boolean().default(true).optional(),\n })\n .optional(),\n scan: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\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 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}","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 /^[^\\p{L}]*$/u, // No letters at all (Unicode-aware)\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 type { Expression, TemplateLiteral } from \"@babel/types\";\nimport * as t from \"@babel/types\";\n\nexport interface TemplateLiteralInfo {\n text: string;\n placeholders: string[];\n}\n\nfunction memberExpressionToName(node: Expression): string | null {\n if (node.type === \"Identifier\") return node.name;\n if (\n node.type === \"MemberExpression\" &&\n !node.computed &&\n node.property.type === \"Identifier\"\n ) {\n const objectName = memberExpressionToName(node.object as Expression);\n if (!objectName) return null;\n const prop = node.property.name;\n return objectName + prop.charAt(0).toUpperCase() + prop.slice(1);\n }\n return null;\n}\n\nexport function buildTemplateLiteralText(\n quasis: TemplateLiteral[\"quasis\"],\n expressions: TemplateLiteral[\"expressions\"],\n): TemplateLiteralInfo | null {\n const placeholders: string[] = [];\n const usedNames = new Set<string>();\n let text = \"\";\n\n for (let i = 0; i < quasis.length; i++) {\n text += quasis[i].value.cooked ?? quasis[i].value.raw;\n\n if (i < expressions.length) {\n const expr = expressions[i];\n let name: string | null = null;\n\n if (expr.type === \"Identifier\") {\n name = expr.name;\n } else if (expr.type === \"MemberExpression\") {\n name = memberExpressionToName(expr);\n }\n\n if (name === null) return null;\n\n let finalName = name;\n if (usedNames.has(finalName)) {\n let suffix = 2;\n while (usedNames.has(`${name}${suffix}`)) suffix++;\n finalName = `${name}${suffix}`;\n }\n\n usedNames.add(finalName);\n placeholders.push(finalName);\n text += `{${finalName}}`;\n }\n }\n\n return { text, placeholders };\n}\n\nexport function buildValuesObject(\n expressions: TemplateLiteral[\"expressions\"],\n placeholders: string[],\n): t.ObjectExpression {\n const properties = placeholders.map((name, i) => {\n const expr = expressions[i] as Expression;\n const isShorthand =\n expr.type === \"Identifier\" && expr.name === name;\n\n return t.objectProperty(\n t.identifier(name),\n t.cloneNode(expr),\n false,\n isShorthand,\n );\n });\n\n return t.objectExpression(properties);\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 { buildTemplateLiteralText } from \"../utils/template-literal.js\";\nimport type { ExtractedString } from \"../types.js\";\nimport type { Expression, ConditionalExpression } from \"@babel/types\";\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\nfunction extractTextFromNode(node: Expression): string | null {\n if (node.type === \"StringLiteral\") {\n const trimmed = node.value.trim();\n return trimmed || null;\n }\n if (node.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(node.quasis, node.expressions);\n return info ? info.text : null;\n }\n return null;\n}\n\nfunction collectConditionalTexts(node: ConditionalExpression): string[] {\n const texts: string[] = [];\n\n for (const branch of [node.consequent, node.alternate]) {\n if (branch.type === \"ConditionalExpression\") {\n texts.push(...collectConditionalTexts(branch));\n } else {\n const text = extractTextFromNode(branch as Expression);\n if (text && !shouldIgnore(text)) {\n texts.push(text);\n }\n }\n }\n\n return texts;\n}\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 (value.type === \"JSXExpressionContainer\") {\n if (value.expression.type === \"StringLiteral\") {\n text = value.expression.value;\n } else if (value.expression.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n value.expression.quasis,\n value.expression.expressions,\n );\n if (info) text = info.text;\n } else if (value.expression.type === \"ConditionalExpression\") {\n const parentTag = getParentTagName(path);\n if (parentTag && isIgnoredTag(parentTag)) return;\n\n const texts = collectConditionalTexts(value.expression);\n for (const t of texts) {\n results.push({\n text: t,\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 return;\n }\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 if (path.parent.type === \"JSXAttribute\") return;\n\n const expr = path.node.expression;\n\n if (expr.type === \"ConditionalExpression\") {\n const parentTag = getParentTagName(path);\n if (parentTag && isIgnoredTag(parentTag)) return;\n\n const texts = collectConditionalTexts(expr);\n for (const t of texts) {\n results.push({\n text: t,\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 return;\n }\n\n let text: string | undefined;\n\n if (expr.type === \"StringLiteral\") {\n text = expr.value.trim();\n } else if (expr.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n if (info) text = info.text;\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-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; // skip module-level, codegen can't transform these\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\n if (valueNode.type === \"ConditionalExpression\") {\n const texts = collectConditionalTexts(valueNode);\n for (const t of texts) {\n results.push({\n text: t,\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 return;\n }\n\n let text: string | undefined;\n if (valueNode.type === \"StringLiteral\") {\n text = valueNode.value.trim();\n } else if (valueNode.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n valueNode.quasis,\n valueNode.expressions,\n );\n if (info) text = info.text;\n }\n\n if (!text || 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 type { ExtractedString } from \"../types.js\";\n\nexport function deriveRoutePath(filePath: string): string | undefined {\n // Next.js app router: src/app/<route>/page.tsx\n const appMatch = filePath.match(/src\\/app\\/(.+?)\\/page\\.[jt]sx?$/);\n if (appMatch) return appMatch[1].replace(/\\//g, \".\");\n\n // Next.js pages router: src/pages/<route>.tsx or pages/<route>.tsx\n const pagesMatch = filePath.match(/(?:src\\/)?pages\\/(.+?)\\.[jt]sx?$/);\n if (pagesMatch) {\n const route = pagesMatch[1].replace(/\\/index$/, \"\").replace(/\\//g, \".\");\n return route || undefined;\n }\n\n // Components: src/components/<section>/Component.tsx\n const compMatch = filePath.match(/src\\/components\\/(.+?)\\//);\n if (compMatch) return compMatch[1];\n\n return undefined;\n}\n\nexport function enrichStrings(\n strings: ExtractedString[],\n filePath: string,\n): ExtractedString[] {\n const routePath = deriveRoutePath(filePath);\n\n // Group by componentName\n const byComponent = new Map<string, ExtractedString[]>();\n for (const str of strings) {\n const key = str.componentName ?? \"__root__\";\n if (!byComponent.has(key)) byComponent.set(key, []);\n byComponent.get(key)!.push(str);\n }\n\n // Find section headings (h1-h3)\n const headings = strings.filter((s) => s.parentTag && /^h[1-3]$/.test(s.parentTag));\n const defaultHeading = headings.length > 0 ? headings[0].text : undefined;\n\n return strings.map((str) => {\n const enriched = { ...str };\n\n if (routePath) enriched.routePath = routePath;\n\n // Assign siblingTexts from same component (max 5, excluding self)\n const siblings = byComponent.get(str.componentName ?? \"__root__\") ?? [];\n const siblingTexts = siblings\n .filter((s) => s !== str)\n .slice(0, 5)\n .map((s) => s.text);\n if (siblingTexts.length > 0) enriched.siblingTexts = siblingTexts;\n\n // Assign sectionHeading\n if (defaultHeading && str.text !== defaultHeading) {\n enriched.sectionHeading = defaultHeading;\n }\n\n return enriched;\n });\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\nexport function logUsage(tokens: string, cost?: string): void {\n console.log(`\\n ${pc.dim(\"Tokens:\")} ${tokens}`);\n if (cost) console.log(` ${pc.dim(\"Est. cost:\")} ${cost}`);\n}\n\nexport function logProgress(current: number, total: number, label: string): void {\n if (!process.stdout.isTTY) return;\n const pct = total > 0 ? Math.round((current / total) * 100) : 0;\n process.stdout.write(\n `\\r ${pc.dim(label)} ${pc.bold(`${current}`)}${pc.dim(`/${total}`)} ${pc.dim(`(${pct}%)`)}`,\n );\n}\n\nexport function logProgressClear(): void {\n if (!process.stdout.isTTY) return;\n process.stdout.write(\"\\r\" + \" \".repeat(60) + \"\\r\");\n}\n","import { readFile } from \"node:fs/promises\";\nimport { glob } from \"tinyglobby\";\nimport pLimit from \"p-limit\";\nimport { parseFile } from \"./parser.js\";\nimport { extractStrings } from \"./extractor.js\";\nimport { enrichStrings } from \"./context-enricher.js\";\nimport { logVerbose } from \"../logger.js\";\nimport type { ExtractedString, ScanOptions } from \"../types.js\";\n\nexport interface ScanResult {\n strings: ExtractedString[];\n fileCount: number;\n}\n\nexport interface ScanCallbacks {\n onProgress?: (completed: number, total: number) => void;\n}\n\nexport async function scan(\n options: ScanOptions,\n cwd: string = process.cwd(),\n callbacks?: ScanCallbacks,\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\n const limit = pLimit(10);\n let completed = 0;\n\n const fileResults = await Promise.all(\n files.map((filePath) =>\n limit(async () => {\n const code = await readFile(filePath, \"utf-8\");\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 false,\n );\n completed++;\n callbacks?.onProgress?.(completed, files.length);\n return null;\n }\n const raw = extractStrings(ast, filePath, options.translatableProps);\n const strings = enrichStrings(raw, filePath);\n completed++;\n callbacks?.onProgress?.(completed, files.length);\n return { strings, filePath };\n }),\n ),\n );\n\n for (const result of fileResults) {\n if (!result) continue;\n allStrings.push(...result.strings);\n }\n\n return {\n strings: allStrings,\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 /** All texts found in the codebase (including wrapped). Used to determine which existingMap entries are still active. When omitted, defaults to texts from `strings`. */\n allTexts?: Set<string>;\n batchSize?: number;\n concurrency?: number;\n retries?: number;\n onProgress?: (completed: number, total: number) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\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 if (str.routePath) parts.push(`route: ${str.routePath}`);\n if (str.sectionHeading) parts.push(`section: \"${str.sectionHeading}\"`);\n if (str.siblingTexts?.length) {\n parts.push(`siblings: [${str.siblingTexts.slice(0, 3).map((t) => `\"${t}\"`).join(\", \")}]`);\n }\n lines.push(` ${parts.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n\ninterface KeyBatchResult {\n keys: Record<string, string>;\n usage: { inputTokens: number; outputTokens: number };\n}\n\nasync function generateKeysBatchWithRetry(\n model: LanguageModel,\n strings: ExtractedString[],\n retries: number,\n): Promise<KeyBatchResult> {\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 let totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const { object, usage } = await generateObject({\n model,\n prompt,\n schema,\n });\n\n totalUsage.inputTokens += usage.inputTokens ?? 0;\n totalUsage.outputTokens += usage.outputTokens ?? 0;\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 { keys: result, usage: totalUsage };\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 allTexts,\n batchSize = 50,\n concurrency = 3,\n retries = 2,\n onProgress,\n onUsage,\n } = input;\n\n const activeTexts = allTexts ?? new Set(strings.map((s) => s.text));\n const activeExisting: Record<string, string> = {};\n for (const [text, key] of Object.entries(existingMap)) {\n if (activeTexts.has(text)) {\n activeExisting[text] = key;\n }\n }\n\n const newStrings = strings.filter((s) => !(s.text in activeExisting));\n if (newStrings.length === 0) return activeExisting;\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 let completedStrings = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n await Promise.all(\n batches.map((batch) =>\n limit(async () => {\n const { keys, usage } = await generateKeysBatchWithRetry(model, batch, retries);\n Object.assign(allNewKeys, keys);\n totalInputTokens += usage.inputTokens;\n totalOutputTokens += usage.outputTokens;\n completedStrings += batch.length;\n onProgress?.(completedStrings, uniqueStrings.length);\n }),\n ),\n );\n\n if (totalInputTokens > 0 || totalOutputTokens > 0) {\n onUsage?.({ inputTokens: totalInputTokens, outputTokens: totalOutputTokens });\n }\n\n const resolved = resolveCollisions(allNewKeys, activeExisting);\n\n return { ...activeExisting, ...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 {\n buildTemplateLiteralText,\n buildValuesObject,\n} from \"../utils/template-literal.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 hasSubstantialSiblings(parent: NodePath<t.JSXElement>): boolean {\n const count = parent.node.children.filter((child: JSXChild) => {\n if (child.type === \"JSXText\") return child.value.trim().length > 0;\n return true;\n }).length;\n return count > 1;\n}\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 forceClient?: boolean;\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 hasGetTranslationsImport(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 === \"getTranslations\"\n ) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\nfunction transformConditionalBranch(\n node: t.Expression,\n textToKey: Record<string, string>,\n): { node: t.Expression; count: number } {\n if (node.type === \"ConditionalExpression\") {\n const cons = transformConditionalBranch(\n node.consequent as t.Expression,\n textToKey,\n );\n const alt = transformConditionalBranch(\n node.alternate as t.Expression,\n textToKey,\n );\n if (cons.count > 0 || alt.count > 0) {\n return {\n node: t.conditionalExpression(node.test, cons.node, alt.node),\n count: cons.count + alt.count,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"StringLiteral\") {\n const text = node.value.trim();\n if (text && text in textToKey) {\n const key = textToKey[text];\n return {\n node: t.callExpression(t.identifier(\"t\"), [t.stringLiteral(key)]),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(node.quasis, node.expressions);\n if (info && info.text in textToKey) {\n const key = textToKey[info.text];\n const args: t.Expression[] = [t.stringLiteral(key)];\n if (info.placeholders.length > 0) {\n args.push(buildValuesObject(node.expressions, info.placeholders));\n }\n return {\n node: t.callExpression(t.identifier(\"t\"), args),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n return { node, count: 0 };\n}\n\nfunction transformConditionalBranchInline(\n node: t.Expression,\n textToKey: Record<string, string>,\n): { node: t.Expression; count: number } {\n if (node.type === \"ConditionalExpression\") {\n const cons = transformConditionalBranchInline(\n node.consequent as t.Expression,\n textToKey,\n );\n const alt = transformConditionalBranchInline(\n node.alternate as t.Expression,\n textToKey,\n );\n if (cons.count > 0 || alt.count > 0) {\n return {\n node: t.conditionalExpression(node.test, cons.node, alt.node),\n count: cons.count + alt.count,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"StringLiteral\") {\n const text = node.value.trim();\n if (text && text in textToKey) {\n const key = textToKey[text];\n return {\n node: t.callExpression(t.identifier(\"t\"), [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ]),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(node.quasis, node.expressions);\n if (info && info.text in textToKey) {\n const key = textToKey[info.text];\n const args: t.Expression[] = [\n t.stringLiteral(info.text),\n t.stringLiteral(key),\n ];\n if (info.placeholders.length > 0) {\n args.push(buildValuesObject(node.expressions, info.placeholders));\n }\n return {\n node: t.callExpression(t.identifier(\"t\"), args),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n return { node, count: 0 };\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 const supportsServerSplit = importSource === \"next-intl\";\n const isClient =\n !supportsServerSplit || options.forceClient || detectClientFile(ast);\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 if (!hasSubstantialSiblings(parent)) {\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 JSXExpressionContainer(path: NodePath<t.JSXExpressionContainer>) {\n const expr = path.node.expression;\n if (path.parent.type === \"JSXAttribute\") return;\n\n if (expr.type === \"ConditionalExpression\") {\n const result = transformConditionalBranch(expr, textToKey);\n if (result.count > 0) {\n path.node.expression = result.node;\n stringsWrapped += result.count;\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n }\n return;\n }\n\n if (expr.type !== \"TemplateLiteral\") return;\n\n const info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n if (!info) return;\n\n const { text, placeholders } = info;\n if (!(text in textToKey)) return;\n\n const key = textToKey[text];\n const args: t.Expression[] = [t.stringLiteral(key)];\n if (placeholders.length > 0) {\n args.push(buildValuesObject(expr.expressions, placeholders));\n }\n path.node.expression = t.callExpression(t.identifier(\"t\"), args);\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 if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"ConditionalExpression\"\n ) {\n const result = transformConditionalBranch(value.expression, textToKey);\n if (result.count > 0) {\n path.node.value = t.jsxExpressionContainer(result.node);\n stringsWrapped += result.count;\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (value.type === \"StringLiteral\") {\n text = value.value;\n } else if (value.type === \"JSXExpressionContainer\") {\n if (value.expression.type === \"StringLiteral\") {\n text = value.expression.value;\n } else if (value.expression.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n value.expression.quasis,\n value.expression.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: value.expression.expressions,\n };\n }\n }\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 const args: t.Expression[] = [t.stringLiteral(key)];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = t.jsxExpressionContainer(\n t.callExpression(t.identifier(\"t\"), args),\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 compName = getComponentName(path);\n if (!compName) 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\n if (valueNode.type === \"ConditionalExpression\") {\n const result = transformConditionalBranch(valueNode, textToKey);\n if (result.count > 0) {\n path.node.value = result.node;\n stringsWrapped += result.count;\n componentsNeedingT.add(compName);\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (valueNode.type === \"StringLiteral\") {\n text = valueNode.value;\n } else if (valueNode.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n valueNode.quasis,\n valueNode.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: valueNode.expressions,\n };\n }\n }\n\n if (!text || !(text in textToKey)) return;\n\n const key = textToKey[text];\n const args: t.Expression[] = [t.stringLiteral(key)];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = t.callExpression(t.identifier(\"t\"), args);\n stringsWrapped++;\n\n componentsNeedingT.add(compName);\n },\n });\n\n if (stringsWrapped === 0) {\n return { code: generate(ast).code, stringsWrapped: 0, modified: false };\n }\n\n if (isClient) {\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 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 } else {\n const serverSource = `${importSource}/server`;\n if (!hasGetTranslationsImport(ast, serverSource)) {\n const importDecl = t.importDeclaration(\n [\n t.importSpecifier(\n t.identifier(\"getTranslations\"),\n t.identifier(\"getTranslations\"),\n ),\n ],\n t.stringLiteral(serverSource),\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 traverse(ast, {\n FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n const name = path.node.id?.name;\n if (!name || !componentsNeedingT.has(name)) return;\n path.node.async = true;\n injectAsyncTIntoBlock(path.node.body);\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 init.async = true;\n if (init.body.type === \"BlockStatement\") {\n injectAsyncTIntoBlock(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 d.init.callee.name === \"getTranslations\")) ||\n (d.init?.type === \"AwaitExpression\" &&\n d.init.argument.type === \"CallExpression\" &&\n d.init.argument.callee.type === \"Identifier\" &&\n d.init.argument.callee.name === \"getTranslations\")),\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 injectAsyncTIntoBlock(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 === \"AwaitExpression\" &&\n d.init.argument.type === \"CallExpression\" &&\n d.init.argument.callee.type === \"Identifier\" &&\n d.init.argument.callee.name === \"getTranslations\") ||\n (d.init?.type === \"CallExpression\" &&\n d.init.callee.type === \"Identifier\" &&\n d.init.callee.name === \"getTranslations\")),\n )\n ) {\n return;\n }\n }\n\n const tDecl = t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(\"t\"),\n t.awaitExpression(\n t.callExpression(t.identifier(\"getTranslations\"), []),\n ),\n ),\n ]);\n\n block.body.unshift(tDecl);\n}\n\nexport function detectClientFile(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\n // Detect files that use React hooks (use*() calls) — these are effectively\n // client components even without an explicit \"use client\" directive, since\n // they must be rendered inside a client component boundary.\n let usesHooks = false;\n traverse(ast, {\n CallExpression(path: NodePath<t.CallExpression>) {\n if (usesHooks) return;\n const callee = path.node.callee;\n if (callee.type === \"Identifier\" && /^use[A-Z]/.test(callee.name)) {\n usesHooks = true;\n }\n },\n noScope: true,\n });\n return usesHooks;\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 normalizeInlineImports(\n ast: File,\n componentPath: string,\n isClient: boolean,\n): boolean {\n const validSources = new Set([\n componentPath,\n `${componentPath}-server`,\n `${componentPath}/t-server`,\n ]);\n const desiredSource = isClient ? componentPath : `${componentPath}-server`;\n let changed = false;\n\n for (const node of ast.program.body) {\n if (node.type !== \"ImportDeclaration\") continue;\n if (!validSources.has(node.source.value)) continue;\n\n if (node.source.value !== desiredSource) {\n node.source.value = desiredSource;\n changed = true;\n }\n\n for (const spec of node.specifiers) {\n if (\n spec.type !== \"ImportSpecifier\" ||\n spec.imported.type !== \"Identifier\"\n ) {\n continue;\n }\n\n if (isClient && spec.imported.name === \"createT\") {\n spec.imported = t.identifier(\"useT\");\n changed = true;\n }\n\n if (!isClient && spec.imported.name === \"useT\") {\n spec.imported = t.identifier(\"createT\");\n changed = true;\n }\n }\n }\n\n return changed;\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 = options.forceClient || detectClientFile(ast);\n let stringsWrapped = 0;\n const componentsNeedingT = new Set<string>();\n let needsTComponent = false;\n let repaired = false;\n let boundaryRepaired = false;\n\n boundaryRepaired = normalizeInlineImports(ast, componentPath, isClient);\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 if (!hasSubstantialSiblings(parent)) {\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 JSXExpressionContainer(path: NodePath<t.JSXExpressionContainer>) {\n const expr = path.node.expression;\n if (path.parent.type === \"JSXAttribute\") return;\n\n if (expr.type === \"ConditionalExpression\") {\n const result = transformConditionalBranchInline(expr, textToKey);\n if (result.count > 0) {\n path.node.expression = result.node;\n stringsWrapped += result.count;\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n }\n return;\n }\n\n if (expr.type !== \"TemplateLiteral\") return;\n\n const info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n if (!info || !(info.text in textToKey)) return;\n\n const key = textToKey[info.text];\n const args: t.Expression[] = [\n t.stringLiteral(info.text),\n t.stringLiteral(key),\n ];\n if (info.placeholders.length > 0) {\n args.push(buildValuesObject(expr.expressions, info.placeholders));\n }\n path.node.expression = t.callExpression(t.identifier(\"t\"), args);\n stringsWrapped++;\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 if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"ConditionalExpression\"\n ) {\n const result = transformConditionalBranchInline(\n value.expression,\n textToKey,\n );\n if (result.count > 0) {\n path.node.value = t.jsxExpressionContainer(result.node);\n stringsWrapped += result.count;\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (value.type === \"StringLiteral\") {\n text = value.value;\n } else if (value.type === \"JSXExpressionContainer\") {\n if (value.expression.type === \"StringLiteral\") {\n text = value.expression.value;\n } else if (value.expression.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n value.expression.quasis,\n value.expression.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: value.expression.expressions,\n };\n }\n }\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 const args: t.Expression[] = [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = t.jsxExpressionContainer(\n t.callExpression(t.identifier(\"t\"), args),\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 compName = getComponentName(path);\n if (!compName) 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\n if (valueNode.type === \"ConditionalExpression\") {\n const result = transformConditionalBranchInline(valueNode, textToKey);\n if (result.count > 0) {\n path.node.value = result.node;\n stringsWrapped += result.count;\n componentsNeedingT.add(compName);\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (valueNode.type === \"StringLiteral\") {\n text = valueNode.value;\n } else if (valueNode.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n valueNode.quasis,\n valueNode.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: valueNode.expressions,\n };\n }\n }\n\n if (!text || !(text in textToKey)) return;\n\n const key = textToKey[text];\n const args: t.Expression[] = [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = t.callExpression(t.identifier(\"t\"), args);\n stringsWrapped++;\n\n componentsNeedingT.add(compName);\n },\n });\n\n if (stringsWrapped === 0 && !repaired && !boundaryRepaired) {\n return { code: generate(ast).code, stringsWrapped: 0, modified: false };\n }\n\n if (stringsWrapped === 0 && (repaired || boundaryRepaired)) {\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) {\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 { dirname, extname, join, resolve } from \"node:path\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport type { File } from \"@babel/types\";\nimport { glob } from \"tinyglobby\";\nimport pLimit from \"p-limit\";\nimport { parseFile } from \"../scanner/parser.js\";\nimport {\n detectClientFile,\n transform,\n type TransformOptions,\n} from \"./transform.js\";\nimport { logWarning } 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 onProgress?: (completed: number, total: number) => void;\n}\n\nexport interface CodegenResult {\n filesModified: number;\n stringsWrapped: number;\n filesProcessed: number;\n filesSkipped: number;\n}\n\ninterface ParsedFileEntry {\n filePath: string;\n code: string;\n ast?: File;\n parseError?: string;\n isClientRoot: boolean;\n}\n\nconst SOURCE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".cts\",\n \".mjs\",\n \".cjs\",\n];\n\nfunction collectRuntimeImportSources(ast: File): string[] {\n const sources: string[] = [];\n\n for (const node of ast.program.body) {\n if (node.type === \"ImportDeclaration\") {\n if (node.importKind === \"type\") continue;\n\n const allTypeSpecifiers =\n node.specifiers.length > 0 &&\n node.specifiers.every(\n (spec) =>\n spec.type === \"ImportSpecifier\" && spec.importKind === \"type\",\n );\n if (allTypeSpecifiers) continue;\n\n sources.push(node.source.value);\n continue;\n }\n\n if (node.type === \"ExportNamedDeclaration\" && node.source) {\n if (node.exportKind !== \"type\") {\n sources.push(node.source.value);\n }\n continue;\n }\n\n if (node.type === \"ExportAllDeclaration\") {\n if (node.exportKind !== \"type\") {\n sources.push(node.source.value);\n }\n }\n }\n\n return sources;\n}\n\nfunction resolveFileCandidate(\n basePath: string,\n knownFiles: Set<string>,\n): string | null {\n const candidates = new Set<string>();\n const resolvedBase = resolve(basePath);\n const baseExt = extname(resolvedBase);\n\n candidates.add(resolvedBase);\n\n if (!baseExt) {\n for (const ext of SOURCE_EXTENSIONS) {\n candidates.add(resolve(`${resolvedBase}${ext}`));\n candidates.add(resolve(join(resolvedBase, `index${ext}`)));\n }\n }\n\n // ESM imports may reference .js while source files are .ts/.tsx\n if ([\".js\", \".jsx\", \".mjs\", \".cjs\"].includes(baseExt)) {\n const noExt = resolvedBase.slice(0, -baseExt.length);\n for (const ext of SOURCE_EXTENSIONS) {\n candidates.add(resolve(`${noExt}${ext}`));\n }\n }\n\n for (const candidate of candidates) {\n if (knownFiles.has(candidate)) return candidate;\n }\n\n return null;\n}\n\nfunction resolveLocalImport(\n importerPath: string,\n source: string,\n cwd: string,\n knownFiles: Set<string>,\n): string | null {\n const baseCandidates: string[] = [];\n\n if (source.startsWith(\".\")) {\n baseCandidates.push(resolve(dirname(importerPath), source));\n } else if (source.startsWith(\"@/\")) {\n baseCandidates.push(resolve(join(cwd, \"src\", source.slice(2))));\n baseCandidates.push(resolve(join(cwd, source.slice(2))));\n } else if (source.startsWith(\"~/\")) {\n baseCandidates.push(resolve(join(cwd, source.slice(2))));\n } else if (source.startsWith(\"/\")) {\n baseCandidates.push(resolve(join(cwd, source.slice(1))));\n } else {\n return null;\n }\n\n for (const base of baseCandidates) {\n const resolved = resolveFileCandidate(base, knownFiles);\n if (resolved) return resolved;\n }\n\n return null;\n}\n\nfunction buildClientGraph(\n entries: ParsedFileEntry[],\n cwd: string,\n): Set<string> {\n const parsedEntries = entries.filter((e) => e.ast != null);\n const knownFiles = new Set(parsedEntries.map((e) => e.filePath));\n const depsByImporter = new Map<string, string[]>();\n\n for (const entry of parsedEntries) {\n const deps: string[] = [];\n const imports = collectRuntimeImportSources(entry.ast!);\n for (const source of imports) {\n const dep = resolveLocalImport(entry.filePath, source, cwd, knownFiles);\n if (dep) deps.push(dep);\n }\n depsByImporter.set(entry.filePath, deps);\n }\n\n const clientReachable = new Set<string>();\n const queue: string[] = [];\n\n for (const entry of parsedEntries) {\n if (!entry.isClientRoot) continue;\n clientReachable.add(entry.filePath);\n queue.push(entry.filePath);\n }\n\n while (queue.length > 0) {\n const filePath = queue.shift()!;\n const deps = depsByImporter.get(filePath) ?? [];\n for (const dep of deps) {\n if (clientReachable.has(dep)) continue;\n clientReachable.add(dep);\n queue.push(dep);\n }\n }\n\n return clientReachable;\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 const transformOpts: TransformOptions = {\n i18nImport: options.i18nImport,\n mode: options.mode,\n componentPath: options.componentPath,\n };\n\n const parseLimit = pLimit(10);\n const parsedEntries = await Promise.all(\n files.map((filePath) =>\n parseLimit(async (): Promise<ParsedFileEntry> => {\n const code = await readFile(filePath, \"utf-8\");\n try {\n const ast = parseFile(code, filePath);\n return {\n filePath,\n code,\n ast,\n isClientRoot: detectClientFile(ast),\n };\n } catch (err) {\n return {\n filePath,\n code,\n parseError: err instanceof Error ? err.message : String(err),\n isClientRoot: false,\n };\n }\n }),\n ),\n );\n\n const forceClientSet = buildClientGraph(parsedEntries, cwd);\n\n const limit = pLimit(10);\n let completed = 0;\n\n const fileResults = await Promise.all(\n parsedEntries.map((entry) =>\n limit(async () => {\n if (!entry.ast) {\n logWarning(\n `Skipping unparseable file ${entry.filePath}: ${entry.parseError ?? \"unknown parse error\"}`,\n );\n completed++;\n options.onProgress?.(completed, files.length);\n return { modified: false, wrapped: 0, skipped: false };\n }\n\n const fileTransformOpts: TransformOptions = {\n ...transformOpts,\n forceClient: forceClientSet.has(entry.filePath),\n };\n\n const result = transform(\n entry.ast,\n options.textToKey,\n fileTransformOpts,\n );\n\n if (result.modified) {\n try {\n parseFile(result.code, entry.filePath);\n } catch {\n logWarning(\n `Codegen produced invalid syntax for ${entry.filePath}, file was NOT modified.`,\n );\n completed++;\n options.onProgress?.(completed, files.length);\n return { modified: false, wrapped: 0, skipped: true };\n }\n\n await writeFile(entry.filePath, result.code, \"utf-8\");\n completed++;\n options.onProgress?.(completed, files.length);\n return {\n modified: true,\n wrapped: result.stringsWrapped,\n skipped: false,\n };\n }\n\n completed++;\n options.onProgress?.(completed, files.length);\n return { modified: false, wrapped: 0, skipped: false };\n }),\n ),\n );\n\n let filesModified = 0;\n let stringsWrapped = 0;\n let filesSkipped = 0;\n\n for (const r of fileResults) {\n if (r.modified) {\n filesModified++;\n stringsWrapped += r.wrapped;\n }\n if (r.skipped) filesSkipped++;\n }\n\n return {\n filesModified,\n stringsWrapped,\n filesProcessed: files.length,\n filesSkipped,\n };\n}\n","const PLACEHOLDER_REGEX =\n /\\{\\{[\\w.]+\\}\\}|\\{[\\w.]+\\}|\\{\\d+\\}|%[sd@]|%\\.\\d+f|<\\/?[\\w-]+(?:\\s[^>]*)?\\s*\\/?>|<\\/[\\w-]+>/g;\n\nexport function extractPlaceholders(text: string): string[] {\n const matches = text.match(PLACEHOLDER_REGEX);\n if (!matches) return [];\n return matches.slice().sort();\n}\n\nexport interface PlaceholderValidation {\n valid: boolean;\n missing: string[];\n extra: string[];\n}\n\nexport function validatePlaceholders(\n source: string,\n translated: string,\n): PlaceholderValidation {\n const sourcePlaceholders = extractPlaceholders(source);\n const translatedPlaceholders = extractPlaceholders(translated);\n\n const sourceCount = new Map<string, number>();\n for (const p of sourcePlaceholders) {\n sourceCount.set(p, (sourceCount.get(p) ?? 0) + 1);\n }\n\n const translatedCount = new Map<string, number>();\n for (const p of translatedPlaceholders) {\n translatedCount.set(p, (translatedCount.get(p) ?? 0) + 1);\n }\n\n const missing: string[] = [];\n const extra: string[] = [];\n\n for (const [placeholder, count] of sourceCount) {\n const tCount = translatedCount.get(placeholder) ?? 0;\n for (let i = 0; i < count - tCount; i++) {\n missing.push(placeholder);\n }\n }\n\n for (const [placeholder, count] of translatedCount) {\n const sCount = sourceCount.get(placeholder) ?? 0;\n for (let i = 0; i < count - sCount; i++) {\n extra.push(placeholder);\n }\n }\n\n return {\n valid: missing.length === 0 && extra.length === 0,\n missing,\n extra,\n };\n}\n\nexport interface BatchValidation {\n valid: boolean;\n failures: Array<{\n key: string;\n missing: string[];\n extra: string[];\n }>;\n}\n\nexport function validateBatch(\n sourceEntries: Record<string, string>,\n translatedEntries: Record<string, string>,\n): BatchValidation {\n const failures: BatchValidation[\"failures\"] = [];\n\n for (const key of Object.keys(sourceEntries)) {\n const source = sourceEntries[key];\n const translated = translatedEntries[key];\n if (translated == null) continue;\n\n const result = validatePlaceholders(source, translated);\n if (!result.valid) {\n failures.push({ key, missing: result.missing, extra: result.extra });\n }\n }\n\n return {\n valid: failures.length === 0,\n failures,\n };\n}\n","import { generateObject, type LanguageModel } from \"ai\";\nimport { z } from \"zod\";\nimport pLimit from \"p-limit\";\nimport type { TranslationOptions } from \"./types.js\";\nimport { validateBatch } from \"./validate.js\";\nimport { logWarning } from \"./logger.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\ninterface BatchResult {\n translations: Record<string, string>;\n usage: { inputTokens: number; outputTokens: number };\n}\n\nasync function translateBatchWithRetry(\n input: TranslateBatchInput,\n retries: number,\n): Promise<BatchResult> {\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 const shouldValidate = options?.validatePlaceholders !== false;\n let lastError: Error | undefined;\n let totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const { object, usage } = await generateObject({\n model,\n prompt,\n schema,\n });\n\n totalUsage.inputTokens += usage.inputTokens ?? 0;\n totalUsage.outputTokens += usage.outputTokens ?? 0;\n\n if (shouldValidate) {\n const validation = validateBatch(entries, object);\n if (!validation.valid) {\n if (attempt < retries) {\n logWarning(\n `Placeholder mismatch in batch (attempt ${attempt + 1}/${retries + 1}), retrying...`,\n );\n continue;\n }\n for (const failure of validation.failures) {\n logWarning(\n `Placeholder mismatch for key \"${failure.key}\": missing=[${failure.missing.join(\", \")}] extra=[${failure.extra.join(\", \")}]`,\n );\n }\n }\n }\n\n return { translations: object, usage: totalUsage };\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 onProgress?: (completed: number, total: number) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => 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 onProgress,\n onUsage,\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 let completedKeys = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n await Promise.all(\n batches.map((batch) =>\n limit(async () => {\n const { translations, usage } = await translateBatchWithRetry(\n { model, entries: batch, sourceLocale, targetLocale, options },\n retries,\n );\n Object.assign(results, translations);\n totalInputTokens += usage.inputTokens;\n totalOutputTokens += usage.outputTokens;\n completedKeys += Object.keys(batch).length;\n onProgress?.(completedKeys, keys.length);\n onBatchComplete?.(translations);\n }),\n ),\n );\n\n if (totalInputTokens > 0 || totalOutputTokens > 0) {\n onUsage?.({ inputTokens: totalInputTokens, outputTokens: totalOutputTokens });\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 { join } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { scan } from \"./scanner/index.js\";\nimport { generateSemanticKeys } from \"./scanner/key-ai.js\";\nimport { codegen, type CodegenResult } from \"./codegen/index.js\";\nimport { translateAll } from \"./translate.js\";\nimport { writeTranslation, writeLockFile } from \"./writer.js\";\nimport { loadJsonFile, loadLockFile, computeDiff } from \"./diff.js\";\nimport { flatten, unflatten } from \"./flatten.js\";\nimport { logWarning } from \"./logger.js\";\nimport type { TranslateKitConfig } from \"./types.js\";\n\n// --- Map file helpers (moved from cli.ts) ---\n\nexport async function loadMapFile(\n messagesDir: string,\n): Promise<Record<string, string>> {\n const mapPath = join(messagesDir, \".translate-map.json\");\n let content: string;\n try {\n content = await readFile(mapPath, \"utf-8\");\n } catch {\n return {};\n }\n try {\n return JSON.parse(content);\n } catch {\n logWarning(\n `.translate-map.json is corrupted (invalid JSON). Starting fresh.`,\n );\n return {};\n }\n}\n\nexport async 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\n// --- Scan step ---\n\nexport interface ScanStepInput {\n config: TranslateKitConfig;\n cwd: string;\n callbacks?: {\n onScanProgress?: (completed: number, total: number) => void;\n onKeygenProgress?: (completed: number, total: number) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n };\n}\n\nexport interface ScanStepResult {\n textToKey: Record<string, string>;\n sourceFlat: Record<string, string>;\n bareStringCount: number;\n fileCount: number;\n}\n\nexport async function runScanStep(\n input: ScanStepInput,\n): Promise<ScanStepResult> {\n const { config, cwd, callbacks } = input;\n const mode = config.mode ?? \"keys\";\n\n const result = await scan(config.scan!, cwd, {\n onProgress: callbacks?.onScanProgress,\n });\n\n // Blacklist filter: exclude already-wrapped strings\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 const existingMap = await loadMapFile(config.messagesDir);\n\n // Inline mode: supplement existingMap with T-components and t-calls from scan\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 // allTexts includes wrapped strings for key deduplication\n const allTexts = new Set(result.strings.map((s) => s.text));\n\n const textToKey = await generateSemanticKeys({\n model: config.model,\n strings: bareStrings,\n existingMap,\n allTexts,\n batchSize: config.translation?.batchSize ?? 50,\n concurrency: config.translation?.concurrency ?? 3,\n retries: config.translation?.retries ?? 2,\n onProgress: callbacks?.onKeygenProgress,\n onUsage: callbacks?.onUsage,\n });\n\n await writeMapFile(config.messagesDir, textToKey);\n\n // Keys mode: write source locale JSON\n const sourceFlat: Record<string, string> = {};\n for (const [text, key] of Object.entries(textToKey)) {\n sourceFlat[key] = text;\n }\n\n if (mode !== \"inline\") {\n const sourceFile = join(\n config.messagesDir,\n `${config.sourceLocale}.json`,\n );\n await mkdir(config.messagesDir, { recursive: true });\n const nested = unflatten(sourceFlat);\n const content = JSON.stringify(nested, null, 2) + \"\\n\";\n await writeFile(sourceFile, content, \"utf-8\");\n }\n\n return {\n textToKey,\n sourceFlat,\n bareStringCount: bareStrings.length,\n fileCount: result.fileCount,\n };\n}\n\n// --- Codegen step ---\n\nexport interface CodegenStepInput {\n config: TranslateKitConfig;\n cwd: string;\n textToKey?: Record<string, string>;\n callbacks?: {\n onProgress?: (completed: number, total: number) => void;\n };\n}\n\nexport async function runCodegenStep(\n input: CodegenStepInput,\n): Promise<CodegenResult> {\n const { config, cwd, callbacks } = input;\n const mode = config.mode ?? \"keys\";\n\n let textToKey = input.textToKey;\n if (!textToKey) {\n textToKey = await loadMapFile(config.messagesDir);\n if (Object.keys(textToKey).length === 0) {\n throw new Error(\n \"No .translate-map.json found. Run 'translate-kit scan' first.\",\n );\n }\n }\n\n return codegen(\n {\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 onProgress: callbacks?.onProgress,\n },\n cwd,\n );\n}\n\n// --- Translate step ---\n\nexport interface TranslateStepInput {\n config: TranslateKitConfig;\n sourceFlat?: Record<string, string>;\n locales?: string[];\n force?: boolean;\n dryRun?: boolean;\n callbacks?: {\n onLocaleProgress?: (\n locale: string,\n completed: number,\n total: number,\n ) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n };\n}\n\nexport interface TranslateLocaleResult {\n locale: string;\n translated: number;\n cached: number;\n removed: number;\n errors: number;\n duration: number;\n}\n\nexport interface TranslateStepResult {\n localeResults: TranslateLocaleResult[];\n}\n\nexport async function runTranslateStep(\n input: TranslateStepInput,\n): Promise<TranslateStepResult> {\n const { config, callbacks } = input;\n const mode = config.mode ?? \"keys\";\n const locales = input.locales ?? config.targetLocales;\n\n // Resolve sourceFlat\n let sourceFlat = input.sourceFlat;\n if (!sourceFlat) {\n if (mode === \"inline\") {\n const mapData = await loadMapFile(config.messagesDir);\n sourceFlat = {};\n for (const [text, key] of Object.entries(mapData)) {\n sourceFlat[key] = text;\n }\n } else {\n const sourceFile = join(\n config.messagesDir,\n `${config.sourceLocale}.json`,\n );\n const sourceRaw = await loadJsonFile(sourceFile);\n sourceFlat = flatten(sourceRaw);\n }\n }\n\n const localeResults: TranslateLocaleResult[] = [];\n\n for (const locale of locales) {\n const start = Date.now();\n const targetFile = join(config.messagesDir, `${locale}.json`);\n\n const targetRaw = await loadJsonFile(targetFile);\n const targetFlat = flatten(targetRaw);\n\n let lockData = await loadLockFile(config.messagesDir);\n if (input.force) {\n lockData = {};\n }\n\n const diffResult = computeDiff(sourceFlat, targetFlat, lockData);\n\n if (input.dryRun) {\n localeResults.push({\n locale,\n translated: 0,\n cached: Object.keys(diffResult.unchanged).length,\n removed: diffResult.removed.length,\n errors: 0,\n duration: Date.now() - start,\n });\n continue;\n }\n\n const toTranslate = { ...diffResult.added, ...diffResult.modified };\n let translated: Record<string, string> = {};\n let errors = 0;\n let translationFailed = false;\n\n if (Object.keys(toTranslate).length > 0) {\n try {\n translated = await translateAll({\n model: config.model,\n entries: toTranslate,\n sourceLocale: config.sourceLocale,\n targetLocale: locale,\n options: config.translation,\n onProgress: callbacks?.onLocaleProgress\n ? (c, t) => callbacks.onLocaleProgress!(locale, c, t)\n : undefined,\n onUsage: callbacks?.onUsage,\n });\n } catch (err) {\n errors = Object.keys(toTranslate).length;\n translationFailed = true;\n }\n }\n\n if (translationFailed) {\n localeResults.push({\n locale,\n translated: 0,\n cached: Object.keys(diffResult.unchanged).length,\n removed: 0,\n errors,\n duration: Date.now() - start,\n });\n continue;\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(config.messagesDir);\n await writeLockFile(\n config.messagesDir,\n sourceFlat,\n currentLock,\n allTranslatedKeys,\n );\n\n localeResults.push({\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\n return { localeResults };\n}\n","import { fetchModels, getTokenCosts } from \"tokenlens\";\nimport type { LanguageModel } from \"ai\";\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n}\n\nexport function createUsageTracker() {\n let inputTokens = 0;\n let outputTokens = 0;\n return {\n add(usage: { inputTokens?: number; outputTokens?: number }) {\n inputTokens += usage.inputTokens ?? 0;\n outputTokens += usage.outputTokens ?? 0;\n },\n get(): TokenUsage {\n return { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens };\n },\n };\n}\n\nexport async function estimateCost(\n model: LanguageModel,\n usage: TokenUsage,\n): Promise<{ totalUSD: number; inputUSD: number; outputUSD: number } | null> {\n try {\n const m = model as Record<string, unknown>;\n const provider = typeof m.provider === \"string\" ? m.provider : \"unknown\";\n const modelId = typeof m.modelId === \"string\" ? m.modelId : \"unknown\";\n const fullId = `${provider}/${modelId}`;\n const providers = await fetchModels(provider);\n const costs = getTokenCosts({\n modelId: fullId,\n usage: {\n prompt_tokens: usage.inputTokens,\n completion_tokens: usage.outputTokens,\n },\n providers,\n });\n if (costs.totalUSD == null) return null;\n return { totalUSD: costs.totalUSD, inputUSD: costs.inputUSD ?? 0, outputUSD: costs.outputUSD ?? 0 };\n } catch {\n return null;\n }\n}\n\nexport function formatUsage(usage: TokenUsage): string {\n return `${usage.inputTokens.toLocaleString()} in + ${usage.outputTokens.toLocaleString()} out = ${usage.totalTokens.toLocaleString()} tokens`;\n}\n\nexport function formatCost(usd: number): string {\n return usd < 0.01 ? `~$${usd.toFixed(4)}` : `~$${usd.toFixed(2)}`;\n}\n","/**\n * Pure functions extracted from cli.ts for testability.\n */\n\nexport interface ParsedTranslateFlags {\n dryRun: boolean;\n force: boolean;\n verbose: boolean;\n locale: string | undefined;\n}\n\n/**\n * Parse raw CLI args into translate command flags.\n * Mirrors the logic in main.run() for the default translate command.\n */\nexport function parseTranslateFlags(rawArgs: string[]): ParsedTranslateFlags {\n const dryRun = rawArgs.includes(\"--dry-run\");\n const force = rawArgs.includes(\"--force\");\n const verbose = rawArgs.includes(\"--verbose\");\n let locale: string | undefined;\n const equalsArg = rawArgs.find((a) => a.startsWith(\"--locale=\"));\n if (equalsArg) {\n locale = equalsArg.split(\"=\")[1] || undefined;\n } else {\n const idx = rawArgs.indexOf(\"--locale\");\n if (idx !== -1) {\n const next = rawArgs[idx + 1];\n locale = next && !next.startsWith(\"--\") ? next : undefined;\n }\n }\n\n return { dryRun, force, verbose, locale };\n}\n\n/**\n * Validate a locale string to prevent path traversal and injection.\n * Only allows letters, numbers, hyphens, and underscores.\n */\nexport function validateLocale(locale: string): boolean {\n return /^[a-zA-Z0-9_-]+$/.test(locale);\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, values?: Record<string, string | number>): string => {\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n}\n`;\n\nexport function serverTemplate(\n clientBasename: string,\n opts?: {\n sourceLocale: string;\n targetLocales: string[];\n messagesDir: string;\n },\n): string {\n if (!opts) {\n // Legacy fallback (no lazy loading)\n return `import type { ReactNode } from \"react\";\nimport { cache } from \"react\";\nexport { I18nProvider } from \"./${clientBasename}\";\n\ntype Messages = Record<string, string>;\n\n// Per-request message store using React cache\nconst getMessageStore = cache(() => ({ current: {} as Messages }));\n\nexport function setServerMessages(messages: Messages) {\n getMessageStore().current = messages;\n}\n\nexport function T({ id, children, messages }: { id?: string; children: ReactNode; messages?: Messages }) {\n if (!id) return <>{children}</>;\n const msgs = messages ?? getMessageStore().current;\n return <>{msgs[id] ?? children}</>;\n}\n\nexport function createT(messages?: Messages) {\n return (text: string, id?: string, values?: Record<string, string | number>): string => {\n const msgs = messages ?? getMessageStore().current;\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n}\n`;\n }\n\n const allLocales = [opts.sourceLocale, ...opts.targetLocales];\n const allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n\n return `import type { ReactNode } from \"react\";\nimport { cache } from \"react\";\nexport { I18nProvider } from \"./${clientBasename}\";\n\ntype Messages = Record<string, string>;\n\nconst supported = [${allLocalesStr}] as const;\ntype Locale = (typeof supported)[number];\nconst defaultLocale: Locale = \"${opts.sourceLocale}\";\nconst messagesDir = \"${opts.messagesDir}\";\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\n// Per-request cached message loading — works even when layout is cached during client-side navigation\n// Uses dynamic imports so this file can be safely imported from client components\nconst getCachedMessages = cache(async (): Promise<Messages> => {\n const { headers } = await import(\"next/headers\");\n const { readFile } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n\n const h = await headers();\n const acceptLang = h.get(\"accept-language\") ?? \"\";\n const locale = parseAcceptLanguage(acceptLang);\n if (locale === defaultLocale) return {};\n try {\n const filePath = join(process.cwd(), messagesDir, \\`\\${locale}.json\\`);\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {};\n }\n});\n\n// Per-request message store (populated by setServerMessages in layout)\nconst getMessageStore = cache(() => ({ current: null as Messages | null }));\n\nexport function setServerMessages(messages: Messages) {\n getMessageStore().current = messages;\n}\n\nasync function resolveMessages(explicit?: Messages): Promise<Messages> {\n if (explicit) return explicit;\n const store = getMessageStore().current;\n if (store) return store;\n return getCachedMessages();\n}\n\nexport async function T({ id, children, messages }: { id?: string; children: ReactNode; messages?: Messages }) {\n if (!id) return <>{children}</>;\n const msgs = await resolveMessages(messages);\n // Populate store so sync createT() calls in the same request benefit\n if (!messages && !getMessageStore().current) {\n getMessageStore().current = msgs;\n }\n return <>{msgs[id] ?? children}</>;\n}\n\ntype TFn = (text: string, id?: string, values?: Record<string, string | number>) => string;\n\n// Backward-compatible: works both as sync createT() and async await createT()\n// - Sync: reads from store (works when layout called setServerMessages)\n// - Async: lazily loads messages from filesystem (works during client-side navigation)\nexport function createT(messages?: Messages): TFn & PromiseLike<TFn> {\n const t: TFn = (text, id, values) => {\n const msgs = messages ?? getMessageStore().current ?? {};\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n\n const asyncResult = resolveMessages(messages).then(msgs => {\n if (!messages && !getMessageStore().current) {\n getMessageStore().current = msgs;\n }\n const bound: TFn = (text, id, values) => {\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n return bound;\n });\n\n return Object.assign(t, { then: asyncResult.then.bind(asyncResult) });\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 { basename, join, relative } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport {\n runScanStep,\n runCodegenStep,\n runTranslateStep,\n} from \"./pipeline.js\";\nimport {\n CLIENT_TEMPLATE,\n serverTemplate,\n generateI18nHelper,\n} from \"./templates/t-component.js\";\nimport { parseFile } from \"./scanner/parser.js\";\nimport { createUsageTracker, estimateCost, formatUsage, formatCost } from \"./usage.js\";\nimport { validateLocale } from \"./cli-utils.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 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 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 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 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 localeOpts: {\n sourceLocale: string;\n targetLocales: string[];\n messagesDir: string;\n },\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 const clientBasename = basename(fsPath);\n\n await writeFile(clientFile, CLIENT_TEMPLATE, \"utf-8\");\n await writeFile(serverFile, serverTemplate(clientBasename, localeOpts), \"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 importLines =\n `import { I18nProvider } from \"${componentPath}\";\\n` +\n `import { setServerMessages } from \"${componentPath}-server\";\\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\\tsetServerMessages(messages);\\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 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 validate(value) {\n if (!validateLocale(value)) {\n return \"Invalid locale. Use only letters, numbers, hyphens, and underscores.\";\n }\n },\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 sourceLocale,\n targetLocales,\n messagesDir,\n });\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 usageTracker = createUsageTracker();\n\n // --- SCAN ---\n const s1 = p.spinner();\n s1.start(\"Scanning...\");\n const scanResult = await runScanStep({\n config,\n cwd,\n callbacks: {\n onScanProgress: (c, t) => s1.message(`Scanning... ${c}/${t} files`),\n onKeygenProgress: (c, t) => s1.message(`Generating keys... ${c}/${t}`),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n s1.stop(\n `Found ${scanResult.bareStringCount} strings from ${scanResult.fileCount} files`,\n );\n\n if (scanResult.bareStringCount === 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 // --- CODEGEN ---\n const s3 = p.spinner();\n s3.start(\"Codegen...\");\n const codegenResult = await runCodegenStep({\n config,\n cwd,\n textToKey: scanResult.textToKey,\n callbacks: {\n onProgress: (c, t) => s3.message(`Codegen... ${c}/${t} files`),\n },\n });\n s3.stop(\n `Codegen... ${codegenResult.stringsWrapped} strings wrapped in ${codegenResult.filesModified} files`,\n );\n\n // --- TRANSLATE ---\n for (const locale of targetLocales) {\n const st = p.spinner();\n st.start(`Translating ${locale}...`);\n\n await runTranslateStep({\n config,\n sourceFlat: scanResult.sourceFlat,\n locales: [locale],\n callbacks: {\n onLocaleProgress: (_locale, c, t) =>\n st.message(`Translating ${locale}... ${c}/${t} keys`),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n\n st.stop(`Translating ${locale}... done`);\n }\n\n const usage = usageTracker.get();\n if (usage.totalTokens > 0) {\n const cost = await estimateCost(config.model, usage);\n const costStr = cost ? ` · ${formatCost(cost.totalUSD)}` : \"\";\n p.log.info(`${formatUsage(usage)}${costStr}`);\n }\n\n p.outro(\"You're all set!\");\n}\n","import \"dotenv/config\";\nimport { defineCommand, runMain } from \"citty\";\nimport { join } from \"node:path\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport { flatten } from \"./flatten.js\";\nimport { loadJsonFile } from \"./diff.js\";\nimport { scan } from \"./scanner/index.js\";\nimport {\n loadMapFile,\n runScanStep,\n runCodegenStep,\n runTranslateStep,\n} from \"./pipeline.js\";\nimport {\n logStart,\n logLocaleStart,\n logLocaleResult,\n logSummary,\n logDryRun,\n logScanResult,\n logError,\n logInfo,\n logSuccess,\n logWarning,\n logUsage,\n logProgress,\n logProgressClear,\n} from \"./logger.js\";\nimport { createUsageTracker, estimateCost, formatUsage, formatCost } from \"./usage.js\";\nimport type { TranslationResult } from \"./types.js\";\nimport { parseTranslateFlags, validateLocale } from \"./cli-utils.js\";\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 mode = config.mode ?? \"keys\";\n\n if (args.locale && !validateLocale(args.locale)) {\n logError(\n `Invalid locale \"${args.locale}\". Locale must only contain letters, numbers, hyphens, and underscores.`,\n );\n process.exit(1);\n }\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 // Dry-run: show diff counts per locale without translating\n if (args[\"dry-run\"]) {\n let sourceFlat: Record<string, string>;\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 const dryResult = await runTranslateStep({\n config,\n sourceFlat,\n locales,\n force: args.force,\n dryRun: true,\n });\n\n logStart(sourceLocale, locales);\n for (const r of dryResult.localeResults) {\n logDryRun(r.locale, 0, 0, r.removed, r.cached);\n }\n return;\n }\n\n // Normal translation\n let sourceFlat: Record<string, string>;\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 usageTracker = createUsageTracker();\n const results: TranslationResult[] = [];\n\n const translateResult = await runTranslateStep({\n config,\n sourceFlat,\n locales,\n force: args.force,\n callbacks: {\n onLocaleProgress: (locale, c, t) =>\n logProgress(c, t, `Translating ${locale}...`),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n\n for (const r of translateResult.localeResults) {\n logLocaleStart(r.locale);\n logProgressClear();\n const result: TranslationResult = {\n locale: r.locale,\n translated: r.translated,\n cached: r.cached,\n removed: r.removed,\n errors: r.errors,\n duration: r.duration,\n };\n logLocaleResult(result);\n results.push(result);\n }\n\n logSummary(results);\n const usage = usageTracker.get();\n if (usage.totalTokens > 0) {\n const cost = await estimateCost(model, usage);\n logUsage(formatUsage(usage), cost ? formatCost(cost.totalUSD) : undefined);\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 // Dry-run: show found strings without writing anything\n if (args[\"dry-run\"]) {\n const result = await scan(config.scan, process.cwd(), {\n onProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n });\n logProgressClear();\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 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 // Normal scan\n const scanUsageTracker = createUsageTracker();\n const scanResult = await runScanStep({\n config,\n cwd: process.cwd(),\n callbacks: {\n onScanProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n onKeygenProgress: (c, t) => logProgress(c, t, \"Generating keys...\"),\n onUsage: (usage) => scanUsageTracker.add(usage),\n },\n });\n logProgressClear();\n\n logScanResult(scanResult.bareStringCount, scanResult.fileCount);\n logSuccess(\n `Written .translate-map.json (${Object.keys(scanResult.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 sourceFile = join(\n config.messagesDir,\n `${config.sourceLocale}.json`,\n );\n logSuccess(`Written to ${sourceFile}`);\n }\n\n const scanUsage = scanUsageTracker.get();\n if (scanUsage.totalTokens > 0) {\n const cost = await estimateCost(config.model, scanUsage);\n logUsage(formatUsage(scanUsage), cost ? formatCost(cost.totalUSD) : undefined);\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 // Dry-run: show what would be changed\n if (args[\"dry-run\"]) {\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 (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 // Normal codegen\n const result = await runCodegenStep({\n config,\n cwd: process.cwd(),\n callbacks: {\n onProgress: (c, t) => logProgress(c, t, \"Processing files...\"),\n },\n });\n logProgressClear();\n\n logSuccess(\n `Codegen complete: ${result.stringsWrapped} strings wrapped in ${result.filesModified} files (${result.filesProcessed} files processed)`,\n );\n if (result.filesSkipped > 0) {\n logWarning(\n `${result.filesSkipped} file(s) skipped due to invalid generated syntax`,\n );\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 const { dryRun, force, verbose, locale } = parseTranslateFlags(rawArgs);\n\n await translateCommand.run!({\n args: {\n _: rawArgs,\n \"dry-run\": dryRun,\n force,\n verbose,\n locale: locale ?? \"\",\n },\n rawArgs,\n cmd: translateCommand,\n });\n }\n },\n});\n\nrunMain(main);\n"],"mappings":"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","names":["p","text","text","text","parentTag","t","readFile","z","pLimit","t","resolve","text","_traverse","t","text","traverse","compName","output","join","readFile","glob","pLimit","text","p","generateObject","z","pLimit","buildPrompt","resolve","writeFile","join","dirname","join","readFile","writeFile","mkdir","text","t","join","readFile","writeFile","mkdir","p","cancel","t","usage","join","sourceFlat","text","t","usage","runInitWizard"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/flatten.ts","../src/diff.ts","../src/scanner/parser.ts","../src/scanner/filters.ts","../src/utils/ast-helpers.ts","../src/utils/template-literal.ts","../src/scanner/extractor.ts","../src/scanner/context-enricher.ts","../src/logger.ts","../src/scanner/index.ts","../src/scanner/key-ai.ts","../src/codegen/transform.ts","../src/codegen/index.ts","../src/validate.ts","../src/translate.ts","../src/writer.ts","../src/typegen.ts","../src/pipeline.ts","../src/usage.ts","../src/cli-utils.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 splitByNamespace: z.boolean().default(false).optional(),\n typeSafe: z.boolean().default(false).optional(),\n translation: z\n .object({\n batchSize: z.number().int().positive().default(50),\n context: z.string().optional(),\n glossary: z.record(z.string(), 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 validatePlaceholders: z.boolean().default(true).optional(),\n })\n .optional(),\n scan: z\n .object({\n include: z.array(z.string()),\n exclude: z.array(z.string()).optional(),\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 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","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 /^[\\d.,%$€£¥]+$/, // Numbers, currency\n /^[^\\p{L}]*$/u, // No letters at all (Unicode-aware)\n];\n\nfunction isLikelyKebabIdentifier(text: string): boolean {\n // Keep this conservative to avoid skipping real UI copy like \"sign-in\".\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)+$/.test(text)) return false;\n return text.split(\"-\").length >= 3;\n}\n\nfunction isLikelyConstantIdentifier(text: string): boolean {\n // Ignore env/constant-like tokens, but keep plain ALLCAPS words (API, OK).\n return /^(?=.*[_\\d])[A-Z0-9_]+$/.test(text);\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 if (isLikelyKebabIdentifier(trimmed)) return true;\n if (isLikelyConstantIdentifier(trimmed)) 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 const isNestedInFunctionOrClass = (nodePath: NodePath<Node>): boolean => {\n let current = nodePath.parentPath;\n while (current) {\n if (\n current.isFunctionDeclaration() ||\n current.isFunctionExpression() ||\n current.isArrowFunctionExpression() ||\n current.isClassMethod() ||\n current.isClassPrivateMethod() ||\n current.isClassDeclaration() ||\n current.isClassExpression()\n ) {\n return true;\n }\n if (current.isProgram()) return false;\n current = current.parentPath;\n }\n return false;\n };\n\n const getNameFromFunctionLike = (\n fnPath: NodePath<Node>,\n ): string | undefined => {\n if (fnPath.isFunctionDeclaration()) {\n if (fnPath.node.id) return fnPath.node.id.name;\n if (fnPath.parentPath?.isExportDefaultDeclaration()) return \"__default__\";\n return undefined;\n }\n\n if (!fnPath.isFunctionExpression() && !fnPath.isArrowFunctionExpression()) {\n return undefined;\n }\n\n if (isNestedInFunctionOrClass(fnPath)) return undefined;\n\n const parent = fnPath.parentPath;\n if (!parent) return undefined;\n\n if (parent.isVariableDeclarator() && parent.node.id.type === \"Identifier\") {\n return parent.node.id.name;\n }\n\n if (parent.isExportDefaultDeclaration()) return \"__default__\";\n\n if (parent.isCallExpression()) {\n let call: NodePath<Node> = parent;\n while (call.parentPath?.isCallExpression()) {\n call = call.parentPath;\n }\n const carrier = call.parentPath;\n if (!carrier) return undefined;\n if (\n carrier.isVariableDeclarator() &&\n carrier.node.id.type === \"Identifier\"\n ) {\n return carrier.node.id.name;\n }\n if (carrier.isExportDefaultDeclaration()) return \"__default__\";\n }\n\n return undefined;\n };\n\n const getNameFromClassLike = (\n classPath: NodePath<Node>,\n ): string | undefined => {\n if (classPath.isClassDeclaration()) {\n if (classPath.node.id) return classPath.node.id.name;\n if (classPath.parentPath?.isExportDefaultDeclaration())\n return \"__default__\";\n return undefined;\n }\n\n if (!classPath.isClassExpression()) return undefined;\n if (isNestedInFunctionOrClass(classPath)) return undefined;\n\n const parent = classPath.parentPath;\n if (!parent) return undefined;\n if (parent.isVariableDeclarator() && parent.node.id.type === \"Identifier\") {\n return parent.node.id.name;\n }\n if (parent.isExportDefaultDeclaration()) return \"__default__\";\n\n return undefined;\n };\n\n let current: NodePath<Node> | null = path;\n while (current) {\n const functionName = getNameFromFunctionLike(current);\n if (functionName) return functionName;\n\n const className = getNameFromClassLike(current);\n if (className) return className;\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 type { Expression, TemplateLiteral } from \"@babel/types\";\nimport * as t from \"@babel/types\";\n\nexport interface TemplateLiteralInfo {\n text: string;\n placeholders: string[];\n}\n\nfunction memberExpressionToName(node: Expression): string | null {\n if (node.type === \"Identifier\") return node.name;\n if (\n node.type === \"MemberExpression\" &&\n !node.computed &&\n node.property.type === \"Identifier\"\n ) {\n const objectName = memberExpressionToName(node.object as Expression);\n if (!objectName) return null;\n const prop = node.property.name;\n return objectName + prop.charAt(0).toUpperCase() + prop.slice(1);\n }\n return null;\n}\n\nexport function buildTemplateLiteralText(\n quasis: TemplateLiteral[\"quasis\"],\n expressions: TemplateLiteral[\"expressions\"],\n): TemplateLiteralInfo | null {\n const placeholders: string[] = [];\n const usedNames = new Set<string>();\n let text = \"\";\n\n for (let i = 0; i < quasis.length; i++) {\n text += quasis[i].value.cooked ?? quasis[i].value.raw;\n\n if (i < expressions.length) {\n const expr = expressions[i];\n let name: string | null = null;\n\n if (expr.type === \"Identifier\") {\n name = expr.name;\n } else if (expr.type === \"MemberExpression\") {\n name = memberExpressionToName(expr);\n }\n\n if (name === null) return null;\n\n let finalName = name;\n if (usedNames.has(finalName)) {\n let suffix = 2;\n while (usedNames.has(`${name}${suffix}`)) suffix++;\n finalName = `${name}${suffix}`;\n }\n\n usedNames.add(finalName);\n placeholders.push(finalName);\n text += `{${finalName}}`;\n }\n }\n\n return { text, placeholders };\n}\n\nexport function buildValuesObject(\n expressions: TemplateLiteral[\"expressions\"],\n placeholders: string[],\n): t.ObjectExpression {\n const properties = placeholders.map((name, i) => {\n const expr = expressions[i] as Expression;\n const isShorthand =\n expr.type === \"Identifier\" && expr.name === name;\n\n return t.objectProperty(\n t.identifier(name),\n t.cloneNode(expr),\n false,\n isShorthand,\n );\n });\n\n return t.objectExpression(properties);\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 { buildTemplateLiteralText } from \"../utils/template-literal.js\";\nimport type { ExtractedString } from \"../types.js\";\nimport type { Expression, ConditionalExpression } from \"@babel/types\";\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\nfunction getNearestFunctionPath(path: NodePath<any>): NodePath<any> | null {\n let current = path.parentPath;\n while (current) {\n if (\n current.isFunctionDeclaration() ||\n current.isFunctionExpression() ||\n current.isArrowFunctionExpression()\n ) {\n return current;\n }\n current = current.parentPath;\n }\n return null;\n}\n\nfunction functionContainsJSX(path: NodePath<any>): boolean {\n let hasJSX = false;\n path.traverse({\n JSXElement(p: NodePath<JSXElement>) {\n hasJSX = true;\n p.stop();\n },\n JSXFragment(p: NodePath<any>) {\n hasJSX = true;\n p.stop();\n },\n });\n return hasJSX;\n}\n\nfunction extractTextFromNode(node: Expression): string | null {\n if (node.type === \"StringLiteral\") {\n const trimmed = node.value.trim();\n return trimmed || null;\n }\n if (node.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(node.quasis, node.expressions);\n return info ? info.text : null;\n }\n return null;\n}\n\nfunction collectConditionalTexts(node: ConditionalExpression): string[] {\n const texts: string[] = [];\n\n for (const branch of [node.consequent, node.alternate]) {\n if (branch.type === \"ConditionalExpression\") {\n texts.push(...collectConditionalTexts(branch));\n } else {\n const text = extractTextFromNode(branch as Expression);\n if (text && !shouldIgnore(text)) {\n texts.push(text);\n }\n }\n }\n\n return texts;\n}\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 (value.type === \"JSXExpressionContainer\") {\n if (value.expression.type === \"StringLiteral\") {\n text = value.expression.value;\n } else if (value.expression.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n value.expression.quasis,\n value.expression.expressions,\n );\n if (info) text = info.text;\n } else if (value.expression.type === \"ConditionalExpression\") {\n const parentTag = getParentTagName(path);\n if (parentTag && isIgnoredTag(parentTag)) return;\n\n const texts = collectConditionalTexts(value.expression);\n for (const t of texts) {\n results.push({\n text: t,\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 return;\n }\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 if (path.parent.type === \"JSXAttribute\") return;\n\n const expr = path.node.expression;\n\n if (expr.type === \"ConditionalExpression\") {\n const parentTag = getParentTagName(path);\n if (parentTag && isIgnoredTag(parentTag)) return;\n\n const texts = collectConditionalTexts(expr);\n for (const t of texts) {\n results.push({\n text: t,\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 return;\n }\n\n let text: string | undefined;\n\n if (expr.type === \"StringLiteral\") {\n text = expr.value.trim();\n } else if (expr.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n if (info) text = info.text;\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-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; // skip module-level, codegen can't transform these\n const ownerFn = getNearestFunctionPath(path as unknown as NodePath<any>);\n if (!ownerFn) return;\n if (!functionContainsJSX(ownerFn)) return;\n const componentName = getComponentName(ownerFn as unknown as NodePath<any>);\n if (!componentName) 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\n if (valueNode.type === \"ConditionalExpression\") {\n const texts = collectConditionalTexts(valueNode);\n for (const t of texts) {\n results.push({\n text: t,\n type: \"object-property\",\n file: filePath,\n line: valueNode.loc?.start.line ?? 0,\n column: valueNode.loc?.start.column ?? 0,\n componentName,\n propName,\n });\n }\n return;\n }\n\n let text: string | undefined;\n if (valueNode.type === \"StringLiteral\") {\n text = valueNode.value.trim();\n } else if (valueNode.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n valueNode.quasis,\n valueNode.expressions,\n );\n if (info) text = info.text;\n }\n\n if (!text || 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,\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 type { ExtractedString } from \"../types.js\";\n\nexport function deriveRoutePath(filePath: string): string | undefined {\n // Next.js app router: src/app/<route>/page.tsx\n const appMatch = filePath.match(/src\\/app\\/(.+?)\\/page\\.[jt]sx?$/);\n if (appMatch) return appMatch[1].replace(/\\//g, \".\");\n\n // Next.js pages router: src/pages/<route>.tsx or pages/<route>.tsx\n const pagesMatch = filePath.match(/(?:src\\/)?pages\\/(.+?)\\.[jt]sx?$/);\n if (pagesMatch) {\n const route = pagesMatch[1].replace(/\\/index$/, \"\").replace(/\\//g, \".\");\n return route || undefined;\n }\n\n // Components: src/components/<section>/Component.tsx\n const compMatch = filePath.match(/src\\/components\\/(.+?)\\//);\n if (compMatch) return compMatch[1];\n\n return undefined;\n}\n\nexport function enrichStrings(\n strings: ExtractedString[],\n filePath: string,\n): ExtractedString[] {\n const routePath = deriveRoutePath(filePath);\n\n // Group by componentName\n const byComponent = new Map<string, ExtractedString[]>();\n for (const str of strings) {\n const key = str.componentName ?? \"__root__\";\n if (!byComponent.has(key)) byComponent.set(key, []);\n byComponent.get(key)!.push(str);\n }\n\n // Find section headings (h1-h3)\n const headings = strings.filter(\n (s) => s.parentTag && /^h[1-3]$/.test(s.parentTag),\n );\n const defaultHeading = headings.length > 0 ? headings[0].text : undefined;\n\n return strings.map((str) => {\n const enriched = { ...str };\n\n if (routePath) enriched.routePath = routePath;\n\n // Assign siblingTexts from same component (max 5, excluding self)\n const siblings = byComponent.get(str.componentName ?? \"__root__\") ?? [];\n const siblingTexts = siblings\n .filter((s) => s !== str)\n .slice(0, 5)\n .map((s) => s.text);\n if (siblingTexts.length > 0) enriched.siblingTexts = siblingTexts;\n\n // Assign sectionHeading\n if (defaultHeading && str.text !== defaultHeading) {\n enriched.sectionHeading = defaultHeading;\n }\n\n return enriched;\n });\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\nexport function logUsage(tokens: string, cost?: string): void {\n console.log(`\\n ${pc.dim(\"Tokens:\")} ${tokens}`);\n if (cost) console.log(` ${pc.dim(\"Est. cost:\")} ${cost}`);\n}\n\nexport function logProgress(current: number, total: number, label: string): void {\n if (!process.stdout.isTTY) return;\n const pct = total > 0 ? Math.round((current / total) * 100) : 0;\n process.stdout.write(\n `\\r ${pc.dim(label)} ${pc.bold(`${current}`)}${pc.dim(`/${total}`)} ${pc.dim(`(${pct}%)`)}`,\n );\n}\n\nexport function logProgressClear(): void {\n if (!process.stdout.isTTY) return;\n process.stdout.write(\"\\r\" + \" \".repeat(60) + \"\\r\");\n}\n","import { readFile } from \"node:fs/promises\";\nimport { glob } from \"tinyglobby\";\nimport pLimit from \"p-limit\";\nimport { parseFile } from \"./parser.js\";\nimport { extractStrings } from \"./extractor.js\";\nimport { enrichStrings } from \"./context-enricher.js\";\nimport { logVerbose } from \"../logger.js\";\nimport type { ExtractedString, ScanOptions } from \"../types.js\";\n\nexport interface ScanResult {\n strings: ExtractedString[];\n fileCount: number;\n}\n\nexport interface ScanCallbacks {\n onProgress?: (completed: number, total: number) => void;\n}\n\nexport async function scan(\n options: ScanOptions,\n cwd: string = process.cwd(),\n callbacks?: ScanCallbacks,\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\n const limit = pLimit(10);\n let completed = 0;\n\n const fileResults = await Promise.all(\n files.map((filePath) =>\n limit(async () => {\n const code = await readFile(filePath, \"utf-8\");\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 false,\n );\n completed++;\n callbacks?.onProgress?.(completed, files.length);\n return null;\n }\n const raw = extractStrings(ast, filePath, options.translatableProps);\n const strings = enrichStrings(raw, filePath);\n completed++;\n callbacks?.onProgress?.(completed, files.length);\n return { strings, filePath };\n }),\n ),\n );\n\n for (const result of fileResults) {\n if (!result) continue;\n allStrings.push(...result.strings);\n }\n\n return {\n strings: allStrings,\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\";\nimport { logWarning } from \"../logger.js\";\n\ninterface KeyGenInput {\n model: LanguageModel;\n strings: ExtractedString[];\n existingMap?: Record<string, string>;\n /** All texts found in the codebase (including wrapped). Used to determine which existingMap entries are still active. When omitted, defaults to texts from `strings`. */\n allTexts?: Set<string>;\n batchSize?: number;\n concurrency?: number;\n retries?: number;\n onProgress?: (completed: number, total: number) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n}\n\nfunction buildPrompt(\n strings: ExtractedString[],\n existingMap?: Record<string, string>,\n): 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 \"- Use camelCase for key segments\",\n \"- CRITICAL: All strings within the same React component MUST share the same namespace prefix.\",\n ' This is because the generated code will use useTranslations(\"namespace\") / getTranslations(\"namespace\")',\n \" from next-intl, which scopes all t() calls to that namespace.\",\n ' Example: A Hero component with \"Welcome\" and \"Get Started\" → both must be \"hero.welcome\" and \"hero.getStarted\", NOT \"hero.welcome\" and \"common.getStarted\".',\n \"- Derive namespace from: route path > component name > file path section, in that priority order.\",\n ' Example: file src/app/dashboard/page.tsx, component DashboardPage → namespace \"dashboard\"',\n ' Example: file src/components/hero/Hero.tsx, component Hero → namespace \"hero\"',\n \"- Only use cross-cutting namespaces (common, auth, nav, form, error) for strings that are truly generic\",\n ' and appear in multiple unrelated components. If \"Save\" only appears in SettingsForm, use \"settings.save\" not \"common.save\".',\n \"- For shared/layout components (Header, Footer, Sidebar), use their component name as namespace.\",\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\n // Add existing keys context for namespace consistency\n if (existingMap && Object.keys(existingMap).length > 0) {\n const entries = Object.entries(existingMap).slice(0, 30);\n lines.push(\"\");\n lines.push(\"Existing keys (maintain consistency with these namespaces):\");\n for (const [text, key] of entries) {\n lines.push(` \"${text}\" → ${key}`);\n }\n }\n\n // Group strings by file for better context\n lines.push(\"\");\n lines.push(\"Strings:\");\n\n const byFile = new Map<string, { index: number; str: ExtractedString }[]>();\n for (let i = 0; i < strings.length; i++) {\n const str = strings[i];\n const file = str.file || \"(unknown)\";\n if (!byFile.has(file)) byFile.set(file, []);\n byFile.get(file)!.push({ index: i, str });\n }\n\n for (const [file, entries] of byFile) {\n const routePart = entries[0].str.routePath\n ? ` (route: ${entries[0].str.routePath})`\n : \"\";\n lines.push(`--- File: ${file}${routePart} ---`);\n\n for (const { index, str } of entries) {\n const parts: string[] = [`[${index}] \"${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.sectionHeading) parts.push(`section: \"${str.sectionHeading}\"`);\n if (str.siblingTexts?.length) {\n parts.push(\n `siblings: [${str.siblingTexts\n .slice(0, 3)\n .map((t) => `\"${t}\"`)\n .join(\", \")}]`,\n );\n }\n lines.push(` ${parts.join(\", \")}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\ninterface KeyBatchResult {\n keys: Record<string, string>;\n usage: { inputTokens: number; outputTokens: number };\n}\n\nfunction inferNamespace(str: ExtractedString): string {\n // 1. Component name: \"FeaturesGrid\" → \"featuresGrid\", \"Newsletter\" → \"newsletter\"\n if (str.componentName && str.componentName.length > 0) {\n return str.componentName[0].toLowerCase() + str.componentName.slice(1);\n }\n\n // 2. Route path: \"/dashboard/settings\" → \"settings\"\n // Skip dynamic segments like [id], [...slug]\n if (str.routePath) {\n const segments = str.routePath\n .split(\"/\")\n .filter((s) => s.length > 0 && !s.startsWith(\"[\"));\n if (segments.length > 0) {\n return segments[segments.length - 1].toLowerCase();\n }\n }\n\n // 3. File path: \"src/components/sections/hero.tsx\" → \"hero\"\n // For generic names (index, page, layout), use parent directory\n if (str.file) {\n const parts = str.file.replace(/\\.\\w+$/, \"\").split(\"/\");\n const fileName = parts[parts.length - 1];\n if (\n fileName &&\n fileName !== \"index\" &&\n fileName !== \"page\" &&\n fileName !== \"layout\"\n ) {\n return fileName[0].toLowerCase() + fileName.slice(1);\n }\n // Use parent directory for generic filenames\n if (parts.length >= 2) {\n const dir = parts[parts.length - 2];\n if (dir && !dir.startsWith(\"[\") && !dir.startsWith(\"(\")) {\n return dir[0].toLowerCase() + dir.slice(1);\n }\n }\n }\n\n return \"common\";\n}\n\nasync function generateKeysBatchWithRetry(\n model: LanguageModel,\n strings: ExtractedString[],\n retries: number,\n existingMap?: Record<string, string>,\n): Promise<KeyBatchResult> {\n const prompt = buildPrompt(strings, existingMap);\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 let totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const { object, usage } = await generateObject({\n model,\n prompt,\n schema,\n });\n\n totalUsage.inputTokens += usage.inputTokens ?? 0;\n totalUsage.outputTokens += usage.outputTokens ?? 0;\n\n const result: Record<string, string> = {};\n for (const mapping of object.mappings) {\n if (mapping.index >= 0 && mapping.index < texts.length) {\n let key = mapping.key;\n if (!key.includes(\".\")) {\n // Infer namespace from component name or file path\n const str = strings[mapping.index];\n const ns = inferNamespace(str);\n key = `${ns}.${key}`;\n logWarning(\n `AI generated single-segment key \"${mapping.key}\" for \"${texts[mapping.index]}\". Auto-prefixed to \"${key}\".`,\n );\n }\n result[texts[mapping.index]] = key;\n }\n }\n return { keys: result, usage: totalUsage };\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\n/**\n * Detects and resolves path conflicts where a key is both a leaf (string value)\n * and a prefix of other keys (branch node). When unflattened, the leaf value\n * would be overwritten by the branch object.\n *\n * Example: \"integrations.integration\" (leaf) + \"integrations.integration.name\" (child)\n * → renames leaf to \"integrations.integrationLabel\"\n */\nfunction resolvePathConflicts(\n map: Record<string, string>,\n): Record<string, string> {\n const allKeys = new Set(Object.values(map));\n const result: Record<string, string> = {};\n\n for (const [text, key] of Object.entries(map)) {\n let hasChild = false;\n const prefix = key + \".\";\n for (const other of allKeys) {\n if (other.startsWith(prefix)) {\n hasChild = true;\n break;\n }\n }\n\n if (!hasChild) {\n result[text] = key;\n continue;\n }\n\n // Key is both leaf and branch — rename by appending \"Label\" to last segment\n const dotIdx = key.lastIndexOf(\".\");\n let renamed: string;\n if (dotIdx === -1) {\n renamed = key + \"Label\";\n } else {\n renamed = key.slice(0, dotIdx + 1) + key.slice(dotIdx + 1) + \"Label\";\n }\n\n // Ensure the renamed key doesn't collide\n let finalKey = renamed;\n let suffix = 2;\n while (allKeys.has(finalKey)) {\n finalKey = `${renamed}${suffix}`;\n suffix++;\n }\n\n allKeys.delete(key);\n allKeys.add(finalKey);\n result[text] = finalKey;\n logWarning(\n `Key path conflict: \"${key}\" is both a value and a prefix of other keys. Renamed to \"${finalKey}\".`,\n );\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 allTexts,\n batchSize = 50,\n concurrency = 3,\n retries = 2,\n onProgress,\n onUsage,\n } = input;\n\n const activeTexts = allTexts ?? new Set(strings.map((s) => s.text));\n const activeExisting: Record<string, string> = {};\n for (const [text, key] of Object.entries(existingMap)) {\n if (activeTexts.has(text)) {\n activeExisting[text] = key;\n }\n }\n\n const newStrings = strings.filter((s) => !(s.text in activeExisting));\n if (newStrings.length === 0) return activeExisting;\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()).sort((a, b) => {\n const fileCmp = (a.file || \"\").localeCompare(b.file || \"\");\n if (fileCmp !== 0) return fileCmp;\n return (a.componentName || \"\").localeCompare(b.componentName || \"\");\n });\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 let completedStrings = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n await Promise.all(\n batches.map((batch) =>\n limit(async () => {\n const { keys, usage } = await generateKeysBatchWithRetry(\n model,\n batch,\n retries,\n activeExisting,\n );\n Object.assign(allNewKeys, keys);\n totalInputTokens += usage.inputTokens;\n totalOutputTokens += usage.outputTokens;\n completedStrings += batch.length;\n onProgress?.(completedStrings, uniqueStrings.length);\n }),\n ),\n );\n\n if (totalInputTokens > 0 || totalOutputTokens > 0) {\n onUsage?.({\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n });\n }\n\n const resolved = resolveCollisions(allNewKeys, activeExisting);\n const merged = { ...activeExisting, ...resolved };\n\n return resolvePathConflicts(merged);\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 {\n buildTemplateLiteralText,\n buildValuesObject,\n} from \"../utils/template-literal.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 hasSubstantialSiblings(parent: NodePath<t.JSXElement>): boolean {\n const count = parent.node.children.filter((child: JSXChild) => {\n if (child.type === \"JSXText\") return child.value.trim().length > 0;\n return true;\n }).length;\n return count > 1;\n}\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 usedKeys: string[];\n}\n\nexport interface TransformOptions {\n i18nImport?: string;\n mode?: \"keys\" | \"inline\";\n componentPath?: string;\n forceClient?: boolean;\n}\n\nexport function detectNamespace(keys: string[]): string | null {\n if (keys.length === 0) return null;\n\n const prefixes = keys.map((k) => {\n const dot = k.indexOf(\".\");\n return dot > 0 ? k.slice(0, dot) : null;\n });\n\n // All keys must have a dot-separated prefix and share the same one\n if (prefixes.some((p) => p === null)) return null;\n\n const first = prefixes[0];\n if (prefixes.every((p) => p === first)) return first;\n\n return null;\n}\n\nfunction stripNamespace(key: string, ns: string): string {\n const prefix = ns + \".\";\n return key.startsWith(prefix) ? key.slice(prefix.length) : key;\n}\n\nfunction ensureBlockBody(\n fn: t.ArrowFunctionExpression | t.FunctionExpression,\n): t.BlockStatement {\n if (fn.body.type === \"BlockStatement\") return fn.body;\n fn.body = t.blockStatement([t.returnStatement(fn.body as t.Expression)]);\n return fn.body;\n}\n\nfunction isInsideClass(path: NodePath<t.Node>): boolean {\n let current = path.parentPath;\n while (current) {\n if (\n current.isClassMethod() ||\n current.isClassPrivateMethod() ||\n current.isClassDeclaration() ||\n current.isClassExpression()\n ) {\n return true;\n }\n current = current.parentPath;\n }\n return false;\n}\n\nfunction markGeneratedCall(call: t.CallExpression): t.CallExpression {\n (call as t.CallExpression & { __tkGenerated?: true }).__tkGenerated = true;\n return call;\n}\n\nfunction isGeneratedCall(call: t.CallExpression): boolean {\n return (\n (call as t.CallExpression & { __tkGenerated?: true }).__tkGenerated === true\n );\n}\n\nfunction isIdentifierPattern(\n param: t.LVal | t.PatternLike | t.TSParameterProperty,\n): param is t.Identifier {\n return param.type === \"Identifier\";\n}\n\nfunction collectPatternNames(\n pattern: t.LVal | t.PatternLike | t.TSParameterProperty,\n names: Set<string>,\n): void {\n if (pattern.type === \"TSParameterProperty\") {\n collectPatternNames(\n pattern.parameter as t.LVal | t.PatternLike | t.TSParameterProperty,\n names,\n );\n return;\n }\n\n if (isIdentifierPattern(pattern)) {\n names.add(pattern.name);\n return;\n }\n\n if (pattern.type === \"VoidPattern\") return;\n\n if (pattern.type === \"ObjectPattern\") {\n for (const prop of pattern.properties) {\n if (prop.type === \"ObjectProperty\") {\n collectPatternNames(\n prop.value as t.LVal | t.PatternLike | t.TSParameterProperty,\n names,\n );\n } else if (prop.type === \"RestElement\") {\n collectPatternNames(\n prop.argument as t.LVal | t.PatternLike | t.TSParameterProperty,\n names,\n );\n }\n }\n return;\n }\n if (pattern.type === \"ArrayPattern\") {\n for (const el of pattern.elements) {\n if (el) {\n collectPatternNames(\n el as t.LVal | t.PatternLike | t.TSParameterProperty,\n names,\n );\n }\n }\n return;\n }\n if (pattern.type === \"AssignmentPattern\") {\n collectPatternNames(\n pattern.left as t.LVal | t.PatternLike | t.TSParameterProperty,\n names,\n );\n return;\n }\n if (pattern.type === \"RestElement\") {\n collectPatternNames(\n pattern.argument as t.LVal | t.PatternLike | t.TSParameterProperty,\n names,\n );\n }\n}\n\nfunction collectBlockNames(block: t.BlockStatement, names: Set<string>): void {\n for (const stmt of block.body) {\n if (stmt.type === \"VariableDeclaration\") {\n for (const d of stmt.declarations) {\n collectPatternNames(d.id, names);\n }\n continue;\n }\n if (stmt.type === \"FunctionDeclaration\" && stmt.id) {\n names.add(stmt.id.name);\n continue;\n }\n if (stmt.type === \"ClassDeclaration\" && stmt.id) {\n names.add(stmt.id.name);\n }\n }\n}\n\nfunction pickTranslatorId(\n block: t.BlockStatement,\n ownerFn?: t.Function,\n): string {\n const names = new Set<string>();\n if (ownerFn) {\n for (const param of ownerFn.params) {\n collectPatternNames(param, names);\n }\n }\n collectBlockNames(block, names);\n if (!names.has(\"t\")) return \"t\";\n let i = 0;\n while (true) {\n const candidate = i === 0 ? \"__tk_t\" : `__tk_t${i + 1}`;\n if (!names.has(candidate)) return candidate;\n i++;\n }\n}\n\nfunction findWrappedFunctionInCall(\n node: t.CallExpression,\n): t.FunctionExpression | t.ArrowFunctionExpression | null {\n for (const arg of node.arguments) {\n if (\n arg.type === \"FunctionExpression\" ||\n arg.type === \"ArrowFunctionExpression\"\n ) {\n return arg;\n }\n if (arg.type === \"CallExpression\") {\n const nested = findWrappedFunctionInCall(arg);\n if (nested) return nested;\n }\n }\n if (node.callee.type === \"CallExpression\") {\n return findWrappedFunctionInCall(node.callee);\n }\n return null;\n}\n\nfunction resolveNamedImportLocal(\n ast: File,\n importSource: string,\n importedName: string,\n): string | null {\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 === importedName &&\n spec.local.type === \"Identifier\"\n ) {\n return spec.local.name;\n }\n }\n }\n }\n return null;\n}\n\nfunction ensureNamedImportLocal(\n ast: File,\n importSource: string,\n importedName: string,\n): string {\n const existingLocal = resolveNamedImportLocal(ast, importSource, importedName);\n if (existingLocal) return existingLocal;\n\n for (const node of ast.program.body) {\n if (node.type !== \"ImportDeclaration\" || node.source.value !== importSource) {\n continue;\n }\n node.specifiers.push(\n t.importSpecifier(t.identifier(importedName), t.identifier(importedName)),\n );\n return importedName;\n }\n\n const importDecl = t.importDeclaration(\n [\n t.importSpecifier(\n t.identifier(importedName),\n t.identifier(importedName),\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 return importedName;\n}\n\nfunction getNearestFunctionPath(path: NodePath<t.Node>): NodePath<t.Function> | null {\n let current = path.parentPath;\n while (current) {\n if (\n current.isFunctionDeclaration() ||\n current.isFunctionExpression() ||\n current.isArrowFunctionExpression()\n ) {\n return current as NodePath<t.Function>;\n }\n current = current.parentPath;\n }\n return null;\n}\n\nfunction functionContainsJSX(fn: t.Function): boolean {\n let found = false;\n\n const visit = (node: t.Node | null | undefined): void => {\n if (!node || found) return;\n if (node.type === \"JSXElement\" || node.type === \"JSXFragment\") {\n found = true;\n return;\n }\n\n const keys = t.VISITOR_KEYS[node.type] ?? [];\n for (const key of keys) {\n const value = (node as unknown as Record<string, unknown>)[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item && typeof item === \"object\" && \"type\" in item) {\n visit(item as t.Node);\n if (found) return;\n }\n }\n } else if (value && typeof value === \"object\" && \"type\" in value) {\n visit(value as t.Node);\n if (found) return;\n }\n }\n };\n\n visit(fn.body as t.Node);\n return found;\n}\n\nfunction isTranslationFactoryCall(\n init: t.Expression | null | undefined,\n localName: string,\n): init is t.CallExpression {\n return (\n init?.type === \"CallExpression\" &&\n init.callee.type === \"Identifier\" &&\n (init.callee.name === localName ||\n init.callee.name === \"useTranslations\" ||\n init.callee.name === \"getTranslations\")\n );\n}\n\nfunction isAwaitedGetTranslationsCall(\n init: t.Expression | null | undefined,\n localName: string,\n): init is t.AwaitExpression & {\n argument: t.CallExpression & { callee: t.Identifier };\n} {\n return (\n init?.type === \"AwaitExpression\" &&\n init.argument.type === \"CallExpression\" &&\n init.argument.callee.type === \"Identifier\" &&\n (init.argument.callee.name === localName ||\n init.argument.callee.name === \"getTranslations\")\n );\n}\n\nfunction isGetTranslationsCall(\n init: t.Expression | null | undefined,\n localName: string,\n): init is t.CallExpression & { callee: t.Identifier } {\n return (\n init?.type === \"CallExpression\" &&\n init.callee.type === \"Identifier\" &&\n (init.callee.name === localName || init.callee.name === \"getTranslations\")\n );\n}\n\nfunction collectConditionalKeys(\n node: t.Expression,\n textToKey: Record<string, string>,\n): string[] {\n const keys: string[] = [];\n if (node.type === \"ConditionalExpression\") {\n keys.push(\n ...collectConditionalKeys(node.consequent as t.Expression, textToKey),\n );\n keys.push(\n ...collectConditionalKeys(node.alternate as t.Expression, textToKey),\n );\n } else if (node.type === \"StringLiteral\") {\n const text = node.value.trim();\n if (text && text in textToKey) keys.push(textToKey[text]);\n } else if (node.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(node.quasis, node.expressions);\n if (info && info.text in textToKey) keys.push(textToKey[info.text]);\n }\n return keys;\n}\n\nfunction transformConditionalBranch(\n node: t.Expression,\n textToKey: Record<string, string>,\n): { node: t.Expression; count: number } {\n if (node.type === \"ConditionalExpression\") {\n const cons = transformConditionalBranch(\n node.consequent as t.Expression,\n textToKey,\n );\n const alt = transformConditionalBranch(\n node.alternate as t.Expression,\n textToKey,\n );\n if (cons.count > 0 || alt.count > 0) {\n return {\n node: t.conditionalExpression(node.test, cons.node, alt.node),\n count: cons.count + alt.count,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"StringLiteral\") {\n const text = node.value.trim();\n if (text && text in textToKey) {\n const key = textToKey[text];\n return {\n node: markGeneratedCall(\n t.callExpression(t.identifier(\"t\"), [t.stringLiteral(key)]),\n ),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(node.quasis, node.expressions);\n if (info && info.text in textToKey) {\n const key = textToKey[info.text];\n const args: t.Expression[] = [t.stringLiteral(key)];\n if (info.placeholders.length > 0) {\n args.push(buildValuesObject(node.expressions, info.placeholders));\n }\n return {\n node: markGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n return { node, count: 0 };\n}\n\nfunction transformConditionalBranchInline(\n node: t.Expression,\n textToKey: Record<string, string>,\n): { node: t.Expression; count: number } {\n if (node.type === \"ConditionalExpression\") {\n const cons = transformConditionalBranchInline(\n node.consequent as t.Expression,\n textToKey,\n );\n const alt = transformConditionalBranchInline(\n node.alternate as t.Expression,\n textToKey,\n );\n if (cons.count > 0 || alt.count > 0) {\n return {\n node: t.conditionalExpression(node.test, cons.node, alt.node),\n count: cons.count + alt.count,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"StringLiteral\") {\n const text = node.value.trim();\n if (text && text in textToKey) {\n const key = textToKey[text];\n return {\n node: markGeneratedCall(\n t.callExpression(t.identifier(\"t\"), [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ]),\n ),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n if (node.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(node.quasis, node.expressions);\n if (info && info.text in textToKey) {\n const key = textToKey[info.text];\n const args: t.Expression[] = [\n t.stringLiteral(info.text),\n t.stringLiteral(key),\n ];\n if (info.placeholders.length > 0) {\n args.push(buildValuesObject(node.expressions, info.placeholders));\n }\n return {\n node: markGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\n count: 1,\n };\n }\n return { node, count: 0 };\n }\n\n return { node, count: 0 };\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 const supportsServerSplit = importSource === \"next-intl\";\n const isClient =\n !supportsServerSplit || options.forceClient || detectClientFile(ast);\n const needsClientDirective =\n isClient && options.forceClient === true && !detectClientFile(ast);\n let stringsWrapped = 0;\n const componentsNeedingT = new Set<string>();\n const componentKeys = new Map<string, Set<string>>();\n const allUsedKeys: string[] = [];\n\n function trackKey(path: NodePath, key: string): void {\n allUsedKeys.push(key);\n const compName = getComponentName(path);\n if (compName) {\n componentsNeedingT.add(compName);\n let keys = componentKeys.get(compName);\n if (!keys) {\n keys = new Set();\n componentKeys.set(compName, keys);\n }\n keys.add(key);\n }\n }\n\n traverse(ast, {\n JSXText(path: NodePath<t.JSXText>) {\n if (isInsideClass(path)) return;\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 markGeneratedCall(\n t.callExpression(t.identifier(\"t\"), [t.stringLiteral(key)]),\n ),\n );\n\n if (!hasSubstantialSiblings(parent)) {\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 trackKey(path, key);\n },\n\n JSXExpressionContainer(path: NodePath<t.JSXExpressionContainer>) {\n if (isInsideClass(path)) return;\n const expr = path.node.expression;\n if (path.parent.type === \"JSXAttribute\") return;\n\n if (expr.type === \"ConditionalExpression\") {\n const result = transformConditionalBranch(expr, textToKey);\n if (result.count > 0) {\n path.node.expression = result.node;\n stringsWrapped += result.count;\n // Collect keys from conditional branches\n collectConditionalKeys(expr, textToKey).forEach((k) =>\n trackKey(path, k),\n );\n }\n return;\n }\n\n if (expr.type !== \"TemplateLiteral\") return;\n\n const info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n if (!info) return;\n\n const { text, placeholders } = info;\n if (!(text in textToKey)) return;\n\n const key = textToKey[text];\n const args: t.Expression[] = [t.stringLiteral(key)];\n if (placeholders.length > 0) {\n args.push(buildValuesObject(expr.expressions, placeholders));\n }\n path.node.expression = markGeneratedCall(\n t.callExpression(t.identifier(\"t\"), args),\n );\n stringsWrapped++;\n trackKey(path, key);\n },\n\n JSXAttribute(path: NodePath<t.JSXAttribute>) {\n if (isInsideClass(path)) return;\n const value = path.node.value;\n if (!value) return;\n\n if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"ConditionalExpression\"\n ) {\n const result = transformConditionalBranch(value.expression, textToKey);\n if (result.count > 0) {\n path.node.value = t.jsxExpressionContainer(result.node);\n stringsWrapped += result.count;\n collectConditionalKeys(value.expression, textToKey).forEach((k) =>\n trackKey(path, k),\n );\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (value.type === \"StringLiteral\") {\n text = value.value;\n } else if (value.type === \"JSXExpressionContainer\") {\n if (value.expression.type === \"StringLiteral\") {\n text = value.expression.value;\n } else if (value.expression.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n value.expression.quasis,\n value.expression.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: value.expression.expressions,\n };\n }\n }\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 const args: t.Expression[] = [t.stringLiteral(key)];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = t.jsxExpressionContainer(\n markGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\n );\n stringsWrapped++;\n trackKey(path, key);\n },\n\n ObjectProperty(path: NodePath<t.ObjectProperty>) {\n if (isInsideClass(path)) return;\n if (!isInsideFunction(path)) return;\n\n const ownerFn = getNearestFunctionPath(path as unknown as NodePath<t.Node>);\n if (!ownerFn) return;\n if (!functionContainsJSX(ownerFn.node)) return;\n const compName = getComponentName(ownerFn as unknown as NodePath<t.Node>);\n if (!compName) 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\n if (valueNode.type === \"ConditionalExpression\") {\n const result = transformConditionalBranch(valueNode, textToKey);\n if (result.count > 0) {\n path.node.value = result.node;\n stringsWrapped += result.count;\n collectConditionalKeys(valueNode, textToKey).forEach((k) =>\n trackKey(path, k),\n );\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (valueNode.type === \"StringLiteral\") {\n text = valueNode.value;\n } else if (valueNode.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n valueNode.quasis,\n valueNode.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: valueNode.expressions,\n };\n }\n }\n\n if (!text || !(text in textToKey)) return;\n\n const key = textToKey[text];\n const args: t.Expression[] = [t.stringLiteral(key)];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = markGeneratedCall(\n t.callExpression(t.identifier(\"t\"), args),\n );\n stringsWrapped++;\n trackKey(path, key);\n },\n });\n\n if (stringsWrapped === 0) {\n return {\n code: generate(ast).code,\n stringsWrapped: 0,\n modified: false,\n usedKeys: [],\n };\n }\n\n // Compute namespace per component\n const componentNamespaces = new Map<string, string | null>();\n for (const [comp, keys] of componentKeys) {\n componentNamespaces.set(comp, detectNamespace([...keys]));\n }\n\n const namespacedComponents = new Set<string>();\n const componentTranslatorIds = new Map<string, string>();\n\n if (isClient) {\n const useTranslationsLocal = ensureNamedImportLocal(\n ast,\n importSource,\n \"useTranslations\",\n );\n\n traverse(ast, {\n FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n const name = getComponentName(path as unknown as NodePath<t.Node>);\n if (!name || !componentsNeedingT.has(name)) return;\n const ns = componentNamespaces.get(name) ?? undefined;\n const injected = injectTDeclaration(path, ns, useTranslationsLocal);\n if (!injected) return;\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\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 const block = ensureBlockBody(init);\n const ns = componentNamespaces.get(name) ?? undefined;\n const injected = injectTIntoBlock(\n block,\n useTranslationsLocal,\n ns,\n name,\n init,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n return;\n }\n\n if (init.type === \"CallExpression\") {\n const wrappedFn = findWrappedFunctionInCall(init);\n if (!wrappedFn) return;\n const block = ensureBlockBody(wrappedFn);\n const ns = componentNamespaces.get(name) ?? undefined;\n const injected = injectTIntoBlock(\n block,\n useTranslationsLocal,\n ns,\n name,\n wrappedFn,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n }\n },\n ExportDefaultDeclaration(path: NodePath<t.ExportDefaultDeclaration>) {\n const name = \"__default__\";\n if (!componentsNeedingT.has(name)) return;\n const decl = path.node.declaration;\n const ns = componentNamespaces.get(name) ?? undefined;\n\n if (decl.type === \"FunctionDeclaration\") {\n const injected = injectTIntoBlock(\n decl.body,\n useTranslationsLocal,\n ns,\n name,\n decl,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n return;\n }\n\n if (\n decl.type === \"FunctionExpression\" ||\n decl.type === \"ArrowFunctionExpression\"\n ) {\n const block = ensureBlockBody(decl);\n const injected = injectTIntoBlock(\n block,\n useTranslationsLocal,\n ns,\n name,\n decl,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n return;\n }\n\n if (decl.type === \"CallExpression\") {\n const wrappedFn = findWrappedFunctionInCall(decl);\n if (!wrappedFn) return;\n const block = ensureBlockBody(wrappedFn);\n const injected = injectTIntoBlock(\n block,\n useTranslationsLocal,\n ns,\n name,\n wrappedFn,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n }\n },\n noScope: true,\n });\n } else {\n const serverSource = `${importSource}/server`;\n const getTranslationsLocal = ensureNamedImportLocal(\n ast,\n serverSource,\n \"getTranslations\",\n );\n\n traverse(ast, {\n FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n const name = getComponentName(path as unknown as NodePath<t.Node>);\n if (!name || !componentsNeedingT.has(name)) return;\n path.node.async = true;\n const ns = componentNamespaces.get(name) ?? undefined;\n const injected = injectAsyncTIntoBlock(\n path.node.body,\n getTranslationsLocal,\n ns,\n name,\n path.node,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\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 const block = ensureBlockBody(init);\n init.async = true;\n const ns = componentNamespaces.get(name) ?? undefined;\n const injected = injectAsyncTIntoBlock(\n block,\n getTranslationsLocal,\n ns,\n name,\n init,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n return;\n }\n\n if (init.type === \"CallExpression\") {\n const wrappedFn = findWrappedFunctionInCall(init);\n if (!wrappedFn) return;\n const block = ensureBlockBody(wrappedFn);\n wrappedFn.async = true;\n const ns = componentNamespaces.get(name) ?? undefined;\n const injected = injectAsyncTIntoBlock(\n block,\n getTranslationsLocal,\n ns,\n name,\n wrappedFn,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n }\n },\n ExportDefaultDeclaration(path: NodePath<t.ExportDefaultDeclaration>) {\n const name = \"__default__\";\n if (!componentsNeedingT.has(name)) return;\n const decl = path.node.declaration;\n const ns = componentNamespaces.get(name) ?? undefined;\n\n if (decl.type === \"FunctionDeclaration\") {\n decl.async = true;\n const injected = injectAsyncTIntoBlock(\n decl.body,\n getTranslationsLocal,\n ns,\n name,\n decl,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n return;\n }\n\n if (\n decl.type === \"FunctionExpression\" ||\n decl.type === \"ArrowFunctionExpression\"\n ) {\n const block = ensureBlockBody(decl);\n decl.async = true;\n const injected = injectAsyncTIntoBlock(\n block,\n getTranslationsLocal,\n ns,\n name,\n decl,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n return;\n }\n\n if (decl.type === \"CallExpression\") {\n const wrappedFn = findWrappedFunctionInCall(decl);\n if (!wrappedFn) return;\n const block = ensureBlockBody(wrappedFn);\n wrappedFn.async = true;\n const injected = injectAsyncTIntoBlock(\n block,\n getTranslationsLocal,\n ns,\n name,\n wrappedFn,\n );\n componentTranslatorIds.set(name, injected.translatorId);\n if (injected.namespaced) namespacedComponents.add(name);\n }\n },\n noScope: true,\n });\n }\n\n // Rewrite keys to strip namespace prefix only for components where namespace was established\n const effectiveNamespaces = new Map<string, string | null>();\n for (const [comp, ns] of componentNamespaces) {\n effectiveNamespaces.set(comp, namespacedComponents.has(comp) ? ns : null);\n }\n rewriteKeysForNamespaces(ast, effectiveNamespaces);\n rewriteGeneratedCallsForTranslator(ast, componentTranslatorIds);\n\n if (needsClientDirective && componentsNeedingT.size > 0) {\n addUseClientDirective(ast);\n }\n\n const output = generate(ast, { retainLines: false });\n return {\n code: output.code,\n stringsWrapped,\n modified: true,\n usedKeys: allUsedKeys,\n };\n}\n\ninterface InjectionResult {\n namespaced: boolean;\n translatorId: string;\n}\n\nfunction injectTDeclaration(\n path: NodePath<t.FunctionDeclaration>,\n namespace?: string,\n useTranslationsLocal: string = \"useTranslations\",\n): InjectionResult | null {\n const body = path.node.body;\n if (body.type !== \"BlockStatement\") return null;\n return injectTIntoBlock(\n body,\n useTranslationsLocal,\n namespace,\n path.node.id?.name,\n path.node,\n );\n}\n\nfunction updateCallNamespace(\n call: t.CallExpression,\n namespace: string | undefined,\n): boolean {\n const currentArg = call.arguments[0];\n if (!namespace) {\n // Mixed namespace or unresolved namespace case: clear stale static namespaces\n // from previous runs, but preserve dynamic arguments.\n if (currentArg && currentArg.type === \"StringLiteral\") {\n call.arguments = [];\n }\n return false;\n }\n if (\n currentArg &&\n currentArg.type === \"StringLiteral\" &&\n currentArg.value === namespace\n ) {\n return true; // Already correct\n }\n // Only overwrite if argument is missing or is a string literal (safe to update).\n // Non-string arguments (variables, expressions) are left untouched to avoid\n // silently breaking dynamic namespace usage.\n if (!currentArg || currentArg.type === \"StringLiteral\") {\n call.arguments = [t.stringLiteral(namespace)];\n return true;\n }\n return false; // Dynamic argument — don't strip keys since runtime namespace is unknown\n}\n\nfunction injectTIntoBlock(\n block: t.BlockStatement,\n useTranslationsLocal: string,\n namespace?: string,\n componentName?: string,\n ownerFn?: t.Function,\n): InjectionResult {\n let sawConflictingT = false;\n\n for (const stmt of block.body) {\n if (stmt.type !== \"VariableDeclaration\") continue;\n for (const d of stmt.declarations) {\n if (d.id.type !== \"Identifier\") continue;\n\n // const <id> = useTranslations(...) or const <id> = getTranslations(...)\n if (isTranslationFactoryCall(d.init, useTranslationsLocal)) {\n return {\n namespaced: updateCallNamespace(d.init as t.CallExpression, namespace),\n translatorId: d.id.name,\n };\n }\n\n // const <id> = await getTranslations(...)\n if (isAwaitedGetTranslationsCall(d.init, useTranslationsLocal)) {\n return {\n namespaced: updateCallNamespace(d.init.argument, namespace),\n translatorId: d.id.name,\n };\n }\n\n if (d.id.name === \"t\") sawConflictingT = true;\n }\n }\n\n const translatorId = pickTranslatorId(block, ownerFn);\n if (sawConflictingT && translatorId !== \"t\") {\n logWarning(\n componentName\n ? `Component \"${componentName}\" has \"const t = ...\" that is not useTranslations/getTranslations.\\n Injected fallback translator \"${translatorId}\" to avoid conflicts.`\n : `Detected \"const t = ...\" conflict. Injected fallback translator \"${translatorId}\".`,\n );\n }\n\n const args: t.Expression[] = namespace ? [t.stringLiteral(namespace)] : [];\n const tDecl = t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(translatorId),\n t.callExpression(t.identifier(useTranslationsLocal), args),\n ),\n ]);\n\n block.body.unshift(tDecl);\n return { namespaced: !!namespace, translatorId };\n}\n\nfunction injectAsyncTIntoBlock(\n block: t.BlockStatement,\n getTranslationsLocal: string,\n namespace?: string,\n componentName?: string,\n ownerFn?: t.Function,\n): InjectionResult {\n let sawConflictingT = false;\n\n for (const stmt of block.body) {\n if (stmt.type !== \"VariableDeclaration\") continue;\n for (const d of stmt.declarations) {\n if (d.id.type !== \"Identifier\") continue;\n\n // const <id> = await getTranslations(...)\n if (isAwaitedGetTranslationsCall(d.init, getTranslationsLocal)) {\n return {\n namespaced: updateCallNamespace(d.init.argument, namespace),\n translatorId: d.id.name,\n };\n }\n\n // const <id> = getTranslations(...)\n if (isGetTranslationsCall(d.init, getTranslationsLocal)) {\n return {\n namespaced: updateCallNamespace(d.init as t.CallExpression, namespace),\n translatorId: d.id.name,\n };\n }\n\n if (d.id.name === \"t\") sawConflictingT = true;\n }\n }\n\n const translatorId = pickTranslatorId(block, ownerFn);\n if (sawConflictingT && translatorId !== \"t\") {\n logWarning(\n componentName\n ? `Component \"${componentName}\" has \"const t = ...\" that is not useTranslations/getTranslations.\\n Injected fallback translator \"${translatorId}\" to avoid conflicts.`\n : `Detected \"const t = ...\" conflict. Injected fallback translator \"${translatorId}\".`,\n );\n }\n\n const args: t.Expression[] = namespace ? [t.stringLiteral(namespace)] : [];\n const tDecl = t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(translatorId),\n t.awaitExpression(\n t.callExpression(t.identifier(getTranslationsLocal), args),\n ),\n ),\n ]);\n\n block.body.unshift(tDecl);\n return { namespaced: !!namespace, translatorId };\n}\n\nfunction rewriteKeysForNamespaces(\n ast: File,\n componentNamespaces: Map<string, string | null>,\n): void {\n // Collect component names that actually have a namespace\n const nsComponents = new Map<string, string>();\n for (const [comp, ns] of componentNamespaces) {\n if (ns) nsComponents.set(comp, ns);\n }\n if (nsComponents.size === 0) return;\n\n traverse(ast, {\n CallExpression(path: NodePath<t.CallExpression>) {\n if (!isGeneratedCall(path.node)) return;\n if (\n path.node.callee.type !== \"Identifier\" ||\n path.node.callee.name !== \"t\"\n )\n return;\n if (path.node.arguments.length === 0) return;\n const firstArg = path.node.arguments[0];\n if (firstArg.type !== \"StringLiteral\") return;\n\n const compName = getComponentName(path);\n if (!compName) return;\n const ns = nsComponents.get(compName);\n if (!ns) return;\n\n const stripped = stripNamespace(firstArg.value, ns);\n if (stripped !== firstArg.value) {\n firstArg.value = stripped;\n }\n },\n noScope: true,\n });\n}\n\nfunction rewriteGeneratedCallsForTranslator(\n ast: File,\n translatorByComponent: Map<string, string>,\n): void {\n if (translatorByComponent.size === 0) return;\n\n traverse(ast, {\n CallExpression(path: NodePath<t.CallExpression>) {\n if (!isGeneratedCall(path.node)) return;\n if (\n path.node.callee.type !== \"Identifier\" ||\n path.node.callee.name !== \"t\"\n ) {\n return;\n }\n const compName = getComponentName(path);\n if (!compName) return;\n const translatorId = translatorByComponent.get(compName);\n if (!translatorId || translatorId === \"t\") return;\n path.node.callee = t.identifier(translatorId);\n },\n noScope: true,\n });\n}\n\nexport function detectClientFile(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\n // Detect files that use React hooks (use*() calls) — these are effectively\n // client components even without an explicit \"use client\" directive, since\n // they must be rendered inside a client component boundary.\n let usesHooks = false;\n traverse(ast, {\n CallExpression(path: NodePath<t.CallExpression>) {\n if (usesHooks) return;\n const callee = path.node.callee;\n\n // useState(), useQuery(), usePathname(), etc. imported from any module.\n if (callee.type === \"Identifier\") {\n const binding = path.scope.getBinding(callee.name);\n if (!binding) return;\n\n if (binding.path.isImportSpecifier()) {\n const imported = binding.path.node.imported;\n if (\n imported.type === \"Identifier\" &&\n /^use[A-Z]/.test(imported.name) &&\n // Exclude translate-kit's inline mode hook — it is normalised\n // by codegen and should not force client detection.\n imported.name !== \"useT\"\n ) {\n usesHooks = true;\n }\n return;\n }\n\n if (\n (binding.path.isImportDefaultSpecifier() ||\n binding.path.isImportNamespaceSpecifier()) &&\n /^use[A-Z]/.test(callee.name) &&\n callee.name !== \"useT\"\n ) {\n usesHooks = true;\n }\n\n return;\n }\n\n // React.useState(), React.useEffect(), etc.\n if (\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.object.type === \"Identifier\" &&\n callee.property.type === \"Identifier\" &&\n /^use[A-Z]/.test(callee.property.name)\n ) {\n const binding = path.scope.getBinding(callee.object.name);\n if (\n binding &&\n (binding.path.isImportDefaultSpecifier() ||\n binding.path.isImportNamespaceSpecifier()) &&\n binding.path.parentPath.isImportDeclaration() &&\n binding.path.parentPath.node.source.value === \"react\"\n ) {\n usesHooks = true;\n }\n }\n },\n });\n return usesHooks;\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 resolveImportedLocalName(\n ast: File,\n sources: Set<string>,\n importedName: string,\n): string | null {\n for (const node of ast.program.body) {\n if (node.type !== \"ImportDeclaration\") continue;\n if (!sources.has(node.source.value)) continue;\n for (const spec of node.specifiers) {\n if (\n spec.type === \"ImportSpecifier\" &&\n spec.imported.type === \"Identifier\" &&\n spec.imported.name === importedName &&\n spec.local.type === \"Identifier\"\n ) {\n return spec.local.name;\n }\n }\n }\n return null;\n}\n\nfunction normalizeInlineImports(\n ast: File,\n componentPath: string,\n isClient: boolean,\n): boolean {\n const validSources = new Set([\n componentPath,\n `${componentPath}-server`,\n `${componentPath}/t-server`,\n ]);\n const desiredSource = isClient ? componentPath : `${componentPath}-server`;\n let changed = false;\n let hookRenamed: { from: string; to: string } | undefined;\n\n for (const node of ast.program.body) {\n if (node.type !== \"ImportDeclaration\") continue;\n if (!validSources.has(node.source.value)) continue;\n\n if (node.source.value !== desiredSource) {\n node.source.value = desiredSource;\n changed = true;\n }\n\n for (const spec of node.specifiers) {\n if (\n spec.type !== \"ImportSpecifier\" ||\n spec.imported.type !== \"Identifier\"\n ) {\n continue;\n }\n\n if (isClient && spec.imported.name === \"createT\") {\n hookRenamed = { from: \"createT\", to: \"useT\" };\n spec.imported = t.identifier(\"useT\");\n if (spec.local.type === \"Identifier\" && spec.local.name === \"createT\") {\n spec.local = t.identifier(\"useT\");\n }\n changed = true;\n }\n\n if (!isClient && spec.imported.name === \"useT\") {\n hookRenamed = { from: \"useT\", to: \"createT\" };\n spec.imported = t.identifier(\"createT\");\n if (spec.local.type === \"Identifier\" && spec.local.name === \"useT\") {\n spec.local = t.identifier(\"createT\");\n }\n changed = true;\n }\n }\n }\n\n // Rename call expressions in function bodies to match the updated import\n if (hookRenamed) {\n const { from, to } = hookRenamed;\n traverse(ast, {\n VariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n if (\n path.node.id.type === \"Identifier\" &&\n path.node.id.name === \"t\" &&\n path.node.init?.type === \"CallExpression\" &&\n path.node.init.callee.type === \"Identifier\" &&\n path.node.init.callee.name === from\n ) {\n path.node.init.callee = t.identifier(to);\n }\n },\n noScope: true,\n });\n }\n\n return changed;\n}\n\nfunction hasUseClientDirective(ast: File): boolean {\n if (ast.program.directives) {\n for (const directive of ast.program.directives) {\n if (directive.value?.value === \"use client\") return true;\n }\n }\n return false;\n}\n\nfunction addUseClientDirective(ast: File): void {\n // Guard against duplicate directives\n if (hasUseClientDirective(ast)) return;\n\n if (!ast.program.directives) {\n ast.program.directives = [];\n }\n ast.program.directives.unshift(\n t.directive(t.directiveLiteral(\"use client\")),\n );\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 = options.forceClient || detectClientFile(ast);\n const needsClientDirective =\n options.forceClient === true && !detectClientFile(ast);\n let stringsWrapped = 0;\n const componentsNeedingT = new Set<string>();\n const componentTranslatorIds = new Map<string, string>();\n let needsTComponent = false;\n let repaired = false;\n let boundaryRepaired = false;\n\n boundaryRepaired = normalizeInlineImports(ast, componentPath, isClient);\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 if (isInsideClass(path)) return;\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 if (!hasSubstantialSiblings(parent)) {\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 JSXExpressionContainer(path: NodePath<t.JSXExpressionContainer>) {\n if (isInsideClass(path)) return;\n const expr = path.node.expression;\n if (path.parent.type === \"JSXAttribute\") return;\n\n if (expr.type === \"ConditionalExpression\") {\n const result = transformConditionalBranchInline(expr, textToKey);\n if (result.count > 0) {\n path.node.expression = result.node;\n stringsWrapped += result.count;\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n }\n return;\n }\n\n if (expr.type !== \"TemplateLiteral\") return;\n\n const info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n if (!info || !(info.text in textToKey)) return;\n\n const key = textToKey[info.text];\n const args: t.Expression[] = [\n t.stringLiteral(info.text),\n t.stringLiteral(key),\n ];\n if (info.placeholders.length > 0) {\n args.push(buildValuesObject(expr.expressions, info.placeholders));\n }\n path.node.expression = markGeneratedCall(\n t.callExpression(t.identifier(\"t\"), args),\n );\n stringsWrapped++;\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n },\n\n JSXAttribute(path: NodePath<t.JSXAttribute>) {\n if (isInsideClass(path)) return;\n const value = path.node.value;\n if (!value) return;\n\n if (\n value.type === \"JSXExpressionContainer\" &&\n value.expression.type === \"ConditionalExpression\"\n ) {\n const result = transformConditionalBranchInline(\n value.expression,\n textToKey,\n );\n if (result.count > 0) {\n path.node.value = t.jsxExpressionContainer(result.node);\n stringsWrapped += result.count;\n const compName = getComponentName(path);\n if (compName) componentsNeedingT.add(compName);\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (value.type === \"StringLiteral\") {\n text = value.value;\n } else if (value.type === \"JSXExpressionContainer\") {\n if (value.expression.type === \"StringLiteral\") {\n text = value.expression.value;\n } else if (value.expression.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n value.expression.quasis,\n value.expression.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: value.expression.expressions,\n };\n }\n }\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 const args: t.Expression[] = [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = t.jsxExpressionContainer(\n markGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\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 (isInsideClass(path)) return;\n if (!isInsideFunction(path)) return;\n\n const ownerFn = getNearestFunctionPath(path as unknown as NodePath<t.Node>);\n if (!ownerFn) return;\n if (!functionContainsJSX(ownerFn.node)) return;\n const compName = getComponentName(ownerFn as unknown as NodePath<t.Node>);\n if (!compName) 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\n if (valueNode.type === \"ConditionalExpression\") {\n const result = transformConditionalBranchInline(valueNode, textToKey);\n if (result.count > 0) {\n path.node.value = result.node;\n stringsWrapped += result.count;\n componentsNeedingT.add(compName);\n }\n return;\n }\n\n let text: string | undefined;\n let templateInfo:\n | {\n placeholders: string[];\n expressions: t.TemplateLiteral[\"expressions\"];\n }\n | undefined;\n\n if (valueNode.type === \"StringLiteral\") {\n text = valueNode.value;\n } else if (valueNode.type === \"TemplateLiteral\") {\n const info = buildTemplateLiteralText(\n valueNode.quasis,\n valueNode.expressions,\n );\n if (info) {\n text = info.text;\n templateInfo = {\n placeholders: info.placeholders,\n expressions: valueNode.expressions,\n };\n }\n }\n\n if (!text || !(text in textToKey)) return;\n\n const key = textToKey[text];\n const args: t.Expression[] = [\n t.stringLiteral(text),\n t.stringLiteral(key),\n ];\n if (templateInfo && templateInfo.placeholders.length > 0) {\n args.push(\n buildValuesObject(\n templateInfo.expressions,\n templateInfo.placeholders,\n ),\n );\n }\n path.node.value = markGeneratedCall(\n t.callExpression(t.identifier(\"t\"), args),\n );\n stringsWrapped++;\n\n componentsNeedingT.add(compName);\n },\n });\n\n if (stringsWrapped === 0 && !repaired && !boundaryRepaired) {\n return {\n code: generate(ast).code,\n stringsWrapped: 0,\n modified: false,\n usedKeys: [],\n };\n }\n\n if (stringsWrapped === 0 && (repaired || boundaryRepaired)) {\n if (needsClientDirective && boundaryRepaired) {\n addUseClientDirective(ast);\n }\n const output = generate(ast, { retainLines: false });\n return {\n code: output.code,\n stringsWrapped: 0,\n modified: true,\n usedKeys: [],\n };\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) {\n const hookSources = new Set<string>([\n componentPath,\n `${componentPath}-server`,\n `${componentPath}/t-server`,\n ]);\n const importedHookName = isClient ? \"useT\" : \"createT\";\n const hookLocalName =\n resolveImportedLocalName(ast, hookSources, importedHookName) ??\n importedHookName;\n const hookCall = isClient\n ? t.callExpression(t.identifier(hookLocalName), [])\n : t.callExpression(t.identifier(hookLocalName), []);\n\n traverse(ast, {\n FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n const name = getComponentName(path as unknown as NodePath<t.Node>);\n if (!name || !componentsNeedingT.has(name)) return;\n const body = path.node.body;\n if (body.type !== \"BlockStatement\") return;\n const translatorId = injectInlineHookIntoBlock(\n body,\n hookCall,\n name,\n path.node,\n );\n componentTranslatorIds.set(name, translatorId);\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 const block = ensureBlockBody(init);\n const translatorId = injectInlineHookIntoBlock(\n block,\n hookCall,\n name,\n init,\n );\n componentTranslatorIds.set(name, translatorId);\n return;\n }\n\n if (init.type === \"CallExpression\") {\n const wrappedFn = findWrappedFunctionInCall(init);\n if (!wrappedFn) return;\n const block = ensureBlockBody(wrappedFn);\n const translatorId = injectInlineHookIntoBlock(\n block,\n hookCall,\n name,\n wrappedFn,\n );\n componentTranslatorIds.set(name, translatorId);\n }\n },\n ExportDefaultDeclaration(path: NodePath<t.ExportDefaultDeclaration>) {\n const name = \"__default__\";\n if (!componentsNeedingT.has(name)) return;\n const decl = path.node.declaration;\n\n if (decl.type === \"FunctionDeclaration\") {\n const translatorId = injectInlineHookIntoBlock(\n decl.body,\n hookCall,\n name,\n decl,\n );\n componentTranslatorIds.set(name, translatorId);\n return;\n }\n\n if (\n decl.type === \"FunctionExpression\" ||\n decl.type === \"ArrowFunctionExpression\"\n ) {\n const block = ensureBlockBody(decl);\n const translatorId = injectInlineHookIntoBlock(\n block,\n hookCall,\n name,\n decl,\n );\n componentTranslatorIds.set(name, translatorId);\n return;\n }\n\n if (decl.type === \"CallExpression\") {\n const wrappedFn = findWrappedFunctionInCall(decl);\n if (!wrappedFn) return;\n const block = ensureBlockBody(wrappedFn);\n const translatorId = injectInlineHookIntoBlock(\n block,\n hookCall,\n name,\n wrappedFn,\n );\n componentTranslatorIds.set(name, translatorId);\n }\n },\n noScope: true,\n });\n }\n\n rewriteGeneratedCallsForTranslator(ast, componentTranslatorIds);\n\n if (needsClientDirective && (needsHook || boundaryRepaired)) {\n addUseClientDirective(ast);\n }\n\n const output = generate(ast, { retainLines: false });\n return { code: output.code, stringsWrapped, modified: true, usedKeys: [] };\n}\n\nfunction injectInlineHookIntoBlock(\n block: t.BlockStatement,\n hookCall: t.CallExpression,\n componentName?: string,\n ownerFn?: t.Function,\n): string {\n const targetName =\n hookCall.callee.type === \"Identifier\" ? hookCall.callee.name : undefined;\n let sawConflictingT = false;\n\n for (const stmt of block.body) {\n if (stmt.type !== \"VariableDeclaration\") continue;\n for (const d of stmt.declarations) {\n if (d.id.type !== \"Identifier\") continue;\n\n if (\n d.init?.type === \"CallExpression\" &&\n d.init.callee.type === \"Identifier\" &&\n (d.init.callee.name === \"useT\" ||\n d.init.callee.name === \"createT\" ||\n (targetName ? d.init.callee.name === targetName : false))\n ) {\n const translatorId = d.id.name;\n // Fix the hook name if it doesn't match the expected one (boundary repair)\n if (targetName && d.init.callee.name !== targetName) {\n d.init.callee = t.identifier(targetName);\n }\n return translatorId;\n }\n\n if (d.id.name === \"t\") sawConflictingT = true;\n }\n }\n\n const translatorId = pickTranslatorId(block, ownerFn);\n if (sawConflictingT && translatorId !== \"t\") {\n logWarning(\n componentName\n ? `Component \"${componentName}\" has \"const t = ...\" that is not useT/createT.\\n Injected fallback translator \"${translatorId}\" to avoid conflicts.`\n : `Detected \"const t = ...\" conflict. Injected fallback translator \"${translatorId}\".`,\n );\n }\n\n const tDecl = t.variableDeclaration(\"const\", [\n t.variableDeclarator(\n t.identifier(translatorId),\n t.cloneNode(hookCall, true),\n ),\n ]);\n\n block.body.unshift(tDecl);\n return translatorId;\n}\n","import { dirname, extname, join, resolve } from \"node:path\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport _traverse from \"@babel/traverse\";\nimport type { File } from \"@babel/types\";\nimport { glob } from \"tinyglobby\";\nimport pLimit from \"p-limit\";\nimport { parseFile } from \"../scanner/parser.js\";\nimport { resolveDefault } from \"../utils/ast-helpers.js\";\nimport {\n detectClientFile,\n transform,\n type TransformOptions,\n} from \"./transform.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;\nconst traverse = resolveDefault(_traverse) as unknown as TraverseFn;\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 onProgress?: (completed: number, total: number) => void;\n}\n\nexport interface CodegenResult {\n filesModified: number;\n stringsWrapped: number;\n filesProcessed: number;\n filesSkipped: number;\n clientNamespaces: string[];\n}\n\ninterface ParsedFileEntry {\n filePath: string;\n code: string;\n ast?: File;\n parseError?: string;\n isClientRoot: boolean;\n}\n\nconst SOURCE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".cts\",\n \".mjs\",\n \".cjs\",\n];\n\ninterface PathAliasResolver {\n prefix: string;\n exact: boolean;\n targets: string[];\n}\n\nfunction stripJsonComments(input: string): string {\n return input\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/^\\s*\\/\\/.*$/gm, \"\");\n}\n\nasync function loadPathAliasResolvers(cwd: string): Promise<PathAliasResolver[]> {\n const configNames = [\"tsconfig.json\", \"jsconfig.json\"];\n\n for (const configName of configNames) {\n let raw: string;\n try {\n raw = await readFile(join(cwd, configName), \"utf-8\");\n } catch {\n continue;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(stripJsonComments(raw));\n } catch {\n continue;\n }\n\n const compilerOptions = (\n parsed as { compilerOptions?: { baseUrl?: string; paths?: unknown } }\n ).compilerOptions;\n if (!compilerOptions?.paths || typeof compilerOptions.paths !== \"object\") {\n return [];\n }\n\n const baseUrl =\n typeof compilerOptions.baseUrl === \"string\"\n ? compilerOptions.baseUrl\n : \".\";\n const baseDir = resolve(join(cwd, baseUrl));\n const resolvers: PathAliasResolver[] = [];\n\n for (const [pattern, replacements] of Object.entries(compilerOptions.paths)) {\n if (!Array.isArray(replacements) || replacements.length === 0) continue;\n\n const wildcard = pattern.endsWith(\"/*\");\n const prefix = wildcard ? pattern.slice(0, -1) : pattern;\n const targets = replacements\n .filter((r): r is string => typeof r === \"string\")\n .map((r) => (wildcard && r.endsWith(\"/*\") ? r.slice(0, -1) : r))\n .map((r) => resolve(join(baseDir, r)));\n\n if (targets.length === 0) continue;\n resolvers.push({ prefix, exact: !wildcard, targets });\n }\n\n resolvers.sort((a, b) => b.prefix.length - a.prefix.length);\n return resolvers;\n }\n\n return [];\n}\n\nfunction collectRuntimeImportSources(ast: File): string[] {\n const sources = new Set<string>();\n\n for (const node of ast.program.body) {\n if (node.type === \"ImportDeclaration\") {\n if (node.importKind === \"type\") continue;\n\n const allTypeSpecifiers =\n node.specifiers.length > 0 &&\n node.specifiers.every(\n (spec) =>\n spec.type === \"ImportSpecifier\" && spec.importKind === \"type\",\n );\n if (allTypeSpecifiers) continue;\n\n sources.add(node.source.value);\n continue;\n }\n\n if (node.type === \"ExportNamedDeclaration\" && node.source) {\n if (node.exportKind !== \"type\") {\n sources.add(node.source.value);\n }\n continue;\n }\n\n if (node.type === \"ExportAllDeclaration\") {\n if (node.exportKind !== \"type\") {\n sources.add(node.source.value);\n }\n }\n }\n\n traverse(ast, {\n ImportExpression(path: any) {\n if (path.node.source.type === \"StringLiteral\") {\n sources.add(path.node.source.value);\n }\n },\n CallExpression(path: any) {\n // Babel can represent import() as CallExpression with Import callee.\n if (\n path.node.callee.type === \"Import\" &&\n path.node.arguments[0]?.type === \"StringLiteral\"\n ) {\n sources.add(path.node.arguments[0].value);\n }\n },\n noScope: true,\n });\n\n return [...sources];\n}\n\nfunction resolveFileCandidate(\n basePath: string,\n knownFiles: Set<string>,\n): string | null {\n const candidates = new Set<string>();\n const resolvedBase = resolve(basePath);\n const baseExt = extname(resolvedBase);\n\n candidates.add(resolvedBase);\n\n if (!baseExt) {\n for (const ext of SOURCE_EXTENSIONS) {\n candidates.add(resolve(`${resolvedBase}${ext}`));\n candidates.add(resolve(join(resolvedBase, `index${ext}`)));\n }\n }\n\n // ESM imports may reference .js while source files are .ts/.tsx\n if ([\".js\", \".jsx\", \".mjs\", \".cjs\"].includes(baseExt)) {\n const noExt = resolvedBase.slice(0, -baseExt.length);\n for (const ext of SOURCE_EXTENSIONS) {\n candidates.add(resolve(`${noExt}${ext}`));\n }\n }\n\n for (const candidate of candidates) {\n if (knownFiles.has(candidate)) return candidate;\n }\n\n return null;\n}\n\nfunction resolveLocalImport(\n importerPath: string,\n source: string,\n cwd: string,\n knownFiles: Set<string>,\n pathAliases: PathAliasResolver[],\n): string | null {\n const baseCandidates: string[] = [];\n\n if (source.startsWith(\".\")) {\n baseCandidates.push(resolve(dirname(importerPath), source));\n } else if (source.startsWith(\"@/\")) {\n baseCandidates.push(resolve(join(cwd, \"src\", source.slice(2))));\n baseCandidates.push(resolve(join(cwd, source.slice(2))));\n } else if (source.startsWith(\"~/\")) {\n baseCandidates.push(resolve(join(cwd, source.slice(2))));\n } else if (source.startsWith(\"/\")) {\n baseCandidates.push(resolve(join(cwd, source.slice(1))));\n } else {\n for (const alias of pathAliases) {\n if (alias.exact) {\n if (source !== alias.prefix) continue;\n baseCandidates.push(...alias.targets);\n } else if (source.startsWith(alias.prefix)) {\n const suffix = source.slice(alias.prefix.length);\n for (const target of alias.targets) {\n baseCandidates.push(resolve(join(target, suffix)));\n }\n }\n }\n if (baseCandidates.length === 0) return null;\n }\n\n for (const base of baseCandidates) {\n const resolved = resolveFileCandidate(base, knownFiles);\n if (resolved) return resolved;\n }\n\n return null;\n}\n\nfunction buildClientGraph(\n entries: ParsedFileEntry[],\n cwd: string,\n pathAliases: PathAliasResolver[],\n): Set<string> {\n const parsedEntries = entries.filter((e) => e.ast != null);\n const knownFiles = new Set(parsedEntries.map((e) => e.filePath));\n const depsByImporter = new Map<string, string[]>();\n\n for (const entry of parsedEntries) {\n const deps: string[] = [];\n const imports = collectRuntimeImportSources(entry.ast!);\n for (const source of imports) {\n const dep = resolveLocalImport(\n entry.filePath,\n source,\n cwd,\n knownFiles,\n pathAliases,\n );\n if (dep) deps.push(dep);\n }\n depsByImporter.set(entry.filePath, deps);\n }\n\n const clientReachable = new Set<string>();\n const queue: string[] = [];\n\n for (const entry of parsedEntries) {\n if (!entry.isClientRoot) continue;\n clientReachable.add(entry.filePath);\n queue.push(entry.filePath);\n }\n\n while (queue.length > 0) {\n const filePath = queue.shift()!;\n const deps = depsByImporter.get(filePath) ?? [];\n for (const dep of deps) {\n if (clientReachable.has(dep)) continue;\n clientReachable.add(dep);\n queue.push(dep);\n }\n }\n\n return clientReachable;\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 const transformOpts: TransformOptions = {\n i18nImport: options.i18nImport,\n mode: options.mode,\n componentPath: options.componentPath,\n };\n\n const parseLimit = pLimit(10);\n const parsedEntries = await Promise.all(\n files.map((filePath) =>\n parseLimit(async (): Promise<ParsedFileEntry> => {\n const code = await readFile(filePath, \"utf-8\");\n try {\n const ast = parseFile(code, filePath);\n return {\n filePath,\n code,\n ast,\n isClientRoot: detectClientFile(ast),\n };\n } catch (err) {\n return {\n filePath,\n code,\n parseError: err instanceof Error ? err.message : String(err),\n isClientRoot: false,\n };\n }\n }),\n ),\n );\n\n const pathAliases = await loadPathAliasResolvers(cwd);\n const forceClientSet = buildClientGraph(parsedEntries, cwd, pathAliases);\n\n const limit = pLimit(10);\n let completed = 0;\n const clientNamespacesSet = new Set<string>();\n\n const fileResults = await Promise.all(\n parsedEntries.map((entry) =>\n limit(async () => {\n if (!entry.ast) {\n logWarning(\n `Skipping unparseable file ${entry.filePath}: ${entry.parseError ?? \"unknown parse error\"}`,\n );\n completed++;\n options.onProgress?.(completed, files.length);\n return { modified: false, wrapped: 0, skipped: false };\n }\n\n const isClient =\n forceClientSet.has(entry.filePath) || entry.isClientRoot;\n const fileTransformOpts: TransformOptions = {\n ...transformOpts,\n forceClient: forceClientSet.has(entry.filePath),\n };\n\n const result = transform(\n entry.ast,\n options.textToKey,\n fileTransformOpts,\n );\n\n // Collect namespaces from client files for selective message passing\n if (isClient && result.usedKeys.length > 0) {\n for (const key of result.usedKeys) {\n const dot = key.indexOf(\".\");\n if (dot > 0) {\n clientNamespacesSet.add(key.slice(0, dot));\n }\n }\n }\n\n if (result.modified) {\n try {\n parseFile(result.code, entry.filePath);\n } catch {\n logWarning(\n `Codegen produced invalid syntax for ${entry.filePath}, file was NOT modified.`,\n );\n completed++;\n options.onProgress?.(completed, files.length);\n return { modified: false, wrapped: 0, skipped: true };\n }\n\n await writeFile(entry.filePath, result.code, \"utf-8\");\n completed++;\n options.onProgress?.(completed, files.length);\n return {\n modified: true,\n wrapped: result.stringsWrapped,\n skipped: false,\n };\n }\n\n completed++;\n options.onProgress?.(completed, files.length);\n return { modified: false, wrapped: 0, skipped: false };\n }),\n ),\n );\n\n let filesModified = 0;\n let stringsWrapped = 0;\n let filesSkipped = 0;\n\n for (const r of fileResults) {\n if (r.modified) {\n filesModified++;\n stringsWrapped += r.wrapped;\n }\n if (r.skipped) filesSkipped++;\n }\n\n return {\n filesModified,\n stringsWrapped,\n filesProcessed: files.length,\n filesSkipped,\n clientNamespaces: [...clientNamespacesSet].sort(),\n };\n}\n","const PLACEHOLDER_REGEX =\n /\\{\\{[\\w.]+\\}\\}|\\{[\\w.]+\\}|\\{\\d+\\}|%[sd@]|%\\.\\d+f|<\\/?[\\w-]+(?:\\s[^>]*)?\\s*\\/?>|<\\/[\\w-]+>/g;\n\nexport function extractPlaceholders(text: string): string[] {\n const matches = text.match(PLACEHOLDER_REGEX);\n if (!matches) return [];\n return matches.slice().sort();\n}\n\nexport interface PlaceholderValidation {\n valid: boolean;\n missing: string[];\n extra: string[];\n}\n\nexport function validatePlaceholders(\n source: string,\n translated: string,\n): PlaceholderValidation {\n const sourcePlaceholders = extractPlaceholders(source);\n const translatedPlaceholders = extractPlaceholders(translated);\n\n const sourceCount = new Map<string, number>();\n for (const p of sourcePlaceholders) {\n sourceCount.set(p, (sourceCount.get(p) ?? 0) + 1);\n }\n\n const translatedCount = new Map<string, number>();\n for (const p of translatedPlaceholders) {\n translatedCount.set(p, (translatedCount.get(p) ?? 0) + 1);\n }\n\n const missing: string[] = [];\n const extra: string[] = [];\n\n for (const [placeholder, count] of sourceCount) {\n const tCount = translatedCount.get(placeholder) ?? 0;\n for (let i = 0; i < count - tCount; i++) {\n missing.push(placeholder);\n }\n }\n\n for (const [placeholder, count] of translatedCount) {\n const sCount = sourceCount.get(placeholder) ?? 0;\n for (let i = 0; i < count - sCount; i++) {\n extra.push(placeholder);\n }\n }\n\n return {\n valid: missing.length === 0 && extra.length === 0,\n missing,\n extra,\n };\n}\n\nexport interface BatchValidation {\n valid: boolean;\n failures: Array<{\n key: string;\n missing: string[];\n extra: string[];\n }>;\n}\n\nexport function validateBatch(\n sourceEntries: Record<string, string>,\n translatedEntries: Record<string, string>,\n): BatchValidation {\n const failures: BatchValidation[\"failures\"] = [];\n\n for (const key of Object.keys(sourceEntries)) {\n const source = sourceEntries[key];\n const translated = translatedEntries[key];\n if (translated == null) continue;\n\n const result = validatePlaceholders(source, translated);\n if (!result.valid) {\n failures.push({ key, missing: result.missing, extra: result.extra });\n }\n }\n\n return {\n valid: failures.length === 0,\n failures,\n };\n}\n","import { generateObject, type LanguageModel } from \"ai\";\nimport { z } from \"zod\";\nimport pLimit from \"p-limit\";\nimport type { TranslationOptions } from \"./types.js\";\nimport { validateBatch } from \"./validate.js\";\nimport { logWarning } from \"./logger.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\ninterface BatchResult {\n translations: Record<string, string>;\n usage: { inputTokens: number; outputTokens: number };\n}\n\nasync function translateBatchWithRetry(\n input: TranslateBatchInput,\n retries: number,\n): Promise<BatchResult> {\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 const shouldValidate = options?.validatePlaceholders !== false;\n let lastError: Error | undefined;\n let totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const { object, usage } = await generateObject({\n model,\n prompt,\n schema,\n });\n\n totalUsage.inputTokens += usage.inputTokens ?? 0;\n totalUsage.outputTokens += usage.outputTokens ?? 0;\n\n if (shouldValidate) {\n const validation = validateBatch(entries, object);\n if (!validation.valid) {\n if (attempt < retries) {\n logWarning(\n `Placeholder mismatch in batch (attempt ${attempt + 1}/${retries + 1}), retrying...`,\n );\n continue;\n }\n for (const failure of validation.failures) {\n logWarning(\n `Placeholder mismatch for key \"${failure.key}\": missing=[${failure.missing.join(\", \")}] extra=[${failure.extra.join(\", \")}]`,\n );\n }\n }\n }\n\n return { translations: object, usage: totalUsage };\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 onProgress?: (completed: number, total: number) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => 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 onProgress,\n onUsage,\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 let completedKeys = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n await Promise.all(\n batches.map((batch) =>\n limit(async () => {\n const { translations, usage } = await translateBatchWithRetry(\n { model, entries: batch, sourceLocale, targetLocale, options },\n retries,\n );\n Object.assign(results, translations);\n totalInputTokens += usage.inputTokens;\n totalOutputTokens += usage.outputTokens;\n completedKeys += Object.keys(batch).length;\n onProgress?.(completedKeys, keys.length);\n onBatchComplete?.(translations);\n }),\n ),\n );\n\n if (totalInputTokens > 0 || totalOutputTokens > 0) {\n onUsage?.({ inputTokens: totalInputTokens, outputTokens: totalOutputTokens });\n }\n\n return results;\n}\n","import { writeFile, mkdir, readdir, unlink } 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 writeTranslationSplit(\n dir: string,\n flatEntries: Record<string, string>,\n): Promise<void> {\n await mkdir(dir, { recursive: true });\n\n const byNamespace = new Map<string, Record<string, string>>();\n\n for (const [key, value] of Object.entries(flatEntries)) {\n const dot = key.indexOf(\".\");\n if (dot > 0) {\n const ns = key.slice(0, dot);\n const restKey = key.slice(dot + 1);\n if (!byNamespace.has(ns)) byNamespace.set(ns, {});\n byNamespace.get(ns)![restKey] = value;\n } else {\n // Keys without a namespace go into a root namespace file\n if (!byNamespace.has(\"_root\")) byNamespace.set(\"_root\", {});\n byNamespace.get(\"_root\")![key] = value;\n }\n }\n\n for (const [ns, entries] of byNamespace) {\n const filePath = join(dir, `${ns}.json`);\n const nested = unflatten(entries);\n const content = JSON.stringify(nested, null, 2) + \"\\n\";\n await writeFile(filePath, content, \"utf-8\");\n }\n\n // Remove stale namespace files\n const currentFiles = new Set([...byNamespace.keys()].map((ns) => `${ns}.json`));\n let existing: string[];\n try {\n existing = await readdir(dir);\n } catch {\n return;\n }\n for (const file of existing) {\n if (file.endsWith(\".json\") && !currentFiles.has(file)) {\n await unlink(join(dir, file));\n }\n }\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 { join } from \"node:path\";\nimport { writeFile, mkdir, readdir } from \"node:fs/promises\";\n\nexport async function generateNextIntlTypes(\n messagesDir: string,\n sourceLocale: string,\n splitByNamespace?: boolean,\n): Promise<void> {\n await mkdir(messagesDir, { recursive: true });\n\n let content: string;\n\n if (splitByNamespace) {\n const sourceDir = join(messagesDir, sourceLocale);\n let files: string[];\n try {\n files = (await readdir(sourceDir)).filter((f) => f.endsWith(\".json\")).sort();\n } catch {\n files = [];\n }\n\n if (files.length === 0) {\n content = `type Messages = Record<string, never>;\n\ndeclare module \"next-intl\" {\n interface AppConfig {\n Messages: Messages;\n }\n}\n`;\n } else {\n const imports = files.map((f) => {\n const ns = f.replace(\".json\", \"\");\n return `import ${ns} from \"./${sourceLocale}/${f}\";`;\n });\n const typeEntries = files.map((f) => {\n const ns = f.replace(\".json\", \"\");\n return ` ${ns}: typeof ${ns};`;\n });\n content = `${imports.join(\"\\n\")}\n\ntype Messages = {\n${typeEntries.join(\"\\n\")}\n};\n\ndeclare module \"next-intl\" {\n interface AppConfig {\n Messages: Messages;\n }\n}\n`;\n }\n } else {\n content = `import messages from \"./${sourceLocale}.json\";\n\ndeclare module \"next-intl\" {\n interface AppConfig {\n Messages: typeof messages;\n }\n}\n`;\n }\n\n const outPath = join(messagesDir, \"next-intl.d.ts\");\n await writeFile(outPath, content, \"utf-8\");\n}\n","import { join } from \"node:path\";\nimport { readFile, readdir, writeFile, mkdir } from \"node:fs/promises\";\nimport { scan } from \"./scanner/index.js\";\nimport { generateSemanticKeys } from \"./scanner/key-ai.js\";\nimport { codegen, type CodegenResult } from \"./codegen/index.js\";\nimport { translateAll } from \"./translate.js\";\nimport { writeTranslation, writeTranslationSplit, writeLockFile } from \"./writer.js\";\nimport { loadJsonFile, loadLockFile, computeDiff } from \"./diff.js\";\nimport { flatten, unflatten } from \"./flatten.js\";\nimport { logWarning } from \"./logger.js\";\nimport { generateNextIntlTypes } from \"./typegen.js\";\nimport type { TranslateKitConfig } from \"./types.js\";\n\n// --- Map file helpers (moved from cli.ts) ---\n\nexport async function loadMapFile(\n messagesDir: string,\n): Promise<Record<string, string>> {\n const mapPath = join(messagesDir, \".translate-map.json\");\n let content: string;\n try {\n content = await readFile(mapPath, \"utf-8\");\n } catch {\n return {};\n }\n try {\n return JSON.parse(content);\n } catch {\n logWarning(\n `.translate-map.json is corrupted (invalid JSON). Starting fresh.`,\n );\n return {};\n }\n}\n\nexport async 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\nexport async function loadSplitMessages(\n dir: string,\n): Promise<Record<string, string>> {\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return {};\n }\n\n const flat: Record<string, string> = {};\n for (const file of files.filter((f) => f.endsWith(\".json\"))) {\n const ns = file.replace(\".json\", \"\");\n const raw = await loadJsonFile(join(dir, file));\n const nsFlat = flatten(raw);\n for (const [key, value] of Object.entries(nsFlat)) {\n if (ns === \"_root\") {\n flat[key] = value;\n } else {\n flat[`${ns}.${key}`] = value;\n }\n }\n }\n return flat;\n}\n\n// --- Scan step ---\n\nexport interface ScanStepInput {\n config: TranslateKitConfig;\n cwd: string;\n callbacks?: {\n onScanProgress?: (completed: number, total: number) => void;\n onKeygenProgress?: (completed: number, total: number) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n };\n}\n\nexport interface ScanStepResult {\n textToKey: Record<string, string>;\n sourceFlat: Record<string, string>;\n bareStringCount: number;\n fileCount: number;\n}\n\nexport async function runScanStep(\n input: ScanStepInput,\n): Promise<ScanStepResult> {\n const { config, cwd, callbacks } = input;\n const mode = config.mode ?? \"keys\";\n\n const result = await scan(config.scan!, cwd, {\n onProgress: callbacks?.onScanProgress,\n });\n\n // Blacklist filter: exclude already-wrapped strings\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 const existingMap = await loadMapFile(config.messagesDir);\n\n // Inline mode: supplement existingMap with T-components and t-calls from scan\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 // allTexts includes wrapped strings for key deduplication.\n // In keys mode, wrapped calls usually expose keys (not source text), so we\n // keep existing text entries to avoid pruning valid mappings on re-scans.\n const allTexts = new Set(result.strings.map((s) => s.text));\n if (mode === \"keys\") {\n for (const text of Object.keys(existingMap)) {\n allTexts.add(text);\n }\n }\n\n const textToKey = await generateSemanticKeys({\n model: config.model,\n strings: bareStrings,\n existingMap,\n allTexts,\n batchSize: config.translation?.batchSize ?? 50,\n concurrency: config.translation?.concurrency ?? 3,\n retries: config.translation?.retries ?? 2,\n onProgress: callbacks?.onKeygenProgress,\n onUsage: callbacks?.onUsage,\n });\n\n await writeMapFile(config.messagesDir, textToKey);\n\n // Keys mode: write source locale JSON\n const sourceFlat: Record<string, string> = {};\n for (const [text, key] of Object.entries(textToKey)) {\n sourceFlat[key] = text;\n }\n\n if (mode !== \"inline\") {\n if (config.splitByNamespace) {\n const sourceDir = join(config.messagesDir, config.sourceLocale);\n await writeTranslationSplit(sourceDir, sourceFlat);\n } else {\n const sourceFile = join(\n config.messagesDir,\n `${config.sourceLocale}.json`,\n );\n await mkdir(config.messagesDir, { recursive: true });\n const nested = unflatten(sourceFlat);\n const content = JSON.stringify(nested, null, 2) + \"\\n\";\n await writeFile(sourceFile, content, \"utf-8\");\n }\n if (config.typeSafe) {\n await generateNextIntlTypes(config.messagesDir, config.sourceLocale, config.splitByNamespace);\n }\n }\n\n return {\n textToKey,\n sourceFlat,\n bareStringCount: bareStrings.length,\n fileCount: result.fileCount,\n };\n}\n\n// --- Codegen step ---\n\nexport interface CodegenStepInput {\n config: TranslateKitConfig;\n cwd: string;\n textToKey?: Record<string, string>;\n callbacks?: {\n onProgress?: (completed: number, total: number) => void;\n };\n}\n\nexport async function runCodegenStep(\n input: CodegenStepInput,\n): Promise<CodegenResult> {\n const { config, cwd, callbacks } = input;\n const mode = config.mode ?? \"keys\";\n\n let textToKey = input.textToKey;\n if (!textToKey) {\n textToKey = await loadMapFile(config.messagesDir);\n if (Object.keys(textToKey).length === 0) {\n throw new Error(\n \"No .translate-map.json found. Run 'translate-kit scan' first.\",\n );\n }\n }\n\n return codegen(\n {\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 onProgress: callbacks?.onProgress,\n },\n cwd,\n );\n}\n\n// --- Translate step ---\n\nexport interface TranslateStepInput {\n config: TranslateKitConfig;\n sourceFlat?: Record<string, string>;\n locales?: string[];\n force?: boolean;\n dryRun?: boolean;\n callbacks?: {\n onLocaleProgress?: (\n locale: string,\n completed: number,\n total: number,\n ) => void;\n onUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n };\n}\n\nexport interface TranslateLocaleResult {\n locale: string;\n translated: number;\n cached: number;\n removed: number;\n errors: number;\n duration: number;\n}\n\nexport interface TranslateStepResult {\n localeResults: TranslateLocaleResult[];\n}\n\nexport async function runTranslateStep(\n input: TranslateStepInput,\n): Promise<TranslateStepResult> {\n const { config, callbacks } = input;\n const mode = config.mode ?? \"keys\";\n const locales = input.locales ?? config.targetLocales;\n\n // Resolve sourceFlat\n let sourceFlat = input.sourceFlat;\n if (!sourceFlat) {\n if (mode === \"inline\") {\n const mapData = await loadMapFile(config.messagesDir);\n sourceFlat = {};\n for (const [text, key] of Object.entries(mapData)) {\n sourceFlat[key] = text;\n }\n } else if (config.splitByNamespace) {\n const sourceDir = join(config.messagesDir, config.sourceLocale);\n sourceFlat = await loadSplitMessages(sourceDir);\n } else {\n const sourceFile = join(\n config.messagesDir,\n `${config.sourceLocale}.json`,\n );\n const sourceRaw = await loadJsonFile(sourceFile);\n sourceFlat = flatten(sourceRaw);\n }\n }\n\n const localeResults: TranslateLocaleResult[] = [];\n\n for (const locale of locales) {\n const start = Date.now();\n let targetFlat: Record<string, string>;\n\n if (config.splitByNamespace) {\n const targetDir = join(config.messagesDir, locale);\n targetFlat = await loadSplitMessages(targetDir);\n } else {\n const targetFile = join(config.messagesDir, `${locale}.json`);\n const targetRaw = await loadJsonFile(targetFile);\n targetFlat = flatten(targetRaw);\n }\n\n let lockData = await loadLockFile(config.messagesDir);\n if (input.force) {\n lockData = {};\n }\n\n const diffResult = computeDiff(sourceFlat, targetFlat, lockData);\n\n if (input.dryRun) {\n localeResults.push({\n locale,\n translated: 0,\n cached: Object.keys(diffResult.unchanged).length,\n removed: diffResult.removed.length,\n errors: 0,\n duration: Date.now() - start,\n });\n continue;\n }\n\n const toTranslate = { ...diffResult.added, ...diffResult.modified };\n let translated: Record<string, string> = {};\n let errors = 0;\n let translationFailed = false;\n\n if (Object.keys(toTranslate).length > 0) {\n try {\n translated = await translateAll({\n model: config.model,\n entries: toTranslate,\n sourceLocale: config.sourceLocale,\n targetLocale: locale,\n options: config.translation,\n onProgress: callbacks?.onLocaleProgress\n ? (c, t) => callbacks.onLocaleProgress!(locale, c, t)\n : undefined,\n onUsage: callbacks?.onUsage,\n });\n } catch (err) {\n errors = Object.keys(toTranslate).length;\n translationFailed = true;\n }\n }\n\n if (translationFailed) {\n localeResults.push({\n locale,\n translated: 0,\n cached: Object.keys(diffResult.unchanged).length,\n removed: 0,\n errors,\n duration: Date.now() - start,\n });\n continue;\n }\n\n const finalFlat: Record<string, string> = {\n ...diffResult.unchanged,\n ...translated,\n };\n\n if (config.splitByNamespace) {\n const targetDir = join(config.messagesDir, locale);\n await writeTranslationSplit(targetDir, finalFlat);\n } else {\n const targetFile = join(config.messagesDir, `${locale}.json`);\n await writeTranslation(targetFile, finalFlat, {\n flat: mode === \"inline\",\n });\n }\n\n const allTranslatedKeys = Object.keys(finalFlat);\n const currentLock = await loadLockFile(config.messagesDir);\n await writeLockFile(\n config.messagesDir,\n sourceFlat,\n currentLock,\n allTranslatedKeys,\n );\n\n localeResults.push({\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\n return { localeResults };\n}\n","import { fetchModels, getTokenCosts } from \"tokenlens\";\nimport type { LanguageModel } from \"ai\";\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n}\n\nexport function createUsageTracker() {\n let inputTokens = 0;\n let outputTokens = 0;\n return {\n add(usage: { inputTokens?: number; outputTokens?: number }) {\n inputTokens += usage.inputTokens ?? 0;\n outputTokens += usage.outputTokens ?? 0;\n },\n get(): TokenUsage {\n return { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens };\n },\n };\n}\n\nexport async function estimateCost(\n model: LanguageModel,\n usage: TokenUsage,\n): Promise<{ totalUSD: number; inputUSD: number; outputUSD: number } | null> {\n try {\n const m = model as Record<string, unknown>;\n const provider = typeof m.provider === \"string\" ? m.provider : \"unknown\";\n const modelId = typeof m.modelId === \"string\" ? m.modelId : \"unknown\";\n const fullId = `${provider}/${modelId}`;\n const providers = await fetchModels(provider);\n const costs = getTokenCosts({\n modelId: fullId,\n usage: {\n prompt_tokens: usage.inputTokens,\n completion_tokens: usage.outputTokens,\n },\n providers,\n });\n if (costs.totalUSD == null) return null;\n return { totalUSD: costs.totalUSD, inputUSD: costs.inputUSD ?? 0, outputUSD: costs.outputUSD ?? 0 };\n } catch {\n return null;\n }\n}\n\nexport function formatUsage(usage: TokenUsage): string {\n return `${usage.inputTokens.toLocaleString()} in + ${usage.outputTokens.toLocaleString()} out = ${usage.totalTokens.toLocaleString()} tokens`;\n}\n\nexport function formatCost(usd: number): string {\n return usd < 0.01 ? `~$${usd.toFixed(4)}` : `~$${usd.toFixed(2)}`;\n}\n","/**\n * Pure functions extracted from cli.ts for testability.\n */\n\nexport interface ParsedTranslateFlags {\n dryRun: boolean;\n force: boolean;\n verbose: boolean;\n locale: string | undefined;\n}\n\n/**\n * Parse raw CLI args into translate command flags.\n * Mirrors the logic in main.run() for the default translate command.\n */\nexport function parseTranslateFlags(rawArgs: string[]): ParsedTranslateFlags {\n const dryRun = rawArgs.includes(\"--dry-run\");\n const force = rawArgs.includes(\"--force\");\n const verbose = rawArgs.includes(\"--verbose\");\n let locale: string | undefined;\n const equalsArg = rawArgs.find((a) => a.startsWith(\"--locale=\"));\n if (equalsArg) {\n locale = equalsArg.split(\"=\")[1] || undefined;\n } else {\n const idx = rawArgs.indexOf(\"--locale\");\n if (idx !== -1) {\n const next = rawArgs[idx + 1];\n locale = next && !next.startsWith(\"--\") ? next : undefined;\n }\n }\n\n return { dryRun, force, verbose, locale };\n}\n\n/**\n * Validate a locale string to prevent path traversal and injection.\n * Only allows letters, numbers, hyphens, and underscores.\n */\nexport function validateLocale(locale: string): boolean {\n return /^[a-zA-Z0-9_-]+$/.test(locale);\n}\n","export const CLIENT_TEMPLATE = `\"use client\";\nimport { createContext, useContext, useEffect, type ReactNode } from \"react\";\n\ntype Messages = Record<string, string>;\nconst I18nCtx = createContext<Messages>({});\n\nexport function I18nProvider({ messages = {}, locale, children }: { messages?: Messages; locale?: string; children: ReactNode }) {\n useEffect(() => {\n if (locale) {\n document.cookie = \\`NEXT_LOCALE=\\${locale}; path=/; max-age=31536000; SameSite=Lax\\`;\n }\n }, [locale]);\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, values?: Record<string, string | number>): string => {\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n}\n`;\n\nconst SINGLE_FILE_LOAD_BODY = ` const { readFile } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n try {\n const filePath = join(process.cwd(), messagesDir, \\`\\${locale}.json\\`);\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {};\n }`;\n\nconst SPLIT_LOAD_BODY = ` const { readFile, readdir } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n try {\n const dir = join(process.cwd(), messagesDir, locale);\n let files: string[];\n try { files = (await readdir(dir)).filter(f => f.endsWith(\".json\")); } catch { return {}; }\n const msgs: Messages = {};\n for (const f of files) {\n const ns = f.replace(\".json\", \"\");\n const data = JSON.parse(await readFile(join(dir, f), \"utf-8\"));\n (function flat(obj: any, prefix: string) {\n for (const [k, v] of Object.entries(obj)) {\n const full = prefix ? prefix + \".\" + k : k;\n if (typeof v === \"object\" && v !== null && !Array.isArray(v)) flat(v, full);\n else msgs[ns === \"_root\" ? full : ns + \".\" + full] = v as string;\n }\n })(data, \"\");\n }\n return msgs;\n } catch {\n return {};\n }`;\n\nexport function serverTemplate(\n clientBasename: string,\n opts?: {\n sourceLocale: string;\n targetLocales: string[];\n messagesDir: string;\n splitByNamespace?: boolean;\n },\n): string {\n if (!opts) {\n // Legacy fallback (no lazy loading)\n return `import type { ReactNode } from \"react\";\nimport { cache } from \"react\";\nexport { I18nProvider } from \"./${clientBasename}\";\n\ntype Messages = Record<string, string>;\n\n// Per-request message store using React cache\nconst getMessageStore = cache(() => ({ current: {} as Messages }));\n\nexport function setServerMessages(messages: Messages) {\n getMessageStore().current = messages;\n}\n\nexport function T({ id, children, messages }: { id?: string; children: ReactNode; messages?: Messages }) {\n if (!id) return <>{children}</>;\n const msgs = messages ?? getMessageStore().current;\n return <>{msgs[id] ?? children}</>;\n}\n\nexport function createT(messages?: Messages) {\n return (text: string, id?: string, values?: Record<string, string | number>): string => {\n const msgs = messages ?? getMessageStore().current;\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n}\n`;\n }\n\n const allLocales = [opts.sourceLocale, ...opts.targetLocales];\n const allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n\n return `import type { ReactNode } from \"react\";\nimport { cache } from \"react\";\nexport { I18nProvider } from \"./${clientBasename}\";\n\ntype Messages = Record<string, string>;\n\nconst supported = [${allLocalesStr}] as const;\ntype Locale = (typeof supported)[number];\nconst defaultLocale: Locale = \"${opts.sourceLocale}\";\nconst messagesDir = \"${opts.messagesDir}\";\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\nconst getLocaleStore = cache(() => ({ current: null as string | null }));\n\nexport function setLocale(locale: string) {\n getLocaleStore().current = locale;\n}\n\n// Per-request cached message loading — works even when layout is cached during client-side navigation\n// Uses dynamic imports so this file can be safely imported from client components\nconst getCachedMessages = cache(async (): Promise<Messages> => {\n let locale: Locale | null = getLocaleStore().current as Locale | null;\n\n if (!locale) {\n try {\n const { cookies } = await import(\"next/headers\");\n const c = await cookies();\n const cookieLocale = c.get(\"NEXT_LOCALE\")?.value;\n if (cookieLocale && supported.includes(cookieLocale as Locale)) {\n locale = cookieLocale as Locale;\n }\n } catch {}\n }\n\n if (!locale) {\n const { headers } = await import(\"next/headers\");\n const h = await headers();\n const acceptLang = h.get(\"accept-language\") ?? \"\";\n locale = parseAcceptLanguage(acceptLang);\n }\n\n if (locale === defaultLocale) return {};\n${opts.splitByNamespace ? SPLIT_LOAD_BODY : SINGLE_FILE_LOAD_BODY}\n});\n\n// Per-request message store (populated by setServerMessages in layout)\nconst getMessageStore = cache(() => ({ current: null as Messages | null }));\n\nexport function setServerMessages(messages: Messages) {\n getMessageStore().current = messages;\n}\n\nasync function resolveMessages(explicit?: Messages): Promise<Messages> {\n if (explicit) return explicit;\n const store = getMessageStore().current;\n if (store) return store;\n return getCachedMessages();\n}\n\nexport async function T({ id, children, messages }: { id?: string; children: ReactNode; messages?: Messages }) {\n if (!id) return <>{children}</>;\n const msgs = await resolveMessages(messages);\n // Populate store so sync createT() calls in the same request benefit\n if (!messages && !getMessageStore().current) {\n getMessageStore().current = msgs;\n }\n return <>{msgs[id] ?? children}</>;\n}\n\ntype TFn = (text: string, id?: string, values?: Record<string, string | number>) => string;\n\n// Backward-compatible: works both as sync createT() and async await createT()\n// - Sync: reads from store (works when layout called setServerMessages)\n// - Async: lazily loads messages from filesystem (works during client-side navigation)\nexport function createT(messages?: Messages): TFn & PromiseLike<TFn> {\n const t: TFn = (text, id, values) => {\n const msgs = messages ?? getMessageStore().current ?? {};\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n\n const asyncResult = resolveMessages(messages).then(msgs => {\n if (!messages && !getMessageStore().current) {\n getMessageStore().current = msgs;\n }\n const bound: TFn = (text, id, values) => {\n const raw = id ? (msgs[id] ?? text) : text;\n if (!values) return raw;\n return raw.replace(/\\\\{(\\\\w+)\\\\}/g, (_, k) => String(values[k] ?? \\`{\\${k}}\\`));\n };\n return bound;\n });\n\n return Object.assign(t, { then: asyncResult.then.bind(asyncResult) });\n}\n`;\n}\n\nexport function generateI18nHelper(opts: {\n sourceLocale: string;\n targetLocales: string[];\n messagesDir: string;\n splitByNamespace?: boolean;\n}): string {\n const allLocales = [opts.sourceLocale, ...opts.targetLocales];\n const allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n\n const fsImports = opts.splitByNamespace\n ? `import { readFile, readdir } from \"node:fs/promises\";`\n : `import { readFile } from \"node:fs/promises\";`;\n\n const getMessagesBody = opts.splitByNamespace\n ? ` if (locale === defaultLocale) return {};\n try {\n const dir = join(process.cwd(), \"${opts.messagesDir}\", locale);\n let files: string[];\n try { files = (await readdir(dir)).filter(f => f.endsWith(\".json\")); } catch { return {}; }\n const msgs: Record<string, string> = {};\n for (const f of files) {\n const ns = f.replace(\".json\", \"\");\n const data = JSON.parse(await readFile(join(dir, f), \"utf-8\"));\n (function flat(obj: any, prefix: string) {\n for (const [k, v] of Object.entries(obj)) {\n const full = prefix ? prefix + \".\" + k : k;\n if (typeof v === \"object\" && v !== null && !Array.isArray(v)) flat(v, full);\n else msgs[ns === \"_root\" ? full : ns + \".\" + full] = v as string;\n }\n })(data, \"\");\n }\n return msgs;\n } catch {\n return {};\n }`\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 return `import { headers, cookies } from \"next/headers\";\n${fsImports}\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 try {\n const c = await cookies();\n const cookieLocale = c.get(\"NEXT_LOCALE\")?.value;\n if (cookieLocale && supported.includes(cookieLocale as Locale)) {\n return cookieLocale as Locale;\n }\n } catch {}\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${getMessagesBody}\n}\n`;\n}\n","import * as p from \"@clack/prompts\";\nimport { existsSync } from \"node:fs\";\nimport { basename, join, relative } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport {\n runScanStep,\n runCodegenStep,\n runTranslateStep,\n} from \"./pipeline.js\";\nimport {\n CLIENT_TEMPLATE,\n serverTemplate,\n generateI18nHelper,\n} from \"./templates/t-component.js\";\nimport { parseFile } from \"./scanner/parser.js\";\nimport { createUsageTracker, estimateCost, formatUsage, formatCost } from \"./usage.js\";\nimport { validateLocale } from \"./cli-utils.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\nexport function 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 splitByNamespace?: boolean;\n typeSafe?: boolean;\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 if (opts.splitByNamespace) {\n lines.push(` splitByNamespace: true,`);\n }\n if (opts.typeSafe) {\n lines.push(` typeSafe: true,`);\n }\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 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 splitByNamespace?: boolean,\n): Promise<void> {\n await mkdir(msgDir, { recursive: true });\n for (const locale of locales) {\n if (splitByNamespace) {\n await mkdir(join(msgDir, locale), { recursive: true });\n } else {\n const msgFile = join(msgDir, `${locale}.json`);\n if (!existsSync(msgFile)) {\n await writeFile(msgFile, \"{}\\n\", \"utf-8\");\n }\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 splitByNamespace?: boolean,\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\n const messagesLoader = splitByNamespace\n ? `await loadNamespaceMessages(join(process.cwd(), \"${messagesDir}\", locale))`\n : `(await import(\\`${relMessages}/\\${locale}.json\\`)).default`;\n\n const splitHelpers = splitByNamespace\n ? `\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nasync function loadNamespaceMessages(dir: string): Promise<Record<string, unknown>> {\n let files: string[];\n try { files = await readdir(dir); } catch { return {}; }\n const messages: Record<string, unknown> = {};\n for (const file of files.filter((f) => f.endsWith(\".json\"))) {\n const ns = file.replace(\".json\", \"\");\n if (ns === \"_root\") {\n Object.assign(messages, JSON.parse(await readFile(join(dir, file), \"utf-8\")));\n } else {\n messages[ns] = JSON.parse(await readFile(join(dir, file), \"utf-8\"));\n }\n }\n return messages;\n}\n`\n : \"\";\n\n await writeFile(\n requestFile,\n `import { getRequestConfig } from \"next-intl/server\";\nimport { headers } from \"next/headers\";${splitHelpers}\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: ${messagesLoader},\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 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 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 layoutContent,\n \"root layout\",\n )\n ) {\n filesCreated.push(relative(cwd, layoutPath) + \" (updated)\");\n }\n }\n }\n\n await createEmptyMessageFiles(join(cwd, messagesDir), allLocales, splitByNamespace);\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 localeOpts: {\n sourceLocale: string;\n targetLocales: string[];\n messagesDir: string;\n splitByNamespace?: boolean;\n },\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 const clientBasename = basename(fsPath);\n\n await writeFile(clientFile, CLIENT_TEMPLATE, \"utf-8\");\n await writeFile(serverFile, serverTemplate(clientBasename, localeOpts), \"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 splitByNamespace?: boolean,\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 splitByNamespace,\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 importLines =\n `import { I18nProvider } from \"${componentPath}\";\\n` +\n `import { setServerMessages, setLocale } from \"${componentPath}-server\";\\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\\tsetLocale(locale);\\n\\tconst messages = await getMessages(locale);\\n\\tsetServerMessages(messages);\\n\\n\\treturn (\",\n );\n\n layoutContent = layoutContent.replace(\n /(<body[^>]*>)/,\n \"$1\\n\\t\\t\\t\\t<I18nProvider messages={messages} locale={locale}>\",\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 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 ], splitByNamespace);\n\n if (filesCreated.length > 0) {\n p.log.success(`Inline i18n configured: ${filesCreated.join(\", \")}`);\n }\n}\n\nexport async function updateLayoutWithSelectiveMessages(\n cwd: string,\n clientNamespaces: string[],\n): Promise<void> {\n if (clientNamespaces.length === 0) return;\n\n const useSrc = detectSrcDir(cwd);\n const base = useSrc ? join(cwd, \"src\") : cwd;\n const layoutPath = findLayoutFile(base);\n if (!layoutPath) return;\n\n let content = await readFile(layoutPath, \"utf-8\");\n\n const isNextIntl = content.includes(\"NextIntlClientProvider\");\n const isInline = content.includes(\"I18nProvider\") && !isNextIntl;\n\n if (!isNextIntl && !isInline) return;\n\n const namespacesStr = clientNamespaces.map((n) => `\"${n}\"`).join(\", \");\n\n if (content.includes(\"clientMessages\")) {\n // Already updated — just refresh the namespace list\n content = content.replace(\n /pickMessages\\(messages,\\s*\\[.*?\\]\\)/,\n `pickMessages(messages, [${namespacesStr}])`,\n );\n } else {\n if (!content.includes(\"messages={messages}\")) return;\n\n // Add pickMessages helper — different filter logic for inline vs keys mode\n if (!content.includes(\"pickMessages\")) {\n const helper = isInline\n ? '\\nfunction pickMessages(messages: Record<string, string>, namespaces: string[]) {\\n return Object.fromEntries(\\n Object.entries(messages).filter(([key]) =>\\n namespaces.some(ns => key === ns || key.startsWith(ns + \".\"))\\n )\\n );\\n}\\n'\n : '\\nfunction pickMessages(messages: Record<string, unknown>, namespaces: string[]) {\\n return Object.fromEntries(Object.entries(messages).filter(([key]) => namespaces.includes(key) || (typeof messages[key] === \"string\" && namespaces.some(ns => key.startsWith(ns + \".\")))));\\n}\\n';\n content = insertImportsAfterLast(content, helper);\n }\n\n // Insert clientMessages after getMessages() — handle both signatures\n content = content.replace(\n /const messages = await getMessages\\([^)]*\\);/,\n `$&\\n const clientMessages = pickMessages(messages, [${namespacesStr}]);`,\n );\n\n // Replace messages={messages} with messages={clientMessages}\n content = content.replace(\n \"messages={messages}\",\n \"messages={clientMessages}\",\n );\n }\n\n if (\n await safeWriteModifiedFile(layoutPath, content, \"root layout (selective messages)\")\n ) {\n const rel = relative(cwd, layoutPath);\n p.log.success(\n `Updated ${rel} with selective message passing (${clientNamespaces.length} namespaces)`,\n );\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 validate(value = \"\") {\n if (!validateLocale(value)) {\n return \"Invalid locale. Use only letters, numbers, hyphens, and underscores.\";\n }\n },\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 let splitByNamespace = false;\n {\n const split = await p.confirm({\n message: \"Split messages by namespace? (messages/en/hero.json instead of en.json)\",\n initialValue: false,\n });\n if (p.isCancel(split)) cancel();\n splitByNamespace = split;\n }\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 let typeSafe = false;\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 i18nImport = \"next-intl\";\n\n const ts = await p.confirm({\n message: \"Generate TypeScript types for message keys? (next-intl.d.ts)\",\n initialValue: true,\n });\n if (p.isCancel(ts)) cancel();\n typeSafe = ts;\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 (mode !== \"inline\") {\n await ensurePackageInstalled(cwd, \"next-intl\", \"next-intl\");\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 splitByNamespace,\n typeSafe,\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 sourceLocale,\n targetLocales,\n messagesDir,\n splitByNamespace,\n });\n await setupInlineI18n(\n cwd,\n componentPath,\n sourceLocale,\n targetLocales,\n messagesDir,\n splitByNamespace,\n );\n } else {\n await setupNextIntl(cwd, sourceLocale, targetLocales, messagesDir, splitByNamespace);\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 usageTracker = createUsageTracker();\n\n // --- SCAN ---\n const s1 = p.spinner();\n s1.start(\"Scanning...\");\n const scanResult = await runScanStep({\n config,\n cwd,\n callbacks: {\n onScanProgress: (c, t) => s1.message(`Scanning... ${c}/${t} files`),\n onKeygenProgress: (c, t) => s1.message(`Generating keys... ${c}/${t}`),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n s1.stop(\n `Found ${scanResult.bareStringCount} strings from ${scanResult.fileCount} files`,\n );\n\n if (scanResult.bareStringCount === 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 // --- CODEGEN ---\n const s3 = p.spinner();\n s3.start(\"Codegen...\");\n const codegenResult = await runCodegenStep({\n config,\n cwd,\n textToKey: scanResult.textToKey,\n callbacks: {\n onProgress: (c, t) => s3.message(`Codegen... ${c}/${t} files`),\n },\n });\n s3.stop(\n `Codegen... ${codegenResult.stringsWrapped} strings wrapped in ${codegenResult.filesModified} files`,\n );\n\n // Update layout with selective message passing if client namespaces were found\n if (codegenResult.clientNamespaces.length > 0) {\n await updateLayoutWithSelectiveMessages(cwd, codegenResult.clientNamespaces);\n }\n\n // --- TRANSLATE ---\n for (const locale of targetLocales) {\n const st = p.spinner();\n st.start(`Translating ${locale}...`);\n\n await runTranslateStep({\n config,\n sourceFlat: scanResult.sourceFlat,\n locales: [locale],\n callbacks: {\n onLocaleProgress: (_locale, c, t) =>\n st.message(`Translating ${locale}... ${c}/${t} keys`),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n\n st.stop(`Translating ${locale}... done`);\n }\n\n const usage = usageTracker.get();\n if (usage.totalTokens > 0) {\n const cost = await estimateCost(config.model, usage);\n const costStr = cost ? ` · ${formatCost(cost.totalUSD)}` : \"\";\n p.log.info(`${formatUsage(usage)}${costStr}`);\n }\n\n p.outro(\"You're all set!\");\n}\n","import \"dotenv/config\";\nimport { defineCommand, runMain } from \"citty\";\nimport { join } from \"node:path\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport { flatten } from \"./flatten.js\";\nimport { loadJsonFile } from \"./diff.js\";\nimport { scan } from \"./scanner/index.js\";\nimport {\n loadMapFile,\n loadSplitMessages,\n runScanStep,\n runCodegenStep,\n runTranslateStep,\n} from \"./pipeline.js\";\nimport {\n logStart,\n logLocaleStart,\n logLocaleResult,\n logSummary,\n logDryRun,\n logScanResult,\n logError,\n logInfo,\n logSuccess,\n logWarning,\n logUsage,\n logProgress,\n logProgressClear,\n} from \"./logger.js\";\nimport {\n createUsageTracker,\n estimateCost,\n formatUsage,\n formatCost,\n} from \"./usage.js\";\nimport { generateNextIntlTypes } from \"./typegen.js\";\nimport type { TranslationResult } from \"./types.js\";\nimport { parseTranslateFlags, validateLocale } from \"./cli-utils.js\";\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 mode = config.mode ?? \"keys\";\n\n if (args.locale && !validateLocale(args.locale)) {\n logError(\n `Invalid locale \"${args.locale}\". Locale must only contain letters, numbers, hyphens, and underscores.`,\n );\n process.exit(1);\n }\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 // Dry-run: show diff counts per locale without translating\n if (args[\"dry-run\"]) {\n let sourceFlat: Record<string, string>;\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 if (config.splitByNamespace) {\n const sourceDir = join(messagesDir, sourceLocale);\n sourceFlat = await loadSplitMessages(sourceDir);\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 const dryResult = await runTranslateStep({\n config,\n sourceFlat,\n locales,\n force: args.force,\n dryRun: true,\n });\n\n logStart(sourceLocale, locales);\n for (const r of dryResult.localeResults) {\n logDryRun(r.locale, 0, 0, r.removed, r.cached);\n }\n return;\n }\n\n // Normal translation\n let sourceFlat: Record<string, string>;\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 if (config.splitByNamespace) {\n const sourceDir = join(messagesDir, sourceLocale);\n sourceFlat = await loadSplitMessages(sourceDir);\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 usageTracker = createUsageTracker();\n const results: TranslationResult[] = [];\n\n const translateResult = await runTranslateStep({\n config,\n sourceFlat,\n locales,\n force: args.force,\n callbacks: {\n onLocaleProgress: (locale, c, t) =>\n logProgress(c, t, `Translating ${locale}...`),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n\n for (const r of translateResult.localeResults) {\n logLocaleStart(r.locale);\n logProgressClear();\n const result: TranslationResult = {\n locale: r.locale,\n translated: r.translated,\n cached: r.cached,\n removed: r.removed,\n errors: r.errors,\n duration: r.duration,\n };\n logLocaleResult(result);\n results.push(result);\n }\n\n logSummary(results);\n const usage = usageTracker.get();\n if (usage.totalTokens > 0) {\n const cost = await estimateCost(model, usage);\n logUsage(\n formatUsage(usage),\n cost ? formatCost(cost.totalUSD) : undefined,\n );\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 // Dry-run: show found strings without writing anything\n if (args[\"dry-run\"]) {\n const result = await scan(config.scan, process.cwd(), {\n onProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n });\n logProgressClear();\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 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 // Normal scan\n const scanUsageTracker = createUsageTracker();\n const scanResult = await runScanStep({\n config,\n cwd: process.cwd(),\n callbacks: {\n onScanProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n onKeygenProgress: (c, t) => logProgress(c, t, \"Generating keys...\"),\n onUsage: (usage) => scanUsageTracker.add(usage),\n },\n });\n logProgressClear();\n\n logScanResult(scanResult.bareStringCount, scanResult.fileCount);\n logSuccess(\n `Written .translate-map.json (${Object.keys(scanResult.textToKey).length} keys)`,\n );\n\n if (mode === \"inline\" && config.splitByNamespace) {\n logInfo(\n \"Inline mode + split: source text stays in code, translations split by namespace.\",\n );\n } else if (mode === \"inline\") {\n logInfo(\n \"Inline mode: source text stays in code, no source locale JSON created.\",\n );\n } else if (config.splitByNamespace) {\n logSuccess(\n `Written to ${join(config.messagesDir, config.sourceLocale)}/`,\n );\n } else {\n const sourceFile = join(\n config.messagesDir,\n `${config.sourceLocale}.json`,\n );\n logSuccess(`Written to ${sourceFile}`);\n }\n\n const scanUsage = scanUsageTracker.get();\n if (scanUsage.totalTokens > 0) {\n const cost = await estimateCost(config.model, scanUsage);\n logUsage(\n formatUsage(scanUsage),\n cost ? formatCost(cost.totalUSD) : undefined,\n );\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 // Dry-run: show what would be changed\n if (args[\"dry-run\"]) {\n const textToKey = await loadMapFile(config.messagesDir);\n\n if (Object.keys(textToKey).length === 0) {\n logError(\n \"No .translate-map.json found. Run 'translate-kit scan' first.\",\n );\n process.exit(1);\n }\n\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 // Normal codegen\n const result = await runCodegenStep({\n config,\n cwd: process.cwd(),\n callbacks: {\n onProgress: (c, t) => logProgress(c, t, \"Processing files...\"),\n },\n });\n logProgressClear();\n\n logSuccess(\n `Codegen complete: ${result.stringsWrapped} strings wrapped in ${result.filesModified} files (${result.filesProcessed} files processed)`,\n );\n if (result.filesSkipped > 0) {\n logWarning(\n `${result.filesSkipped} file(s) skipped due to invalid generated syntax`,\n );\n }\n },\n});\n\nconst typegenCommand = defineCommand({\n meta: {\n name: \"typegen\",\n description: \"Generate TypeScript types for message keys (next-intl.d.ts)\",\n },\n async run() {\n const config = await loadTranslateKitConfig();\n if (config.mode === \"inline\") {\n logWarning(\"Type generation is only available in keys mode.\");\n return;\n }\n await generateNextIntlTypes(config.messagesDir, config.sourceLocale, config.splitByNamespace);\n logSuccess(`Generated ${join(config.messagesDir, \"next-intl.d.ts\")}`);\n },\n});\n\nconst runCommand = defineCommand({\n meta: {\n name: \"run\",\n description: \"Run the full pipeline: scan → codegen → translate\",\n },\n args: {\n \"dry-run\": {\n type: \"boolean\",\n default: false,\n description: \"Preview without writing\",\n },\n force: {\n type: \"boolean\",\n default: false,\n description: \"Ignore translation cache\",\n },\n verbose: {\n type: \"boolean\",\n default: false,\n description: \"Verbose output\",\n },\n },\n async run({ args }) {\n const config = await loadTranslateKitConfig();\n\n if (!config.scan) {\n logError(\"No scan configuration found. Add a 'scan' section to your config.\");\n process.exit(1);\n }\n\n const usageTracker = createUsageTracker();\n\n // --- SCAN ---\n logInfo(\"Scanning...\");\n const scanResult = await runScanStep({\n config,\n cwd: process.cwd(),\n callbacks: {\n onScanProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n onKeygenProgress: (c, t) => logProgress(c, t, \"Generating keys...\"),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n logProgressClear();\n logSuccess(`Scan: ${scanResult.bareStringCount} strings from ${scanResult.fileCount} files`);\n\n if (scanResult.bareStringCount === 0 && Object.keys(scanResult.textToKey).length === 0) {\n logWarning(\"No translatable strings found.\");\n return;\n }\n\n // --- CODEGEN ---\n const codegenResult = await runCodegenStep({\n config,\n cwd: process.cwd(),\n textToKey: scanResult.textToKey,\n callbacks: {\n onProgress: (c, t) => logProgress(c, t, \"Codegen...\"),\n },\n });\n logProgressClear();\n logSuccess(`Codegen: ${codegenResult.stringsWrapped} strings wrapped in ${codegenResult.filesModified} files`);\n\n // --- TRANSLATE ---\n const locales = config.targetLocales;\n logStart(config.sourceLocale, locales);\n\n const translateResult = await runTranslateStep({\n config,\n sourceFlat: scanResult.sourceFlat,\n locales,\n force: args.force,\n callbacks: {\n onLocaleProgress: (locale, c, t) => logProgress(c, t, `Translating ${locale}...`),\n onUsage: (usage) => usageTracker.add(usage),\n },\n });\n\n for (const r of translateResult.localeResults) {\n logLocaleStart(r.locale);\n logProgressClear();\n logLocaleResult(r);\n }\n logSummary(translateResult.localeResults);\n\n const usage = usageTracker.get();\n if (usage.totalTokens > 0) {\n const cost = await estimateCost(config.model, usage);\n logUsage(formatUsage(usage), cost ? formatCost(cost.totalUSD) : undefined);\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 run: runCommand,\n typegen: typegenCommand,\n init: initCommand,\n },\n async run({ rawArgs }) {\n if (rawArgs.length === 0) {\n console.log(`\n translate-kit — AI-powered translation SDK for build time\n\n Usage:\n translate-kit <command> [flags]\n\n Commands:\n init Interactive setup wizard\n run Full pipeline: scan → codegen → translate\n scan Scan source code for translatable strings\n codegen Replace strings with t() calls\n translate Translate messages to target locales\n typegen Generate TypeScript types for message keys\n\n Flags:\n --dry-run Preview without writing files\n --force Ignore translation cache\n --locale Only translate a specific locale\n --verbose Verbose output\n\n Examples:\n translate-kit init # Set up a new project\n translate-kit run # Full pipeline\n translate-kit translate # Translate only (incremental)\n translate-kit translate --force # Re-translate everything\n`);\n return;\n }\n\n if (rawArgs[0]?.startsWith(\"-\")) {\n const { dryRun, force, verbose, locale } = parseTranslateFlags(rawArgs);\n\n await translateCommand.run!({\n args: {\n _: rawArgs,\n \"dry-run\": dryRun,\n force,\n verbose,\n locale: locale ?? \"\",\n },\n rawArgs,\n cmd: translateCommand,\n });\n }\n },\n});\n\nrunMain(main);\n"],"mappings":"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","names":["p","text","current","text","p","text","parentTag","t","readFile","z","pLimit","text","t","resolve","_traverse","t","p","getNearestFunctionPath","functionContainsJSX","text","traverse","directive","compName","output","translatorId","join","readFile","_traverse","glob","pLimit","traverse","text","p","generateObject","z","pLimit","buildPrompt","resolve","writeFile","join","dirname","join","writeFile","mkdir","readdir","join","readFile","readdir","writeFile","mkdir","text","t","join","readFile","writeFile","mkdir","p","cancel","t","usage","join","sourceFlat","text","t","usage","runInitWizard"]}