translate-kit 0.4.0 → 0.4.2
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 +3443 -2707
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/package.json +80 -77
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/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"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli-utils.ts","../src/scanner/filters.ts","../src/config.ts","../src/logger.ts","../src/scanner/parser.ts","../src/utils/ast-helpers.ts","../src/utils/template-literal.ts","../src/codegen/transform.ts","../src/codegen/index.ts","../src/diff.ts","../src/flatten.ts","../src/scanner/context-enricher.ts","../src/scanner/extractor.ts","../src/scanner/index.ts","../src/scanner/key-ai.ts","../src/validate.ts","../src/translate.ts","../src/typegen.ts","../src/writer.ts","../src/pipeline.ts","../src/usage.ts","../src/templates/t-component.ts","../src/init.ts","../src/cli.ts"],"sourcesContent":["/**\n * Pure functions extracted from cli.ts for testability.\n */\n\nexport interface ParsedTranslateFlags {\n\tdryRun: boolean;\n\tforce: boolean;\n\tverbose: boolean;\n\tlocale: 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\tconst dryRun = rawArgs.includes(\"--dry-run\");\n\tconst force = rawArgs.includes(\"--force\");\n\tconst verbose = rawArgs.includes(\"--verbose\");\n\tlet locale: string | undefined;\n\tconst equalsArg = rawArgs.find((a) => a.startsWith(\"--locale=\"));\n\tif (equalsArg) {\n\t\tlocale = equalsArg.split(\"=\")[1] || undefined;\n\t} else {\n\t\tconst idx = rawArgs.indexOf(\"--locale\");\n\t\tif (idx !== -1) {\n\t\t\tconst next = rawArgs[idx + 1];\n\t\t\tlocale = next && !next.startsWith(\"--\") ? next : undefined;\n\t\t}\n\t}\n\n\treturn { 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\treturn /^[a-zA-Z0-9_-]+$/.test(locale);\n}\n","export const DEFAULT_TRANSLATABLE_PROPS = [\n\t\"placeholder\",\n\t\"title\",\n\t\"alt\",\n\t\"aria-label\",\n\t\"aria-description\",\n\t\"aria-placeholder\",\n\t\"label\",\n];\n\nconst NEVER_TRANSLATE_PROPS = [\n\t\"className\",\n\t\"class\",\n\t\"id\",\n\t\"key\",\n\t\"ref\",\n\t\"href\",\n\t\"src\",\n\t\"type\",\n\t\"name\",\n\t\"value\",\n\t\"htmlFor\",\n\t\"for\",\n\t\"role\",\n\t\"style\",\n\t\"data-testid\",\n\t\"data-cy\",\n\t\"onClick\",\n\t\"onChange\",\n\t\"onSubmit\",\n\t\"onFocus\",\n\t\"onBlur\",\n];\n\nconst IGNORE_TAGS = [\n\t\"script\",\n\t\"style\",\n\t\"code\",\n\t\"pre\",\n\t\"svg\",\n\t\"path\",\n\t\"circle\",\n\t\"rect\",\n\t\"line\",\n\t\"polyline\",\n\t\"polygon\",\n];\n\nconst IGNORE_PATTERNS = [\n\t/^\\s*$/, // Whitespace only\n\t/^https?:\\/\\//, // URLs\n\t/^[\\d.,%$€£¥]+$/, // Numbers, currency\n\t/^[^\\p{L}]*$/u, // No letters at all (Unicode-aware)\n];\n\nfunction isLikelyKebabIdentifier(text: string): boolean {\n\t// Keep this conservative to avoid skipping real UI copy like \"sign-in\".\n\tif (!/^[a-z0-9]+(?:-[a-z0-9]+)+$/.test(text)) return false;\n\treturn text.split(\"-\").length >= 3;\n}\n\nfunction isLikelyConstantIdentifier(text: string): boolean {\n\t// Ignore env/constant-like tokens, but keep plain ALLCAPS words (API, OK).\n\treturn /^(?=.*[_\\d])[A-Z0-9_]+$/.test(text);\n}\n\nconst CONTENT_PROPERTY_NAMES = [\n\t\"title\",\n\t\"description\",\n\t\"label\",\n\t\"text\",\n\t\"content\",\n\t\"heading\",\n\t\"subtitle\",\n\t\"caption\",\n\t\"summary\",\n\t\"message\",\n\t\"placeholder\",\n\t\"alt\",\n];\n\nexport function isContentProperty(propName: string): boolean {\n\treturn CONTENT_PROPERTY_NAMES.includes(propName);\n}\n\nexport function isTranslatableProp(\n\tpropName: string,\n\tcustomProps?: string[],\n): boolean {\n\tif (NEVER_TRANSLATE_PROPS.includes(propName)) return false;\n\tconst allowed = customProps ?? DEFAULT_TRANSLATABLE_PROPS;\n\treturn allowed.includes(propName);\n}\n\nexport function isIgnoredTag(tagName: string): boolean {\n\treturn IGNORE_TAGS.includes(tagName.toLowerCase());\n}\n\nexport function shouldIgnore(text: string): boolean {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return true;\n\tif (isLikelyKebabIdentifier(trimmed)) return true;\n\tif (isLikelyConstantIdentifier(trimmed)) return true;\n\treturn IGNORE_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n","import { loadConfig } from \"c12\";\nimport { z } from \"zod\";\nimport { DEFAULT_TRANSLATABLE_PROPS } from \"./scanner/filters.js\";\nimport type { TranslateKitConfig } from \"./types.js\";\n\nconst configSchema = z\n\t.object({\n\t\tmodel: z.custom<TranslateKitConfig[\"model\"]>(\n\t\t\t(val) => val != null && typeof val === \"object\",\n\t\t\t{ message: \"model must be an AI SDK LanguageModel instance\" },\n\t\t),\n\t\tmode: z.enum([\"keys\", \"inline\"]).default(\"keys\"),\n\t\tsourceLocale: z.string().min(1),\n\t\ttargetLocales: z.array(z.string().min(1)).min(1),\n\t\tmessagesDir: z.string().min(1),\n\t\tsplitByNamespace: z.boolean().default(false).optional(),\n\t\ttypeSafe: z.boolean().default(false).optional(),\n\t\ttranslation: z\n\t\t\t.object({\n\t\t\t\tbatchSize: z.number().int().positive().default(50),\n\t\t\t\tcontext: z.string().optional(),\n\t\t\t\tglossary: z.record(z.string(), z.string()).optional(),\n\t\t\t\ttone: z.string().optional(),\n\t\t\t\tretries: z.number().int().min(0).default(2),\n\t\t\t\tconcurrency: z.number().int().positive().default(3),\n\t\t\t\tvalidatePlaceholders: z.boolean().default(true).optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\tscan: z\n\t\t\t.object({\n\t\t\t\tinclude: z.array(z.string()),\n\t\t\t\texclude: z.array(z.string()).optional(),\n\t\t\t\ttranslatableProps: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.default([...DEFAULT_TRANSLATABLE_PROPS]),\n\t\t\t\ti18nImport: z.string().default(\"next-intl\"),\n\t\t\t})\n\t\t\t.optional(),\n\t\tinline: z\n\t\t\t.object({\n\t\t\t\tcomponentPath: z.string().min(1),\n\t\t\t})\n\t\t\t.optional(),\n\t})\n\t.refine((data) => data.mode !== \"inline\" || data.inline != null, {\n\t\tmessage: \"inline options are required when mode is 'inline'\",\n\t\tpath: [\"inline\"],\n\t});\n\nexport function defineConfig(config: TranslateKitConfig) {\n\treturn config as TranslateKitConfig;\n}\n\nexport async function loadTranslateKitConfig(): Promise<TranslateKitConfig> {\n\tconst { config } = await loadConfig({\n\t\tname: \"translate-kit\",\n\t});\n\n\tif (!config || Object.keys(config).length === 0) {\n\t\tthrow new Error(\n\t\t\t\"No config found. Create a translate-kit.config.ts file or run `translate-kit init`.\",\n\t\t);\n\t}\n\n\tconst result = configSchema.safeParse(config);\n\tif (!result.success) {\n\t\tconst errors = result.error.issues\n\t\t\t.map((i) => ` - ${i.path.join(\".\")}: ${i.message}`)\n\t\t\t.join(\"\\n\");\n\t\tthrow new Error(`Invalid config:\\n${errors}`);\n\t}\n\n\treturn result.data as TranslateKitConfig;\n}\n","import pc from \"picocolors\";\nimport type { TranslationResult } from \"./types.js\";\n\nexport function logStart(sourceLocale: string, targetLocales: string[]): void {\n\tconsole.log(\n\t\t`\\n${pc.bold(\"translate-kit\")} ${pc.dim(\"·\")} ${sourceLocale} ${pc.dim(\"→\")} ${targetLocales.join(\", \")}\\n`,\n\t);\n}\n\nexport function logLocaleStart(locale: string): void {\n\tconsole.log(`${pc.cyan(\"●\")} ${pc.bold(locale)}`);\n}\n\nexport function logLocaleResult(result: TranslationResult): void {\n\tconst parts: string[] = [];\n\n\tif (result.translated > 0) {\n\t\tparts.push(pc.green(`${result.translated} translated`));\n\t}\n\tif (result.cached > 0) {\n\t\tparts.push(pc.dim(`${result.cached} cached`));\n\t}\n\tif (result.removed > 0) {\n\t\tparts.push(pc.yellow(`${result.removed} removed`));\n\t}\n\tif (result.errors > 0) {\n\t\tparts.push(pc.red(`${result.errors} errors`));\n\t}\n\n\tconst time = pc.dim(`${(result.duration / 1000).toFixed(1)}s`);\n\tconsole.log(` ${parts.join(pc.dim(\" · \"))} ${time}`);\n}\n\nexport function logSummary(results: TranslationResult[]): void {\n\tconst totalTranslated = results.reduce((s, r) => s + r.translated, 0);\n\tconst totalCached = results.reduce((s, r) => s + r.cached, 0);\n\tconst totalDuration = results.reduce((s, r) => s + r.duration, 0);\n\n\tconsole.log(\n\t\t`\\n${pc.bold(\"Done!\")} ${totalTranslated} keys translated, ${totalCached} cached ${pc.dim(`(${(totalDuration / 1000).toFixed(1)}s)`)}\\n`,\n\t);\n}\n\nexport function logDryRun(\n\tlocale: string,\n\tadded: number,\n\tmodified: number,\n\tremoved: number,\n\tunchanged: number,\n): void {\n\tconsole.log(`${pc.cyan(\"●\")} ${pc.bold(locale)} ${pc.dim(\"(dry run)\")}`);\n\tconsole.log(\n\t\t` ${pc.green(`+${added}`)} added, ${pc.yellow(`~${modified}`)} modified, ${pc.red(`-${removed}`)} removed, ${pc.dim(`${unchanged} unchanged`)}`,\n\t);\n}\n\nexport function logScanResult(total: number, files: number): void {\n\tconsole.log(\n\t\t`\\n${pc.bold(\"Scan complete:\")} ${pc.green(`${total} strings`)} from ${files} files\\n`,\n\t);\n}\n\nexport function logError(message: string): void {\n\tconsole.error(`${pc.red(\"✖\")} ${message}`);\n}\n\nexport function logWarning(message: string): void {\n\tconsole.log(`${pc.yellow(\"⚠\")} ${message}`);\n}\n\nexport function logInfo(message: string): void {\n\tconsole.log(` ${message}`);\n}\n\nexport function logSuccess(message: string): void {\n\tconsole.log(`${pc.green(\"✔\")} ${message}`);\n}\n\nexport function logVerbose(message: string, verbose: boolean): void {\n\tif (verbose) {\n\t\tconsole.log(pc.dim(` ${message}`));\n\t}\n}\n\nexport function logUsage(tokens: string, cost?: string): void {\n\tconsole.log(`\\n ${pc.dim(\"Tokens:\")} ${tokens}`);\n\tif (cost) console.log(` ${pc.dim(\"Est. cost:\")} ${cost}`);\n}\n\nexport function logProgress(\n\tcurrent: number,\n\ttotal: number,\n\tlabel: string,\n): void {\n\tif (!process.stdout.isTTY) return;\n\tconst pct = total > 0 ? Math.round((current / total) * 100) : 0;\n\tprocess.stdout.write(\n\t\t`\\r ${pc.dim(label)} ${pc.bold(`${current}`)}${pc.dim(`/${total}`)} ${pc.dim(`(${pct}%)`)}`,\n\t);\n}\n\nexport function logProgressClear(): void {\n\tif (!process.stdout.isTTY) return;\n\tprocess.stdout.write(`\\r${\" \".repeat(60)}\\r`);\n}\n","import { type ParserPlugin, parse } 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\tconst isTypeScript = /\\.(?:ts|tsx|mts|cts)$/.test(filename);\n\treturn parse(code, {\n\t\tsourceType: \"module\",\n\t\tplugins: isTypeScript ? plugins : plugins.filter((p) => p !== \"typescript\"),\n\t\tsourceFilename: filename,\n\t});\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\tif (typeof mod === \"function\") return mod;\n\treturn (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\tlet current = path.parentPath;\n\twhile (current) {\n\t\tif (\n\t\t\tcurrent.isFunctionDeclaration() ||\n\t\t\tcurrent.isFunctionExpression() ||\n\t\t\tcurrent.isArrowFunctionExpression()\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\tcurrent = current.parentPath;\n\t}\n\treturn 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\tconst isNestedInFunctionOrClass = (nodePath: NodePath<Node>): boolean => {\n\t\tlet current = nodePath.parentPath;\n\t\twhile (current) {\n\t\t\tif (\n\t\t\t\tcurrent.isFunctionDeclaration() ||\n\t\t\t\tcurrent.isFunctionExpression() ||\n\t\t\t\tcurrent.isArrowFunctionExpression() ||\n\t\t\t\tcurrent.isClassMethod() ||\n\t\t\t\tcurrent.isClassPrivateMethod() ||\n\t\t\t\tcurrent.isClassDeclaration() ||\n\t\t\t\tcurrent.isClassExpression()\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (current.isProgram()) return false;\n\t\t\tcurrent = current.parentPath;\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst getNameFromFunctionLike = (\n\t\tfnPath: NodePath<Node>,\n\t): string | undefined => {\n\t\tif (fnPath.isFunctionDeclaration()) {\n\t\t\tif (fnPath.node.id) return fnPath.node.id.name;\n\t\t\tif (fnPath.parentPath?.isExportDefaultDeclaration()) return \"__default__\";\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!fnPath.isFunctionExpression() && !fnPath.isArrowFunctionExpression()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (isNestedInFunctionOrClass(fnPath)) return undefined;\n\n\t\tconst parent = fnPath.parentPath;\n\t\tif (!parent) return undefined;\n\n\t\tif (parent.isVariableDeclarator() && parent.node.id.type === \"Identifier\") {\n\t\t\treturn parent.node.id.name;\n\t\t}\n\n\t\tif (parent.isExportDefaultDeclaration()) return \"__default__\";\n\n\t\tif (parent.isCallExpression()) {\n\t\t\tlet call: NodePath<Node> = parent;\n\t\t\twhile (call.parentPath?.isCallExpression()) {\n\t\t\t\tcall = call.parentPath;\n\t\t\t}\n\t\t\tconst carrier = call.parentPath;\n\t\t\tif (!carrier) return undefined;\n\t\t\tif (\n\t\t\t\tcarrier.isVariableDeclarator() &&\n\t\t\t\tcarrier.node.id.type === \"Identifier\"\n\t\t\t) {\n\t\t\t\treturn carrier.node.id.name;\n\t\t\t}\n\t\t\tif (carrier.isExportDefaultDeclaration()) return \"__default__\";\n\t\t}\n\n\t\treturn undefined;\n\t};\n\n\tconst getNameFromClassLike = (\n\t\tclassPath: NodePath<Node>,\n\t): string | undefined => {\n\t\tif (classPath.isClassDeclaration()) {\n\t\t\tif (classPath.node.id) return classPath.node.id.name;\n\t\t\tif (classPath.parentPath?.isExportDefaultDeclaration())\n\t\t\t\treturn \"__default__\";\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!classPath.isClassExpression()) return undefined;\n\t\tif (isNestedInFunctionOrClass(classPath)) return undefined;\n\n\t\tconst parent = classPath.parentPath;\n\t\tif (!parent) return undefined;\n\t\tif (parent.isVariableDeclarator() && parent.node.id.type === \"Identifier\") {\n\t\t\treturn parent.node.id.name;\n\t\t}\n\t\tif (parent.isExportDefaultDeclaration()) return \"__default__\";\n\n\t\treturn undefined;\n\t};\n\n\tlet current: NodePath<Node> | null = path;\n\twhile (current) {\n\t\tconst functionName = getNameFromFunctionLike(current);\n\t\tif (functionName) return functionName;\n\n\t\tconst className = getNameFromClassLike(current);\n\t\tif (className) return className;\n\n\t\tcurrent = current.parentPath;\n\t}\n\treturn undefined;\n}\n\n/**\n * Check if a name follows PascalCase convention (starts with uppercase letter)\n * or is the special `__default__` sentinel used for anonymous default exports.\n * Used to distinguish React components from helper functions.\n */\nexport function isPascalCase(name: string): boolean {\n\tif (name === \"__default__\") return true;\n\treturn /^[A-Z]/.test(name);\n}\n\n/**\n * Walk up the AST to find the enclosing top-level `const` declaration name.\n * Returns `undefined` if a function/arrow/class is encountered first (meaning\n * the path is inside a function body, not at module scope).\n */\nexport function getTopLevelConstName(path: NodePath<Node>): string | undefined {\n\tlet current = path.parentPath;\n\twhile (current) {\n\t\t// If we hit a function or class boundary before reaching a const declaration,\n\t\t// we're not at module level.\n\t\tif (\n\t\t\tcurrent.isFunctionDeclaration() ||\n\t\t\tcurrent.isFunctionExpression() ||\n\t\t\tcurrent.isArrowFunctionExpression() ||\n\t\t\tcurrent.isClassDeclaration() ||\n\t\t\tcurrent.isClassExpression() ||\n\t\t\tcurrent.isClassMethod() ||\n\t\t\tcurrent.isClassPrivateMethod()\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (current.isVariableDeclarator()) {\n\t\t\t// Check that the parent VariableDeclaration is `const`\n\t\t\tconst declParent = current.parentPath;\n\t\t\tif (\n\t\t\t\tdeclParent?.isVariableDeclaration() &&\n\t\t\t\tdeclParent.node.kind === \"const\"\n\t\t\t) {\n\t\t\t\t// Check that the declaration is at program level or exported\n\t\t\t\tconst grandParent = declParent.parentPath;\n\t\t\t\tif (\n\t\t\t\t\tgrandParent?.isProgram() ||\n\t\t\t\t\tgrandParent?.isExportNamedDeclaration()\n\t\t\t\t) {\n\t\t\t\t\tconst id = current.node.id;\n\t\t\t\t\tif (id.type === \"Identifier\") return id.name;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcurrent = current.parentPath;\n\t}\n\treturn undefined;\n}\n\n/**\n * Check if a path is inside a function parameter list.\n */\nexport function isInsideFunctionParam(path: NodePath<Node>): boolean {\n\tlet current: NodePath<Node> | null = path;\n\twhile (current.parentPath) {\n\t\tif (current.parentPath.isFunction()) {\n\t\t\tconst fn = current.parentPath.node as import(\"@babel/types\").Function;\n\t\t\treturn fn.params.includes(current.node as any);\n\t\t}\n\t\tcurrent = current.parentPath;\n\t}\n\treturn false;\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\tlet current = path.parentPath;\n\twhile (current) {\n\t\tif (current.isJSXElement()) {\n\t\t\tconst opening = current.node.openingElement;\n\t\t\tif (opening.name.type === \"JSXIdentifier\") {\n\t\t\t\treturn opening.name.name;\n\t\t\t}\n\t\t\tif (\n\t\t\t\topening.name.type === \"JSXMemberExpression\" &&\n\t\t\t\topening.name.object.type === \"JSXIdentifier\"\n\t\t\t) {\n\t\t\t\treturn `${opening.name.object.name}.${opening.name.property.name}`;\n\t\t\t}\n\t\t}\n\t\tcurrent = current.parentPath;\n\t}\n\treturn undefined;\n}\n","import type { Expression, TemplateLiteral } from \"@babel/types\";\nimport * as t from \"@babel/types\";\n\nexport interface TemplateLiteralInfo {\n\ttext: string;\n\tplaceholders: string[];\n}\n\nfunction memberExpressionToName(node: Expression): string | null {\n\tif (node.type === \"Identifier\") return node.name;\n\tif (\n\t\tnode.type === \"MemberExpression\" &&\n\t\t!node.computed &&\n\t\tnode.property.type === \"Identifier\"\n\t) {\n\t\tconst objectName = memberExpressionToName(node.object as Expression);\n\t\tif (!objectName) return null;\n\t\tconst prop = node.property.name;\n\t\treturn objectName + prop.charAt(0).toUpperCase() + prop.slice(1);\n\t}\n\treturn null;\n}\n\nexport function buildTemplateLiteralText(\n\tquasis: TemplateLiteral[\"quasis\"],\n\texpressions: TemplateLiteral[\"expressions\"],\n): TemplateLiteralInfo | null {\n\tconst placeholders: string[] = [];\n\tconst usedNames = new Set<string>();\n\tlet text = \"\";\n\n\tfor (let i = 0; i < quasis.length; i++) {\n\t\ttext += quasis[i].value.cooked ?? quasis[i].value.raw;\n\n\t\tif (i < expressions.length) {\n\t\t\tconst expr = expressions[i];\n\t\t\tlet name: string | null = null;\n\n\t\t\tif (expr.type === \"Identifier\") {\n\t\t\t\tname = expr.name;\n\t\t\t} else if (expr.type === \"MemberExpression\") {\n\t\t\t\tname = memberExpressionToName(expr);\n\t\t\t}\n\n\t\t\tif (name === null) return null;\n\n\t\t\tlet finalName = name;\n\t\t\tif (usedNames.has(finalName)) {\n\t\t\t\tlet suffix = 2;\n\t\t\t\twhile (usedNames.has(`${name}${suffix}`)) suffix++;\n\t\t\t\tfinalName = `${name}${suffix}`;\n\t\t\t}\n\n\t\t\tusedNames.add(finalName);\n\t\t\tplaceholders.push(finalName);\n\t\t\ttext += `{${finalName}}`;\n\t\t}\n\t}\n\n\treturn { text, placeholders };\n}\n\nexport function buildValuesObject(\n\texpressions: TemplateLiteral[\"expressions\"],\n\tplaceholders: string[],\n): t.ObjectExpression {\n\tconst properties = placeholders.map((name, i) => {\n\t\tconst expr = expressions[i] as Expression;\n\t\tconst isShorthand = expr.type === \"Identifier\" && expr.name === name;\n\n\t\treturn t.objectProperty(\n\t\t\tt.identifier(name),\n\t\t\tt.cloneNode(expr),\n\t\t\tfalse,\n\t\t\tisShorthand,\n\t\t);\n\t});\n\n\treturn t.objectExpression(properties);\n}\n","import _generate from \"@babel/generator\";\nimport type { NodePath } from \"@babel/traverse\";\nimport _traverse from \"@babel/traverse\";\nimport type { File } from \"@babel/types\";\nimport * as t from \"@babel/types\";\nimport { logWarning } from \"../logger.js\";\nimport { isContentProperty, isTranslatableProp } from \"../scanner/filters.js\";\nimport {\n\tgetComponentName,\n\tgetTopLevelConstName,\n\tisInsideFunction,\n\tisInsideFunctionParam,\n\tisPascalCase,\n\tresolveDefault,\n} from \"../utils/ast-helpers.js\";\nimport {\n\tbuildTemplateLiteralText,\n\tbuildValuesObject,\n} from \"../utils/template-literal.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| t.JSXText\n\t| t.JSXExpressionContainer\n\t| t.JSXSpreadChild\n\t| t.JSXElement\n\t| t.JSXFragment;\n\nfunction hasSubstantialSiblings(parent: NodePath<t.JSXElement>): boolean {\n\tconst count = parent.node.children.filter((child: JSXChild) => {\n\t\tif (child.type === \"JSXText\") return child.value.trim().length > 0;\n\t\treturn true;\n\t}).length;\n\treturn count > 1;\n}\n\nfunction findLastImportIndex(ast: File): number {\n\tlet idx = -1;\n\tfor (let i = 0; i < ast.program.body.length; i++) {\n\t\tif (ast.program.body[i].type === \"ImportDeclaration\") {\n\t\t\tidx = i;\n\t\t}\n\t}\n\treturn idx;\n}\n\nexport interface TransformResult {\n\tcode: string;\n\tstringsWrapped: number;\n\tmodified: boolean;\n\tusedKeys: string[];\n}\n\nexport interface TransformOptions {\n\ti18nImport?: string;\n\tmode?: \"keys\" | \"inline\";\n\tcomponentPath?: string;\n\tforceClient?: boolean;\n\tmoduleFactoryConstNames?: string[];\n\tmoduleFactoryImportedNames?: string[];\n\ttranslatableProps?: string[];\n\tisTypeScript?: boolean;\n}\n\nexport function detectNamespace(keys: string[]): string | null {\n\tif (keys.length === 0) return null;\n\n\tconst prefixes = keys.map((k) => {\n\t\tconst dot = k.indexOf(\".\");\n\t\treturn dot > 0 ? k.slice(0, dot) : null;\n\t});\n\n\t// All keys must have a dot-separated prefix and share the same one\n\tif (prefixes.some((p) => p === null)) return null;\n\n\tconst first = prefixes[0];\n\tif (prefixes.every((p) => p === first)) return first;\n\n\treturn null;\n}\n\nfunction stripNamespace(key: string, ns: string): string {\n\tconst prefix = `${ns}.`;\n\treturn key.startsWith(prefix) ? key.slice(prefix.length) : key;\n}\n\nfunction ensureBlockBody(\n\tfn: t.ArrowFunctionExpression | t.FunctionExpression,\n): t.BlockStatement {\n\tif (fn.body.type === \"BlockStatement\") return fn.body;\n\tfn.body = t.blockStatement([t.returnStatement(fn.body as t.Expression)]);\n\treturn fn.body;\n}\n\nfunction isInsideClass(path: NodePath<t.Node>): boolean {\n\tlet current = path.parentPath;\n\twhile (current) {\n\t\tif (\n\t\t\tcurrent.isClassMethod() ||\n\t\t\tcurrent.isClassPrivateMethod() ||\n\t\t\tcurrent.isClassDeclaration() ||\n\t\t\tcurrent.isClassExpression()\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\tcurrent = current.parentPath;\n\t}\n\treturn false;\n}\n\nfunction markGeneratedCall(call: t.CallExpression): t.CallExpression {\n\t(call as t.CallExpression & { __tkGenerated?: true }).__tkGenerated = true;\n\treturn call;\n}\n\nfunction isGeneratedCall(call: t.CallExpression): boolean {\n\treturn (\n\t\t(call as t.CallExpression & { __tkGenerated?: true }).__tkGenerated === true\n\t);\n}\n\nfunction isIdentifierPattern(\n\tparam: t.LVal | t.PatternLike | t.TSParameterProperty,\n): param is t.Identifier {\n\treturn param.type === \"Identifier\";\n}\n\nfunction collectPatternNames(\n\tpattern: t.LVal | t.PatternLike | t.TSParameterProperty,\n\tnames: Set<string>,\n): void {\n\tif (pattern.type === \"TSParameterProperty\") {\n\t\tcollectPatternNames(\n\t\t\tpattern.parameter as t.LVal | t.PatternLike | t.TSParameterProperty,\n\t\t\tnames,\n\t\t);\n\t\treturn;\n\t}\n\n\tif (isIdentifierPattern(pattern)) {\n\t\tnames.add(pattern.name);\n\t\treturn;\n\t}\n\n\tif (pattern.type === \"VoidPattern\") return;\n\n\tif (pattern.type === \"ObjectPattern\") {\n\t\tfor (const prop of pattern.properties) {\n\t\t\tif (prop.type === \"ObjectProperty\") {\n\t\t\t\tcollectPatternNames(\n\t\t\t\t\tprop.value as t.LVal | t.PatternLike | t.TSParameterProperty,\n\t\t\t\t\tnames,\n\t\t\t\t);\n\t\t\t} else if (prop.type === \"RestElement\") {\n\t\t\t\tcollectPatternNames(\n\t\t\t\t\tprop.argument as t.LVal | t.PatternLike | t.TSParameterProperty,\n\t\t\t\t\tnames,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tif (pattern.type === \"ArrayPattern\") {\n\t\tfor (const el of pattern.elements) {\n\t\t\tif (el) {\n\t\t\t\tcollectPatternNames(\n\t\t\t\t\tel as t.LVal | t.PatternLike | t.TSParameterProperty,\n\t\t\t\t\tnames,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tif (pattern.type === \"AssignmentPattern\") {\n\t\tcollectPatternNames(\n\t\t\tpattern.left as t.LVal | t.PatternLike | t.TSParameterProperty,\n\t\t\tnames,\n\t\t);\n\t\treturn;\n\t}\n\tif (pattern.type === \"RestElement\") {\n\t\tcollectPatternNames(\n\t\t\tpattern.argument as t.LVal | t.PatternLike | t.TSParameterProperty,\n\t\t\tnames,\n\t\t);\n\t}\n}\n\nfunction collectBlockNames(block: t.BlockStatement, names: Set<string>): void {\n\tfor (const stmt of block.body) {\n\t\tif (stmt.type === \"VariableDeclaration\") {\n\t\t\tfor (const d of stmt.declarations) {\n\t\t\t\tcollectPatternNames(d.id, names);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (stmt.type === \"FunctionDeclaration\" && stmt.id) {\n\t\t\tnames.add(stmt.id.name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (stmt.type === \"ClassDeclaration\" && stmt.id) {\n\t\t\tnames.add(stmt.id.name);\n\t\t}\n\t}\n}\n\nfunction pickTranslatorId(\n\tblock: t.BlockStatement,\n\townerFn?: t.Function,\n): string {\n\tconst names = new Set<string>();\n\tif (ownerFn) {\n\t\tfor (const param of ownerFn.params) {\n\t\t\tcollectPatternNames(param, names);\n\t\t}\n\t}\n\tcollectBlockNames(block, names);\n\tif (!names.has(\"t\")) return \"t\";\n\tlet i = 0;\n\twhile (true) {\n\t\tconst candidate = i === 0 ? \"__tk_t\" : `__tk_t${i + 1}`;\n\t\tif (!names.has(candidate)) return candidate;\n\t\ti++;\n\t}\n}\n\nfunction findWrappedFunctionInCall(\n\tnode: t.CallExpression,\n): t.FunctionExpression | t.ArrowFunctionExpression | null {\n\tfor (const arg of node.arguments) {\n\t\tif (\n\t\t\targ.type === \"FunctionExpression\" ||\n\t\t\targ.type === \"ArrowFunctionExpression\"\n\t\t) {\n\t\t\treturn arg;\n\t\t}\n\t\tif (arg.type === \"CallExpression\") {\n\t\t\tconst nested = findWrappedFunctionInCall(arg);\n\t\t\tif (nested) return nested;\n\t\t}\n\t}\n\tif (node.callee.type === \"CallExpression\") {\n\t\treturn findWrappedFunctionInCall(node.callee);\n\t}\n\treturn null;\n}\n\nfunction resolveNamedImportLocal(\n\tast: File,\n\timportSource: string,\n\timportedName: string,\n): string | null {\n\tfor (const node of ast.program.body) {\n\t\tif (\n\t\t\tnode.type === \"ImportDeclaration\" &&\n\t\t\tnode.source.value === importSource\n\t\t) {\n\t\t\tfor (const spec of node.specifiers) {\n\t\t\t\tif (\n\t\t\t\t\tspec.type === \"ImportSpecifier\" &&\n\t\t\t\t\tspec.imported.type === \"Identifier\" &&\n\t\t\t\t\tspec.imported.name === importedName &&\n\t\t\t\t\tspec.local.type === \"Identifier\"\n\t\t\t\t) {\n\t\t\t\t\treturn spec.local.name;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction ensureNamedImportLocal(\n\tast: File,\n\timportSource: string,\n\timportedName: string,\n): string {\n\tconst existingLocal = resolveNamedImportLocal(\n\t\tast,\n\t\timportSource,\n\t\timportedName,\n\t);\n\tif (existingLocal) return existingLocal;\n\n\tfor (const node of ast.program.body) {\n\t\tif (\n\t\t\tnode.type !== \"ImportDeclaration\" ||\n\t\t\tnode.source.value !== importSource\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tnode.specifiers.push(\n\t\t\tt.importSpecifier(t.identifier(importedName), t.identifier(importedName)),\n\t\t);\n\t\treturn importedName;\n\t}\n\n\tconst importDecl = t.importDeclaration(\n\t\t[t.importSpecifier(t.identifier(importedName), t.identifier(importedName))],\n\t\tt.stringLiteral(importSource),\n\t);\n\n\tconst lastImportIndex = findLastImportIndex(ast);\n\tif (lastImportIndex >= 0) {\n\t\tast.program.body.splice(lastImportIndex + 1, 0, importDecl);\n\t} else {\n\t\tast.program.body.unshift(importDecl);\n\t}\n\n\treturn importedName;\n}\n\nfunction getNearestFunctionPath(\n\tpath: NodePath<t.Node>,\n): NodePath<t.Function> | null {\n\tlet current = path.parentPath;\n\twhile (current) {\n\t\tif (\n\t\t\tcurrent.isFunctionDeclaration() ||\n\t\t\tcurrent.isFunctionExpression() ||\n\t\t\tcurrent.isArrowFunctionExpression()\n\t\t) {\n\t\t\treturn current as NodePath<t.Function>;\n\t\t}\n\t\tcurrent = current.parentPath;\n\t}\n\treturn null;\n}\n\nfunction functionContainsJSX(fn: t.Function): boolean {\n\tlet found = false;\n\n\tconst visit = (node: t.Node | null | undefined): void => {\n\t\tif (!node || found) return;\n\t\tif (node.type === \"JSXElement\" || node.type === \"JSXFragment\") {\n\t\t\tfound = true;\n\t\t\treturn;\n\t\t}\n\n\t\tconst keys = t.VISITOR_KEYS[node.type] ?? [];\n\t\tfor (const key of keys) {\n\t\t\tconst value = (node as unknown as Record<string, unknown>)[key];\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const item of value) {\n\t\t\t\t\tif (item && typeof item === \"object\" && \"type\" in item) {\n\t\t\t\t\t\tvisit(item as t.Node);\n\t\t\t\t\t\tif (found) return;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (value && typeof value === \"object\" && \"type\" in value) {\n\t\t\t\tvisit(value as t.Node);\n\t\t\t\tif (found) return;\n\t\t\t}\n\t\t}\n\t};\n\n\tvisit(fn.body as t.Node);\n\treturn found;\n}\n\nfunction isTranslationFactoryCall(\n\tinit: t.Expression | null | undefined,\n\tlocalName: string,\n): init is t.CallExpression {\n\treturn (\n\t\tinit?.type === \"CallExpression\" &&\n\t\tinit.callee.type === \"Identifier\" &&\n\t\t(init.callee.name === localName ||\n\t\t\tinit.callee.name === \"useTranslations\" ||\n\t\t\tinit.callee.name === \"getTranslations\")\n\t);\n}\n\nfunction isAwaitedGetTranslationsCall(\n\tinit: t.Expression | null | undefined,\n\tlocalName: string,\n): init is t.AwaitExpression & {\n\targument: t.CallExpression & { callee: t.Identifier };\n} {\n\treturn (\n\t\tinit?.type === \"AwaitExpression\" &&\n\t\tinit.argument.type === \"CallExpression\" &&\n\t\tinit.argument.callee.type === \"Identifier\" &&\n\t\t(init.argument.callee.name === localName ||\n\t\t\tinit.argument.callee.name === \"getTranslations\")\n\t);\n}\n\nfunction isGetTranslationsCall(\n\tinit: t.Expression | null | undefined,\n\tlocalName: string,\n): init is t.CallExpression & { callee: t.Identifier } {\n\treturn (\n\t\tinit?.type === \"CallExpression\" &&\n\t\tinit.callee.type === \"Identifier\" &&\n\t\t(init.callee.name === localName || init.callee.name === \"getTranslations\")\n\t);\n}\n\ninterface TextExtractionResult {\n\ttext: string;\n\ttemplateInfo?: {\n\t\tplaceholders: string[];\n\t\texpressions: t.TemplateLiteral[\"expressions\"];\n\t};\n}\n\nfunction extractTextFromNode(node: t.Node): TextExtractionResult | null {\n\tif (node.type === \"StringLiteral\") {\n\t\treturn node.value ? { text: node.value } : null;\n\t}\n\tif (node.type === \"TemplateLiteral\") {\n\t\tconst info = buildTemplateLiteralText(node.quasis, node.expressions);\n\t\tif (!info) return null;\n\t\treturn {\n\t\t\ttext: info.text,\n\t\t\ttemplateInfo: {\n\t\t\t\tplaceholders: info.placeholders,\n\t\t\t\texpressions: node.expressions,\n\t\t\t},\n\t\t};\n\t}\n\tif (node.type === \"JSXExpressionContainer\") {\n\t\treturn extractTextFromNode(node.expression as t.Node);\n\t}\n\treturn null;\n}\n\nfunction collectConditionalKeys(\n\tnode: t.Expression,\n\ttextToKey: Record<string, string>,\n): string[] {\n\tconst keys: string[] = [];\n\tif (node.type === \"ConditionalExpression\") {\n\t\tkeys.push(\n\t\t\t...collectConditionalKeys(node.consequent as t.Expression, textToKey),\n\t\t);\n\t\tkeys.push(\n\t\t\t...collectConditionalKeys(node.alternate as t.Expression, textToKey),\n\t\t);\n\t} else if (node.type === \"StringLiteral\") {\n\t\tconst text = node.value.trim();\n\t\tif (text && text in textToKey) keys.push(textToKey[text]);\n\t} else if (node.type === \"TemplateLiteral\") {\n\t\tconst info = buildTemplateLiteralText(node.quasis, node.expressions);\n\t\tif (info && info.text in textToKey) keys.push(textToKey[info.text]);\n\t}\n\treturn keys;\n}\n\nfunction transformConditionalBranch(\n\tnode: t.Expression,\n\ttextToKey: Record<string, string>,\n\tmode: \"keys\" | \"inline\" = \"keys\",\n): { node: t.Expression; count: number } {\n\tif (node.type === \"ConditionalExpression\") {\n\t\tconst cons = transformConditionalBranch(\n\t\t\tnode.consequent as t.Expression,\n\t\t\ttextToKey,\n\t\t\tmode,\n\t\t);\n\t\tconst alt = transformConditionalBranch(\n\t\t\tnode.alternate as t.Expression,\n\t\t\ttextToKey,\n\t\t\tmode,\n\t\t);\n\t\tif (cons.count > 0 || alt.count > 0) {\n\t\t\treturn {\n\t\t\t\tnode: t.conditionalExpression(node.test, cons.node, alt.node),\n\t\t\t\tcount: cons.count + alt.count,\n\t\t\t};\n\t\t}\n\t\treturn { node, count: 0 };\n\t}\n\n\tif (node.type === \"StringLiteral\") {\n\t\tconst text = node.value.trim();\n\t\tif (text && text in textToKey) {\n\t\t\tconst key = textToKey[text];\n\t\t\tconst args =\n\t\t\t\tmode === \"inline\"\n\t\t\t\t\t? [t.stringLiteral(text), t.stringLiteral(key)]\n\t\t\t\t\t: [t.stringLiteral(key)];\n\t\t\treturn {\n\t\t\t\tnode: markGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\n\t\t\t\tcount: 1,\n\t\t\t};\n\t\t}\n\t\treturn { node, count: 0 };\n\t}\n\n\tif (node.type === \"TemplateLiteral\") {\n\t\tconst info = buildTemplateLiteralText(node.quasis, node.expressions);\n\t\tif (info && info.text in textToKey) {\n\t\t\tconst key = textToKey[info.text];\n\t\t\tconst args: t.Expression[] =\n\t\t\t\tmode === \"inline\"\n\t\t\t\t\t? [t.stringLiteral(info.text), t.stringLiteral(key)]\n\t\t\t\t\t: [t.stringLiteral(key)];\n\t\t\tif (info.placeholders.length > 0) {\n\t\t\t\targs.push(buildValuesObject(node.expressions, info.placeholders));\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tnode: markGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\n\t\t\t\tcount: 1,\n\t\t\t};\n\t\t}\n\t\treturn { node, count: 0 };\n\t}\n\n\treturn { node, count: 0 };\n}\n\n/**\n * Pre-scan AST to find which React components reference any of the given\n * imported factory names. Returns a set of component names that will need\n * a translator injected. This runs BEFORE the main injection phase so we\n * can include those components proactively.\n */\nfunction preDiscoverFactoryRefComponents(\n\tast: File,\n\timportedNames: string[],\n): Set<string> {\n\tif (importedNames.length === 0) return new Set();\n\tconst nameSet = new Set(importedNames);\n\tconst comps = new Set<string>();\n\n\ttraverse(ast, {\n\t\tIdentifier(path: NodePath<t.Identifier>) {\n\t\t\tif (!nameSet.has(path.node.name)) return;\n\t\t\tconst parent = path.parent;\n\t\t\t// Skip import/export specifiers\n\t\t\tif (\n\t\t\t\tparent.type === \"ImportSpecifier\" ||\n\t\t\t\tparent.type === \"ImportDefaultSpecifier\" ||\n\t\t\t\tparent.type === \"ImportNamespaceSpecifier\" ||\n\t\t\t\tparent.type === \"ExportSpecifier\"\n\t\t\t)\n\t\t\t\treturn;\n\t\t\t// Skip declaration id\n\t\t\tif (\n\t\t\t\tparent.type === \"VariableDeclarator\" &&\n\t\t\t\t(parent as t.VariableDeclarator).id === path.node\n\t\t\t)\n\t\t\t\treturn;\n\t\t\t// Skip already-callee (idempotent)\n\t\t\tif (\n\t\t\t\tparent.type === \"CallExpression\" &&\n\t\t\t\t(parent as t.CallExpression).callee === path.node\n\t\t\t)\n\t\t\t\treturn;\n\t\t\t// Verify binding comes from module-level (import or top-level const)\n\t\t\tconst binding = path.scope?.getBinding(path.node.name);\n\t\t\tif (binding) {\n\t\t\t\tconst bPath = binding.path;\n\t\t\t\tconst isImportBinding =\n\t\t\t\t\tbPath.isImportSpecifier() || bPath.isImportDefaultSpecifier();\n\t\t\t\tconst isTopLevelConst =\n\t\t\t\t\tbPath.isVariableDeclarator() &&\n\t\t\t\t\tbPath.parentPath?.isVariableDeclaration() &&\n\t\t\t\t\t(bPath.parentPath.parentPath?.isProgram() ||\n\t\t\t\t\t\tbPath.parentPath.parentPath?.isExportNamedDeclaration());\n\t\t\t\tif (!isImportBinding && !isTopLevelConst) return;\n\t\t\t}\n\t\t\t// Must be inside a PascalCase function (React component)\n\t\t\tif (!isInsideFunction(path)) return;\n\t\t\tconst comp = getComponentName(path);\n\t\t\tif (comp && isPascalCase(comp)) comps.add(comp);\n\t\t},\n\t});\n\n\treturn comps;\n}\n\nfunction wrapModuleFactoryDeclarations(\n\tast: File,\n\tconstNames: string[],\n\tisTypeScript?: boolean,\n): boolean {\n\tif (constNames.length === 0) return false;\n\tconst nameSet = new Set(constNames);\n\tlet wrapped = false;\n\n\tfor (const node of ast.program.body) {\n\t\tlet decl: t.VariableDeclaration | undefined;\n\t\tif (node.type === \"VariableDeclaration\") {\n\t\t\tdecl = node;\n\t\t} else if (\n\t\t\tnode.type === \"ExportNamedDeclaration\" &&\n\t\t\tnode.declaration?.type === \"VariableDeclaration\"\n\t\t) {\n\t\t\tdecl = node.declaration;\n\t\t}\n\t\tif (!decl || decl.kind !== \"const\") continue;\n\n\t\tfor (const declarator of decl.declarations) {\n\t\t\tif (declarator.id.type !== \"Identifier\") continue;\n\t\t\tif (!nameSet.has(declarator.id.name)) continue;\n\t\t\tif (!declarator.init) continue;\n\n\t\t\t// Move type annotation to arrow function return type (preserves type safety)\n\t\t\tconst typeAnnotation = (declarator.id as any).typeAnnotation;\n\t\t\tif (typeAnnotation) {\n\t\t\t\t(declarator.id as any).typeAnnotation = null;\n\t\t\t}\n\n\t\t\t// Idempotency: if init is already an arrow with 1 param named `t`, skip\n\t\t\tif (\n\t\t\t\tdeclarator.init.type === \"ArrowFunctionExpression\" &&\n\t\t\t\tdeclarator.init.params.length === 1 &&\n\t\t\t\tdeclarator.init.params[0].type === \"Identifier\" &&\n\t\t\t\tdeclarator.init.params[0].name === \"t\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Wrap: const FOO = expr → const FOO = (t: any) => (expr)\n\t\t\tconst originalInit = declarator.init;\n\t\t\tconst tParam = t.identifier(\"t\");\n\t\t\tif (isTypeScript) {\n\t\t\t\t(tParam as any).typeAnnotation = t.tsTypeAnnotation(t.tsAnyKeyword());\n\t\t\t}\n\t\t\tconst arrowFn = t.arrowFunctionExpression(\n\t\t\t\t[tParam],\n\t\t\t\tt.parenthesizedExpression(originalInit),\n\t\t\t);\n\t\t\tif (typeAnnotation) {\n\t\t\t\t(arrowFn as any).returnType = typeAnnotation;\n\t\t\t}\n\t\t\tdeclarator.init = arrowFn;\n\t\t\twrapped = true;\n\t\t}\n\t}\n\treturn wrapped;\n}\n\nfunction rewriteModuleFactoryReferences(\n\tast: File,\n\timportedNames: string[],\n\tcomponentTranslatorIds: Map<string, string>,\n): { componentsNeedingT: Set<string>; rewrote: boolean } {\n\tif (importedNames.length === 0)\n\t\treturn { componentsNeedingT: new Set(), rewrote: false };\n\tconst nameSet = new Set(importedNames);\n\tconst componentsNeedingT = new Set<string>();\n\tlet rewrote = false;\n\n\t// Collect rewrite targets first, then apply — avoids AST mutation issues\n\t// during traversal (e.g. shorthand ObjectProperty key/value sharing).\n\tconst rewrites: Array<{\n\t\tpath: NodePath<t.Identifier>;\n\t\ttranslatorId: string;\n\t\tcompName: string;\n\t\tshorthandProp?: t.ObjectProperty;\n\t}> = [];\n\n\ttraverse(ast, {\n\t\tIdentifier(path: NodePath<t.Identifier>) {\n\t\t\tif (!nameSet.has(path.node.name)) return;\n\n\t\t\tconst parent = path.parent;\n\t\t\t// Skip import/export specifiers\n\t\t\tif (\n\t\t\t\tparent.type === \"ImportSpecifier\" ||\n\t\t\t\tparent.type === \"ImportDefaultSpecifier\" ||\n\t\t\t\tparent.type === \"ImportNamespaceSpecifier\" ||\n\t\t\t\tparent.type === \"ExportSpecifier\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Skip type contexts (TSTypeReference, TSTypeQuery, TSQualifiedName, etc.)\n\t\t\tif (\n\t\t\t\tparent.type.startsWith(\"TS\") &&\n\t\t\t\tparent.type !== \"TSNonNullExpression\" &&\n\t\t\t\tparent.type !== \"TSAsExpression\" &&\n\t\t\t\tparent.type !== \"TSSatisfiesExpression\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Idempotency: skip if already callee of CallExpression\n\t\t\tif (\n\t\t\t\tparent.type === \"CallExpression\" &&\n\t\t\t\t(parent as t.CallExpression).callee === path.node\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For shorthand ObjectProperty, key and value reference the same node.\n\t\t\t// Only handle it once — when visiting as \"value\" position.\n\t\t\tif (\n\t\t\t\tparent.type === \"ObjectProperty\" &&\n\t\t\t\t(parent as t.ObjectProperty).key === path.node\n\t\t\t) {\n\t\t\t\tif ((parent as t.ObjectProperty).shorthand) {\n\t\t\t\t\t// Will be handled as a shorthand rewrite — but only from value position.\n\t\t\t\t\t// Skip the key position visit to avoid double processing.\n\t\t\t\t\tif (path.key === \"key\") return;\n\t\t\t\t} else {\n\t\t\t\t\t// Non-shorthand key: never rewrite\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Verify this Identifier refers to the module-level binding (import or\n\t\t\t// top-level const), not a shadowed local variable or destructuring param.\n\t\t\tconst binding = path.scope?.getBinding(path.node.name);\n\t\t\tif (binding) {\n\t\t\t\tconst bPath = binding.path;\n\t\t\t\tconst isImportBinding =\n\t\t\t\t\tbPath.isImportSpecifier() || bPath.isImportDefaultSpecifier();\n\t\t\t\tconst isTopLevelConst =\n\t\t\t\t\tbPath.isVariableDeclarator() &&\n\t\t\t\t\tbPath.parentPath?.isVariableDeclaration() &&\n\t\t\t\t\t(bPath.parentPath.parentPath?.isProgram() ||\n\t\t\t\t\t\tbPath.parentPath.parentPath?.isExportNamedDeclaration());\n\t\t\t\tif (!isImportBinding && !isTopLevelConst) return;\n\t\t\t}\n\n\t\t\t// Skip refs inside function parameter defaults (t is not in scope there)\n\t\t\tif (isInsideFunctionParam(path)) return;\n\n\t\t\t// Must be inside a PascalCase function (React component)\n\t\t\tif (!isInsideFunction(path)) return;\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) return;\n\n\t\t\tconst translatorId = componentTranslatorIds.get(compName) ?? \"t\";\n\n\t\t\tif (\n\t\t\t\tparent.type === \"ObjectProperty\" &&\n\t\t\t\t(parent as t.ObjectProperty).shorthand\n\t\t\t) {\n\t\t\t\trewrites.push({\n\t\t\t\t\tpath,\n\t\t\t\t\ttranslatorId,\n\t\t\t\t\tcompName,\n\t\t\t\t\tshorthandProp: parent as t.ObjectProperty,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trewrites.push({ path, translatorId, compName });\n\t\t\t}\n\t\t},\n\t});\n\n\t// Apply collected rewrites\n\tfor (const { path, translatorId, compName, shorthandProp } of rewrites) {\n\t\tconst callExpr = t.callExpression(t.identifier(path.node.name), [\n\t\t\tt.identifier(translatorId),\n\t\t]);\n\n\t\tif (shorthandProp) {\n\t\t\tshorthandProp.shorthand = false;\n\t\t\tshorthandProp.value = callExpr;\n\t\t} else {\n\t\t\tpath.replaceWith(callExpr);\n\t\t}\n\n\t\tcomponentsNeedingT.add(compName);\n\t\trewrote = true;\n\t}\n\n\treturn { componentsNeedingT, rewrote };\n}\n\nexport function transform(\n\tast: File,\n\ttextToKey: Record<string, string>,\n\toptions: TransformOptions = {},\n): TransformResult {\n\tif (options.mode === \"inline\") {\n\t\treturn transformInline(ast, textToKey, options);\n\t}\n\n\tconst importSource = options.i18nImport ?? \"next-intl\";\n\tconst supportsServerSplit = importSource === \"next-intl\";\n\tconst isClient =\n\t\t!supportsServerSplit || options.forceClient || detectClientFile(ast);\n\tconst needsClientDirective =\n\t\tisClient && options.forceClient === true && !detectClientFile(ast);\n\tlet stringsWrapped = 0;\n\tconst componentsNeedingT = new Set<string>();\n\tconst componentKeys = new Map<string, Set<string>>();\n\tconst allUsedKeys: string[] = [];\n\n\tfunction trackKey(path: NodePath, key: string): void {\n\t\tallUsedKeys.push(key);\n\t\tconst compName = getComponentName(path);\n\t\tif (compName) {\n\t\t\tcomponentsNeedingT.add(compName);\n\t\t\tlet keys = componentKeys.get(compName);\n\t\t\tif (!keys) {\n\t\t\t\tkeys = new Set();\n\t\t\t\tcomponentKeys.set(compName, keys);\n\t\t\t}\n\t\t\tkeys.add(key);\n\t\t}\n\t}\n\n\ttraverse(ast, {\n\t\tJSXText(path: NodePath<t.JSXText>) {\n\t\t\tif (isInsideClass(path)) return;\n\t\t\tconst text = path.node.value.trim();\n\t\t\tif (!text || !(text in textToKey)) return;\n\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) return;\n\n\t\t\tconst parent = path.parentPath;\n\t\t\tif (!parent?.isJSXElement()) return;\n\n\t\t\tconst key = textToKey[text];\n\t\t\tconst tCall = t.jsxExpressionContainer(\n\t\t\t\tmarkGeneratedCall(\n\t\t\t\t\tt.callExpression(t.identifier(\"t\"), [t.stringLiteral(key)]),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (!hasSubstantialSiblings(parent)) {\n\t\t\t\tpath.replaceWith(tCall);\n\t\t\t} else {\n\t\t\t\tconst raw = path.node.value;\n\t\t\t\tconst hasLeading = raw !== raw.trimStart();\n\t\t\t\tconst hasTrailing = raw !== raw.trimEnd();\n\t\t\t\tconst nodes: t.Node[] = [];\n\t\t\t\tif (hasLeading) {\n\t\t\t\t\tnodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n\t\t\t\t}\n\t\t\t\tnodes.push(tCall);\n\t\t\t\tif (hasTrailing) {\n\t\t\t\t\tnodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n\t\t\t\t}\n\t\t\t\tpath.replaceWithMultiple(nodes);\n\t\t\t}\n\n\t\t\tstringsWrapped++;\n\t\t\ttrackKey(path, key);\n\t\t},\n\n\t\tJSXExpressionContainer(path: NodePath<t.JSXExpressionContainer>) {\n\t\t\tif (isInsideClass(path)) return;\n\t\t\tconst expr = path.node.expression;\n\t\t\tif (path.parent.type === \"JSXAttribute\") return;\n\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) return;\n\n\t\t\tif (expr.type === \"ConditionalExpression\") {\n\t\t\t\tconst result = transformConditionalBranch(expr, textToKey);\n\t\t\t\tif (result.count > 0) {\n\t\t\t\t\tpath.node.expression = result.node;\n\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\t// Collect keys from conditional branches\n\t\t\t\t\tcollectConditionalKeys(expr, textToKey).forEach((k) =>\n\t\t\t\t\t\ttrackKey(path, k),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (expr.type !== \"TemplateLiteral\") return;\n\n\t\t\tconst info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n\t\t\tif (!info) return;\n\n\t\t\tconst { text, placeholders } = info;\n\t\t\tif (!(text in textToKey)) return;\n\n\t\t\tconst key = textToKey[text];\n\t\t\tconst args: t.Expression[] = [t.stringLiteral(key)];\n\t\t\tif (placeholders.length > 0) {\n\t\t\t\targs.push(buildValuesObject(expr.expressions, placeholders));\n\t\t\t}\n\t\t\tpath.node.expression = markGeneratedCall(\n\t\t\t\tt.callExpression(t.identifier(\"t\"), args),\n\t\t\t);\n\t\t\tstringsWrapped++;\n\t\t\ttrackKey(path, key);\n\t\t},\n\n\t\tJSXAttribute(path: NodePath<t.JSXAttribute>) {\n\t\t\tif (isInsideClass(path)) return;\n\t\t\tconst value = path.node.value;\n\t\t\tif (!value) return;\n\n\t\t\t// Only wrap translatable props (placeholder, title, alt, aria-label, etc.)\n\t\t\tconst attrName = path.node.name;\n\t\t\tconst propName =\n\t\t\t\tattrName.type === \"JSXIdentifier\" ? attrName.name : attrName.name.name;\n\t\t\tif (!isTranslatableProp(propName, options.translatableProps)) return;\n\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) return;\n\n\t\t\tif (\n\t\t\t\tvalue.type === \"JSXExpressionContainer\" &&\n\t\t\t\tvalue.expression.type === \"ConditionalExpression\"\n\t\t\t) {\n\t\t\t\tconst result = transformConditionalBranch(value.expression, textToKey);\n\t\t\t\tif (result.count > 0) {\n\t\t\t\t\tpath.node.value = t.jsxExpressionContainer(result.node);\n\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\tcollectConditionalKeys(value.expression, textToKey).forEach((k) =>\n\t\t\t\t\t\ttrackKey(path, k),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst extracted = extractTextFromNode(value);\n\t\t\tif (!extracted || !(extracted.text in textToKey)) return;\n\n\t\t\tif (\n\t\t\t\tvalue.type === \"JSXExpressionContainer\" &&\n\t\t\t\tvalue.expression.type === \"CallExpression\" &&\n\t\t\t\tvalue.expression.callee.type === \"Identifier\" &&\n\t\t\t\tvalue.expression.callee.name === \"t\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst key = textToKey[extracted.text];\n\t\t\tconst args: t.Expression[] = [t.stringLiteral(key)];\n\t\t\tif (\n\t\t\t\textracted.templateInfo &&\n\t\t\t\textracted.templateInfo.placeholders.length > 0\n\t\t\t) {\n\t\t\t\targs.push(\n\t\t\t\t\tbuildValuesObject(\n\t\t\t\t\t\textracted.templateInfo.expressions,\n\t\t\t\t\t\textracted.templateInfo.placeholders,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\tpath.node.value = t.jsxExpressionContainer(\n\t\t\t\tmarkGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\n\t\t\t);\n\t\t\tstringsWrapped++;\n\t\t\ttrackKey(path, key);\n\t\t},\n\n\t\tObjectProperty(path: NodePath<t.ObjectProperty>) {\n\t\t\tif (isInsideClass(path)) return;\n\n\t\t\tconst factoryConstNames = options.moduleFactoryConstNames ?? [];\n\t\t\tconst inFunction = isInsideFunction(path);\n\n\t\t\tif (!inFunction) {\n\t\t\t\t// Module-factory path: only if inside a const from the plan\n\t\t\t\tconst constName = getTopLevelConstName(\n\t\t\t\t\tpath as unknown as NodePath<t.Node>,\n\t\t\t\t);\n\t\t\t\tif (!constName || !factoryConstNames.includes(constName)) return;\n\n\t\t\t\tconst keyNode = path.node.key;\n\t\t\t\tif (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n\t\t\t\t\treturn;\n\t\t\t\tconst propName =\n\t\t\t\t\tkeyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n\t\t\t\tif (!isContentProperty(propName)) return;\n\n\t\t\t\tconst valueNode = path.node.value;\n\n\t\t\t\tif (valueNode.type === \"ConditionalExpression\") {\n\t\t\t\t\tconst result = transformConditionalBranch(valueNode, textToKey);\n\t\t\t\t\tif (result.count > 0) {\n\t\t\t\t\t\tpath.node.value = result.node;\n\t\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\t\tcollectConditionalKeys(valueNode, textToKey).forEach((k) =>\n\t\t\t\t\t\t\tallUsedKeys.push(k),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst extracted = extractTextFromNode(valueNode);\n\t\t\t\tif (!extracted || !(extracted.text in textToKey)) return;\n\n\t\t\t\tconst key = textToKey[extracted.text];\n\t\t\t\tconst args: t.Expression[] = [t.stringLiteral(key)];\n\t\t\t\tif (\n\t\t\t\t\textracted.templateInfo &&\n\t\t\t\t\textracted.templateInfo.placeholders.length > 0\n\t\t\t\t) {\n\t\t\t\t\targs.push(\n\t\t\t\t\t\tbuildValuesObject(\n\t\t\t\t\t\t\textracted.templateInfo.expressions,\n\t\t\t\t\t\t\textracted.templateInfo.placeholders,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tpath.node.value = markGeneratedCall(\n\t\t\t\t\tt.callExpression(t.identifier(\"t\"), args),\n\t\t\t\t);\n\t\t\t\tstringsWrapped++;\n\t\t\t\tallUsedKeys.push(key);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Existing function-scoped logic\n\t\t\tconst ownerFn = getNearestFunctionPath(\n\t\t\t\tpath as unknown as NodePath<t.Node>,\n\t\t\t);\n\t\t\tif (!ownerFn) return;\n\t\t\tif (!functionContainsJSX(ownerFn.node)) return;\n\t\t\tconst compName = getComponentName(ownerFn as unknown as NodePath<t.Node>);\n\t\t\tif (!compName) return;\n\n\t\t\tconst keyNode = path.node.key;\n\t\t\tif (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n\t\t\t\treturn;\n\t\t\tconst propName =\n\t\t\t\tkeyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n\t\t\tif (!isContentProperty(propName)) return;\n\n\t\t\tconst valueNode = path.node.value;\n\n\t\t\tif (valueNode.type === \"ConditionalExpression\") {\n\t\t\t\tconst result = transformConditionalBranch(valueNode, textToKey);\n\t\t\t\tif (result.count > 0) {\n\t\t\t\t\tpath.node.value = result.node;\n\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\tcollectConditionalKeys(valueNode, textToKey).forEach((k) =>\n\t\t\t\t\t\ttrackKey(path, k),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst extracted = extractTextFromNode(valueNode);\n\t\t\tif (!extracted || !(extracted.text in textToKey)) return;\n\n\t\t\tconst key = textToKey[extracted.text];\n\t\t\tconst args: t.Expression[] = [t.stringLiteral(key)];\n\t\t\tif (\n\t\t\t\textracted.templateInfo &&\n\t\t\t\textracted.templateInfo.placeholders.length > 0\n\t\t\t) {\n\t\t\t\targs.push(\n\t\t\t\t\tbuildValuesObject(\n\t\t\t\t\t\textracted.templateInfo.expressions,\n\t\t\t\t\t\textracted.templateInfo.placeholders,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\tpath.node.value = markGeneratedCall(\n\t\t\t\tt.callExpression(t.identifier(\"t\"), args),\n\t\t\t);\n\t\t\tstringsWrapped++;\n\t\t\ttrackKey(path, key);\n\t\t},\n\t});\n\n\tconst hasModuleFactoryWork =\n\t\t(options.moduleFactoryConstNames?.length ?? 0) > 0 ||\n\t\t(options.moduleFactoryImportedNames?.length ?? 0) > 0;\n\n\tif (stringsWrapped === 0 && !hasModuleFactoryWork) {\n\t\treturn {\n\t\t\tcode: generate(ast).code,\n\t\t\tstringsWrapped: 0,\n\t\t\tmodified: false,\n\t\t\tusedKeys: [],\n\t\t};\n\t}\n\n\t// Pre-scan: discover which components will need `t` due to factory imports,\n\t// so the injection phase can handle them proactively.\n\tconst moduleFactoryImportedNames = options.moduleFactoryImportedNames ?? [];\n\tconst factoryRefComponents = preDiscoverFactoryRefComponents(\n\t\tast,\n\t\tmoduleFactoryImportedNames,\n\t);\n\tfor (const comp of factoryRefComponents) {\n\t\tcomponentsNeedingT.add(comp);\n\t}\n\n\t// Compute namespace per component.\n\t// Components that reference factory imports must NOT be namespaced, because\n\t// the factory functions use full keys (e.g. \"footer.about\") and a namespaced\n\t// translator would mangle them.\n\tconst componentNamespaces = new Map<string, string | null>();\n\tfor (const [comp, keys] of componentKeys) {\n\t\tif (factoryRefComponents.has(comp)) {\n\t\t\tcomponentNamespaces.set(comp, null);\n\t\t} else {\n\t\t\tcomponentNamespaces.set(comp, detectNamespace([...keys]));\n\t\t}\n\t}\n\t// Ensure factory-only components (no own keys) still get into the map\n\tfor (const comp of factoryRefComponents) {\n\t\tif (!componentNamespaces.has(comp)) {\n\t\t\tcomponentNamespaces.set(comp, null);\n\t\t}\n\t}\n\n\tconst namespacedComponents = new Set<string>();\n\tconst componentTranslatorIds = new Map<string, string>();\n\n\tconst asyncMode = !isClient;\n\tconst translationsLocal = isClient\n\t\t? componentsNeedingT.size > 0\n\t\t\t? ensureNamedImportLocal(ast, importSource, \"useTranslations\")\n\t\t\t: \"useTranslations\"\n\t\t: componentsNeedingT.size > 0\n\t\t\t? ensureNamedImportLocal(ast, `${importSource}/server`, \"getTranslations\")\n\t\t\t: \"getTranslations\";\n\n\tinjectTranslatorsIntoComponents(ast, {\n\t\tcomponentsNeedingT,\n\t\tcomponentNamespaces,\n\t\tcomponentTranslatorIds,\n\t\tnamespacedComponents,\n\t\ttranslationsLocal,\n\t\tasyncMode,\n\t});\n\n\t// Module factory: wrap const declarations as arrow factories\n\tconst moduleFactoryConstNames = options.moduleFactoryConstNames ?? [];\n\tconst didWrapFactory = wrapModuleFactoryDeclarations(\n\t\tast,\n\t\tmoduleFactoryConstNames,\n\t\toptions.isTypeScript,\n\t);\n\n\t// Rewrite keys to strip namespace prefix only for components where namespace was established\n\tconst effectiveNamespaces = new Map<string, string | null>();\n\tfor (const [comp, ns] of componentNamespaces) {\n\t\teffectiveNamespaces.set(comp, namespacedComponents.has(comp) ? ns : null);\n\t}\n\trewriteKeysForNamespaces(ast, effectiveNamespaces);\n\trewriteGeneratedCallsForTranslator(ast, componentTranslatorIds);\n\n\t// Module factory: rewrite references to imported factory consts AFTER translator IDs are known\n\tconst {\n\t\tcomponentsNeedingT: factoryComponentsNeedingT,\n\t\trewrote: didRewriteRefs,\n\t} = rewriteModuleFactoryReferences(\n\t\tast,\n\t\tmoduleFactoryImportedNames,\n\t\tcomponentTranslatorIds,\n\t);\n\t// Merge factory components into the main set\n\tfor (const comp of factoryComponentsNeedingT) {\n\t\tcomponentsNeedingT.add(comp);\n\t}\n\n\tif (needsClientDirective && componentsNeedingT.size > 0) {\n\t\taddUseClientDirective(ast);\n\t}\n\n\tconst didModify = stringsWrapped > 0 || didWrapFactory || didRewriteRefs;\n\tconst output = generate(ast, { retainLines: false });\n\treturn {\n\t\tcode: output.code,\n\t\tstringsWrapped,\n\t\tmodified: didModify,\n\t\tusedKeys: allUsedKeys,\n\t};\n}\n\ninterface InjectionResult {\n\tnamespaced: boolean;\n\ttranslatorId: string;\n}\n\ninterface InjectionTraverseOptions {\n\tcomponentsNeedingT: Set<string>;\n\tcomponentNamespaces: Map<string, string | null>;\n\tcomponentTranslatorIds: Map<string, string>;\n\tnamespacedComponents: Set<string>;\n\ttranslationsLocal: string;\n\tasyncMode: boolean;\n}\n\nfunction injectTranslatorsIntoComponents(\n\tast: File,\n\topts: InjectionTraverseOptions,\n): void {\n\tconst {\n\t\tcomponentsNeedingT,\n\t\tcomponentNamespaces,\n\t\tcomponentTranslatorIds,\n\t\tnamespacedComponents,\n\t\ttranslationsLocal,\n\t\tasyncMode,\n\t} = opts;\n\n\tfunction recordInjection(name: string, injected: InjectionResult): void {\n\t\tcomponentTranslatorIds.set(name, injected.translatorId);\n\t\tif (injected.namespaced) namespacedComponents.add(name);\n\t}\n\n\tfunction injectIntoFn(\n\t\tblock: t.BlockStatement,\n\t\tfn: t.Function,\n\t\tname: string,\n\t): void {\n\t\tif (asyncMode) fn.async = true;\n\t\tconst ns = componentNamespaces.get(name) ?? undefined;\n\t\tconst injected = injectTIntoBlock(\n\t\t\tblock,\n\t\t\ttranslationsLocal,\n\t\t\tns,\n\t\t\tname,\n\t\t\tfn,\n\t\t\tasyncMode || undefined,\n\t\t);\n\t\trecordInjection(name, injected);\n\t}\n\n\ttraverse(ast, {\n\t\tFunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n\t\t\tconst name = getComponentName(path as unknown as NodePath<t.Node>);\n\t\t\tif (!name || !componentsNeedingT.has(name)) return;\n\t\t\tinjectIntoFn(path.node.body, path.node, name);\n\t\t},\n\t\tVariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n\t\t\tif (path.node.id.type !== \"Identifier\") return;\n\t\t\tconst name = path.node.id.name;\n\t\t\tif (!componentsNeedingT.has(name)) return;\n\n\t\t\tconst init = path.node.init;\n\t\t\tif (!init) return;\n\n\t\t\tif (\n\t\t\t\tinit.type === \"ArrowFunctionExpression\" ||\n\t\t\t\tinit.type === \"FunctionExpression\"\n\t\t\t) {\n\t\t\t\tinjectIntoFn(ensureBlockBody(init), init, name);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (init.type === \"CallExpression\") {\n\t\t\t\tconst wrappedFn = findWrappedFunctionInCall(init);\n\t\t\t\tif (!wrappedFn) return;\n\t\t\t\tinjectIntoFn(ensureBlockBody(wrappedFn), wrappedFn, name);\n\t\t\t}\n\t\t},\n\t\tExportDefaultDeclaration(path: NodePath<t.ExportDefaultDeclaration>) {\n\t\t\tconst name = \"__default__\";\n\t\t\tif (!componentsNeedingT.has(name)) return;\n\t\t\tconst decl = path.node.declaration;\n\n\t\t\tif (decl.type === \"FunctionDeclaration\") {\n\t\t\t\tinjectIntoFn(decl.body, decl, name);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tdecl.type === \"FunctionExpression\" ||\n\t\t\t\tdecl.type === \"ArrowFunctionExpression\"\n\t\t\t) {\n\t\t\t\tinjectIntoFn(ensureBlockBody(decl), decl, name);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (decl.type === \"CallExpression\") {\n\t\t\t\tconst wrappedFn = findWrappedFunctionInCall(decl);\n\t\t\t\tif (!wrappedFn) return;\n\t\t\t\tinjectIntoFn(ensureBlockBody(wrappedFn), wrappedFn, name);\n\t\t\t}\n\t\t},\n\t\tnoScope: true,\n\t});\n}\n\nfunction updateCallNamespace(\n\tcall: t.CallExpression,\n\tnamespace: string | undefined,\n): boolean {\n\tconst currentArg = call.arguments[0];\n\tif (!namespace) {\n\t\t// Mixed namespace or unresolved namespace case: clear stale static namespaces\n\t\t// from previous runs, but preserve dynamic arguments.\n\t\tif (currentArg && currentArg.type === \"StringLiteral\") {\n\t\t\tcall.arguments = [];\n\t\t}\n\t\treturn false;\n\t}\n\tif (\n\t\tcurrentArg &&\n\t\tcurrentArg.type === \"StringLiteral\" &&\n\t\tcurrentArg.value === namespace\n\t) {\n\t\treturn true; // Already correct\n\t}\n\t// Only overwrite if argument is missing or is a string literal (safe to update).\n\t// Non-string arguments (variables, expressions) are left untouched to avoid\n\t// silently breaking dynamic namespace usage.\n\tif (!currentArg || currentArg.type === \"StringLiteral\") {\n\t\tcall.arguments = [t.stringLiteral(namespace)];\n\t\treturn true;\n\t}\n\treturn false; // Dynamic argument — don't strip keys since runtime namespace is unknown\n}\n\nfunction injectTIntoBlock(\n\tblock: t.BlockStatement,\n\ttranslationsLocal: string,\n\tnamespace?: string,\n\tcomponentName?: string,\n\townerFn?: t.Function,\n\tasyncMode?: boolean,\n): InjectionResult {\n\tlet sawConflictingT = false;\n\n\tfor (const stmt of block.body) {\n\t\tif (stmt.type !== \"VariableDeclaration\") continue;\n\t\tfor (const d of stmt.declarations) {\n\t\t\tif (d.id.type !== \"Identifier\") continue;\n\n\t\t\t// const <id> = useTranslations(...) or const <id> = getTranslations(...)\n\t\t\tif (isTranslationFactoryCall(d.init, translationsLocal)) {\n\t\t\t\treturn {\n\t\t\t\t\tnamespaced: updateCallNamespace(\n\t\t\t\t\t\td.init as t.CallExpression,\n\t\t\t\t\t\tnamespace,\n\t\t\t\t\t),\n\t\t\t\t\ttranslatorId: d.id.name,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// const <id> = await getTranslations(...)\n\t\t\tif (isAwaitedGetTranslationsCall(d.init, translationsLocal)) {\n\t\t\t\treturn {\n\t\t\t\t\tnamespaced: updateCallNamespace(d.init.argument, namespace),\n\t\t\t\t\ttranslatorId: d.id.name,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// const <id> = getTranslations(...) (without await — async mode detection)\n\t\t\tif (asyncMode && isGetTranslationsCall(d.init, translationsLocal)) {\n\t\t\t\treturn {\n\t\t\t\t\tnamespaced: updateCallNamespace(\n\t\t\t\t\t\td.init as t.CallExpression,\n\t\t\t\t\t\tnamespace,\n\t\t\t\t\t),\n\t\t\t\t\ttranslatorId: d.id.name,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (d.id.name === \"t\") sawConflictingT = true;\n\t\t}\n\t}\n\n\tconst translatorId = pickTranslatorId(block, ownerFn);\n\tif (sawConflictingT && translatorId !== \"t\") {\n\t\tlogWarning(\n\t\t\tcomponentName\n\t\t\t\t? `Component \"${componentName}\" has \"const t = ...\" that is not useTranslations/getTranslations.\\n Injected fallback translator \"${translatorId}\" to avoid conflicts.`\n\t\t\t\t: `Detected \"const t = ...\" conflict. Injected fallback translator \"${translatorId}\".`,\n\t\t);\n\t}\n\n\tconst args: t.Expression[] = namespace ? [t.stringLiteral(namespace)] : [];\n\tconst callExpr = t.callExpression(t.identifier(translationsLocal), args);\n\tconst tDecl = t.variableDeclaration(\"const\", [\n\t\tt.variableDeclarator(\n\t\t\tt.identifier(translatorId),\n\t\t\tasyncMode ? t.awaitExpression(callExpr) : callExpr,\n\t\t),\n\t]);\n\n\tblock.body.unshift(tDecl);\n\treturn { namespaced: !!namespace, translatorId };\n}\n\nfunction rewriteKeysForNamespaces(\n\tast: File,\n\tcomponentNamespaces: Map<string, string | null>,\n): void {\n\t// Collect component names that actually have a namespace\n\tconst nsComponents = new Map<string, string>();\n\tfor (const [comp, ns] of componentNamespaces) {\n\t\tif (ns) nsComponents.set(comp, ns);\n\t}\n\tif (nsComponents.size === 0) return;\n\n\ttraverse(ast, {\n\t\tCallExpression(path: NodePath<t.CallExpression>) {\n\t\t\tif (!isGeneratedCall(path.node)) return;\n\t\t\tif (\n\t\t\t\tpath.node.callee.type !== \"Identifier\" ||\n\t\t\t\tpath.node.callee.name !== \"t\"\n\t\t\t)\n\t\t\t\treturn;\n\t\t\tif (path.node.arguments.length === 0) return;\n\t\t\tconst firstArg = path.node.arguments[0];\n\t\t\tif (firstArg.type !== \"StringLiteral\") return;\n\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName) return;\n\t\t\tconst ns = nsComponents.get(compName);\n\t\t\tif (!ns) return;\n\n\t\t\tconst stripped = stripNamespace(firstArg.value, ns);\n\t\t\tif (stripped !== firstArg.value) {\n\t\t\t\tfirstArg.value = stripped;\n\t\t\t}\n\t\t},\n\t\tnoScope: true,\n\t});\n}\n\nfunction rewriteGeneratedCallsForTranslator(\n\tast: File,\n\ttranslatorByComponent: Map<string, string>,\n): void {\n\tif (translatorByComponent.size === 0) return;\n\n\ttraverse(ast, {\n\t\tCallExpression(path: NodePath<t.CallExpression>) {\n\t\t\tif (!isGeneratedCall(path.node)) return;\n\t\t\tif (\n\t\t\t\tpath.node.callee.type !== \"Identifier\" ||\n\t\t\t\tpath.node.callee.name !== \"t\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName) return;\n\t\t\tconst translatorId = translatorByComponent.get(compName);\n\t\t\tif (!translatorId || translatorId === \"t\") return;\n\t\t\tpath.node.callee = t.identifier(translatorId);\n\t\t},\n\t\tnoScope: true,\n\t});\n}\n\nexport function detectClientFile(ast: File): boolean {\n\tif (ast.program.directives) {\n\t\tfor (const directive of ast.program.directives) {\n\t\t\tif (directive.value?.value === \"use client\") {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Detect files that use React hooks (use*() calls) — these are effectively\n\t// client components even without an explicit \"use client\" directive, since\n\t// they must be rendered inside a client component boundary.\n\tlet usesHooks = false;\n\ttraverse(ast, {\n\t\tCallExpression(path: NodePath<t.CallExpression>) {\n\t\t\tif (usesHooks) return;\n\t\t\tconst callee = path.node.callee;\n\n\t\t\t// useState(), useQuery(), usePathname(), etc. imported from any module.\n\t\t\tif (callee.type === \"Identifier\") {\n\t\t\t\tconst binding = path.scope.getBinding(callee.name);\n\t\t\t\tif (!binding) return;\n\n\t\t\t\tif (binding.path.isImportSpecifier()) {\n\t\t\t\t\tconst imported = binding.path.node.imported;\n\t\t\t\t\tif (\n\t\t\t\t\t\timported.type === \"Identifier\" &&\n\t\t\t\t\t\t/^use[A-Z]/.test(imported.name) &&\n\t\t\t\t\t\t// Exclude translate-kit's inline mode hook — it is normalised\n\t\t\t\t\t\t// by codegen and should not force client detection.\n\t\t\t\t\t\timported.name !== \"useT\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tusesHooks = true;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(binding.path.isImportDefaultSpecifier() ||\n\t\t\t\t\t\tbinding.path.isImportNamespaceSpecifier()) &&\n\t\t\t\t\t/^use[A-Z]/.test(callee.name) &&\n\t\t\t\t\tcallee.name !== \"useT\"\n\t\t\t\t) {\n\t\t\t\t\tusesHooks = true;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// React.useState(), React.useEffect(), etc.\n\t\t\tif (\n\t\t\t\tcallee.type === \"MemberExpression\" &&\n\t\t\t\t!callee.computed &&\n\t\t\t\tcallee.object.type === \"Identifier\" &&\n\t\t\t\tcallee.property.type === \"Identifier\" &&\n\t\t\t\t/^use[A-Z]/.test(callee.property.name)\n\t\t\t) {\n\t\t\t\tconst binding = path.scope.getBinding(callee.object.name);\n\t\t\t\tif (\n\t\t\t\t\tbinding &&\n\t\t\t\t\t(binding.path.isImportDefaultSpecifier() ||\n\t\t\t\t\t\tbinding.path.isImportNamespaceSpecifier()) &&\n\t\t\t\t\tbinding.path.parentPath.isImportDeclaration() &&\n\t\t\t\t\tbinding.path.parentPath.node.source.value === \"react\"\n\t\t\t\t) {\n\t\t\t\t\tusesHooks = true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t});\n\treturn usesHooks;\n}\n\nfunction hasInlineImport(\n\tast: File,\n\tcomponentPath: string,\n): { hasT: boolean; hasHook: boolean } {\n\tlet hasT = false;\n\tlet hasHook = false;\n\tfor (const node of ast.program.body) {\n\t\tif (node.type !== \"ImportDeclaration\") continue;\n\t\tconst src = node.source.value;\n\t\tif (\n\t\t\tsrc !== componentPath &&\n\t\t\tsrc !== `${componentPath}-server` &&\n\t\t\tsrc !== `${componentPath}/t-server`\n\t\t)\n\t\t\tcontinue;\n\t\tfor (const spec of node.specifiers) {\n\t\t\tif (\n\t\t\t\tspec.type === \"ImportSpecifier\" &&\n\t\t\t\tspec.imported.type === \"Identifier\"\n\t\t\t) {\n\t\t\t\tif (spec.imported.name === \"T\") hasT = true;\n\t\t\t\tif (spec.imported.name === \"useT\" || spec.imported.name === \"createT\")\n\t\t\t\t\thasHook = true;\n\t\t\t}\n\t\t}\n\t}\n\treturn { hasT, hasHook };\n}\n\nfunction resolveImportedLocalName(\n\tast: File,\n\tsources: Set<string>,\n\timportedName: string,\n): string | null {\n\tfor (const node of ast.program.body) {\n\t\tif (node.type !== \"ImportDeclaration\") continue;\n\t\tif (!sources.has(node.source.value)) continue;\n\t\tfor (const spec of node.specifiers) {\n\t\t\tif (\n\t\t\t\tspec.type === \"ImportSpecifier\" &&\n\t\t\t\tspec.imported.type === \"Identifier\" &&\n\t\t\t\tspec.imported.name === importedName &&\n\t\t\t\tspec.local.type === \"Identifier\"\n\t\t\t) {\n\t\t\t\treturn spec.local.name;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction normalizeInlineImports(\n\tast: File,\n\tcomponentPath: string,\n\tisClient: boolean,\n): boolean {\n\tconst validSources = new Set([\n\t\tcomponentPath,\n\t\t`${componentPath}-server`,\n\t\t`${componentPath}/t-server`,\n\t]);\n\tconst desiredSource = isClient ? componentPath : `${componentPath}-server`;\n\tlet changed = false;\n\tlet hookRenamed: { from: string; to: string } | undefined;\n\n\tfor (const node of ast.program.body) {\n\t\tif (node.type !== \"ImportDeclaration\") continue;\n\t\tif (!validSources.has(node.source.value)) continue;\n\n\t\tif (node.source.value !== desiredSource) {\n\t\t\tnode.source.value = desiredSource;\n\t\t\tchanged = true;\n\t\t}\n\n\t\tfor (const spec of node.specifiers) {\n\t\t\tif (\n\t\t\t\tspec.type !== \"ImportSpecifier\" ||\n\t\t\t\tspec.imported.type !== \"Identifier\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isClient && spec.imported.name === \"createT\") {\n\t\t\t\thookRenamed = { from: \"createT\", to: \"useT\" };\n\t\t\t\tspec.imported = t.identifier(\"useT\");\n\t\t\t\tif (spec.local.type === \"Identifier\" && spec.local.name === \"createT\") {\n\t\t\t\t\tspec.local = t.identifier(\"useT\");\n\t\t\t\t}\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tif (!isClient && spec.imported.name === \"useT\") {\n\t\t\t\thookRenamed = { from: \"useT\", to: \"createT\" };\n\t\t\t\tspec.imported = t.identifier(\"createT\");\n\t\t\t\tif (spec.local.type === \"Identifier\" && spec.local.name === \"useT\") {\n\t\t\t\t\tspec.local = t.identifier(\"createT\");\n\t\t\t\t}\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Rename call expressions in function bodies to match the updated import\n\tif (hookRenamed) {\n\t\tconst { from, to } = hookRenamed;\n\t\ttraverse(ast, {\n\t\t\tVariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n\t\t\t\tif (\n\t\t\t\t\tpath.node.id.type === \"Identifier\" &&\n\t\t\t\t\tpath.node.id.name === \"t\" &&\n\t\t\t\t\tpath.node.init?.type === \"CallExpression\" &&\n\t\t\t\t\tpath.node.init.callee.type === \"Identifier\" &&\n\t\t\t\t\tpath.node.init.callee.name === from\n\t\t\t\t) {\n\t\t\t\t\tpath.node.init.callee = t.identifier(to);\n\t\t\t\t}\n\t\t\t},\n\t\t\tnoScope: true,\n\t\t});\n\t}\n\n\treturn changed;\n}\n\nfunction hasUseClientDirective(ast: File): boolean {\n\tif (ast.program.directives) {\n\t\tfor (const directive of ast.program.directives) {\n\t\t\tif (directive.value?.value === \"use client\") return true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction addUseClientDirective(ast: File): void {\n\t// Guard against duplicate directives\n\tif (hasUseClientDirective(ast)) return;\n\n\tif (!ast.program.directives) {\n\t\tast.program.directives = [];\n\t}\n\tast.program.directives.unshift(t.directive(t.directiveLiteral(\"use client\")));\n}\n\nfunction transformInline(\n\tast: File,\n\ttextToKey: Record<string, string>,\n\toptions: TransformOptions,\n): TransformResult {\n\tconst componentPath = options.componentPath ?? \"@/components/t\";\n\tconst isClient = options.forceClient || detectClientFile(ast);\n\tconst needsClientDirective =\n\t\toptions.forceClient === true && !detectClientFile(ast);\n\tlet stringsWrapped = 0;\n\tconst componentsNeedingT = new Set<string>();\n\tconst componentTranslatorIds = new Map<string, string>();\n\tlet needsTComponent = false;\n\tlet repaired = false;\n\tlet boundaryRepaired = false;\n\n\tboundaryRepaired = normalizeInlineImports(ast, componentPath, isClient);\n\n\tif (!isClient) {\n\t\ttraverse(ast, {\n\t\t\tCallExpression(path: NodePath<t.CallExpression>) {\n\t\t\t\tif (\n\t\t\t\t\tpath.node.callee.type === \"Identifier\" &&\n\t\t\t\t\tpath.node.callee.name === \"createT\" &&\n\t\t\t\t\tpath.node.arguments.length > 0 &&\n\t\t\t\t\tpath.node.arguments[0].type === \"Identifier\"\n\t\t\t\t) {\n\t\t\t\t\tconst argName = (path.node.arguments[0] as t.Identifier).name;\n\t\t\t\t\tif (!path.scope.hasBinding(argName)) {\n\t\t\t\t\t\tlogWarning(\n\t\t\t\t\t\t\t`Repaired createT(${argName}) → createT() — \"${argName}\" was not in scope`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpath.node.arguments = [];\n\t\t\t\t\t\trepaired = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\ttraverse(ast, {\n\t\tJSXText(path: NodePath<t.JSXText>) {\n\t\t\tif (isInsideClass(path)) return;\n\t\t\tconst text = path.node.value.trim();\n\t\t\tif (!text || !(text in textToKey)) return;\n\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) return;\n\n\t\t\tconst parent = path.parentPath;\n\t\t\tif (!parent?.isJSXElement()) return;\n\n\t\t\tconst parentOpening = parent.node.openingElement;\n\t\t\tif (\n\t\t\t\tparentOpening.name.type === \"JSXIdentifier\" &&\n\t\t\t\tparentOpening.name.name === \"T\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst key = textToKey[text];\n\t\t\tneedsTComponent = true;\n\n\t\t\tconst tElement = t.jsxElement(\n\t\t\t\tt.jsxOpeningElement(t.jsxIdentifier(\"T\"), [\n\t\t\t\t\tt.jsxAttribute(t.jsxIdentifier(\"id\"), t.stringLiteral(key)),\n\t\t\t\t]),\n\t\t\t\tt.jsxClosingElement(t.jsxIdentifier(\"T\")),\n\t\t\t\t[t.jsxText(text)],\n\t\t\t\tfalse,\n\t\t\t);\n\n\t\t\tif (!hasSubstantialSiblings(parent)) {\n\t\t\t\tpath.replaceWith(tElement);\n\t\t\t} else {\n\t\t\t\tconst raw = path.node.value;\n\t\t\t\tconst hasLeading = raw !== raw.trimStart();\n\t\t\t\tconst hasTrailing = raw !== raw.trimEnd();\n\t\t\t\tconst nodes: t.Node[] = [];\n\t\t\t\tif (hasLeading) {\n\t\t\t\t\tnodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n\t\t\t\t}\n\t\t\t\tnodes.push(tElement);\n\t\t\t\tif (hasTrailing) {\n\t\t\t\t\tnodes.push(t.jsxExpressionContainer(t.stringLiteral(\" \")));\n\t\t\t\t}\n\t\t\t\tpath.replaceWithMultiple(nodes);\n\t\t\t}\n\n\t\t\tstringsWrapped++;\n\t\t},\n\n\t\tJSXExpressionContainer(path: NodePath<t.JSXExpressionContainer>) {\n\t\t\tif (isInsideClass(path)) return;\n\t\t\tconst expr = path.node.expression;\n\t\t\tif (path.parent.type === \"JSXAttribute\") return;\n\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) return;\n\n\t\t\tif (expr.type === \"ConditionalExpression\") {\n\t\t\t\tconst result = transformConditionalBranch(expr, textToKey, \"inline\");\n\t\t\t\tif (result.count > 0) {\n\t\t\t\t\tpath.node.expression = result.node;\n\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\tcomponentsNeedingT.add(compName);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (expr.type !== \"TemplateLiteral\") return;\n\n\t\t\tconst info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n\t\t\tif (!info || !(info.text in textToKey)) return;\n\n\t\t\tconst key = textToKey[info.text];\n\t\t\tconst args: t.Expression[] = [\n\t\t\t\tt.stringLiteral(info.text),\n\t\t\t\tt.stringLiteral(key),\n\t\t\t];\n\t\t\tif (info.placeholders.length > 0) {\n\t\t\t\targs.push(buildValuesObject(expr.expressions, info.placeholders));\n\t\t\t}\n\t\t\tpath.node.expression = markGeneratedCall(\n\t\t\t\tt.callExpression(t.identifier(\"t\"), args),\n\t\t\t);\n\t\t\tstringsWrapped++;\n\t\t\tcomponentsNeedingT.add(compName);\n\t\t},\n\n\t\tJSXAttribute(path: NodePath<t.JSXAttribute>) {\n\t\t\tif (isInsideClass(path)) return;\n\t\t\tconst value = path.node.value;\n\t\t\tif (!value) return;\n\n\t\t\t// Only wrap translatable props (placeholder, title, alt, aria-label, etc.)\n\t\t\tconst attrName = path.node.name;\n\t\t\tconst propName =\n\t\t\t\tattrName.type === \"JSXIdentifier\" ? attrName.name : attrName.name.name;\n\t\t\tif (!isTranslatableProp(propName, options.translatableProps)) return;\n\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) return;\n\n\t\t\tif (\n\t\t\t\tvalue.type === \"JSXExpressionContainer\" &&\n\t\t\t\tvalue.expression.type === \"ConditionalExpression\"\n\t\t\t) {\n\t\t\t\tconst result = transformConditionalBranch(\n\t\t\t\t\tvalue.expression,\n\t\t\t\t\ttextToKey,\n\t\t\t\t\t\"inline\",\n\t\t\t\t);\n\t\t\t\tif (result.count > 0) {\n\t\t\t\t\tpath.node.value = t.jsxExpressionContainer(result.node);\n\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\tcomponentsNeedingT.add(compName);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst extracted = extractTextFromNode(value);\n\t\t\tif (!extracted || !(extracted.text in textToKey)) return;\n\n\t\t\tif (\n\t\t\t\tvalue.type === \"JSXExpressionContainer\" &&\n\t\t\t\tvalue.expression.type === \"CallExpression\" &&\n\t\t\t\tvalue.expression.callee.type === \"Identifier\" &&\n\t\t\t\tvalue.expression.callee.name === \"t\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst key = textToKey[extracted.text];\n\t\t\tconst args: t.Expression[] = [\n\t\t\t\tt.stringLiteral(extracted.text),\n\t\t\t\tt.stringLiteral(key),\n\t\t\t];\n\t\t\tif (\n\t\t\t\textracted.templateInfo &&\n\t\t\t\textracted.templateInfo.placeholders.length > 0\n\t\t\t) {\n\t\t\t\targs.push(\n\t\t\t\t\tbuildValuesObject(\n\t\t\t\t\t\textracted.templateInfo.expressions,\n\t\t\t\t\t\textracted.templateInfo.placeholders,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\tpath.node.value = t.jsxExpressionContainer(\n\t\t\t\tmarkGeneratedCall(t.callExpression(t.identifier(\"t\"), args)),\n\t\t\t);\n\t\t\tstringsWrapped++;\n\n\t\t\tcomponentsNeedingT.add(compName);\n\t\t},\n\n\t\tObjectProperty(path: NodePath<t.ObjectProperty>) {\n\t\t\tif (isInsideClass(path)) return;\n\n\t\t\tconst factoryConstNames = options.moduleFactoryConstNames ?? [];\n\t\t\tconst inFunction = isInsideFunction(path);\n\n\t\t\tif (!inFunction) {\n\t\t\t\t// Module-factory path for inline mode\n\t\t\t\tconst constName = getTopLevelConstName(\n\t\t\t\t\tpath as unknown as NodePath<t.Node>,\n\t\t\t\t);\n\t\t\t\tif (!constName || !factoryConstNames.includes(constName)) return;\n\n\t\t\t\tconst keyNode = path.node.key;\n\t\t\t\tif (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n\t\t\t\t\treturn;\n\t\t\t\tconst propName =\n\t\t\t\t\tkeyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n\t\t\t\tif (!isContentProperty(propName)) return;\n\n\t\t\t\tconst valueNode = path.node.value;\n\n\t\t\t\tif (valueNode.type === \"ConditionalExpression\") {\n\t\t\t\t\tconst result = transformConditionalBranch(\n\t\t\t\t\t\tvalueNode,\n\t\t\t\t\t\ttextToKey,\n\t\t\t\t\t\t\"inline\",\n\t\t\t\t\t);\n\t\t\t\t\tif (result.count > 0) {\n\t\t\t\t\t\tpath.node.value = result.node;\n\t\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst extracted = extractTextFromNode(valueNode);\n\t\t\t\tif (!extracted || !(extracted.text in textToKey)) return;\n\n\t\t\t\tconst key = textToKey[extracted.text];\n\t\t\t\tconst args: t.Expression[] = [\n\t\t\t\t\tt.stringLiteral(extracted.text),\n\t\t\t\t\tt.stringLiteral(key),\n\t\t\t\t];\n\t\t\t\tif (\n\t\t\t\t\textracted.templateInfo &&\n\t\t\t\t\textracted.templateInfo.placeholders.length > 0\n\t\t\t\t) {\n\t\t\t\t\targs.push(\n\t\t\t\t\t\tbuildValuesObject(\n\t\t\t\t\t\t\textracted.templateInfo.expressions,\n\t\t\t\t\t\t\textracted.templateInfo.placeholders,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tpath.node.value = markGeneratedCall(\n\t\t\t\t\tt.callExpression(t.identifier(\"t\"), args),\n\t\t\t\t);\n\t\t\t\tstringsWrapped++;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Existing function-scoped logic\n\t\t\tconst ownerFn = getNearestFunctionPath(\n\t\t\t\tpath as unknown as NodePath<t.Node>,\n\t\t\t);\n\t\t\tif (!ownerFn) return;\n\t\t\tif (!functionContainsJSX(ownerFn.node)) return;\n\t\t\tconst compName = getComponentName(ownerFn as unknown as NodePath<t.Node>);\n\t\t\tif (!compName) return;\n\n\t\t\tconst keyNode = path.node.key;\n\t\t\tif (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n\t\t\t\treturn;\n\t\t\tconst propName =\n\t\t\t\tkeyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n\t\t\tif (!isContentProperty(propName)) return;\n\n\t\t\tconst valueNode = path.node.value;\n\n\t\t\tif (valueNode.type === \"ConditionalExpression\") {\n\t\t\t\tconst result = transformConditionalBranch(\n\t\t\t\t\tvalueNode,\n\t\t\t\t\ttextToKey,\n\t\t\t\t\t\"inline\",\n\t\t\t\t);\n\t\t\t\tif (result.count > 0) {\n\t\t\t\t\tpath.node.value = result.node;\n\t\t\t\t\tstringsWrapped += result.count;\n\t\t\t\t\tcomponentsNeedingT.add(compName);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst extracted = extractTextFromNode(valueNode);\n\t\t\tif (!extracted || !(extracted.text in textToKey)) return;\n\n\t\t\tconst key = textToKey[extracted.text];\n\t\t\tconst args: t.Expression[] = [\n\t\t\t\tt.stringLiteral(extracted.text),\n\t\t\t\tt.stringLiteral(key),\n\t\t\t];\n\t\t\tif (\n\t\t\t\textracted.templateInfo &&\n\t\t\t\textracted.templateInfo.placeholders.length > 0\n\t\t\t) {\n\t\t\t\targs.push(\n\t\t\t\t\tbuildValuesObject(\n\t\t\t\t\t\textracted.templateInfo.expressions,\n\t\t\t\t\t\textracted.templateInfo.placeholders,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\tpath.node.value = markGeneratedCall(\n\t\t\t\tt.callExpression(t.identifier(\"t\"), args),\n\t\t\t);\n\t\t\tstringsWrapped++;\n\n\t\t\tcomponentsNeedingT.add(compName);\n\t\t},\n\t});\n\n\tconst hasModuleFactoryWorkInline =\n\t\t(options.moduleFactoryConstNames?.length ?? 0) > 0 ||\n\t\t(options.moduleFactoryImportedNames?.length ?? 0) > 0;\n\n\tif (\n\t\tstringsWrapped === 0 &&\n\t\t!repaired &&\n\t\t!boundaryRepaired &&\n\t\t!hasModuleFactoryWorkInline\n\t) {\n\t\treturn {\n\t\t\tcode: generate(ast).code,\n\t\t\tstringsWrapped: 0,\n\t\t\tmodified: false,\n\t\t\tusedKeys: [],\n\t\t};\n\t}\n\n\tif (\n\t\tstringsWrapped === 0 &&\n\t\t!hasModuleFactoryWorkInline &&\n\t\t(repaired || boundaryRepaired)\n\t) {\n\t\tif (needsClientDirective && boundaryRepaired) {\n\t\t\taddUseClientDirective(ast);\n\t\t}\n\t\tconst output = generate(ast, { retainLines: false });\n\t\treturn {\n\t\t\tcode: output.code,\n\t\t\tstringsWrapped: 0,\n\t\t\tmodified: true,\n\t\t\tusedKeys: [],\n\t\t};\n\t}\n\n\t// Pre-scan: discover which components will need hook due to factory imports\n\tconst moduleFactoryImportedNamesInline =\n\t\toptions.moduleFactoryImportedNames ?? [];\n\tconst factoryRefComponentsInline = preDiscoverFactoryRefComponents(\n\t\tast,\n\t\tmoduleFactoryImportedNamesInline,\n\t);\n\tfor (const comp of factoryRefComponentsInline) {\n\t\tcomponentsNeedingT.add(comp);\n\t}\n\n\tconst needsHook = componentsNeedingT.size > 0;\n\tconst hookName = isClient ? \"useT\" : \"createT\";\n\tconst importPath = isClient ? componentPath : `${componentPath}-server`;\n\tconst existing = hasInlineImport(ast, componentPath);\n\n\tconst specifiers: t.ImportSpecifier[] = [];\n\tif (needsTComponent && !existing.hasT) {\n\t\tspecifiers.push(t.importSpecifier(t.identifier(\"T\"), t.identifier(\"T\")));\n\t}\n\tif (needsHook && !existing.hasHook) {\n\t\tspecifiers.push(\n\t\t\tt.importSpecifier(t.identifier(hookName), t.identifier(hookName)),\n\t\t);\n\t}\n\n\tif (specifiers.length > 0) {\n\t\tlet appended = false;\n\t\tfor (const node of ast.program.body) {\n\t\t\tif (\n\t\t\t\tnode.type === \"ImportDeclaration\" &&\n\t\t\t\t(node.source.value === importPath ||\n\t\t\t\t\tnode.source.value === componentPath)\n\t\t\t) {\n\t\t\t\tnode.specifiers.push(...specifiers);\n\t\t\t\tnode.source.value = importPath;\n\t\t\t\tappended = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!appended) {\n\t\t\tconst importDecl = t.importDeclaration(\n\t\t\t\tspecifiers,\n\t\t\t\tt.stringLiteral(importPath),\n\t\t\t);\n\t\t\tconst lastImportIndex = findLastImportIndex(ast);\n\n\t\t\tif (lastImportIndex >= 0) {\n\t\t\t\tast.program.body.splice(lastImportIndex + 1, 0, importDecl);\n\t\t\t} else {\n\t\t\t\tlet insertIdx = 0;\n\t\t\t\tif (\n\t\t\t\t\tast.program.body[0]?.type === \"ExpressionStatement\" &&\n\t\t\t\t\t(ast.program.body[0] as t.ExpressionStatement).expression.type ===\n\t\t\t\t\t\t\"StringLiteral\" &&\n\t\t\t\t\t(\n\t\t\t\t\t\t(ast.program.body[0] as t.ExpressionStatement)\n\t\t\t\t\t\t\t.expression as t.StringLiteral\n\t\t\t\t\t).value === \"use client\"\n\t\t\t\t) {\n\t\t\t\t\tinsertIdx = 1;\n\t\t\t\t}\n\t\t\t\tast.program.body.splice(insertIdx, 0, importDecl);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (needsHook) {\n\t\tconst hookSources = new Set<string>([\n\t\t\tcomponentPath,\n\t\t\t`${componentPath}-server`,\n\t\t\t`${componentPath}/t-server`,\n\t\t]);\n\t\tconst importedHookName = isClient ? \"useT\" : \"createT\";\n\t\tconst hookLocalName =\n\t\t\tresolveImportedLocalName(ast, hookSources, importedHookName) ??\n\t\t\timportedHookName;\n\t\tconst hookCall = t.callExpression(t.identifier(hookLocalName), []);\n\n\t\tconst serverAwait = !isClient;\n\t\ttraverse(ast, {\n\t\t\tFunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {\n\t\t\t\tconst name = getComponentName(path as unknown as NodePath<t.Node>);\n\t\t\t\tif (!name || !componentsNeedingT.has(name)) return;\n\t\t\t\tconst body = path.node.body;\n\t\t\t\tif (body.type !== \"BlockStatement\") return;\n\t\t\t\tconst translatorId = injectInlineHookIntoBlock(\n\t\t\t\t\tbody,\n\t\t\t\t\thookCall,\n\t\t\t\t\tname,\n\t\t\t\t\tpath.node,\n\t\t\t\t\tserverAwait,\n\t\t\t\t);\n\t\t\t\tcomponentTranslatorIds.set(name, translatorId);\n\t\t\t},\n\t\t\tVariableDeclarator(path: NodePath<t.VariableDeclarator>) {\n\t\t\t\tif (path.node.id.type !== \"Identifier\") return;\n\t\t\t\tconst name = path.node.id.name;\n\t\t\t\tif (!componentsNeedingT.has(name)) return;\n\n\t\t\t\tconst init = path.node.init;\n\t\t\t\tif (!init) return;\n\n\t\t\t\tif (\n\t\t\t\t\tinit.type === \"ArrowFunctionExpression\" ||\n\t\t\t\t\tinit.type === \"FunctionExpression\"\n\t\t\t\t) {\n\t\t\t\t\tconst block = ensureBlockBody(init);\n\t\t\t\t\tconst translatorId = injectInlineHookIntoBlock(\n\t\t\t\t\t\tblock,\n\t\t\t\t\t\thookCall,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tinit,\n\t\t\t\t\t\tserverAwait,\n\t\t\t\t\t);\n\t\t\t\t\tcomponentTranslatorIds.set(name, translatorId);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (init.type === \"CallExpression\") {\n\t\t\t\t\tconst wrappedFn = findWrappedFunctionInCall(init);\n\t\t\t\t\tif (!wrappedFn) return;\n\t\t\t\t\tconst block = ensureBlockBody(wrappedFn);\n\t\t\t\t\tconst translatorId = injectInlineHookIntoBlock(\n\t\t\t\t\t\tblock,\n\t\t\t\t\t\thookCall,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\twrappedFn,\n\t\t\t\t\t\tserverAwait,\n\t\t\t\t\t);\n\t\t\t\t\tcomponentTranslatorIds.set(name, translatorId);\n\t\t\t\t}\n\t\t\t},\n\t\t\tExportDefaultDeclaration(path: NodePath<t.ExportDefaultDeclaration>) {\n\t\t\t\tconst name = \"__default__\";\n\t\t\t\tif (!componentsNeedingT.has(name)) return;\n\t\t\t\tconst decl = path.node.declaration;\n\n\t\t\t\tif (decl.type === \"FunctionDeclaration\") {\n\t\t\t\t\tconst translatorId = injectInlineHookIntoBlock(\n\t\t\t\t\t\tdecl.body,\n\t\t\t\t\t\thookCall,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tdecl,\n\t\t\t\t\t\tserverAwait,\n\t\t\t\t\t);\n\t\t\t\t\tcomponentTranslatorIds.set(name, translatorId);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tdecl.type === \"FunctionExpression\" ||\n\t\t\t\t\tdecl.type === \"ArrowFunctionExpression\"\n\t\t\t\t) {\n\t\t\t\t\tconst block = ensureBlockBody(decl);\n\t\t\t\t\tconst translatorId = injectInlineHookIntoBlock(\n\t\t\t\t\t\tblock,\n\t\t\t\t\t\thookCall,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tdecl,\n\t\t\t\t\t\tserverAwait,\n\t\t\t\t\t);\n\t\t\t\t\tcomponentTranslatorIds.set(name, translatorId);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (decl.type === \"CallExpression\") {\n\t\t\t\t\tconst wrappedFn = findWrappedFunctionInCall(decl);\n\t\t\t\t\tif (!wrappedFn) return;\n\t\t\t\t\tconst block = ensureBlockBody(wrappedFn);\n\t\t\t\t\tconst translatorId = injectInlineHookIntoBlock(\n\t\t\t\t\t\tblock,\n\t\t\t\t\t\thookCall,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\twrappedFn,\n\t\t\t\t\t\tserverAwait,\n\t\t\t\t\t);\n\t\t\t\t\tcomponentTranslatorIds.set(name, translatorId);\n\t\t\t\t}\n\t\t\t},\n\t\t\tnoScope: true,\n\t\t});\n\t}\n\n\t// Module factory: wrap const declarations as arrow factories\n\tconst moduleFactoryConstNames = options.moduleFactoryConstNames ?? [];\n\tconst didWrapFactoryInline = wrapModuleFactoryDeclarations(\n\t\tast,\n\t\tmoduleFactoryConstNames,\n\t\toptions.isTypeScript,\n\t);\n\n\trewriteGeneratedCallsForTranslator(ast, componentTranslatorIds);\n\n\t// Module factory: rewrite references to imported factory consts\n\tconst moduleFactoryImportedNames = options.moduleFactoryImportedNames ?? [];\n\tconst {\n\t\tcomponentsNeedingT: factoryComponentsNeedingT,\n\t\trewrote: didRewriteRefsInline,\n\t} = rewriteModuleFactoryReferences(\n\t\tast,\n\t\tmoduleFactoryImportedNames,\n\t\tcomponentTranslatorIds,\n\t);\n\tfor (const comp of factoryComponentsNeedingT) {\n\t\tcomponentsNeedingT.add(comp);\n\t}\n\n\tif (needsClientDirective && (needsHook || boundaryRepaired)) {\n\t\taddUseClientDirective(ast);\n\t}\n\n\tconst didModifyInline =\n\t\tstringsWrapped > 0 ||\n\t\trepaired ||\n\t\tboundaryRepaired ||\n\t\tdidWrapFactoryInline ||\n\t\tdidRewriteRefsInline;\n\tconst output = generate(ast, { retainLines: false });\n\treturn {\n\t\tcode: output.code,\n\t\tstringsWrapped,\n\t\tmodified: didModifyInline,\n\t\tusedKeys: [],\n\t};\n}\n\nfunction injectInlineHookIntoBlock(\n\tblock: t.BlockStatement,\n\thookCall: t.CallExpression,\n\tcomponentName?: string,\n\townerFn?: t.Function,\n\tuseAwait?: boolean,\n): string {\n\tconst targetName =\n\t\thookCall.callee.type === \"Identifier\" ? hookCall.callee.name : undefined;\n\tlet sawConflictingT = false;\n\n\tfor (const stmt of block.body) {\n\t\tif (stmt.type !== \"VariableDeclaration\") continue;\n\t\tfor (const d of stmt.declarations) {\n\t\t\tif (d.id.type !== \"Identifier\") continue;\n\n\t\t\t// Detect both `createT()` and `await createT()`\n\t\t\tconst callExpr =\n\t\t\t\td.init?.type === \"AwaitExpression\" &&\n\t\t\t\td.init.argument.type === \"CallExpression\"\n\t\t\t\t\t? d.init.argument\n\t\t\t\t\t: d.init?.type === \"CallExpression\"\n\t\t\t\t\t\t? d.init\n\t\t\t\t\t\t: null;\n\n\t\t\tif (\n\t\t\t\tcallExpr &&\n\t\t\t\tcallExpr.callee.type === \"Identifier\" &&\n\t\t\t\t(callExpr.callee.name === \"useT\" ||\n\t\t\t\t\tcallExpr.callee.name === \"createT\" ||\n\t\t\t\t\t(targetName ? callExpr.callee.name === targetName : false))\n\t\t\t) {\n\t\t\t\tconst translatorId = d.id.name;\n\t\t\t\t// Fix the hook name if it doesn't match the expected one (boundary repair)\n\t\t\t\tif (targetName && callExpr.callee.name !== targetName) {\n\t\t\t\t\tcallExpr.callee = t.identifier(targetName);\n\t\t\t\t}\n\t\t\t\t// Upgrade sync createT() to await createT() for server components\n\t\t\t\tif (useAwait && d.init?.type !== \"AwaitExpression\") {\n\t\t\t\t\td.init = t.awaitExpression(d.init!);\n\t\t\t\t\tif (ownerFn && !ownerFn.async) {\n\t\t\t\t\t\townerFn.async = true;\n\t\t\t\t\t\townerFn.returnType = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn translatorId;\n\t\t\t}\n\n\t\t\tif (d.id.name === \"t\") sawConflictingT = true;\n\t\t}\n\t}\n\n\tconst translatorId = pickTranslatorId(block, ownerFn);\n\tif (sawConflictingT && translatorId !== \"t\") {\n\t\tlogWarning(\n\t\t\tcomponentName\n\t\t\t\t? `Component \"${componentName}\" has \"const t = ...\" that is not useT/createT.\\n Injected fallback translator \"${translatorId}\" to avoid conflicts.`\n\t\t\t\t: `Detected \"const t = ...\" conflict. Injected fallback translator \"${translatorId}\".`,\n\t\t);\n\t}\n\n\tconst initExpr = useAwait\n\t\t? t.awaitExpression(t.cloneNode(hookCall, true))\n\t\t: t.cloneNode(hookCall, true);\n\n\tconst tDecl = t.variableDeclaration(\"const\", [\n\t\tt.variableDeclarator(t.identifier(translatorId), initExpr),\n\t]);\n\n\tblock.body.unshift(tDecl);\n\tif (useAwait && ownerFn && !ownerFn.async) {\n\t\townerFn.async = true;\n\t\townerFn.returnType = null;\n\t}\n\treturn translatorId;\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, extname, join, resolve } from \"node:path\";\nimport _traverse from \"@babel/traverse\";\nimport type { File } from \"@babel/types\";\nimport pLimit from \"p-limit\";\nimport { glob } from \"tinyglobby\";\nimport { logWarning } from \"../logger.js\";\nimport { isContentProperty } from \"../scanner/filters.js\";\nimport { parseFile } from \"../scanner/parser.js\";\nimport {\n\tgetComponentName,\n\tisInsideFunctionParam,\n\tisPascalCase,\n\tresolveDefault,\n} from \"../utils/ast-helpers.js\";\nimport { buildTemplateLiteralText } from \"../utils/template-literal.js\";\nimport {\n\tdetectClientFile,\n\ttype TransformOptions,\n\ttransform,\n} from \"./transform.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\tinclude: string[];\n\texclude?: string[];\n\ttextToKey: Record<string, string>;\n\ti18nImport?: string;\n\tmode?: \"keys\" | \"inline\";\n\tcomponentPath?: string;\n\tmoduleFactory?: boolean;\n\ttranslatableProps?: string[];\n\tonProgress?: (completed: number, total: number) => void;\n}\n\nexport interface CodegenResult {\n\tfilesModified: number;\n\tstringsWrapped: number;\n\tfilesProcessed: number;\n\tfilesSkipped: number;\n\tclientNamespaces: string[];\n}\n\ninterface ParsedFileEntry {\n\tfilePath: string;\n\tcode: string;\n\tast?: File;\n\tparseError?: string;\n\tisClientRoot: boolean;\n}\n\nconst SOURCE_EXTENSIONS = [\n\t\".ts\",\n\t\".tsx\",\n\t\".js\",\n\t\".jsx\",\n\t\".mts\",\n\t\".cts\",\n\t\".mjs\",\n\t\".cjs\",\n];\n\ninterface PathAliasResolver {\n\tprefix: string;\n\texact: boolean;\n\ttargets: string[];\n}\n\nfunction stripJsonComments(input: string): string {\n\treturn input.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").replace(/^\\s*\\/\\/.*$/gm, \"\");\n}\n\nasync function loadPathAliasResolvers(\n\tcwd: string,\n): Promise<PathAliasResolver[]> {\n\tconst configNames = [\"tsconfig.json\", \"jsconfig.json\"];\n\n\tfor (const configName of configNames) {\n\t\tlet raw: string;\n\t\ttry {\n\t\t\traw = await readFile(join(cwd, configName), \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(raw));\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst compilerOptions = (\n\t\t\tparsed as { compilerOptions?: { baseUrl?: string; paths?: unknown } }\n\t\t).compilerOptions;\n\t\tif (!compilerOptions?.paths || typeof compilerOptions.paths !== \"object\") {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst baseUrl =\n\t\t\ttypeof compilerOptions.baseUrl === \"string\"\n\t\t\t\t? compilerOptions.baseUrl\n\t\t\t\t: \".\";\n\t\tconst baseDir = resolve(join(cwd, baseUrl));\n\t\tconst resolvers: PathAliasResolver[] = [];\n\n\t\tfor (const [pattern, replacements] of Object.entries(\n\t\t\tcompilerOptions.paths,\n\t\t)) {\n\t\t\tif (!Array.isArray(replacements) || replacements.length === 0) continue;\n\n\t\t\tconst wildcard = pattern.endsWith(\"/*\");\n\t\t\tconst prefix = wildcard ? pattern.slice(0, -1) : pattern;\n\t\t\tconst targets = replacements\n\t\t\t\t.filter((r): r is string => typeof r === \"string\")\n\t\t\t\t.map((r) => (wildcard && r.endsWith(\"/*\") ? r.slice(0, -1) : r))\n\t\t\t\t.map((r) => resolve(join(baseDir, r)));\n\n\t\t\tif (targets.length === 0) continue;\n\t\t\tresolvers.push({ prefix, exact: !wildcard, targets });\n\t\t}\n\n\t\tresolvers.sort((a, b) => b.prefix.length - a.prefix.length);\n\t\treturn resolvers;\n\t}\n\n\treturn [];\n}\n\nfunction collectRuntimeImportSources(ast: File): string[] {\n\tconst sources = new Set<string>();\n\n\tfor (const node of ast.program.body) {\n\t\tif (node.type === \"ImportDeclaration\") {\n\t\t\tif (node.importKind === \"type\") continue;\n\n\t\t\tconst allTypeSpecifiers =\n\t\t\t\tnode.specifiers.length > 0 &&\n\t\t\t\tnode.specifiers.every(\n\t\t\t\t\t(spec) =>\n\t\t\t\t\t\tspec.type === \"ImportSpecifier\" && spec.importKind === \"type\",\n\t\t\t\t);\n\t\t\tif (allTypeSpecifiers) continue;\n\n\t\t\tsources.add(node.source.value);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node.type === \"ExportNamedDeclaration\" && node.source) {\n\t\t\tif (node.exportKind !== \"type\") {\n\t\t\t\tsources.add(node.source.value);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (node.type === \"ExportAllDeclaration\") {\n\t\t\tif (node.exportKind !== \"type\") {\n\t\t\t\tsources.add(node.source.value);\n\t\t\t}\n\t\t}\n\t}\n\n\ttraverse(ast, {\n\t\tImportExpression(path: any) {\n\t\t\tif (path.node.source.type === \"StringLiteral\") {\n\t\t\t\tsources.add(path.node.source.value);\n\t\t\t}\n\t\t},\n\t\tCallExpression(path: any) {\n\t\t\t// Babel can represent import() as CallExpression with Import callee.\n\t\t\tif (\n\t\t\t\tpath.node.callee.type === \"Import\" &&\n\t\t\t\tpath.node.arguments[0]?.type === \"StringLiteral\"\n\t\t\t) {\n\t\t\t\tsources.add(path.node.arguments[0].value);\n\t\t\t}\n\t\t},\n\t\tnoScope: true,\n\t});\n\n\treturn [...sources];\n}\n\nfunction resolveFileCandidate(\n\tbasePath: string,\n\tknownFiles: Set<string>,\n): string | null {\n\tconst candidates = new Set<string>();\n\tconst resolvedBase = resolve(basePath);\n\tconst baseExt = extname(resolvedBase);\n\n\tcandidates.add(resolvedBase);\n\n\tif (!baseExt) {\n\t\tfor (const ext of SOURCE_EXTENSIONS) {\n\t\t\tcandidates.add(resolve(`${resolvedBase}${ext}`));\n\t\t\tcandidates.add(resolve(join(resolvedBase, `index${ext}`)));\n\t\t}\n\t}\n\n\t// ESM imports may reference .js while source files are .ts/.tsx\n\tif ([\".js\", \".jsx\", \".mjs\", \".cjs\"].includes(baseExt)) {\n\t\tconst noExt = resolvedBase.slice(0, -baseExt.length);\n\t\tfor (const ext of SOURCE_EXTENSIONS) {\n\t\t\tcandidates.add(resolve(`${noExt}${ext}`));\n\t\t}\n\t}\n\n\tfor (const candidate of candidates) {\n\t\tif (knownFiles.has(candidate)) return candidate;\n\t}\n\n\treturn null;\n}\n\nfunction resolveLocalImport(\n\timporterPath: string,\n\tsource: string,\n\tcwd: string,\n\tknownFiles: Set<string>,\n\tpathAliases: PathAliasResolver[],\n): string | null {\n\tconst baseCandidates: string[] = [];\n\n\tif (source.startsWith(\".\")) {\n\t\tbaseCandidates.push(resolve(dirname(importerPath), source));\n\t} else if (source.startsWith(\"@/\")) {\n\t\tbaseCandidates.push(resolve(join(cwd, \"src\", source.slice(2))));\n\t\tbaseCandidates.push(resolve(join(cwd, source.slice(2))));\n\t} else if (source.startsWith(\"~/\")) {\n\t\tbaseCandidates.push(resolve(join(cwd, source.slice(2))));\n\t} else if (source.startsWith(\"/\")) {\n\t\tbaseCandidates.push(resolve(join(cwd, source.slice(1))));\n\t} else {\n\t\tfor (const alias of pathAliases) {\n\t\t\tif (alias.exact) {\n\t\t\t\tif (source !== alias.prefix) continue;\n\t\t\t\tbaseCandidates.push(...alias.targets);\n\t\t\t} else if (source.startsWith(alias.prefix)) {\n\t\t\t\tconst suffix = source.slice(alias.prefix.length);\n\t\t\t\tfor (const target of alias.targets) {\n\t\t\t\t\tbaseCandidates.push(resolve(join(target, suffix)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (baseCandidates.length === 0) return null;\n\t}\n\n\tfor (const base of baseCandidates) {\n\t\tconst resolved = resolveFileCandidate(base, knownFiles);\n\t\tif (resolved) return resolved;\n\t}\n\n\treturn null;\n}\n\nfunction buildClientGraph(\n\tentries: ParsedFileEntry[],\n\tcwd: string,\n\tpathAliases: PathAliasResolver[],\n): Set<string> {\n\tconst parsedEntries = entries.filter((e) => e.ast != null);\n\tconst knownFiles = new Set(parsedEntries.map((e) => e.filePath));\n\tconst depsByImporter = new Map<string, string[]>();\n\n\tfor (const entry of parsedEntries) {\n\t\tconst deps: string[] = [];\n\t\tconst imports = collectRuntimeImportSources(entry.ast!);\n\t\tfor (const source of imports) {\n\t\t\tconst dep = resolveLocalImport(\n\t\t\t\tentry.filePath,\n\t\t\t\tsource,\n\t\t\t\tcwd,\n\t\t\t\tknownFiles,\n\t\t\t\tpathAliases,\n\t\t\t);\n\t\t\tif (dep) deps.push(dep);\n\t\t}\n\t\tdepsByImporter.set(entry.filePath, deps);\n\t}\n\n\tconst clientReachable = new Set<string>();\n\tconst queue: string[] = [];\n\n\tfor (const entry of parsedEntries) {\n\t\tif (!entry.isClientRoot) continue;\n\t\tclientReachable.add(entry.filePath);\n\t\tqueue.push(entry.filePath);\n\t}\n\n\twhile (queue.length > 0) {\n\t\tconst filePath = queue.shift()!;\n\t\tconst deps = depsByImporter.get(filePath) ?? [];\n\t\tfor (const dep of deps) {\n\t\t\tif (clientReachable.has(dep)) continue;\n\t\t\tclientReachable.add(dep);\n\t\t\tqueue.push(dep);\n\t\t}\n\t}\n\n\treturn clientReachable;\n}\n\n// --- Module factory planning ---\n\ninterface ModuleFactoryPlan {\n\tfactoryConstsByFile: Map<string, string[]>;\n\tfactoryImportsByFile: Map<string, string[]>;\n}\n\n/**\n * Check whether an AST value node contains a translatable string present in textToKey.\n * Handles StringLiteral, TemplateLiteral (static only), and ConditionalExpression branches.\n */\nfunction hasTranslatableValue(\n\tnode: import(\"@babel/types\").Node,\n\ttextToKey: Record<string, string>,\n): boolean {\n\tif (node.type === \"StringLiteral\") {\n\t\tconst text = node.value.trim();\n\t\treturn !!text && text in textToKey;\n\t}\n\tif (node.type === \"TemplateLiteral\") {\n\t\tconst info = buildTemplateLiteralText(node.quasis, node.expressions);\n\t\treturn !!info && info.text in textToKey;\n\t}\n\tif (node.type === \"ConditionalExpression\") {\n\t\treturn (\n\t\t\thasTranslatableValue(node.consequent, textToKey) ||\n\t\t\thasTranslatableValue(node.alternate, textToKey)\n\t\t);\n\t}\n\treturn false;\n}\n\n// Next.js/framework special exports that must never be wrapped as factories.\n// These are read directly by the framework and must remain plain objects.\nconst FRAMEWORK_RESERVED_EXPORTS = new Set([\n\t\"metadata\",\n\t\"generateMetadata\",\n\t\"viewport\",\n\t\"generateViewport\",\n\t\"revalidate\",\n\t\"dynamic\",\n\t\"dynamicParams\",\n\t\"fetchCache\",\n\t\"runtime\",\n\t\"preferredRegion\",\n\t\"maxDuration\",\n\t\"generateStaticParams\",\n]);\n\nfunction collectModuleFactoryCandidates(\n\tentries: ParsedFileEntry[],\n\ttextToKey: Record<string, string>,\n): Map<string, Set<string>> {\n\t// file → set of const names that have translatable object properties\n\tconst candidates = new Map<string, Set<string>>();\n\n\tfor (const entry of entries) {\n\t\tif (!entry.ast) continue;\n\n\t\t// Collect top-level const declarations\n\t\tconst topLevelConsts = new Map<\n\t\t\tstring,\n\t\t\t{ exported: boolean; typed: boolean }\n\t\t>();\n\t\tfor (const node of entry.ast.program.body) {\n\t\t\tlet decl: import(\"@babel/types\").VariableDeclaration | undefined;\n\t\t\tlet exported = false;\n\t\t\tif (node.type === \"VariableDeclaration\" && node.kind === \"const\") {\n\t\t\t\tdecl = node;\n\t\t\t} else if (\n\t\t\t\tnode.type === \"ExportNamedDeclaration\" &&\n\t\t\t\tnode.declaration?.type === \"VariableDeclaration\" &&\n\t\t\t\tnode.declaration.kind === \"const\"\n\t\t\t) {\n\t\t\t\tdecl = node.declaration;\n\t\t\t\texported = true;\n\t\t\t}\n\t\t\tif (!decl) continue;\n\n\t\t\tfor (const declarator of decl.declarations) {\n\t\t\t\tif (declarator.id.type !== \"Identifier\") continue;\n\t\t\t\tconst typed = !!(\n\t\t\t\t\tdeclarator.id as import(\"@babel/types\").Identifier & {\n\t\t\t\t\t\ttypeAnnotation?: unknown;\n\t\t\t\t\t}\n\t\t\t\t).typeAnnotation;\n\t\t\t\ttopLevelConsts.set(declarator.id.name, { exported, typed });\n\t\t\t}\n\t\t}\n\n\t\t// Find which consts contain translatable object properties\n\t\ttraverse(entry.ast, {\n\t\t\tObjectProperty(path: any) {\n\t\t\t\t// Must be at module level (not inside a function)\n\t\t\t\tlet current = path.parentPath;\n\t\t\t\tlet insideFunction = false;\n\t\t\t\tlet constName: string | undefined;\n\t\t\t\twhile (current) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcurrent.isFunctionDeclaration?.() ||\n\t\t\t\t\t\tcurrent.isFunctionExpression?.() ||\n\t\t\t\t\t\tcurrent.isArrowFunctionExpression?.()\n\t\t\t\t\t) {\n\t\t\t\t\t\tinsideFunction = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (current.isVariableDeclarator?.()) {\n\t\t\t\t\t\tconst id = current.node.id;\n\t\t\t\t\t\tif (id.type === \"Identifier\" && topLevelConsts.has(id.name)) {\n\t\t\t\t\t\t\tconstName = id.name;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = current.parentPath;\n\t\t\t\t}\n\t\t\t\tif (insideFunction || !constName) return;\n\n\t\t\t\tconst info = topLevelConsts.get(constName);\n\t\t\t\tif (!info) return;\n\n\t\t\t\t// Skip framework-reserved exports (e.g. Next.js metadata)\n\t\t\t\tif (info.exported && FRAMEWORK_RESERVED_EXPORTS.has(constName)) return;\n\n\t\t\t\tconst keyNode = path.node.key;\n\t\t\t\tif (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n\t\t\t\t\treturn;\n\t\t\t\tconst propName =\n\t\t\t\t\tkeyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n\t\t\t\tif (!isContentProperty(propName)) return;\n\n\t\t\t\tconst valueNode = path.node.value;\n\t\t\t\tif (!hasTranslatableValue(valueNode, textToKey)) return;\n\n\t\t\t\tif (!candidates.has(entry.filePath)) {\n\t\t\t\t\tcandidates.set(entry.filePath, new Set());\n\t\t\t\t}\n\t\t\t\tcandidates.get(entry.filePath)!.add(constName);\n\t\t\t},\n\t\t\tnoScope: true,\n\t\t});\n\t}\n\n\treturn candidates;\n}\n\nfunction collectModuleFactoryImportEdges(\n\tentries: ParsedFileEntry[],\n\tcandidates: Map<string, Set<string>>,\n\tcwd: string,\n\tknownFiles: Set<string>,\n\tpathAliases: PathAliasResolver[],\n): Map<string, string[]> {\n\t// importerFile → list of local names that reference a factory const\n\tconst importsByFile = new Map<string, string[]>();\n\n\t// Build a set of all (file, exportedName) pairs\n\tconst factoryExports = new Map<string, Set<string>>();\n\tfor (const [file, names] of candidates) {\n\t\tfactoryExports.set(file, names);\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.ast) continue;\n\n\t\tfor (const node of entry.ast.program.body) {\n\t\t\tif (node.type !== \"ImportDeclaration\") continue;\n\t\t\t// Skip namespace imports\n\t\t\tif (\n\t\t\t\tnode.specifiers.some((s: any) => s.type === \"ImportNamespaceSpecifier\")\n\t\t\t)\n\t\t\t\tcontinue;\n\n\t\t\tconst source = node.source.value;\n\t\t\tconst resolved = resolveLocalImport(\n\t\t\t\tentry.filePath,\n\t\t\t\tsource,\n\t\t\t\tcwd,\n\t\t\t\tknownFiles,\n\t\t\t\tpathAliases,\n\t\t\t);\n\t\t\tif (!resolved || !factoryExports.has(resolved)) continue;\n\n\t\t\tconst exportedNames = factoryExports.get(resolved)!;\n\n\t\t\tfor (const spec of node.specifiers) {\n\t\t\t\tif (spec.type !== \"ImportSpecifier\") continue;\n\t\t\t\tconst importedName =\n\t\t\t\t\tspec.imported.type === \"Identifier\"\n\t\t\t\t\t\t? spec.imported.name\n\t\t\t\t\t\t: spec.imported.value;\n\t\t\t\tif (!exportedNames.has(importedName)) continue;\n\n\t\t\t\tconst localName = spec.local.name;\n\t\t\t\tif (!importsByFile.has(entry.filePath)) {\n\t\t\t\t\timportsByFile.set(entry.filePath, []);\n\t\t\t\t}\n\t\t\t\timportsByFile.get(entry.filePath)!.push(localName);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn importsByFile;\n}\n\n/**\n * Check if a file that defines factory consts also uses them locally in\n * component functions. Returns the const names that are referenced inside\n * a function with a PascalCase name (React component heuristic).\n */\nfunction collectLocalFactoryUsages(\n\tast: File,\n\tconstNames: Set<string>,\n): string[] {\n\tconst used = new Set<string>();\n\ttraverse(ast, {\n\t\tIdentifier(path: any) {\n\t\t\tif (!constNames.has(path.node.name)) return;\n\t\t\tconst parent = path.parent;\n\t\t\t// Skip declaration id\n\t\t\tif (parent.type === \"VariableDeclarator\" && parent.id === path.node)\n\t\t\t\treturn;\n\t\t\t// Skip import/export specifiers\n\t\t\tif (\n\t\t\t\tparent.type === \"ImportSpecifier\" ||\n\t\t\t\tparent.type === \"ExportSpecifier\" ||\n\t\t\t\tparent.type === \"ImportDefaultSpecifier\"\n\t\t\t)\n\t\t\t\treturn;\n\t\t\t// Must be inside a React component (PascalCase function)\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (compName && isPascalCase(compName)) {\n\t\t\t\tused.add(path.node.name);\n\t\t\t}\n\t\t},\n\t\tnoScope: true,\n\t});\n\treturn [...used];\n}\n\n/**\n * Given an unsafe local name in an importer file, resolve which source file\n * and exported name it corresponds to, then record it as unsafe.\n */\nfunction markUnsafeExport(\n\timporterAst: File,\n\tlocalName: string,\n\timporterFile: string,\n\tsafeCandidates: Map<string, Set<string>>,\n\t_entries: ParsedFileEntry[],\n\tcwd: string,\n\tknownFiles: Set<string>,\n\tpathAliases: PathAliasResolver[],\n\tunsafeExportedNames: Map<string, Set<string>>,\n): void {\n\tfor (const node of importerAst.program.body) {\n\t\tif (node.type !== \"ImportDeclaration\") continue;\n\t\tfor (const spec of node.specifiers) {\n\t\t\tif (spec.type !== \"ImportSpecifier\") continue;\n\t\t\tif (spec.local.name !== localName) continue;\n\t\t\tconst exportedName =\n\t\t\t\tspec.imported.type === \"Identifier\"\n\t\t\t\t\t? spec.imported.name\n\t\t\t\t\t: spec.imported.value;\n\t\t\tconst resolved = resolveLocalImport(\n\t\t\t\timporterFile,\n\t\t\t\tnode.source.value,\n\t\t\t\tcwd,\n\t\t\t\tknownFiles,\n\t\t\t\tpathAliases,\n\t\t\t);\n\t\t\tif (resolved && safeCandidates.has(resolved)) {\n\t\t\t\tif (!unsafeExportedNames.has(resolved)) {\n\t\t\t\t\tunsafeExportedNames.set(resolved, new Set());\n\t\t\t\t}\n\t\t\t\tunsafeExportedNames.get(resolved)!.add(exportedName);\n\t\t\t}\n\t\t}\n\t}\n\t// For local usages (self-references), the localName IS the exported name\n\tif (\n\t\tsafeCandidates.has(importerFile) &&\n\t\tsafeCandidates.get(importerFile)!.has(localName)\n\t) {\n\t\tif (!unsafeExportedNames.has(importerFile)) {\n\t\t\tunsafeExportedNames.set(importerFile, new Set());\n\t\t}\n\t\tunsafeExportedNames.get(importerFile)!.add(localName);\n\t}\n}\n\n/**\n * Given a local name in an importer AST, find which exported name it maps to\n * from a given source file.\n */\nfunction resolveLocalToExportedName(\n\timporterAst: File | undefined,\n\tlocalName: string,\n\timporterFile: string,\n\tsourceFile: string,\n\tcwd: string,\n\tknownFiles: Set<string>,\n\tpathAliases: PathAliasResolver[],\n): string | undefined {\n\tif (!importerAst) return undefined;\n\tfor (const node of importerAst.program.body) {\n\t\tif (node.type !== \"ImportDeclaration\") continue;\n\t\tfor (const spec of node.specifiers) {\n\t\t\tif (spec.type !== \"ImportSpecifier\") continue;\n\t\t\tif (spec.local.name !== localName) continue;\n\t\t\t// Verify this import points to the source file\n\t\t\tconst resolved = resolveLocalImport(\n\t\t\t\timporterFile,\n\t\t\t\tnode.source.value,\n\t\t\t\tcwd,\n\t\t\t\tknownFiles,\n\t\t\t\tpathAliases,\n\t\t\t);\n\t\t\tif (resolved !== sourceFile) continue;\n\t\t\treturn spec.imported.type === \"Identifier\"\n\t\t\t\t? spec.imported.name\n\t\t\t\t: spec.imported.value;\n\t\t}\n\t}\n\t// For self-references (local usage in the same file), localName is the exported name\n\tif (importerFile === sourceFile) return localName;\n\treturn undefined;\n}\n\nfunction getBindingSafety(\n\tast: File,\n\tbindingName: string,\n): { safe: boolean; reason?: string } {\n\tlet unsafe = false;\n\tlet reason: string | undefined;\n\n\ttraverse(ast, {\n\t\tIdentifier(path: any) {\n\t\t\tif (unsafe) return;\n\t\t\tif (path.node.name !== bindingName) return;\n\n\t\t\t// Use scope to verify this Identifier refers to the top-level binding,\n\t\t\t// not a shadowed local variable or destructuring parameter.\n\t\t\tconst binding = path.scope?.getBinding(bindingName);\n\t\t\tif (!binding) return;\n\n\t\t\tconst bPath = binding.path;\n\t\t\tconst isTopLevel =\n\t\t\t\tbPath.isVariableDeclarator?.() &&\n\t\t\t\tbPath.parentPath?.isVariableDeclaration?.() &&\n\t\t\t\t(bPath.parentPath.parentPath?.isProgram?.() ||\n\t\t\t\t\tbPath.parentPath.parentPath?.isExportNamedDeclaration?.());\n\t\t\tconst isImportBinding =\n\t\t\t\tbPath.isImportSpecifier?.() || bPath.isImportDefaultSpecifier?.();\n\t\t\tif (!isTopLevel && !isImportBinding) return;\n\n\t\t\tconst parent = path.parent;\n\n\t\t\t// Skip import/export specifiers\n\t\t\tif (\n\t\t\t\tparent.type === \"ImportSpecifier\" ||\n\t\t\t\tparent.type === \"ImportDefaultSpecifier\" ||\n\t\t\t\tparent.type === \"ExportSpecifier\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Skip type contexts\n\t\t\tif (\n\t\t\t\tparent.type === \"TSTypeReference\" ||\n\t\t\t\tparent.type === \"TSTypeQuery\" ||\n\t\t\t\tparent.type === \"TSTypeAnnotation\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Skip the declaration itself (e.g. `const FOO = ...` — the `FOO` id)\n\t\t\tif (\n\t\t\t\tparent.type === \"VariableDeclarator\" &&\n\t\t\t\t(parent as import(\"@babel/types\").VariableDeclarator).id === path.node\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Must be inside a React component (PascalCase name)\n\t\t\tconst compName = getComponentName(path);\n\t\t\tif (!compName || !isPascalCase(compName)) {\n\t\t\t\tunsafe = true;\n\t\t\t\treason = `\"${bindingName}\" is referenced outside a React component`;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if ref is inside a function parameter default (t is not in scope there)\n\t\t\tif (isInsideFunctionParam(path)) {\n\t\t\t\tunsafe = true;\n\t\t\t\treason = `\"${bindingName}\" is referenced in a function parameter default`;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Mutation: direct assignment\n\t\t\tif (parent.type === \"AssignmentExpression\" && parent.left === path.node) {\n\t\t\t\tunsafe = true;\n\t\t\t\treason = `\"${bindingName}\" is mutated via assignment`;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Mutation via member expression\n\t\t\tif (parent.type === \"MemberExpression\" && parent.object === path.node) {\n\t\t\t\tconst grandParent = path.parentPath?.parent;\n\t\t\t\t// Method mutations (.push(), .splice(), etc.)\n\t\t\t\tif (\n\t\t\t\t\tgrandParent?.type === \"CallExpression\" &&\n\t\t\t\t\tgrandParent.callee === parent &&\n\t\t\t\t\tparent.property.type === \"Identifier\" &&\n\t\t\t\t\t[\n\t\t\t\t\t\t\"push\",\n\t\t\t\t\t\t\"splice\",\n\t\t\t\t\t\t\"pop\",\n\t\t\t\t\t\t\"shift\",\n\t\t\t\t\t\t\"unshift\",\n\t\t\t\t\t\t\"sort\",\n\t\t\t\t\t\t\"reverse\",\n\t\t\t\t\t\t\"fill\",\n\t\t\t\t\t].includes(parent.property.name)\n\t\t\t\t) {\n\t\t\t\t\tunsafe = true;\n\t\t\t\t\treason = `\"${bindingName}\" is mutated via .${parent.property.name}()`;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Property/indexed assignment (items[0] = ..., items.foo = ...)\n\t\t\t\tif (\n\t\t\t\t\tgrandParent?.type === \"AssignmentExpression\" &&\n\t\t\t\t\tgrandParent.left === parent\n\t\t\t\t) {\n\t\t\t\t\tunsafe = true;\n\t\t\t\t\treason = `\"${bindingName}\" is mutated via property/indexed assignment`;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// delete items.foo\n\t\t\t\tif (\n\t\t\t\t\tgrandParent?.type === \"UnaryExpression\" &&\n\t\t\t\t\t(grandParent as import(\"@babel/types\").UnaryExpression).operator ===\n\t\t\t\t\t\t\"delete\"\n\t\t\t\t) {\n\t\t\t\t\tunsafe = true;\n\t\t\t\t\treason = `\"${bindingName}\" is mutated via delete`;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// UpdateExpression (++items, items++)\n\t\t\tif (parent.type === \"UpdateExpression\") {\n\t\t\t\tunsafe = true;\n\t\t\t\treason = `\"${bindingName}\" is mutated via ${(parent as import(\"@babel/types\").UpdateExpression).operator}`;\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t});\n\n\treturn unsafe ? { safe: false, reason } : { safe: true };\n}\n\n/**\n * Scan project files outside the include scope for imports of factory candidates.\n * ANY external import of a factory const blocks it, because we cannot rewrite the\n * external file to call the factory.\n */\nasync function findExternalImportersOfCandidates(\n\tcandidates: Map<string, Set<string>>,\n\tentries: ParsedFileEntry[],\n\tcwd: string,\n\tpathAliases: PathAliasResolver[],\n): Promise<Map<string, Set<string>>> {\n\tconst blocked = new Map<string, Set<string>>();\n\tif (candidates.size === 0) return blocked;\n\n\tconst allFiles = await glob([\"**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs}\"], {\n\t\tignore: [\n\t\t\t\"node_modules/**\",\n\t\t\t\"dist/**\",\n\t\t\t\"build/**\",\n\t\t\t\".next/**\",\n\t\t\t\".output/**\",\n\t\t],\n\t\tcwd,\n\t\tabsolute: true,\n\t});\n\n\tconst includedFiles = new Set(entries.map((e) => e.filePath));\n\tconst externalFiles = allFiles.filter((f) => !includedFiles.has(f));\n\tif (externalFiles.length === 0) return blocked;\n\n\t// Quick pre-filter: basenames of candidate files (without extension)\n\tconst candidateBasenames = new Set<string>();\n\tfor (const file of candidates.keys()) {\n\t\tcandidateBasenames.add(basename(file).replace(/\\.[^.]+$/, \"\"));\n\t}\n\n\tconst allKnownFiles = new Set(allFiles);\n\tconst parseLimit = pLimit(10);\n\n\tawait Promise.all(\n\t\texternalFiles.map((extFile) =>\n\t\t\tparseLimit(async () => {\n\t\t\t\tlet content: string;\n\t\t\t\ttry {\n\t\t\t\t\tcontent = await readFile(extFile, \"utf-8\");\n\t\t\t\t} catch {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Text pre-filter: skip files that don't mention any candidate basename\n\t\t\t\tlet mightImport = false;\n\t\t\t\tfor (const base of candidateBasenames) {\n\t\t\t\t\tif (content.includes(base)) {\n\t\t\t\t\t\tmightImport = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!mightImport) return;\n\n\t\t\t\tlet ast: File;\n\t\t\t\ttry {\n\t\t\t\t\tast = parseFile(content, extFile);\n\t\t\t\t} catch {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (const node of ast.program.body) {\n\t\t\t\t\tif (node.type !== \"ImportDeclaration\") continue;\n\n\t\t\t\t\tconst resolved = resolveLocalImport(\n\t\t\t\t\t\textFile,\n\t\t\t\t\t\tnode.source.value,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tallKnownFiles,\n\t\t\t\t\t\tpathAliases,\n\t\t\t\t\t);\n\t\t\t\t\tif (!resolved || !candidates.has(resolved)) continue;\n\n\t\t\t\t\tconst exportedNames = candidates.get(resolved)!;\n\n\t\t\t\t\t// Namespace import blocks all exports\n\t\t\t\t\tif (\n\t\t\t\t\t\tnode.specifiers.some(\n\t\t\t\t\t\t\t(s: any) => s.type === \"ImportNamespaceSpecifier\",\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (!blocked.has(resolved)) blocked.set(resolved, new Set());\n\t\t\t\t\t\tfor (const name of exportedNames) {\n\t\t\t\t\t\t\tblocked.get(resolved)!.add(name);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const spec of node.specifiers) {\n\t\t\t\t\t\tif (spec.type !== \"ImportSpecifier\") continue;\n\t\t\t\t\t\tconst importedName =\n\t\t\t\t\t\t\tspec.imported.type === \"Identifier\"\n\t\t\t\t\t\t\t\t? spec.imported.name\n\t\t\t\t\t\t\t\t: spec.imported.value;\n\t\t\t\t\t\tif (exportedNames.has(importedName)) {\n\t\t\t\t\t\t\tif (!blocked.has(resolved)) blocked.set(resolved, new Set());\n\t\t\t\t\t\t\tblocked.get(resolved)!.add(importedName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}),\n\t\t),\n\t);\n\n\treturn blocked;\n}\n\nasync function buildModuleFactoryPlan(\n\tentries: ParsedFileEntry[],\n\ttextToKey: Record<string, string>,\n\tcwd: string,\n\tpathAliases: PathAliasResolver[],\n): Promise<ModuleFactoryPlan> {\n\tconst candidates = collectModuleFactoryCandidates(entries, textToKey);\n\tconst knownFiles = new Set(\n\t\tentries.filter((e) => e.ast).map((e) => e.filePath),\n\t);\n\n\t// Check for external importers (files outside include scope) FIRST.\n\t// Any external import of a factory const blocks it entirely because\n\t// we cannot rewrite the external file to call the factory.\n\tconst externallyBlocked = await findExternalImportersOfCandidates(\n\t\tcandidates,\n\t\tentries,\n\t\tcwd,\n\t\tpathAliases,\n\t);\n\tfor (const [file, names] of externallyBlocked) {\n\t\tconst candidateNames = candidates.get(file);\n\t\tif (!candidateNames) continue;\n\t\tfor (const name of names) {\n\t\t\tif (candidateNames.has(name)) {\n\t\t\t\tcandidateNames.delete(name);\n\t\t\t\tlogWarning(\n\t\t\t\t\t`Module factory: blocking \"${name}\" in ${file} — imported by a file outside the include scope`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (candidateNames.size === 0) {\n\t\t\tcandidates.delete(file);\n\t\t}\n\t}\n\n\t// Safety check: validate bindings\n\tconst safeCandidates = new Map<string, Set<string>>();\n\tfor (const [file, names] of candidates) {\n\t\tconst entry = entries.find((e) => e.filePath === file);\n\t\tif (!entry?.ast) continue;\n\n\t\tconst safeNames = new Set<string>();\n\t\tfor (const name of names) {\n\t\t\tconst safety = getBindingSafety(entry.ast, name);\n\t\t\tif (safety.safe) {\n\t\t\t\tsafeNames.add(name);\n\t\t\t} else {\n\t\t\t\tlogWarning(\n\t\t\t\t\t`Module factory: skipping \"${name}\" in ${file}: ${safety.reason}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (safeNames.size > 0) {\n\t\t\tsafeCandidates.set(file, safeNames);\n\t\t}\n\t}\n\n\t// Collect import edges (cross-file references to factory consts)\n\tconst importEdges = collectModuleFactoryImportEdges(\n\t\tentries,\n\t\tsafeCandidates,\n\t\tcwd,\n\t\tknownFiles,\n\t\tpathAliases,\n\t);\n\n\t// Also detect local usages: if the defining file uses the const in a component,\n\t// add self-references so those usages get rewritten too.\n\tfor (const [file, names] of safeCandidates) {\n\t\tconst entry = entries.find((e) => e.filePath === file);\n\t\tif (!entry?.ast) continue;\n\n\t\tconst localRefs = collectLocalFactoryUsages(entry.ast, names);\n\t\tif (localRefs.length > 0) {\n\t\t\tconst existing = importEdges.get(file) ?? [];\n\t\t\timportEdges.set(file, [...existing, ...localRefs]);\n\t\t}\n\t}\n\n\t// Safety check: validate importer bindings.\n\t// Track which exported names have at least one UNSAFE consumer so we can\n\t// remove them from the source-side plan too (issue #3: unsafe importers\n\t// must block source transformation).\n\tconst unsafeExportedNames = new Map<string, Set<string>>(); // sourceFile → names with unsafe consumers\n\n\tconst safeImports = new Map<string, string[]>();\n\tfor (const [file, localNames] of importEdges) {\n\t\tconst entry = entries.find((e) => e.filePath === file);\n\t\tif (!entry?.ast) continue;\n\n\t\tconst safeLocalNames: string[] = [];\n\t\tfor (const name of localNames) {\n\t\t\tconst safety = getBindingSafety(entry.ast, name);\n\t\t\tif (safety.safe) {\n\t\t\t\tsafeLocalNames.push(name);\n\t\t\t} else {\n\t\t\t\tlogWarning(\n\t\t\t\t\t`Module factory: skipping import \"${name}\" in ${file}: ${safety.reason}`,\n\t\t\t\t);\n\t\t\t\t// Track which exported name this corresponds to, so we can block the source\n\t\t\t\tmarkUnsafeExport(\n\t\t\t\t\tentry.ast,\n\t\t\t\t\tname,\n\t\t\t\t\tfile,\n\t\t\t\t\tsafeCandidates,\n\t\t\t\t\tentries,\n\t\t\t\t\tcwd,\n\t\t\t\t\tknownFiles,\n\t\t\t\t\tpathAliases,\n\t\t\t\t\tunsafeExportedNames,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (safeLocalNames.length > 0) {\n\t\t\tsafeImports.set(file, safeLocalNames);\n\t\t}\n\t}\n\n\t// Remove consts that have any unsafe consumer from the source plan\n\tfor (const [sourceFile, unsafeNames] of unsafeExportedNames) {\n\t\tconst safeNames = safeCandidates.get(sourceFile);\n\t\tif (!safeNames) continue;\n\t\tfor (const name of unsafeNames) {\n\t\t\tsafeNames.delete(name);\n\t\t\tlogWarning(\n\t\t\t\t`Module factory: blocking \"${name}\" in ${sourceFile} because an importer cannot be safely rewritten`,\n\t\t\t);\n\t\t}\n\t\tif (safeNames.size === 0) {\n\t\t\tsafeCandidates.delete(sourceFile);\n\t\t}\n\t\t// Also clean up import edges that reference this const\n\t\tfor (const [importFile, locals] of safeImports) {\n\t\t\tconst filtered = locals.filter((l) => {\n\t\t\t\t// Check if this local name maps back to the blocked const\n\t\t\t\tconst exportedName = resolveLocalToExportedName(\n\t\t\t\t\tentries.find((e) => e.filePath === importFile)?.ast,\n\t\t\t\t\tl,\n\t\t\t\t\timportFile,\n\t\t\t\t\tsourceFile,\n\t\t\t\t\tcwd,\n\t\t\t\t\tknownFiles,\n\t\t\t\t\tpathAliases,\n\t\t\t\t);\n\t\t\t\treturn !exportedName || !unsafeNames.has(exportedName);\n\t\t\t});\n\t\t\tif (filtered.length > 0) {\n\t\t\t\tsafeImports.set(importFile, filtered);\n\t\t\t} else {\n\t\t\t\tsafeImports.delete(importFile);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build final plan\n\tconst factoryConstsByFile = new Map<string, string[]>();\n\tfor (const [file, names] of safeCandidates) {\n\t\tfactoryConstsByFile.set(file, [...names]);\n\t}\n\n\treturn {\n\t\tfactoryConstsByFile,\n\t\tfactoryImportsByFile: safeImports,\n\t};\n}\n\nexport async function codegen(\n\toptions: CodegenOptions,\n\tcwd: string = process.cwd(),\n): Promise<CodegenResult> {\n\tconst files = await glob(options.include, {\n\t\tignore: options.exclude ?? [],\n\t\tcwd,\n\t\tabsolute: true,\n\t});\n\n\tconst transformOpts: TransformOptions = {\n\t\ti18nImport: options.i18nImport,\n\t\tmode: options.mode,\n\t\tcomponentPath: options.componentPath,\n\t\ttranslatableProps: options.translatableProps,\n\t};\n\n\tconst parseLimit = pLimit(10);\n\tconst parsedEntries = await Promise.all(\n\t\tfiles.map((filePath) =>\n\t\t\tparseLimit(async (): Promise<ParsedFileEntry> => {\n\t\t\t\tconst code = await readFile(filePath, \"utf-8\");\n\t\t\t\ttry {\n\t\t\t\t\tconst ast = parseFile(code, filePath);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\tast,\n\t\t\t\t\t\tisClientRoot: detectClientFile(ast),\n\t\t\t\t\t};\n\t\t\t\t} catch (err) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\tparseError: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\tisClientRoot: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}),\n\t\t),\n\t);\n\n\tconst pathAliases = await loadPathAliasResolvers(cwd);\n\tconst forceClientSet = buildClientGraph(parsedEntries, cwd, pathAliases);\n\n\t// Module factory plan (optional)\n\tlet factoryPlan: ModuleFactoryPlan | undefined;\n\tif (options.moduleFactory) {\n\t\tfactoryPlan = await buildModuleFactoryPlan(\n\t\t\tparsedEntries,\n\t\t\toptions.textToKey,\n\t\t\tcwd,\n\t\t\tpathAliases,\n\t\t);\n\t}\n\n\tconst limit = pLimit(10);\n\tlet completed = 0;\n\tconst clientNamespacesSet = new Set<string>();\n\n\tconst fileResults = await Promise.all(\n\t\tparsedEntries.map((entry) =>\n\t\t\tlimit(async () => {\n\t\t\t\tif (!entry.ast) {\n\t\t\t\t\tlogWarning(\n\t\t\t\t\t\t`Skipping unparseable file ${entry.filePath}: ${entry.parseError ?? \"unknown parse error\"}`,\n\t\t\t\t\t);\n\t\t\t\t\tcompleted++;\n\t\t\t\t\toptions.onProgress?.(completed, files.length);\n\t\t\t\t\treturn { modified: false, wrapped: 0, skipped: false };\n\t\t\t\t}\n\n\t\t\t\tconst isClient =\n\t\t\t\t\tforceClientSet.has(entry.filePath) || entry.isClientRoot;\n\t\t\t\tconst fileTransformOpts: TransformOptions = {\n\t\t\t\t\t...transformOpts,\n\t\t\t\t\tforceClient: forceClientSet.has(entry.filePath),\n\t\t\t\t\tmoduleFactoryConstNames: factoryPlan?.factoryConstsByFile.get(\n\t\t\t\t\t\tentry.filePath,\n\t\t\t\t\t),\n\t\t\t\t\tmoduleFactoryImportedNames: factoryPlan?.factoryImportsByFile.get(\n\t\t\t\t\t\tentry.filePath,\n\t\t\t\t\t),\n\t\t\t\t\tisTypeScript: /\\.(?:ts|tsx|mts|cts)$/.test(entry.filePath),\n\t\t\t\t};\n\n\t\t\t\tconst result = transform(\n\t\t\t\t\tentry.ast,\n\t\t\t\t\toptions.textToKey,\n\t\t\t\t\tfileTransformOpts,\n\t\t\t\t);\n\n\t\t\t\t// Collect namespaces from client files for selective message passing\n\t\t\t\tif (isClient && result.usedKeys.length > 0) {\n\t\t\t\t\tfor (const key of result.usedKeys) {\n\t\t\t\t\t\tconst dot = key.indexOf(\".\");\n\t\t\t\t\t\tif (dot > 0) {\n\t\t\t\t\t\t\tclientNamespacesSet.add(key.slice(0, dot));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (result.modified) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tparseFile(result.code, entry.filePath);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tlogWarning(\n\t\t\t\t\t\t\t`Codegen produced invalid syntax for ${entry.filePath}, file was NOT modified.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcompleted++;\n\t\t\t\t\t\toptions.onProgress?.(completed, files.length);\n\t\t\t\t\t\treturn { modified: false, wrapped: 0, skipped: true };\n\t\t\t\t\t}\n\n\t\t\t\t\tawait writeFile(entry.filePath, result.code, \"utf-8\");\n\t\t\t\t\tcompleted++;\n\t\t\t\t\toptions.onProgress?.(completed, files.length);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmodified: true,\n\t\t\t\t\t\twrapped: result.stringsWrapped,\n\t\t\t\t\t\tskipped: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tcompleted++;\n\t\t\t\toptions.onProgress?.(completed, files.length);\n\t\t\t\treturn { modified: false, wrapped: 0, skipped: false };\n\t\t\t}),\n\t\t),\n\t);\n\n\tlet filesModified = 0;\n\tlet stringsWrapped = 0;\n\tlet filesSkipped = 0;\n\n\tfor (const r of fileResults) {\n\t\tif (r.modified) {\n\t\t\tfilesModified++;\n\t\t\tstringsWrapped += r.wrapped;\n\t\t}\n\t\tif (r.skipped) filesSkipped++;\n\t}\n\n\treturn {\n\t\tfilesModified,\n\t\tstringsWrapped,\n\t\tfilesProcessed: files.length,\n\t\tfilesSkipped,\n\t\tclientNamespaces: [...clientNamespacesSet].sort(),\n\t};\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\treturn createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16);\n}\n\nfunction isFileNotFound(err: unknown): boolean {\n\treturn (\n\t\terr instanceof Error &&\n\t\t\"code\" in err &&\n\t\t(err as NodeJS.ErrnoException).code === \"ENOENT\"\n\t);\n}\n\nexport async function loadJsonFile(\n\tfilePath: string,\n): Promise<Record<string, unknown>> {\n\ttry {\n\t\tconst content = await readFile(filePath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch (err) {\n\t\tif (isFileNotFound(err)) return {};\n\t\tthrow new Error(\n\t\t\t`Failed to load ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t}\n}\n\nexport async function loadLockFile(messagesDir: string): Promise<LockFile> {\n\tconst lockPath = join(messagesDir, \".translate-lock.json\");\n\ttry {\n\t\tconst content = await readFile(lockPath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch (err) {\n\t\tif (isFileNotFound(err)) return {};\n\t\tthrow new Error(\n\t\t\t`Failed to load lock file: ${err instanceof Error ? err.message : String(err)}`,\n\t\t);\n\t}\n}\n\nexport function computeDiff(\n\tsourceFlat: Record<string, string>,\n\ttargetFlat: Record<string, string>,\n\tlockData: LockFile,\n): DiffResult {\n\tconst added: Record<string, string> = {};\n\tconst modified: Record<string, string> = {};\n\tconst removed: string[] = [];\n\tconst unchanged: Record<string, string> = {};\n\n\tfor (const [key, value] of Object.entries(sourceFlat)) {\n\t\tconst currentHash = hashValue(value);\n\t\tconst lockedHash = lockData[key];\n\n\t\tif (!(key in targetFlat)) {\n\t\t\tadded[key] = value;\n\t\t} else if (!lockedHash || lockedHash !== currentHash) {\n\t\t\tmodified[key] = value;\n\t\t} else {\n\t\t\tunchanged[key] = targetFlat[key];\n\t\t}\n\t}\n\n\tfor (const key of Object.keys(targetFlat)) {\n\t\tif (!(key in sourceFlat)) {\n\t\t\tremoved.push(key);\n\t\t}\n\t}\n\n\treturn { added, modified, removed, unchanged };\n}\n","import { logWarning } from \"./logger.js\";\n\nexport function flatten(\n\tobj: Record<string, unknown>,\n\tprefix = \"\",\n): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\n\tfor (const [key, value] of Object.entries(obj)) {\n\t\tconst fullKey = prefix ? `${prefix}.${key}` : key;\n\n\t\tif (typeof value === \"string\") {\n\t\t\tresult[fullKey] = value;\n\t\t} else if (\n\t\t\tvalue != null &&\n\t\t\ttypeof value === \"object\" &&\n\t\t\t!Array.isArray(value)\n\t\t) {\n\t\t\tObject.assign(result, flatten(value as Record<string, unknown>, fullKey));\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function unflatten(\n\tobj: Record<string, string>,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\n\tfor (const [key, value] of Object.entries(obj)) {\n\t\tconst parts = key.split(\".\");\n\t\tlet current: Record<string, unknown> = result;\n\n\t\tfor (let i = 0; i < parts.length - 1; i++) {\n\t\t\tconst part = parts[i];\n\t\t\tif (part in current && typeof current[part] !== \"object\") {\n\t\t\t\tlogWarning(\n\t\t\t\t\t`Key conflict: \"${parts.slice(0, i + 1).join(\".\")}\" is a value but \"${key}\" expects it to be an object`,\n\t\t\t\t);\n\t\t\t\tcurrent[part] = {};\n\t\t\t} else if (!(part in current)) {\n\t\t\t\tcurrent[part] = {};\n\t\t\t}\n\t\t\tcurrent = current[part] as Record<string, unknown>;\n\t\t}\n\n\t\tcurrent[parts[parts.length - 1]] = value;\n\t}\n\n\treturn result;\n}\n","import type { ExtractedString } from \"../types.js\";\n\nexport function deriveRoutePath(filePath: string): string | undefined {\n\t// Next.js app router: src/app/<route>/page.tsx or app/<route>/page.tsx\n\tconst appMatch = filePath.match(/(?:src\\/)?app\\/(.+?)\\/page\\.[jt]sx?$/);\n\tif (appMatch) return appMatch[1].replace(/\\//g, \".\");\n\n\t// Next.js pages router: src/pages/<route>.tsx or pages/<route>.tsx\n\tconst pagesMatch = filePath.match(/(?:src\\/)?pages\\/(.+?)\\.[jt]sx?$/);\n\tif (pagesMatch) {\n\t\tconst route = pagesMatch[1].replace(/\\/index$/, \"\").replace(/\\//g, \".\");\n\t\treturn route || undefined;\n\t}\n\n\t// Components: src/components/<section>/Component.tsx or components/<section>/Component.tsx\n\tconst compMatch = filePath.match(/(?:src\\/)?components\\/(.+?)\\//);\n\tif (compMatch) return compMatch[1];\n\n\treturn undefined;\n}\n\nexport function enrichStrings(\n\tstrings: ExtractedString[],\n\tfilePath: string,\n): ExtractedString[] {\n\tconst routePath = deriveRoutePath(filePath);\n\n\t// Group by componentName\n\tconst byComponent = new Map<string, ExtractedString[]>();\n\tfor (const str of strings) {\n\t\tconst key = str.componentName ?? \"__root__\";\n\t\tif (!byComponent.has(key)) byComponent.set(key, []);\n\t\tbyComponent.get(key)!.push(str);\n\t}\n\n\t// Find section headings (h1-h3)\n\tconst headings = strings.filter(\n\t\t(s) => s.parentTag && /^h[1-3]$/.test(s.parentTag),\n\t);\n\tconst defaultHeading = headings.length > 0 ? headings[0].text : undefined;\n\n\treturn strings.map((str) => {\n\t\tconst enriched = { ...str };\n\n\t\tif (routePath) enriched.routePath = routePath;\n\n\t\t// Assign siblingTexts from same component (max 5, excluding self)\n\t\tconst siblings = byComponent.get(str.componentName ?? \"__root__\") ?? [];\n\t\tconst siblingTexts = siblings\n\t\t\t.filter((s) => s !== str)\n\t\t\t.slice(0, 5)\n\t\t\t.map((s) => s.text);\n\t\tif (siblingTexts.length > 0) enriched.siblingTexts = siblingTexts;\n\n\t\t// Assign sectionHeading\n\t\tif (defaultHeading && str.text !== defaultHeading) {\n\t\t\tenriched.sectionHeading = defaultHeading;\n\t\t}\n\n\t\treturn enriched;\n\t});\n}\n","import type { NodePath } from \"@babel/traverse\";\nimport _traverse from \"@babel/traverse\";\nimport type {\n\tCallExpression,\n\tConditionalExpression,\n\tExpression,\n\tFile,\n\tJSXAttribute,\n\tJSXElement,\n\tJSXExpressionContainer,\n\tJSXText,\n\tObjectProperty,\n} from \"@babel/types\";\nimport type { ExtractedString } from \"../types.js\";\nimport {\n\tgetComponentName,\n\tgetParentTagName,\n\tgetTopLevelConstName,\n\tisInsideFunction,\n\tresolveDefault,\n} from \"../utils/ast-helpers.js\";\nimport { buildTemplateLiteralText } from \"../utils/template-literal.js\";\nimport {\n\tisContentProperty,\n\tisIgnoredTag,\n\tisTranslatableProp,\n\tshouldIgnore,\n} from \"./filters.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\nfunction getNearestFunctionPath(path: NodePath<any>): NodePath<any> | null {\n\tlet current = path.parentPath;\n\twhile (current) {\n\t\tif (\n\t\t\tcurrent.isFunctionDeclaration() ||\n\t\t\tcurrent.isFunctionExpression() ||\n\t\t\tcurrent.isArrowFunctionExpression()\n\t\t) {\n\t\t\treturn current;\n\t\t}\n\t\tcurrent = current.parentPath;\n\t}\n\treturn null;\n}\n\nfunction functionContainsJSX(path: NodePath<any>): boolean {\n\tlet hasJSX = false;\n\tpath.traverse({\n\t\tJSXElement(p: NodePath<JSXElement>) {\n\t\t\thasJSX = true;\n\t\t\tp.stop();\n\t\t},\n\t\tJSXFragment(p: NodePath<any>) {\n\t\t\thasJSX = true;\n\t\t\tp.stop();\n\t\t},\n\t});\n\treturn hasJSX;\n}\n\nfunction extractTextFromNode(node: Expression): string | null {\n\tif (node.type === \"StringLiteral\") {\n\t\tconst trimmed = node.value.trim();\n\t\treturn trimmed || null;\n\t}\n\tif (node.type === \"TemplateLiteral\") {\n\t\tconst info = buildTemplateLiteralText(node.quasis, node.expressions);\n\t\treturn info ? info.text : null;\n\t}\n\treturn null;\n}\n\nfunction collectConditionalTexts(node: ConditionalExpression): string[] {\n\tconst texts: string[] = [];\n\n\tfor (const branch of [node.consequent, node.alternate]) {\n\t\tif (branch.type === \"ConditionalExpression\") {\n\t\t\ttexts.push(...collectConditionalTexts(branch));\n\t\t} else {\n\t\t\tconst text = extractTextFromNode(branch as Expression);\n\t\t\tif (text && !shouldIgnore(text)) {\n\t\t\t\ttexts.push(text);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn texts;\n}\n\nexport function extractStrings(\n\tast: File,\n\tfilePath: string,\n\ttranslatableProps?: string[],\n): ExtractedString[] {\n\tconst results: ExtractedString[] = [];\n\n\ttraverse(ast, {\n\t\tJSXText(path: NodePath<JSXText>) {\n\t\t\tconst text = path.node.value.trim();\n\t\t\tif (shouldIgnore(text)) return;\n\n\t\t\tconst parentTag = getParentTagName(path);\n\t\t\tif (parentTag && isIgnoredTag(parentTag)) return;\n\n\t\t\tif (parentTag === \"T\") return;\n\n\t\t\tresults.push({\n\t\t\t\ttext,\n\t\t\t\ttype: \"jsx-text\",\n\t\t\t\tfile: filePath,\n\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\tparentTag,\n\t\t\t});\n\t\t},\n\n\t\tJSXAttribute(path: NodePath<JSXAttribute>) {\n\t\t\tconst name = path.node.name;\n\t\t\tconst propName =\n\t\t\t\tname.type === \"JSXIdentifier\" ? name.name : name.name.name;\n\n\t\t\tif (!isTranslatableProp(propName, translatableProps)) return;\n\n\t\t\tconst value = path.node.value;\n\t\t\tif (!value) return;\n\n\t\t\tlet text: string | undefined;\n\n\t\t\tif (value.type === \"StringLiteral\") {\n\t\t\t\ttext = value.value;\n\t\t\t} else if (value.type === \"JSXExpressionContainer\") {\n\t\t\t\tif (value.expression.type === \"StringLiteral\") {\n\t\t\t\t\ttext = value.expression.value;\n\t\t\t\t} else if (value.expression.type === \"TemplateLiteral\") {\n\t\t\t\t\tconst info = buildTemplateLiteralText(\n\t\t\t\t\t\tvalue.expression.quasis,\n\t\t\t\t\t\tvalue.expression.expressions,\n\t\t\t\t\t);\n\t\t\t\t\tif (info) text = info.text;\n\t\t\t\t} else if (value.expression.type === \"ConditionalExpression\") {\n\t\t\t\t\tconst parentTag = getParentTagName(path);\n\t\t\t\t\tif (parentTag && isIgnoredTag(parentTag)) return;\n\n\t\t\t\t\tconst texts = collectConditionalTexts(value.expression);\n\t\t\t\t\tfor (const t of texts) {\n\t\t\t\t\t\tresults.push({\n\t\t\t\t\t\t\ttext: t,\n\t\t\t\t\t\t\ttype: \"jsx-attribute\",\n\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\t\t\t\tpropName,\n\t\t\t\t\t\t\tparentTag,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!text || shouldIgnore(text)) return;\n\n\t\t\tconst parentTag = getParentTagName(path);\n\t\t\tif (parentTag && isIgnoredTag(parentTag)) return;\n\n\t\t\tresults.push({\n\t\t\t\ttext,\n\t\t\t\ttype: \"jsx-attribute\",\n\t\t\t\tfile: filePath,\n\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\tpropName,\n\t\t\t\tparentTag,\n\t\t\t});\n\t\t},\n\n\t\tJSXExpressionContainer(path: NodePath<JSXExpressionContainer>) {\n\t\t\tif (path.parent.type === \"JSXAttribute\") return;\n\n\t\t\tconst expr = path.node.expression;\n\n\t\t\tif (expr.type === \"ConditionalExpression\") {\n\t\t\t\tconst parentTag = getParentTagName(path);\n\t\t\t\tif (parentTag && isIgnoredTag(parentTag)) return;\n\n\t\t\t\tconst texts = collectConditionalTexts(expr);\n\t\t\t\tfor (const t of texts) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\ttext: t,\n\t\t\t\t\t\ttype: \"jsx-expression\",\n\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\t\t\tparentTag,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet text: string | undefined;\n\n\t\t\tif (expr.type === \"StringLiteral\") {\n\t\t\t\ttext = expr.value.trim();\n\t\t\t} else if (expr.type === \"TemplateLiteral\") {\n\t\t\t\tconst info = buildTemplateLiteralText(expr.quasis, expr.expressions);\n\t\t\t\tif (info) text = info.text;\n\t\t\t}\n\n\t\t\tif (!text || shouldIgnore(text)) return;\n\n\t\t\tconst parentTag = getParentTagName(path);\n\t\t\tif (parentTag && isIgnoredTag(parentTag)) return;\n\n\t\t\tresults.push({\n\t\t\t\ttext,\n\t\t\t\ttype: \"jsx-expression\",\n\t\t\t\tfile: filePath,\n\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\tparentTag,\n\t\t\t});\n\t\t},\n\n\t\tObjectProperty(path: NodePath<ObjectProperty>) {\n\t\t\tconst inFunction = isInsideFunction(path);\n\n\t\t\tif (!inFunction) {\n\t\t\t\t// Module-level: check if inside a top-level const declaration\n\t\t\t\tconst constName = getTopLevelConstName(\n\t\t\t\t\tpath as unknown as NodePath<any>,\n\t\t\t\t);\n\t\t\t\tif (!constName) return;\n\n\t\t\t\tconst keyNode = path.node.key;\n\t\t\t\tif (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n\t\t\t\t\treturn;\n\n\t\t\t\tconst propName =\n\t\t\t\t\tkeyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n\t\t\t\tif (!isContentProperty(propName)) return;\n\n\t\t\t\tconst valueNode = path.node.value;\n\n\t\t\t\tif (valueNode.type === \"ConditionalExpression\") {\n\t\t\t\t\tconst texts = collectConditionalTexts(valueNode);\n\t\t\t\t\tfor (const t of texts) {\n\t\t\t\t\t\tresults.push({\n\t\t\t\t\t\t\ttext: t,\n\t\t\t\t\t\t\ttype: \"module-object-property\",\n\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t\tline: valueNode.loc?.start.line ?? 0,\n\t\t\t\t\t\t\tcolumn: valueNode.loc?.start.column ?? 0,\n\t\t\t\t\t\t\tpropName,\n\t\t\t\t\t\t\tparentConstName: constName,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet text: string | undefined;\n\t\t\t\tif (valueNode.type === \"StringLiteral\") {\n\t\t\t\t\ttext = valueNode.value.trim();\n\t\t\t\t} else if (valueNode.type === \"TemplateLiteral\") {\n\t\t\t\t\tconst info = buildTemplateLiteralText(\n\t\t\t\t\t\tvalueNode.quasis,\n\t\t\t\t\t\tvalueNode.expressions,\n\t\t\t\t\t);\n\t\t\t\t\tif (info) text = info.text;\n\t\t\t\t}\n\n\t\t\t\tif (!text || shouldIgnore(text)) return;\n\n\t\t\t\tresults.push({\n\t\t\t\t\ttext,\n\t\t\t\t\ttype: \"module-object-property\",\n\t\t\t\t\tfile: filePath,\n\t\t\t\t\tline: valueNode.loc?.start.line ?? 0,\n\t\t\t\t\tcolumn: valueNode.loc?.start.column ?? 0,\n\t\t\t\t\tpropName,\n\t\t\t\t\tparentConstName: constName,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Function-level: existing logic\n\t\t\tconst ownerFn = getNearestFunctionPath(path as unknown as NodePath<any>);\n\t\t\tif (!ownerFn) return;\n\t\t\tif (!functionContainsJSX(ownerFn)) return;\n\t\t\tconst componentName = getComponentName(\n\t\t\t\townerFn as unknown as NodePath<any>,\n\t\t\t);\n\t\t\tif (!componentName) return;\n\n\t\t\tconst keyNode = path.node.key;\n\t\t\tif (keyNode.type !== \"Identifier\" && keyNode.type !== \"StringLiteral\")\n\t\t\t\treturn;\n\n\t\t\tconst propName =\n\t\t\t\tkeyNode.type === \"Identifier\" ? keyNode.name : keyNode.value;\n\t\t\tif (!isContentProperty(propName)) return;\n\n\t\t\tconst valueNode = path.node.value;\n\n\t\t\tif (valueNode.type === \"ConditionalExpression\") {\n\t\t\t\tconst texts = collectConditionalTexts(valueNode);\n\t\t\t\tfor (const t of texts) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\ttext: t,\n\t\t\t\t\t\ttype: \"object-property\",\n\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\tline: valueNode.loc?.start.line ?? 0,\n\t\t\t\t\t\tcolumn: valueNode.loc?.start.column ?? 0,\n\t\t\t\t\t\tcomponentName,\n\t\t\t\t\t\tpropName,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet text: string | undefined;\n\t\t\tif (valueNode.type === \"StringLiteral\") {\n\t\t\t\ttext = valueNode.value.trim();\n\t\t\t} else if (valueNode.type === \"TemplateLiteral\") {\n\t\t\t\tconst info = buildTemplateLiteralText(\n\t\t\t\t\tvalueNode.quasis,\n\t\t\t\t\tvalueNode.expressions,\n\t\t\t\t);\n\t\t\t\tif (info) text = info.text;\n\t\t\t}\n\n\t\t\tif (!text || shouldIgnore(text)) return;\n\n\t\t\tresults.push({\n\t\t\t\ttext,\n\t\t\t\ttype: \"object-property\",\n\t\t\t\tfile: filePath,\n\t\t\t\tline: valueNode.loc?.start.line ?? 0,\n\t\t\t\tcolumn: valueNode.loc?.start.column ?? 0,\n\t\t\t\tcomponentName,\n\t\t\t\tpropName,\n\t\t\t});\n\t\t},\n\n\t\tCallExpression(path: NodePath<CallExpression>) {\n\t\t\tconst callee = path.node.callee;\n\t\t\tif (callee.type !== \"Identifier\" || callee.name !== \"t\") return;\n\n\t\t\tconst args = path.node.arguments;\n\t\t\tif (args.length === 0) return;\n\n\t\t\tconst firstArg = args[0];\n\t\t\tif (firstArg.type !== \"StringLiteral\") return;\n\n\t\t\tif (args.length >= 2 && args[1].type === \"StringLiteral\") {\n\t\t\t\tresults.push({\n\t\t\t\t\ttext: firstArg.value,\n\t\t\t\t\ttype: \"t-call\",\n\t\t\t\t\tfile: filePath,\n\t\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\t\tparentTag: getParentTagName(path),\n\t\t\t\t\tid: args[1].value,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresults.push({\n\t\t\t\ttext: firstArg.value,\n\t\t\t\ttype: \"t-call\",\n\t\t\t\tfile: filePath,\n\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\tparentTag: getParentTagName(path),\n\t\t\t});\n\t\t},\n\n\t\tJSXElement(path: NodePath<JSXElement>) {\n\t\t\tconst opening = path.node.openingElement;\n\t\t\tif (opening.name.type !== \"JSXIdentifier\" || opening.name.name !== \"T\")\n\t\t\t\treturn;\n\n\t\t\tlet id: string | undefined;\n\t\t\tfor (const attr of opening.attributes) {\n\t\t\t\tif (\n\t\t\t\t\tattr.type === \"JSXAttribute\" &&\n\t\t\t\t\tattr.name.type === \"JSXIdentifier\" &&\n\t\t\t\t\tattr.name.name === \"id\" &&\n\t\t\t\t\tattr.value?.type === \"StringLiteral\"\n\t\t\t\t) {\n\t\t\t\t\tid = attr.value.value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet text = \"\";\n\t\t\tfor (const child of path.node.children) {\n\t\t\t\tif (child.type === \"JSXText\") {\n\t\t\t\t\ttext += child.value;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttext = text.trim();\n\t\t\tif (!text) return;\n\n\t\t\tresults.push({\n\t\t\t\ttext,\n\t\t\t\ttype: \"T-component\",\n\t\t\t\tfile: filePath,\n\t\t\t\tline: path.node.loc?.start.line ?? 0,\n\t\t\t\tcolumn: path.node.loc?.start.column ?? 0,\n\t\t\t\tcomponentName: getComponentName(path),\n\t\t\t\tparentTag: getParentTagName(path),\n\t\t\t\tid,\n\t\t\t});\n\t\t},\n\t});\n\n\treturn results;\n}\n","import { readFile } from \"node:fs/promises\";\nimport pLimit from \"p-limit\";\nimport { glob } from \"tinyglobby\";\nimport { logVerbose } from \"../logger.js\";\nimport type { ExtractedString, ScanOptions } from \"../types.js\";\nimport { enrichStrings } from \"./context-enricher.js\";\nimport { extractStrings } from \"./extractor.js\";\nimport { parseFile } from \"./parser.js\";\n\nexport interface ScanResult {\n\tstrings: ExtractedString[];\n\tfileCount: number;\n}\n\nexport interface ScanCallbacks {\n\tonProgress?: (completed: number, total: number) => void;\n}\n\nexport async function scan(\n\toptions: ScanOptions,\n\tcwd: string = process.cwd(),\n\tcallbacks?: ScanCallbacks,\n): Promise<ScanResult> {\n\tconst files = await glob(options.include, {\n\t\tignore: options.exclude ?? [],\n\t\tcwd,\n\t\tabsolute: true,\n\t});\n\n\tconst allStrings: ExtractedString[] = [];\n\n\tconst limit = pLimit(10);\n\tlet completed = 0;\n\n\tconst fileResults = await Promise.all(\n\t\tfiles.map((filePath) =>\n\t\t\tlimit(async () => {\n\t\t\t\tconst code = await readFile(filePath, \"utf-8\");\n\t\t\t\tlet ast;\n\t\t\t\ttry {\n\t\t\t\t\tast = parseFile(code, filePath);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogVerbose(\n\t\t\t\t\t\t`Skipping unparseable file ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\t\t\t\tcompleted++;\n\t\t\t\t\tcallbacks?.onProgress?.(completed, files.length);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst raw = extractStrings(ast, filePath, options.translatableProps);\n\t\t\t\tconst strings = enrichStrings(raw, filePath);\n\t\t\t\tcompleted++;\n\t\t\t\tcallbacks?.onProgress?.(completed, files.length);\n\t\t\t\treturn { strings, filePath };\n\t\t\t}),\n\t\t),\n\t);\n\n\tfor (const result of fileResults) {\n\t\tif (!result) continue;\n\t\tallStrings.push(...result.strings);\n\t}\n\n\treturn {\n\t\tstrings: allStrings,\n\t\tfileCount: files.length,\n\t};\n}\n","import { generateObject, type LanguageModel } from \"ai\";\nimport pLimit from \"p-limit\";\nimport { z } from \"zod\";\nimport { logWarning } from \"../logger.js\";\nimport type { ExtractedString } from \"../types.js\";\n\ninterface KeyGenInput {\n\tmodel: LanguageModel;\n\tstrings: ExtractedString[];\n\texistingMap?: Record<string, string>;\n\t/** 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\tallTexts?: Set<string>;\n\tbatchSize?: number;\n\tconcurrency?: number;\n\tretries?: number;\n\tonProgress?: (completed: number, total: number) => void;\n\tonUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n}\n\nfunction buildPrompt(\n\tstrings: ExtractedString[],\n\texistingMap?: Record<string, string>,\n): string {\n\tconst lines = [\n\t\t\"Generate semantic i18n keys for these UI strings.\",\n\t\t\"\",\n\t\t\"Rules:\",\n\t\t\"- Use dot notation with max 2 levels (namespace.key)\",\n\t\t\"- Use camelCase for key segments\",\n\t\t\"- CRITICAL: All strings within the same React component MUST share the same namespace prefix.\",\n\t\t' This is because the generated code will use useTranslations(\"namespace\") / getTranslations(\"namespace\")',\n\t\t\" from next-intl, which scopes all t() calls to that namespace.\",\n\t\t' Example: A Hero component with \"Welcome\" and \"Get Started\" → both must be \"hero.welcome\" and \"hero.getStarted\", NOT \"hero.welcome\" and \"common.getStarted\".',\n\t\t\"- Derive namespace from: route path > component name > file path section, in that priority order.\",\n\t\t' Example: file src/app/dashboard/page.tsx, component DashboardPage → namespace \"dashboard\"',\n\t\t' Example: file src/components/hero/Hero.tsx, component Hero → namespace \"hero\"',\n\t\t\"- Only use cross-cutting namespaces (common, auth, nav, form, error) for strings that are truly generic\",\n\t\t' and appear in multiple unrelated components. If \"Save\" only appears in SettingsForm, use \"settings.save\" not \"common.save\".',\n\t\t\"- For shared/layout components (Header, Footer, Sidebar), use their component name as namespace.\",\n\t\t'- Auth-related use \"auth.\" prefix (Sign in, Log out, Register, Forgot password, etc.)',\n\t\t'- Navigation use \"nav.\" prefix',\n\t\t'- Form-related use \"form.\" prefix for generic form labels',\n\t\t'- Error messages use \"error.\" prefix',\n\t\t\"- Be consistent: same text should always get the same key\",\n\t\t\"- Keys should be concise but descriptive\",\n\t];\n\n\t// Add existing keys context for namespace consistency\n\tif (existingMap && Object.keys(existingMap).length > 0) {\n\t\tconst entries = Object.entries(existingMap).slice(0, 30);\n\t\tlines.push(\"\");\n\t\tlines.push(\"Existing keys (maintain consistency with these namespaces):\");\n\t\tfor (const [text, key] of entries) {\n\t\t\tlines.push(` \"${text}\" → ${key}`);\n\t\t}\n\t}\n\n\t// Group strings by file for better context\n\tlines.push(\"\");\n\tlines.push(\"Strings:\");\n\n\tconst byFile = new Map<string, { index: number; str: ExtractedString }[]>();\n\tfor (let i = 0; i < strings.length; i++) {\n\t\tconst str = strings[i];\n\t\tconst file = str.file || \"(unknown)\";\n\t\tif (!byFile.has(file)) byFile.set(file, []);\n\t\tbyFile.get(file)!.push({ index: i, str });\n\t}\n\n\tfor (const [file, entries] of byFile) {\n\t\tconst routePart = entries[0].str.routePath\n\t\t\t? ` (route: ${entries[0].str.routePath})`\n\t\t\t: \"\";\n\t\tlines.push(`--- File: ${file}${routePart} ---`);\n\n\t\tfor (const { index, str } of entries) {\n\t\t\tconst parts: string[] = [`[${index}] \"${str.text}\"`];\n\t\t\tif (str.componentName) parts.push(`component: ${str.componentName}`);\n\t\t\tif (str.parentTag) parts.push(`tag: ${str.parentTag}`);\n\t\t\tif (str.propName) parts.push(`prop: ${str.propName}`);\n\t\t\tif (str.parentConstName) parts.push(`const: ${str.parentConstName}`);\n\t\t\tif (str.sectionHeading) parts.push(`section: \"${str.sectionHeading}\"`);\n\t\t\tif (str.siblingTexts?.length) {\n\t\t\t\tparts.push(\n\t\t\t\t\t`siblings: [${str.siblingTexts\n\t\t\t\t\t\t.slice(0, 3)\n\t\t\t\t\t\t.map((t) => `\"${t}\"`)\n\t\t\t\t\t\t.join(\", \")}]`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push(` ${parts.join(\", \")}`);\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\ninterface KeyBatchResult {\n\tkeys: Record<string, string>;\n\tusage: { inputTokens: number; outputTokens: number };\n}\n\nfunction inferNamespace(str: ExtractedString): string {\n\t// 1. Component name: \"FeaturesGrid\" → \"featuresGrid\", \"Newsletter\" → \"newsletter\"\n\tif (str.componentName && str.componentName.length > 0) {\n\t\treturn str.componentName[0].toLowerCase() + str.componentName.slice(1);\n\t}\n\n\t// 2. Route path: \"/dashboard/settings\" → \"settings\"\n\t// Skip dynamic segments like [id], [...slug]\n\tif (str.routePath) {\n\t\tconst segments = str.routePath\n\t\t\t.split(\"/\")\n\t\t\t.filter((s) => s.length > 0 && !s.startsWith(\"[\"));\n\t\tif (segments.length > 0) {\n\t\t\treturn segments[segments.length - 1].toLowerCase();\n\t\t}\n\t}\n\n\t// 3. File path: \"src/components/sections/hero.tsx\" → \"hero\"\n\t// For generic names (index, page, layout), use parent directory\n\tif (str.file) {\n\t\tconst parts = str.file.replace(/\\.\\w+$/, \"\").split(\"/\");\n\t\tconst fileName = parts[parts.length - 1];\n\t\tif (\n\t\t\tfileName &&\n\t\t\tfileName !== \"index\" &&\n\t\t\tfileName !== \"page\" &&\n\t\t\tfileName !== \"layout\"\n\t\t) {\n\t\t\treturn fileName[0].toLowerCase() + fileName.slice(1);\n\t\t}\n\t\t// Use parent directory for generic filenames\n\t\tif (parts.length >= 2) {\n\t\t\tconst dir = parts[parts.length - 2];\n\t\t\tif (dir && !dir.startsWith(\"[\") && !dir.startsWith(\"(\")) {\n\t\t\t\treturn dir[0].toLowerCase() + dir.slice(1);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn \"common\";\n}\n\nasync function generateKeysBatchWithRetry(\n\tmodel: LanguageModel,\n\tstrings: ExtractedString[],\n\tretries: number,\n\texistingMap?: Record<string, string>,\n): Promise<KeyBatchResult> {\n\tconst prompt = buildPrompt(strings, existingMap);\n\tconst texts = strings.map((s) => s.text);\n\n\tconst schema = z.object({\n\t\tmappings: z.array(\n\t\t\tz.object({\n\t\t\t\tindex: z.number().describe(\"Zero-based index of the string\"),\n\t\t\t\tkey: z.string().describe(\"Semantic i18n key\"),\n\t\t\t}),\n\t\t),\n\t});\n\n\tlet lastError: Error | undefined;\n\tconst totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n\tfor (let attempt = 0; attempt <= retries; attempt++) {\n\t\ttry {\n\t\t\tconst { object, usage } = await generateObject({\n\t\t\t\tmodel,\n\t\t\t\tprompt,\n\t\t\t\tschema,\n\t\t\t});\n\n\t\t\ttotalUsage.inputTokens += usage.inputTokens ?? 0;\n\t\t\ttotalUsage.outputTokens += usage.outputTokens ?? 0;\n\n\t\t\tconst result: Record<string, string> = {};\n\t\t\tfor (const mapping of object.mappings) {\n\t\t\t\tif (mapping.index >= 0 && mapping.index < texts.length) {\n\t\t\t\t\tlet key = mapping.key;\n\t\t\t\t\tif (!key.includes(\".\")) {\n\t\t\t\t\t\t// Infer namespace from component name or file path\n\t\t\t\t\t\tconst str = strings[mapping.index];\n\t\t\t\t\t\tconst ns = inferNamespace(str);\n\t\t\t\t\t\tkey = `${ns}.${key}`;\n\t\t\t\t\t\tlogWarning(\n\t\t\t\t\t\t\t`AI generated single-segment key \"${mapping.key}\" for \"${texts[mapping.index]}\". Auto-prefixed to \"${key}\".`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tresult[texts[mapping.index]] = key;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { keys: result, usage: totalUsage };\n\t\t} catch (error) {\n\t\t\tlastError = error as Error;\n\t\t\tif (attempt < retries) {\n\t\t\t\tconst delay = Math.min(2 ** attempt * 1000, 30_000);\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\t\t}\n\t}\n\n\tthrow lastError;\n}\n\nfunction resolveCollisions(\n\tnewKeys: Record<string, string>,\n\texistingMap: Record<string, string>,\n): Record<string, string> {\n\tconst usedKeys = new Set(Object.values(existingMap));\n\tconst result: Record<string, string> = {};\n\n\tfor (const [text, key] of Object.entries(newKeys)) {\n\t\tlet finalKey = key;\n\t\tlet suffix = 2;\n\t\twhile (usedKeys.has(finalKey)) {\n\t\t\tfinalKey = `${key}${suffix}`;\n\t\t\tsuffix++;\n\t\t}\n\t\tusedKeys.add(finalKey);\n\t\tresult[text] = finalKey;\n\t}\n\n\treturn 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\tmap: Record<string, string>,\n): Record<string, string> {\n\tconst allKeys = new Set(Object.values(map));\n\tconst result: Record<string, string> = {};\n\n\tfor (const [text, key] of Object.entries(map)) {\n\t\tlet hasChild = false;\n\t\tconst prefix = `${key}.`;\n\t\tfor (const other of allKeys) {\n\t\t\tif (other.startsWith(prefix)) {\n\t\t\t\thasChild = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!hasChild) {\n\t\t\tresult[text] = key;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Key is both leaf and branch — rename by appending \"Label\" to last segment\n\t\tconst dotIdx = key.lastIndexOf(\".\");\n\t\tlet renamed: string;\n\t\tif (dotIdx === -1) {\n\t\t\trenamed = `${key}Label`;\n\t\t} else {\n\t\t\trenamed = `${key.slice(0, dotIdx + 1) + key.slice(dotIdx + 1)}Label`;\n\t\t}\n\n\t\t// Ensure the renamed key doesn't collide\n\t\tlet finalKey = renamed;\n\t\tlet suffix = 2;\n\t\twhile (allKeys.has(finalKey)) {\n\t\t\tfinalKey = `${renamed}${suffix}`;\n\t\t\tsuffix++;\n\t\t}\n\n\t\tallKeys.delete(key);\n\t\tallKeys.add(finalKey);\n\t\tresult[text] = finalKey;\n\t\tlogWarning(\n\t\t\t`Key path conflict: \"${key}\" is both a value and a prefix of other keys. Renamed to \"${finalKey}\".`,\n\t\t);\n\t}\n\n\treturn result;\n}\n\nexport async function generateSemanticKeys(\n\tinput: KeyGenInput,\n): Promise<Record<string, string>> {\n\tconst {\n\t\tmodel,\n\t\tstrings,\n\t\texistingMap = {},\n\t\tallTexts,\n\t\tbatchSize = 50,\n\t\tconcurrency = 3,\n\t\tretries = 2,\n\t\tonProgress,\n\t\tonUsage,\n\t} = input;\n\n\tconst activeTexts = allTexts ?? new Set(strings.map((s) => s.text));\n\tconst activeExisting: Record<string, string> = {};\n\tfor (const [text, key] of Object.entries(existingMap)) {\n\t\tif (activeTexts.has(text)) {\n\t\t\tactiveExisting[text] = key;\n\t\t}\n\t}\n\n\tconst newStrings = strings.filter((s) => !(s.text in activeExisting));\n\tif (newStrings.length === 0) return activeExisting;\n\n\tconst uniqueMap = new Map<string, ExtractedString>();\n\tfor (const str of newStrings) {\n\t\tif (!uniqueMap.has(str.text)) {\n\t\t\tuniqueMap.set(str.text, str);\n\t\t}\n\t}\n\tconst uniqueStrings = Array.from(uniqueMap.values()).sort((a, b) => {\n\t\tconst fileCmp = (a.file || \"\").localeCompare(b.file || \"\");\n\t\tif (fileCmp !== 0) return fileCmp;\n\t\treturn (a.componentName || \"\").localeCompare(b.componentName || \"\");\n\t});\n\n\tconst limit = pLimit(concurrency);\n\tconst batches: ExtractedString[][] = [];\n\n\tfor (let i = 0; i < uniqueStrings.length; i += batchSize) {\n\t\tbatches.push(uniqueStrings.slice(i, i + batchSize));\n\t}\n\n\tconst allNewKeys: Record<string, string> = {};\n\tlet completedStrings = 0;\n\tlet totalInputTokens = 0;\n\tlet totalOutputTokens = 0;\n\n\tawait Promise.all(\n\t\tbatches.map((batch) =>\n\t\t\tlimit(async () => {\n\t\t\t\tconst { keys, usage } = await generateKeysBatchWithRetry(\n\t\t\t\t\tmodel,\n\t\t\t\t\tbatch,\n\t\t\t\t\tretries,\n\t\t\t\t\tactiveExisting,\n\t\t\t\t);\n\t\t\t\tObject.assign(allNewKeys, keys);\n\t\t\t\ttotalInputTokens += usage.inputTokens;\n\t\t\t\ttotalOutputTokens += usage.outputTokens;\n\t\t\t\tcompletedStrings += batch.length;\n\t\t\t\tonProgress?.(completedStrings, uniqueStrings.length);\n\t\t\t}),\n\t\t),\n\t);\n\n\tif (totalInputTokens > 0 || totalOutputTokens > 0) {\n\t\tonUsage?.({\n\t\t\tinputTokens: totalInputTokens,\n\t\t\toutputTokens: totalOutputTokens,\n\t\t});\n\t}\n\n\tconst resolved = resolveCollisions(allNewKeys, activeExisting);\n\tconst merged = { ...activeExisting, ...resolved };\n\n\treturn resolvePathConflicts(merged);\n}\n","const PLACEHOLDER_REGEX =\n\t/\\{\\{[\\w.]+\\}\\}|\\{[\\w.]+\\}|\\{\\d+\\}|%[sd@]|%\\.\\d+f|<\\/?[\\w-]+(?:\\s[^>]*)?\\s*\\/?>|<\\/[\\w-]+>/g;\n\nexport function extractPlaceholders(text: string): string[] {\n\tconst matches = text.match(PLACEHOLDER_REGEX);\n\tif (!matches) return [];\n\treturn matches.slice().sort();\n}\n\nexport interface PlaceholderValidation {\n\tvalid: boolean;\n\tmissing: string[];\n\textra: string[];\n}\n\nexport function validatePlaceholders(\n\tsource: string,\n\ttranslated: string,\n): PlaceholderValidation {\n\tconst sourcePlaceholders = extractPlaceholders(source);\n\tconst translatedPlaceholders = extractPlaceholders(translated);\n\n\tconst sourceCount = new Map<string, number>();\n\tfor (const p of sourcePlaceholders) {\n\t\tsourceCount.set(p, (sourceCount.get(p) ?? 0) + 1);\n\t}\n\n\tconst translatedCount = new Map<string, number>();\n\tfor (const p of translatedPlaceholders) {\n\t\ttranslatedCount.set(p, (translatedCount.get(p) ?? 0) + 1);\n\t}\n\n\tconst missing: string[] = [];\n\tconst extra: string[] = [];\n\n\tfor (const [placeholder, count] of sourceCount) {\n\t\tconst tCount = translatedCount.get(placeholder) ?? 0;\n\t\tfor (let i = 0; i < count - tCount; i++) {\n\t\t\tmissing.push(placeholder);\n\t\t}\n\t}\n\n\tfor (const [placeholder, count] of translatedCount) {\n\t\tconst sCount = sourceCount.get(placeholder) ?? 0;\n\t\tfor (let i = 0; i < count - sCount; i++) {\n\t\t\textra.push(placeholder);\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: missing.length === 0 && extra.length === 0,\n\t\tmissing,\n\t\textra,\n\t};\n}\n\nexport interface BatchValidation {\n\tvalid: boolean;\n\tfailures: Array<{\n\t\tkey: string;\n\t\tmissing: string[];\n\t\textra: string[];\n\t}>;\n}\n\nexport function validateBatch(\n\tsourceEntries: Record<string, string>,\n\ttranslatedEntries: Record<string, string>,\n): BatchValidation {\n\tconst failures: BatchValidation[\"failures\"] = [];\n\n\tfor (const key of Object.keys(sourceEntries)) {\n\t\tconst source = sourceEntries[key];\n\t\tconst translated = translatedEntries[key];\n\t\tif (translated == null) continue;\n\n\t\tconst result = validatePlaceholders(source, translated);\n\t\tif (!result.valid) {\n\t\t\tfailures.push({ key, missing: result.missing, extra: result.extra });\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: failures.length === 0,\n\t\tfailures,\n\t};\n}\n","import { generateObject, type LanguageModel } from \"ai\";\nimport pLimit from \"p-limit\";\nimport { z } from \"zod\";\nimport { logWarning } from \"./logger.js\";\nimport type { TranslationOptions } from \"./types.js\";\nimport { validateBatch } from \"./validate.js\";\n\ninterface TranslateBatchInput {\n\tmodel: LanguageModel;\n\tentries: Record<string, string>;\n\tsourceLocale: string;\n\ttargetLocale: string;\n\toptions?: TranslationOptions;\n}\n\nfunction buildPrompt(\n\tentries: Record<string, string>,\n\tsourceLocale: string,\n\ttargetLocale: string,\n\toptions?: TranslationOptions,\n): string {\n\tconst lines = [\n\t\t`Translate the following strings from \"${sourceLocale}\" to \"${targetLocale}\".`,\n\t\t\"\",\n\t\t\"Rules:\",\n\t\t\"- Preserve all placeholders like {name}, {{count}}, %s, %d exactly as-is\",\n\t\t\"- Preserve HTML tags and markdown formatting\",\n\t\t\"- Do NOT translate proper nouns, brand names, or technical identifiers\",\n\t\t\"- Maintain the same level of formality and register\",\n\t\t\"- Return natural, fluent translations (not word-for-word)\",\n\t];\n\n\tif (options?.tone) {\n\t\tlines.push(`- Use a ${options.tone} tone`);\n\t}\n\n\tif (options?.context) {\n\t\tlines.push(`\\nContext: ${options.context}`);\n\t}\n\n\tif (options?.glossary && Object.keys(options.glossary).length > 0) {\n\t\tlines.push(\"\\nGlossary (use these exact translations):\");\n\t\tfor (const [term, translation] of Object.entries(options.glossary)) {\n\t\t\tlines.push(` \"${term}\" → \"${translation}\"`);\n\t\t}\n\t}\n\n\tlines.push(\"\\nStrings to translate:\");\n\tfor (const [key, value] of Object.entries(entries)) {\n\t\tlines.push(` \"${key}\": \"${value}\"`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction buildSchema(keys: string[]): z.ZodObject<Record<string, z.ZodString>> {\n\tconst shape: Record<string, z.ZodString> = {};\n\tfor (const key of keys) {\n\t\tshape[key] = z.string();\n\t}\n\treturn z.object(shape);\n}\n\ninterface BatchResult {\n\ttranslations: Record<string, string>;\n\tusage: { inputTokens: number; outputTokens: number };\n}\n\nasync function translateBatchWithRetry(\n\tinput: TranslateBatchInput,\n\tretries: number,\n): Promise<BatchResult> {\n\tconst { model, entries, sourceLocale, targetLocale, options } = input;\n\tconst keys = Object.keys(entries);\n\tconst prompt = buildPrompt(entries, sourceLocale, targetLocale, options);\n\tconst schema = buildSchema(keys);\n\n\tconst shouldValidate = options?.validatePlaceholders !== false;\n\tlet lastError: Error | undefined;\n\tconst totalUsage = { inputTokens: 0, outputTokens: 0 };\n\n\tfor (let attempt = 0; attempt <= retries; attempt++) {\n\t\ttry {\n\t\t\tconst { object, usage } = await generateObject({\n\t\t\t\tmodel,\n\t\t\t\tprompt,\n\t\t\t\tschema,\n\t\t\t});\n\n\t\t\ttotalUsage.inputTokens += usage.inputTokens ?? 0;\n\t\t\ttotalUsage.outputTokens += usage.outputTokens ?? 0;\n\n\t\t\tif (shouldValidate) {\n\t\t\t\tconst validation = validateBatch(entries, object);\n\t\t\t\tif (!validation.valid) {\n\t\t\t\t\tif (attempt < retries) {\n\t\t\t\t\t\tlogWarning(\n\t\t\t\t\t\t\t`Placeholder mismatch in batch (attempt ${attempt + 1}/${retries + 1}), retrying...`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const failure of validation.failures) {\n\t\t\t\t\t\tlogWarning(\n\t\t\t\t\t\t\t`Placeholder mismatch for key \"${failure.key}\": missing=[${failure.missing.join(\", \")}] extra=[${failure.extra.join(\", \")}]`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { translations: object, usage: totalUsage };\n\t\t} catch (error) {\n\t\t\tlastError = error as Error;\n\t\t\tif (attempt < retries) {\n\t\t\t\tconst delay = Math.min(2 ** attempt * 1000, 30_000);\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\t\t}\n\t}\n\n\tthrow lastError;\n}\n\nexport interface TranslateAllInput {\n\tmodel: LanguageModel;\n\tentries: Record<string, string>;\n\tsourceLocale: string;\n\ttargetLocale: string;\n\toptions?: TranslationOptions;\n\tonBatchComplete?: (translated: Record<string, string>) => void;\n\tonProgress?: (completed: number, total: number) => void;\n\tonUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n}\n\nexport async function translateAll(\n\tinput: TranslateAllInput,\n): Promise<Record<string, string>> {\n\tconst {\n\t\tmodel,\n\t\tentries,\n\t\tsourceLocale,\n\t\ttargetLocale,\n\t\toptions,\n\t\tonBatchComplete,\n\t\tonProgress,\n\t\tonUsage,\n\t} = input;\n\n\tconst keys = Object.keys(entries);\n\tif (keys.length === 0) return {};\n\n\tconst batchSize = options?.batchSize ?? 50;\n\tconst concurrency = options?.concurrency ?? 3;\n\tconst retries = options?.retries ?? 2;\n\tconst limit = pLimit(concurrency);\n\n\tconst batches: Record<string, string>[] = [];\n\tfor (let i = 0; i < keys.length; i += batchSize) {\n\t\tconst batchKeys = keys.slice(i, i + batchSize);\n\t\tconst batch: Record<string, string> = {};\n\t\tfor (const key of batchKeys) {\n\t\t\tbatch[key] = entries[key];\n\t\t}\n\t\tbatches.push(batch);\n\t}\n\n\tconst results: Record<string, string> = {};\n\tlet completedKeys = 0;\n\tlet totalInputTokens = 0;\n\tlet totalOutputTokens = 0;\n\n\tawait Promise.all(\n\t\tbatches.map((batch) =>\n\t\t\tlimit(async () => {\n\t\t\t\tconst { translations, usage } = await translateBatchWithRetry(\n\t\t\t\t\t{ model, entries: batch, sourceLocale, targetLocale, options },\n\t\t\t\t\tretries,\n\t\t\t\t);\n\t\t\t\tObject.assign(results, translations);\n\t\t\t\ttotalInputTokens += usage.inputTokens;\n\t\t\t\ttotalOutputTokens += usage.outputTokens;\n\t\t\t\tcompletedKeys += Object.keys(batch).length;\n\t\t\t\tonProgress?.(completedKeys, keys.length);\n\t\t\t\tonBatchComplete?.(translations);\n\t\t\t}),\n\t\t),\n\t);\n\n\tif (totalInputTokens > 0 || totalOutputTokens > 0) {\n\t\tonUsage?.({\n\t\t\tinputTokens: totalInputTokens,\n\t\t\toutputTokens: totalOutputTokens,\n\t\t});\n\t}\n\n\treturn results;\n}\n","import { mkdir, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport async function generateNextIntlTypes(\n\tmessagesDir: string,\n\tsourceLocale: string,\n\tsplitByNamespace?: boolean,\n): Promise<void> {\n\tawait mkdir(messagesDir, { recursive: true });\n\n\tlet content: string;\n\n\tif (splitByNamespace) {\n\t\tconst sourceDir = join(messagesDir, sourceLocale);\n\t\tlet files: string[];\n\t\ttry {\n\t\t\tfiles = (await readdir(sourceDir))\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.sort();\n\t\t} catch {\n\t\t\tfiles = [];\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\tcontent = `type Messages = Record<string, never>;\n\ndeclare module \"next-intl\" {\n interface AppConfig {\n Messages: Messages;\n }\n}\n`;\n\t\t} else {\n\t\t\tconst imports = files.map((f) => {\n\t\t\t\tconst ns = f.replace(\".json\", \"\");\n\t\t\t\treturn `import ${ns} from \"./${sourceLocale}/${f}\";`;\n\t\t\t});\n\t\t\tconst typeEntries = files.map((f) => {\n\t\t\t\tconst ns = f.replace(\".json\", \"\");\n\t\t\t\treturn ` ${ns}: typeof ${ns};`;\n\t\t\t});\n\t\t\tcontent = `${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\t\t}\n\t} else {\n\t\tcontent = `import messages from \"./${sourceLocale}.json\";\n\ndeclare module \"next-intl\" {\n interface AppConfig {\n Messages: typeof messages;\n }\n}\n`;\n\t}\n\n\tconst outPath = join(messagesDir, \"next-intl.d.ts\");\n\tawait writeFile(outPath, content, \"utf-8\");\n}\n","import { mkdir, readdir, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { hashValue } from \"./diff.js\";\nimport { unflatten } from \"./flatten.js\";\nimport type { LockFile } from \"./types.js\";\n\nexport async function writeTranslation(\n\tfilePath: string,\n\tflatEntries: Record<string, string>,\n\toptions?: { flat?: boolean },\n): Promise<void> {\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst data = options?.flat ? flatEntries : unflatten(flatEntries);\n\tconst content = `${JSON.stringify(data, null, 2)}\\n`;\n\tawait writeFile(filePath, content, \"utf-8\");\n}\n\nexport async function writeTranslationSplit(\n\tdir: string,\n\tflatEntries: Record<string, string>,\n): Promise<void> {\n\tawait mkdir(dir, { recursive: true });\n\n\tconst byNamespace = new Map<string, Record<string, string>>();\n\n\tfor (const [key, value] of Object.entries(flatEntries)) {\n\t\tconst dot = key.indexOf(\".\");\n\t\tif (dot > 0) {\n\t\t\tconst ns = key.slice(0, dot);\n\t\t\tconst restKey = key.slice(dot + 1);\n\t\t\tif (!byNamespace.has(ns)) byNamespace.set(ns, {});\n\t\t\tbyNamespace.get(ns)![restKey] = value;\n\t\t} else {\n\t\t\t// Keys without a namespace go into a root namespace file\n\t\t\tif (!byNamespace.has(\"_root\")) byNamespace.set(\"_root\", {});\n\t\t\tbyNamespace.get(\"_root\")![key] = value;\n\t\t}\n\t}\n\n\tfor (const [ns, entries] of byNamespace) {\n\t\tconst filePath = join(dir, `${ns}.json`);\n\t\tconst nested = unflatten(entries);\n\t\tconst content = `${JSON.stringify(nested, null, 2)}\\n`;\n\t\tawait writeFile(filePath, content, \"utf-8\");\n\t}\n\n\t// Remove stale namespace files\n\tconst currentFiles = new Set(\n\t\t[...byNamespace.keys()].map((ns) => `${ns}.json`),\n\t);\n\tlet existing: string[];\n\ttry {\n\t\texisting = await readdir(dir);\n\t} catch {\n\t\treturn;\n\t}\n\tfor (const file of existing) {\n\t\tif (file.endsWith(\".json\") && !currentFiles.has(file)) {\n\t\t\tawait unlink(join(dir, file));\n\t\t}\n\t}\n}\n\nexport async function writeLockFile(\n\tmessagesDir: string,\n\tsourceFlat: Record<string, string>,\n\texistingLock: LockFile,\n\ttranslatedKeys: string[],\n): Promise<void> {\n\tconst lock: LockFile = { ...existingLock };\n\n\tfor (const key of translatedKeys) {\n\t\tif (key in sourceFlat) {\n\t\t\tlock[key] = hashValue(sourceFlat[key]);\n\t\t}\n\t}\n\n\t// Remove keys that no longer exist in source\n\tfor (const key of Object.keys(lock)) {\n\t\tif (!(key in sourceFlat)) {\n\t\t\tdelete lock[key];\n\t\t}\n\t}\n\n\tconst lockPath = join(messagesDir, \".translate-lock.json\");\n\tawait mkdir(dirname(lockPath), { recursive: true });\n\tconst content = `${JSON.stringify(lock, null, 2)}\\n`;\n\tawait writeFile(lockPath, content, \"utf-8\");\n}\n","import { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type CodegenResult, codegen } from \"./codegen/index.js\";\nimport { computeDiff, loadJsonFile, loadLockFile } from \"./diff.js\";\nimport { flatten, unflatten } from \"./flatten.js\";\nimport { logWarning } from \"./logger.js\";\nimport { scan } from \"./scanner/index.js\";\nimport { generateSemanticKeys } from \"./scanner/key-ai.js\";\nimport { translateAll } from \"./translate.js\";\nimport { generateNextIntlTypes } from \"./typegen.js\";\nimport type { TranslateKitConfig } from \"./types.js\";\nimport {\n\twriteLockFile,\n\twriteTranslation,\n\twriteTranslationSplit,\n} from \"./writer.js\";\n\n// --- Map file helpers (moved from cli.ts) ---\n\nexport async function loadMapFile(\n\tmessagesDir: string,\n): Promise<Record<string, string>> {\n\tconst mapPath = join(messagesDir, \".translate-map.json\");\n\tlet content: string;\n\ttry {\n\t\tcontent = await readFile(mapPath, \"utf-8\");\n\t} catch {\n\t\treturn {};\n\t}\n\ttry {\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\tlogWarning(\n\t\t\t`.translate-map.json is corrupted (invalid JSON). Starting fresh.`,\n\t\t);\n\t\treturn {};\n\t}\n}\n\nexport async function writeMapFile(\n\tmessagesDir: string,\n\tmap: Record<string, string>,\n): Promise<void> {\n\tconst mapPath = join(messagesDir, \".translate-map.json\");\n\tawait mkdir(messagesDir, { recursive: true });\n\tconst content = `${JSON.stringify(map, null, 2)}\\n`;\n\tawait writeFile(mapPath, content, \"utf-8\");\n}\n\nexport async function loadSplitMessages(\n\tdir: string,\n): Promise<Record<string, string>> {\n\tlet files: string[];\n\ttry {\n\t\tfiles = await readdir(dir);\n\t} catch {\n\t\treturn {};\n\t}\n\n\tconst flat: Record<string, string> = {};\n\tfor (const file of files.filter((f) => f.endsWith(\".json\"))) {\n\t\tconst ns = file.replace(\".json\", \"\");\n\t\tconst raw = await loadJsonFile(join(dir, file));\n\t\tconst nsFlat = flatten(raw);\n\t\tfor (const [key, value] of Object.entries(nsFlat)) {\n\t\t\tif (ns === \"_root\") {\n\t\t\t\tflat[key] = value;\n\t\t\t} else {\n\t\t\t\tflat[`${ns}.${key}`] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport async function loadSourceFlat(\n\tconfig: TranslateKitConfig,\n): Promise<Record<string, string>> {\n\tconst mode = config.mode;\n\tif (mode === \"inline\") {\n\t\tconst mapData = await loadMapFile(config.messagesDir);\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(mapData).map(([text, key]) => [key, text]),\n\t\t);\n\t}\n\tif (config.splitByNamespace) {\n\t\treturn loadSplitMessages(join(config.messagesDir, config.sourceLocale));\n\t}\n\tconst sourceRaw = await loadJsonFile(\n\t\tjoin(config.messagesDir, `${config.sourceLocale}.json`),\n\t);\n\treturn flatten(sourceRaw);\n}\n\n// --- Scan step ---\n\nexport interface ScanStepInput {\n\tconfig: TranslateKitConfig;\n\tcwd: string;\n\tcallbacks?: {\n\t\tonScanProgress?: (completed: number, total: number) => void;\n\t\tonKeygenProgress?: (completed: number, total: number) => void;\n\t\tonUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n\t};\n}\n\nexport interface ScanStepResult {\n\ttextToKey: Record<string, string>;\n\tsourceFlat: Record<string, string>;\n\tbareStringCount: number;\n\tfileCount: number;\n}\n\nexport async function runScanStep(\n\tinput: ScanStepInput,\n): Promise<ScanStepResult> {\n\tconst { config, cwd, callbacks } = input;\n\tconst mode = config.mode;\n\n\tconst result = await scan(config.scan!, cwd, {\n\t\tonProgress: callbacks?.onScanProgress,\n\t});\n\n\t// Blacklist filter: exclude already-wrapped strings\n\tconst bareStrings = result.strings.filter((s) => {\n\t\tif (s.type === \"t-call\") return false;\n\t\tif (s.type === \"T-component\" && s.id) return false;\n\t\treturn true;\n\t});\n\n\tconst existingMap = await loadMapFile(config.messagesDir);\n\n\t// Inline mode: supplement existingMap with T-components and t-calls from scan\n\tif (mode === \"inline\") {\n\t\tconst existingTComponents = result.strings.filter(\n\t\t\t(s) => s.type === \"T-component\" && s.id,\n\t\t);\n\t\tfor (const tc of existingTComponents) {\n\t\t\tif (tc.id && !(tc.text in existingMap)) {\n\t\t\t\texistingMap[tc.text] = tc.id;\n\t\t\t}\n\t\t}\n\t\tconst existingInlineTCalls = result.strings.filter(\n\t\t\t(s) => s.type === \"t-call\" && s.id,\n\t\t);\n\t\tfor (const tc of existingInlineTCalls) {\n\t\t\tif (tc.id && !(tc.text in existingMap)) {\n\t\t\t\texistingMap[tc.text] = tc.id;\n\t\t\t}\n\t\t}\n\t}\n\n\t// allTexts includes wrapped strings for key deduplication.\n\t// In keys mode, wrapped calls usually expose keys (not source text), so we\n\t// keep existing text entries to avoid pruning valid mappings on re-scans.\n\tconst allTexts = new Set(result.strings.map((s) => s.text));\n\tif (mode === \"keys\") {\n\t\tfor (const text of Object.keys(existingMap)) {\n\t\t\tallTexts.add(text);\n\t\t}\n\t}\n\n\tconst textToKey = await generateSemanticKeys({\n\t\tmodel: config.model,\n\t\tstrings: bareStrings,\n\t\texistingMap,\n\t\tallTexts,\n\t\tbatchSize: config.translation?.batchSize ?? 50,\n\t\tconcurrency: config.translation?.concurrency ?? 3,\n\t\tretries: config.translation?.retries ?? 2,\n\t\tonProgress: callbacks?.onKeygenProgress,\n\t\tonUsage: callbacks?.onUsage,\n\t});\n\n\tawait writeMapFile(config.messagesDir, textToKey);\n\n\t// Keys mode: write source locale JSON\n\tconst sourceFlat: Record<string, string> = {};\n\tfor (const [text, key] of Object.entries(textToKey)) {\n\t\tsourceFlat[key] = text;\n\t}\n\n\tif (mode !== \"inline\") {\n\t\tif (config.splitByNamespace) {\n\t\t\tconst sourceDir = join(config.messagesDir, config.sourceLocale);\n\t\t\tawait writeTranslationSplit(sourceDir, sourceFlat);\n\t\t} else {\n\t\t\tconst sourceFile = join(\n\t\t\t\tconfig.messagesDir,\n\t\t\t\t`${config.sourceLocale}.json`,\n\t\t\t);\n\t\t\tawait mkdir(config.messagesDir, { recursive: true });\n\t\t\tconst nested = unflatten(sourceFlat);\n\t\t\tconst content = `${JSON.stringify(nested, null, 2)}\\n`;\n\t\t\tawait writeFile(sourceFile, content, \"utf-8\");\n\t\t}\n\t\tif (config.typeSafe) {\n\t\t\tawait generateNextIntlTypes(\n\t\t\t\tconfig.messagesDir,\n\t\t\t\tconfig.sourceLocale,\n\t\t\t\tconfig.splitByNamespace,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\ttextToKey,\n\t\tsourceFlat,\n\t\tbareStringCount: bareStrings.length,\n\t\tfileCount: result.fileCount,\n\t};\n}\n\n// --- Codegen step ---\n\nexport interface CodegenStepInput {\n\tconfig: TranslateKitConfig;\n\tcwd: string;\n\ttextToKey?: Record<string, string>;\n\tmoduleFactory?: boolean;\n\tcallbacks?: {\n\t\tonProgress?: (completed: number, total: number) => void;\n\t};\n}\n\nexport async function runCodegenStep(\n\tinput: CodegenStepInput,\n): Promise<CodegenResult> {\n\tconst { config, cwd, callbacks } = input;\n\tconst mode = config.mode;\n\n\tlet textToKey = input.textToKey;\n\tif (!textToKey) {\n\t\ttextToKey = await loadMapFile(config.messagesDir);\n\t\tif (Object.keys(textToKey).length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No .translate-map.json found. Run 'translate-kit scan' first.\",\n\t\t\t);\n\t\t}\n\t}\n\n\treturn codegen(\n\t\t{\n\t\t\tinclude: config.scan!.include,\n\t\t\texclude: config.scan!.exclude,\n\t\t\ttextToKey,\n\t\t\ti18nImport: config.scan!.i18nImport,\n\t\t\tmode,\n\t\t\tcomponentPath: config.inline?.componentPath,\n\t\t\tmoduleFactory: input.moduleFactory,\n\t\t\ttranslatableProps: config.scan!.translatableProps,\n\t\t\tonProgress: callbacks?.onProgress,\n\t\t},\n\t\tcwd,\n\t);\n}\n\n// --- Translate step ---\n\nexport interface TranslateStepInput {\n\tconfig: TranslateKitConfig;\n\tsourceFlat?: Record<string, string>;\n\tlocales?: string[];\n\tforce?: boolean;\n\tdryRun?: boolean;\n\tcallbacks?: {\n\t\tonLocaleProgress?: (\n\t\t\tlocale: string,\n\t\t\tcompleted: number,\n\t\t\ttotal: number,\n\t\t) => void;\n\t\tonUsage?: (usage: { inputTokens: number; outputTokens: number }) => void;\n\t};\n}\n\nexport interface TranslateLocaleResult {\n\tlocale: string;\n\ttranslated: number;\n\tcached: number;\n\tremoved: number;\n\terrors: number;\n\tduration: number;\n}\n\nexport interface TranslateStepResult {\n\tlocaleResults: TranslateLocaleResult[];\n}\n\nexport async function runTranslateStep(\n\tinput: TranslateStepInput,\n): Promise<TranslateStepResult> {\n\tconst { config, callbacks } = input;\n\tconst mode = config.mode;\n\tconst locales = input.locales ?? config.targetLocales;\n\n\t// Resolve sourceFlat\n\tlet sourceFlat = input.sourceFlat;\n\tif (!sourceFlat) {\n\t\tsourceFlat = await loadSourceFlat(config);\n\t}\n\n\tconst localeResults: TranslateLocaleResult[] = [];\n\n\tfor (const locale of locales) {\n\t\tif (locale === config.sourceLocale) {\n\t\t\tlogWarning(`Skipping \"${locale}\" — cannot translate to sourceLocale.`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst start = Date.now();\n\t\tlet targetFlat: Record<string, string>;\n\n\t\tif (config.splitByNamespace) {\n\t\t\tconst targetDir = join(config.messagesDir, locale);\n\t\t\ttargetFlat = await loadSplitMessages(targetDir);\n\t\t} else {\n\t\t\tconst targetFile = join(config.messagesDir, `${locale}.json`);\n\t\t\tconst targetRaw = await loadJsonFile(targetFile);\n\t\t\ttargetFlat = flatten(targetRaw);\n\t\t}\n\n\t\tlet lockData = await loadLockFile(config.messagesDir);\n\t\tif (input.force) {\n\t\t\tlockData = {};\n\t\t}\n\n\t\tconst diffResult = computeDiff(sourceFlat, targetFlat, lockData);\n\n\t\tif (input.dryRun) {\n\t\t\tlocaleResults.push({\n\t\t\t\tlocale,\n\t\t\t\ttranslated: 0,\n\t\t\t\tcached: Object.keys(diffResult.unchanged).length,\n\t\t\t\tremoved: diffResult.removed.length,\n\t\t\t\terrors: 0,\n\t\t\t\tduration: Date.now() - start,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst toTranslate = { ...diffResult.added, ...diffResult.modified };\n\t\tlet translated: Record<string, string> = {};\n\t\tlet errors = 0;\n\t\tlet translationFailed = false;\n\n\t\tif (Object.keys(toTranslate).length > 0) {\n\t\t\ttry {\n\t\t\t\ttranslated = await translateAll({\n\t\t\t\t\tmodel: config.model,\n\t\t\t\t\tentries: toTranslate,\n\t\t\t\t\tsourceLocale: config.sourceLocale,\n\t\t\t\t\ttargetLocale: locale,\n\t\t\t\t\toptions: config.translation,\n\t\t\t\t\tonProgress: callbacks?.onLocaleProgress\n\t\t\t\t\t\t? (c, t) => callbacks.onLocaleProgress!(locale, c, t)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tonUsage: callbacks?.onUsage,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\t\tlogWarning(`Translation failed for \"${locale}\": ${msg}`);\n\t\t\t\terrors = Object.keys(toTranslate).length;\n\t\t\t\ttranslationFailed = true;\n\t\t\t}\n\t\t}\n\n\t\tif (translationFailed) {\n\t\t\tlocaleResults.push({\n\t\t\t\tlocale,\n\t\t\t\ttranslated: 0,\n\t\t\t\tcached: Object.keys(diffResult.unchanged).length,\n\t\t\t\tremoved: 0,\n\t\t\t\terrors,\n\t\t\t\tduration: Date.now() - start,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst finalFlat: Record<string, string> = {\n\t\t\t...diffResult.unchanged,\n\t\t\t...translated,\n\t\t};\n\n\t\tif (config.splitByNamespace) {\n\t\t\tconst targetDir = join(config.messagesDir, locale);\n\t\t\tawait writeTranslationSplit(targetDir, finalFlat);\n\t\t} else {\n\t\t\tconst targetFile = join(config.messagesDir, `${locale}.json`);\n\t\t\tawait writeTranslation(targetFile, finalFlat, {\n\t\t\t\tflat: mode === \"inline\",\n\t\t\t});\n\t\t}\n\n\t\tconst allTranslatedKeys = Object.keys(finalFlat);\n\t\tconst currentLock = await loadLockFile(config.messagesDir);\n\t\tawait writeLockFile(\n\t\t\tconfig.messagesDir,\n\t\t\tsourceFlat,\n\t\t\tcurrentLock,\n\t\t\tallTranslatedKeys,\n\t\t);\n\n\t\tlocaleResults.push({\n\t\t\tlocale,\n\t\t\ttranslated: Object.keys(translated).length,\n\t\t\tcached: Object.keys(diffResult.unchanged).length,\n\t\t\tremoved: diffResult.removed.length,\n\t\t\terrors,\n\t\t\tduration: Date.now() - start,\n\t\t});\n\t}\n\n\treturn { localeResults };\n}\n","import type { LanguageModel } from \"ai\";\nimport { fetchModels, getTokenCosts } from \"tokenlens\";\n\nexport interface TokenUsage {\n\tinputTokens: number;\n\toutputTokens: number;\n\ttotalTokens: number;\n}\n\nexport function createUsageTracker() {\n\tlet inputTokens = 0;\n\tlet outputTokens = 0;\n\treturn {\n\t\tadd(usage: { inputTokens?: number; outputTokens?: number }) {\n\t\t\tinputTokens += usage.inputTokens ?? 0;\n\t\t\toutputTokens += usage.outputTokens ?? 0;\n\t\t},\n\t\tget(): TokenUsage {\n\t\t\treturn {\n\t\t\t\tinputTokens,\n\t\t\t\toutputTokens,\n\t\t\t\ttotalTokens: inputTokens + outputTokens,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport async function estimateCost(\n\tmodel: LanguageModel,\n\tusage: TokenUsage,\n): Promise<{ totalUSD: number; inputUSD: number; outputUSD: number } | null> {\n\ttry {\n\t\tconst m = model as Record<string, unknown>;\n\t\tconst provider = typeof m.provider === \"string\" ? m.provider : \"unknown\";\n\t\tconst modelId = typeof m.modelId === \"string\" ? m.modelId : \"unknown\";\n\t\tconst fullId = `${provider}/${modelId}`;\n\t\tconst providers = await fetchModels(provider);\n\t\tconst costs = getTokenCosts({\n\t\t\tmodelId: fullId,\n\t\t\tusage: {\n\t\t\t\tprompt_tokens: usage.inputTokens,\n\t\t\t\tcompletion_tokens: usage.outputTokens,\n\t\t\t},\n\t\t\tproviders,\n\t\t});\n\t\tif (costs.totalUSD == null) return null;\n\t\treturn {\n\t\t\ttotalUSD: costs.totalUSD,\n\t\t\tinputUSD: costs.inputUSD ?? 0,\n\t\t\toutputUSD: costs.outputUSD ?? 0,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function formatUsage(usage: TokenUsage): string {\n\treturn `${usage.inputTokens.toLocaleString()} in + ${usage.outputTokens.toLocaleString()} out = ${usage.totalTokens.toLocaleString()} tokens`;\n}\n\nexport function formatCost(usd: number): string {\n\treturn usd < 0.01 ? `~$${usd.toFixed(4)}` : `~$${usd.toFixed(2)}`;\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 SPLIT_LOAD_BODY = ` try {\n const { readFile, readdir } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\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\nfunction buildSingleFileLoadBody(\n\ttargetLocales: string[],\n\trelativeMessagesDir: string,\n): string {\n\t// Generate static import() calls per locale — works on all platforms\n\tconst cases = targetLocales\n\t\t.map(\n\t\t\t(locale) =>\n\t\t\t\t` case \"${locale}\": return (await import(\"${relativeMessagesDir}/${locale}.json\")).default;`,\n\t\t)\n\t\t.join(\"\\n\");\n\n\treturn ` try {\\n switch (locale) {\\n${cases}\\n default: return {};\\n }\\n } catch {\\n return {};\\n }`;\n}\n\nexport function serverTemplate(\n\tclientBasename: string,\n\topts?: {\n\t\tsourceLocale: string;\n\t\ttargetLocales: string[];\n\t\tmessagesDir: string;\n\t\tsplitByNamespace?: boolean;\n\t\trelativeMessagesDir?: string;\n\t},\n): string {\n\tif (!opts) {\n\t\t// Legacy fallback (no lazy loading)\n\t\treturn `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\t}\n\n\tconst allLocales = [opts.sourceLocale, ...opts.targetLocales];\n\tconst allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n\n\tconst isSplit = !!opts.splitByNamespace;\n\t// Compute the relative import path for messages directory\n\tlet messagesImportPath = opts.relativeMessagesDir ?? opts.messagesDir;\n\t// Ensure it starts with ./ or ../ for relative imports\n\tif (\n\t\t!messagesImportPath.startsWith(\".\") &&\n\t\t!messagesImportPath.startsWith(\"/\")\n\t) {\n\t\tmessagesImportPath = `./${messagesImportPath}`;\n\t}\n\tconst loadBody = isSplit\n\t\t? SPLIT_LOAD_BODY\n\t\t: buildSingleFileLoadBody(opts.targetLocales, messagesImportPath);\n\t// messagesDir const is only needed for split mode (filesystem loading)\n\tconst messagesDirConst = isSplit\n\t\t? `\\nconst messagesDir = \"${opts.messagesDir}\";\\n`\n\t\t: \"\\n\";\n\n\treturn `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}\";${messagesDirConst}\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 on all platforms via static imports\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${loadBody}\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\tsourceLocale: string;\n\ttargetLocales: string[];\n\tmessagesDir: string;\n\tsplitByNamespace?: boolean;\n}): string {\n\tconst allLocales = [opts.sourceLocale, ...opts.targetLocales];\n\tconst allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n\n\tconst fsImports = opts.splitByNamespace\n\t\t? `import { readFile, readdir } from \"node:fs/promises\";`\n\t\t: `import { readFile } from \"node:fs/promises\";`;\n\n\tconst getMessagesBody = opts.splitByNamespace\n\t\t? ` 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\t\t: ` 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\treturn `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 { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, join, relative } from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { validateLocale } from \"./cli-utils.js\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport { runCodegenStep, runScanStep, runTranslateStep } from \"./pipeline.js\";\nimport { parseFile } from \"./scanner/parser.js\";\nimport {\n\tCLIENT_TEMPLATE,\n\tgenerateI18nHelper,\n\tserverTemplate,\n} from \"./templates/t-component.js\";\nimport {\n\tcreateUsageTracker,\n\testimateCost,\n\tformatCost,\n\tformatUsage,\n} from \"./usage.js\";\n\nconst AI_PROVIDERS = {\n\topenai: {\n\t\tpkg: \"@ai-sdk/openai\",\n\t\tfn: \"openai\",\n\t\tdefaultModel: \"gpt-4o-mini\",\n\t},\n\tanthropic: {\n\t\tpkg: \"@ai-sdk/anthropic\",\n\t\tfn: \"anthropic\",\n\t\tdefaultModel: \"claude-sonnet-4-20250514\",\n\t},\n\tgoogle: {\n\t\tpkg: \"@ai-sdk/google\",\n\t\tfn: \"google\",\n\t\tdefaultModel: \"gemini-2.0-flash\",\n\t},\n\tmistral: {\n\t\tpkg: \"@ai-sdk/mistral\",\n\t\tfn: \"mistral\",\n\t\tdefaultModel: \"mistral-large-latest\",\n\t},\n\tgroq: {\n\t\tpkg: \"@ai-sdk/groq\",\n\t\tfn: \"groq\",\n\t\tdefaultModel: \"llama-3.3-70b-versatile\",\n\t},\n} as const;\n\ntype ProviderKey = keyof typeof AI_PROVIDERS;\n\nconst LOCALE_OPTIONS = [\n\t{ value: \"en\", label: \"English (en)\" },\n\t{ value: \"es\", label: \"Spanish (es)\" },\n\t{ value: \"fr\", label: \"French (fr)\" },\n\t{ value: \"de\", label: \"German (de)\" },\n\t{ value: \"pt\", label: \"Portuguese (pt)\" },\n\t{ value: \"ja\", label: \"Japanese (ja)\" },\n\t{ value: \"zh\", label: \"Chinese (zh)\" },\n\t{ value: \"ko\", label: \"Korean (ko)\" },\n\t{ value: \"ru\", label: \"Russian (ru)\" },\n\t{ value: \"ar\", label: \"Arabic (ar)\" },\n\t{ value: \"it\", label: \"Italian (it)\" },\n];\n\nexport function detectIncludePatterns(cwd: string): string[] {\n\tconst patterns: string[] = [];\n\tconst hasSrc = existsSync(join(cwd, \"src\"));\n\n\t// App router — prefer src/app over app\n\tif (hasSrc && existsSync(join(cwd, \"src\", \"app\"))) {\n\t\tpatterns.push(\"src/app/**/*.tsx\", \"src/app/**/*.jsx\");\n\t} else if (existsSync(join(cwd, \"app\"))) {\n\t\tpatterns.push(\"app/**/*.tsx\", \"app/**/*.jsx\");\n\t}\n\n\t// Pages router\n\tif (hasSrc && existsSync(join(cwd, \"src\", \"pages\"))) {\n\t\tpatterns.push(\"src/pages/**/*.tsx\", \"src/pages/**/*.jsx\");\n\t} else if (existsSync(join(cwd, \"pages\"))) {\n\t\tpatterns.push(\"pages/**/*.tsx\", \"pages/**/*.jsx\");\n\t}\n\n\t// Components\n\tif (hasSrc && existsSync(join(cwd, \"src\", \"components\"))) {\n\t\tpatterns.push(\"src/components/**/*.tsx\", \"src/components/**/*.jsx\");\n\t} else if (existsSync(join(cwd, \"components\"))) {\n\t\tpatterns.push(\"components/**/*.tsx\", \"components/**/*.jsx\");\n\t}\n\n\treturn patterns.length > 0 ? patterns : [\"**/*.tsx\", \"**/*.jsx\"];\n}\n\nfunction cancel(): never {\n\tp.cancel(\"Setup cancelled.\");\n\tprocess.exit(0);\n}\n\nfunction findPackageInNodeModules(cwd: string, pkg: string): boolean {\n\tlet dir = cwd;\n\tconst parts = pkg.split(\"/\");\n\twhile (true) {\n\t\tif (existsSync(join(dir, \"node_modules\", ...parts, \"package.json\"))) {\n\t\t\treturn true;\n\t\t}\n\t\tconst parent = join(dir, \"..\");\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn false;\n}\n\nasync function ensurePackageInstalled(\n\tcwd: string,\n\tpkg: string,\n\tlabel: string,\n): Promise<void> {\n\twhile (!findPackageInNodeModules(cwd, pkg)) {\n\t\tp.log.warn(`${label} (${pkg}) is not installed.`);\n\t\tconst retry = await p.confirm({\n\t\t\tmessage: `Install it now with your package manager, then press Enter. Continue?`,\n\t\t});\n\t\tif (p.isCancel(retry) || !retry) cancel();\n\t}\n\tp.log.success(`${label} found.`);\n}\n\nexport function generateConfigFile(opts: {\n\tproviderKey: ProviderKey;\n\tmodelName: string;\n\tsourceLocale: string;\n\ttargetLocales: string[];\n\tmessagesDir: string;\n\tincludePatterns: string[];\n\ti18nImport: string;\n\tcontext: string;\n\ttone: string;\n\tmode: \"keys\" | \"inline\";\n\tcomponentPath?: string;\n\tsplitByNamespace?: boolean;\n\ttypeSafe?: boolean;\n}): string {\n\tconst provider = AI_PROVIDERS[opts.providerKey];\n\tconst lines: string[] = [];\n\n\tlines.push(`import { ${provider.fn} } from \"${provider.pkg}\";`);\n\tlines.push(``);\n\tlines.push(`export default {`);\n\tlines.push(` model: ${provider.fn}(\"${opts.modelName}\"),`);\n\tif (opts.mode === \"inline\") {\n\t\tlines.push(` mode: \"inline\",`);\n\t}\n\tlines.push(` sourceLocale: \"${opts.sourceLocale}\",`);\n\tlines.push(\n\t\t` targetLocales: [${opts.targetLocales.map((l) => `\"${l}\"`).join(\", \")}],`,\n\t);\n\tlines.push(` messagesDir: \"${opts.messagesDir}\",`);\n\tif (opts.splitByNamespace) {\n\t\tlines.push(` splitByNamespace: true,`);\n\t}\n\tif (opts.typeSafe) {\n\t\tlines.push(` typeSafe: true,`);\n\t}\n\n\tconst hasTranslation = opts.context || opts.tone !== \"neutral\";\n\tif (hasTranslation) {\n\t\tlines.push(` translation: {`);\n\t\tif (opts.context) {\n\t\t\tlines.push(` context: \"${opts.context}\",`);\n\t\t}\n\t\tif (opts.tone !== \"neutral\") {\n\t\t\tlines.push(` tone: \"${opts.tone}\",`);\n\t\t}\n\t\tlines.push(` },`);\n\t}\n\n\tlines.push(` scan: {`);\n\tlines.push(\n\t\t` include: [${opts.includePatterns.map((p) => `\"${p}\"`).join(\", \")}],`,\n\t);\n\tlines.push(` // Add more directories as needed. Examples:`);\n\tlines.push(\n\t\t` // \"config/**/*.ts\" — for data/config files (needed with --module-factory)`,\n\t);\n\tlines.push(\n\t\t` // \"lib/**/*.ts\" — for utility files with translatable strings`,\n\t);\n\tlines.push(` // \"layouts/**/*.tsx\" — for layout components`);\n\tlines.push(` //`);\n\tlines.push(\n\t\t` // Note: When using codegen --module-factory, include any directories`,\n\t);\n\tlines.push(\n\t\t` // that contain exported constants with translatable strings (e.g. config/).`,\n\t);\n\tlines.push(` exclude: [\"**/*.test.*\", \"**/*.spec.*\"],`);\n\tif (opts.mode === \"keys\" && opts.i18nImport) {\n\t\tlines.push(` i18nImport: \"${opts.i18nImport}\",`);\n\t}\n\tlines.push(` },`);\n\n\tif (opts.mode === \"inline\" && opts.componentPath) {\n\t\tlines.push(` inline: {`);\n\t\tlines.push(` componentPath: \"${opts.componentPath}\",`);\n\t\tlines.push(` },`);\n\t}\n\n\tlines.push(`};`);\n\tlines.push(``);\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction canParse(content: string, filePath: string): boolean {\n\ttry {\n\t\tparseFile(content, filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function safeWriteModifiedFile(\n\tfilePath: string,\n\tmodified: string,\n\tlabel: string,\n): Promise<boolean> {\n\tif (!canParse(modified, filePath)) {\n\t\tp.log.warn(\n\t\t\t`Could not safely modify ${label}. Please apply changes manually:\\n` +\n\t\t\t\t` File: ${filePath}`,\n\t\t);\n\t\treturn false;\n\t}\n\tawait writeFile(filePath, modified, \"utf-8\");\n\treturn true;\n}\n\nfunction detectSrcDir(cwd: string): boolean {\n\treturn existsSync(join(cwd, \"src\", \"app\"));\n}\n\nfunction resolveComponentPath(cwd: string, componentPath: string): string {\n\tif (componentPath.startsWith(\"@/\")) {\n\t\tconst rel = componentPath.slice(2);\n\t\tconst useSrc = existsSync(join(cwd, \"src\"));\n\t\treturn join(cwd, useSrc ? \"src\" : \"\", rel);\n\t}\n\tif (componentPath.startsWith(\"~/\")) {\n\t\treturn join(cwd, componentPath.slice(2));\n\t}\n\treturn join(cwd, componentPath);\n}\n\nfunction findLayoutFile(base: string): string | undefined {\n\tfor (const ext of [\"tsx\", \"jsx\", \"ts\", \"js\"]) {\n\t\tconst candidate = join(base, \"app\", `layout.${ext}`);\n\t\tif (existsSync(candidate)) return candidate;\n\t}\n\treturn undefined;\n}\n\nasync function createEmptyMessageFiles(\n\tmsgDir: string,\n\tlocales: string[],\n\tsplitByNamespace?: boolean,\n): Promise<void> {\n\tawait mkdir(msgDir, { recursive: true });\n\tfor (const locale of locales) {\n\t\tif (splitByNamespace) {\n\t\t\tawait mkdir(join(msgDir, locale), { recursive: true });\n\t\t} else {\n\t\t\tconst msgFile = join(msgDir, `${locale}.json`);\n\t\t\tif (!existsSync(msgFile)) {\n\t\t\t\tawait writeFile(msgFile, \"{}\\n\", \"utf-8\");\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction insertImportsAfterLast(content: string, importLines: string): string {\n\tconst lastImportIdx = content.lastIndexOf(\"import \");\n\tconst endOfLastImport = content.indexOf(\"\\n\", lastImportIdx);\n\treturn (\n\t\tcontent.slice(0, endOfLastImport + 1) +\n\t\timportLines +\n\t\tcontent.slice(endOfLastImport + 1)\n\t);\n}\n\nfunction ensureAsyncLayout(content: string): string {\n\tif (content.match(/async\\s+function\\s+\\w*Layout/)) return content;\n\treturn content.replace(\n\t\t/export\\s+default\\s+function\\s+(\\w*Layout)/,\n\t\t\"export default async function $1\",\n\t);\n}\n\nasync function setupNextIntl(\n\tcwd: string,\n\tsourceLocale: string,\n\ttargetLocales: string[],\n\tmessagesDir: string,\n\tsplitByNamespace?: boolean,\n): Promise<void> {\n\tconst useSrc = detectSrcDir(cwd);\n\tconst base = useSrc ? join(cwd, \"src\") : cwd;\n\tconst allLocales = [sourceLocale, ...targetLocales];\n\tconst filesCreated: string[] = [];\n\n\tconst i18nDir = join(base, \"i18n\");\n\tawait mkdir(i18nDir, { recursive: true });\n\n\tconst requestFile = join(i18nDir, \"request.ts\");\n\tif (!existsSync(requestFile)) {\n\t\tconst relMessages = relative(i18nDir, join(cwd, messagesDir));\n\t\tconst allLocalesStr = allLocales.map((l) => `\"${l}\"`).join(\", \");\n\n\t\tconst messagesLoader = splitByNamespace\n\t\t\t? `await loadNamespaceMessages(join(process.cwd(), \"${messagesDir}\", locale))`\n\t\t\t: `(await import(\\`${relMessages}/\\${locale}.json\\`)).default`;\n\n\t\tconst splitHelpers = splitByNamespace\n\t\t\t? `\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\t\t\t: \"\";\n\n\t\tawait writeFile(\n\t\t\trequestFile,\n\t\t\t`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\t\t\t\"utf-8\",\n\t\t);\n\t\tfilesCreated.push(relative(cwd, requestFile));\n\t}\n\n\tconst nextConfigPath = join(cwd, \"next.config.ts\");\n\tif (existsSync(nextConfigPath)) {\n\t\tconst content = await readFile(nextConfigPath, \"utf-8\");\n\t\tif (!content.includes(\"next-intl\")) {\n\t\t\tconst importLine = `import createNextIntlPlugin from \"next-intl/plugin\";\\n`;\n\t\t\tconst pluginLine = `const withNextIntl = createNextIntlPlugin();\\n`;\n\n\t\t\tconst wrapped = content.replace(\n\t\t\t\t/export default (.+?);/,\n\t\t\t\t\"export default withNextIntl($1);\",\n\t\t\t);\n\n\t\t\tconst updated = `${importLine}\\n${pluginLine}\\n${wrapped}`;\n\t\t\tif (\n\t\t\t\tawait safeWriteModifiedFile(nextConfigPath, updated, \"next.config.ts\")\n\t\t\t) {\n\t\t\t\tfilesCreated.push(\"next.config.ts (updated)\");\n\t\t\t}\n\t\t}\n\t}\n\n\tconst layoutPath = findLayoutFile(base);\n\n\tif (layoutPath) {\n\t\tlet layoutContent = await readFile(layoutPath, \"utf-8\");\n\t\tif (!layoutContent.includes(\"NextIntlClientProvider\")) {\n\t\t\tconst importLines =\n\t\t\t\t'import { NextIntlClientProvider } from \"next-intl\";\\n' +\n\t\t\t\t'import { getMessages } from \"next-intl/server\";\\n';\n\n\t\t\tlayoutContent = insertImportsAfterLast(layoutContent, importLines);\n\t\t\tlayoutContent = ensureAsyncLayout(layoutContent);\n\n\t\t\tlayoutContent = layoutContent.replace(\n\t\t\t\t/return\\s*\\(/,\n\t\t\t\t\"const messages = await getMessages();\\n\\n return (\",\n\t\t\t);\n\n\t\t\tlayoutContent = layoutContent.replace(\n\t\t\t\t/(<body[^>]*>)/,\n\t\t\t\t\"$1\\n <NextIntlClientProvider messages={messages}>\",\n\t\t\t);\n\t\t\tlayoutContent = layoutContent.replace(\n\t\t\t\t/<\\/body>/,\n\t\t\t\t\" </NextIntlClientProvider>\\n </body>\",\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\tawait safeWriteModifiedFile(layoutPath, layoutContent, \"root layout\")\n\t\t\t) {\n\t\t\t\tfilesCreated.push(`${relative(cwd, layoutPath)} (updated)`);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait createEmptyMessageFiles(\n\t\tjoin(cwd, messagesDir),\n\t\tallLocales,\n\t\tsplitByNamespace,\n\t);\n\n\tif (filesCreated.length > 0) {\n\t\tp.log.success(`next-intl configured: ${filesCreated.join(\", \")}`);\n\t}\n}\n\nasync function dropInlineComponents(\n\tcwd: string,\n\tcomponentPath: string,\n\tlocaleOpts: {\n\t\tsourceLocale: string;\n\t\ttargetLocales: string[];\n\t\tmessagesDir: string;\n\t\tsplitByNamespace?: boolean;\n\t},\n): Promise<void> {\n\tconst fsPath = resolveComponentPath(cwd, componentPath);\n\tconst dir = join(fsPath, \"..\");\n\tawait mkdir(dir, { recursive: true });\n\n\tconst clientFile = `${fsPath}.tsx`;\n\tconst serverFile = `${fsPath}-server.tsx`;\n\tconst clientBasename = basename(fsPath);\n\n\t// Compute relative path from server template dir to messagesDir for static imports\n\tconst serverDir = join(serverFile, \"..\");\n\tconst absoluteMessagesDir = join(cwd, localeOpts.messagesDir);\n\tlet relativeMessagesDir = relative(serverDir, absoluteMessagesDir);\n\tif (!relativeMessagesDir.startsWith(\".\")) {\n\t\trelativeMessagesDir = `./${relativeMessagesDir}`;\n\t}\n\n\tawait writeFile(clientFile, CLIENT_TEMPLATE, \"utf-8\");\n\tawait writeFile(\n\t\tserverFile,\n\t\tserverTemplate(clientBasename, { ...localeOpts, relativeMessagesDir }),\n\t\t\"utf-8\",\n\t);\n\n\tconst relClient = relative(cwd, clientFile);\n\tconst relServer = relative(cwd, serverFile);\n\tp.log.success(`Created inline components: ${relClient}, ${relServer}`);\n}\n\nasync function setupInlineI18n(\n\tcwd: string,\n\tcomponentPath: string,\n\tsourceLocale: string,\n\ttargetLocales: string[],\n\tmessagesDir: string,\n\tsplitByNamespace?: boolean,\n): Promise<void> {\n\tconst useSrc = existsSync(join(cwd, \"src\"));\n\tconst base = useSrc ? join(cwd, \"src\") : cwd;\n\tconst filesCreated: string[] = [];\n\n\tconst i18nDir = join(base, \"i18n\");\n\tawait mkdir(i18nDir, { recursive: true });\n\n\tconst helperFile = join(i18nDir, \"index.ts\");\n\tif (!existsSync(helperFile)) {\n\t\tconst helperContent = generateI18nHelper({\n\t\t\tsourceLocale,\n\t\t\ttargetLocales,\n\t\t\tmessagesDir,\n\t\t\tsplitByNamespace,\n\t\t});\n\t\tawait writeFile(helperFile, helperContent, \"utf-8\");\n\t\tfilesCreated.push(relative(cwd, helperFile));\n\t}\n\n\tconst layoutPath = findLayoutFile(base);\n\n\tif (layoutPath) {\n\t\tlet layoutContent = await readFile(layoutPath, \"utf-8\");\n\t\tif (!layoutContent.includes(\"I18nProvider\")) {\n\t\t\tconst importLines =\n\t\t\t\t`import { I18nProvider } from \"${componentPath}\";\\n` +\n\t\t\t\t`import { setServerMessages, setLocale } from \"${componentPath}-server\";\\n` +\n\t\t\t\t`import { getLocale, getMessages } from \"@/i18n\";\\n`;\n\n\t\t\tlayoutContent = insertImportsAfterLast(layoutContent, importLines);\n\t\t\tlayoutContent = ensureAsyncLayout(layoutContent);\n\n\t\t\tlayoutContent = layoutContent.replace(\n\t\t\t\t/return\\s*\\(/,\n\t\t\t\t\"const locale = await getLocale();\\n\\tsetLocale(locale);\\n\\tconst messages = await getMessages(locale);\\n\\tsetServerMessages(messages);\\n\\n\\treturn (\",\n\t\t\t);\n\n\t\t\tlayoutContent = layoutContent.replace(\n\t\t\t\t/(<body[^>]*>)/,\n\t\t\t\t\"$1\\n\\t\\t\\t\\t<I18nProvider messages={messages} locale={locale}>\",\n\t\t\t);\n\t\t\tlayoutContent = layoutContent.replace(\n\t\t\t\t/<\\/body>/,\n\t\t\t\t\"\\t</I18nProvider>\\n\\t\\t\\t</body>\",\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\tawait safeWriteModifiedFile(layoutPath, layoutContent, \"root layout\")\n\t\t\t) {\n\t\t\t\tfilesCreated.push(`${relative(cwd, layoutPath)} (updated)`);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait createEmptyMessageFiles(\n\t\tjoin(cwd, messagesDir),\n\t\t[sourceLocale, ...targetLocales],\n\t\tsplitByNamespace,\n\t);\n\n\tif (filesCreated.length > 0) {\n\t\tp.log.success(`Inline i18n configured: ${filesCreated.join(\", \")}`);\n\t}\n}\n\nexport async function updateLayoutWithSelectiveMessages(\n\tcwd: string,\n\tclientNamespaces: string[],\n): Promise<void> {\n\tif (clientNamespaces.length === 0) return;\n\n\tconst useSrc = detectSrcDir(cwd);\n\tconst base = useSrc ? join(cwd, \"src\") : cwd;\n\tconst layoutPath = findLayoutFile(base);\n\tif (!layoutPath) return;\n\n\tlet content = await readFile(layoutPath, \"utf-8\");\n\n\tconst isNextIntl = content.includes(\"NextIntlClientProvider\");\n\tconst isInline = content.includes(\"I18nProvider\") && !isNextIntl;\n\n\tif (!isNextIntl && !isInline) return;\n\n\tconst namespacesStr = clientNamespaces.map((n) => `\"${n}\"`).join(\", \");\n\n\tif (content.includes(\"clientMessages\")) {\n\t\t// Already updated — just refresh the namespace list\n\t\tcontent = content.replace(\n\t\t\t/pickMessages\\(messages,\\s*\\[.*?\\]\\)/,\n\t\t\t`pickMessages(messages, [${namespacesStr}])`,\n\t\t);\n\t} else {\n\t\tif (!content.includes(\"messages={messages}\")) return;\n\n\t\t// Add pickMessages helper — different filter logic for inline vs keys mode\n\t\tif (!content.includes(\"pickMessages\")) {\n\t\t\tconst helper = isInline\n\t\t\t\t? '\\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\t\t\t\t: '\\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\t\t\tcontent = insertImportsAfterLast(content, helper);\n\t\t}\n\n\t\t// Insert clientMessages after getMessages() — handle both signatures\n\t\tcontent = content.replace(\n\t\t\t/const messages = await getMessages\\([^)]*\\);/,\n\t\t\t`$&\\n const clientMessages = pickMessages(messages, [${namespacesStr}]);`,\n\t\t);\n\n\t\t// Replace messages={messages} with messages={clientMessages}\n\t\tcontent = content.replace(\n\t\t\t\"messages={messages}\",\n\t\t\t\"messages={clientMessages}\",\n\t\t);\n\t}\n\n\tif (\n\t\tawait safeWriteModifiedFile(\n\t\t\tlayoutPath,\n\t\t\tcontent,\n\t\t\t\"root layout (selective messages)\",\n\t\t)\n\t) {\n\t\tconst rel = relative(cwd, layoutPath);\n\t\tp.log.success(\n\t\t\t`Updated ${rel} with selective message passing (${clientNamespaces.length} namespaces)`,\n\t\t);\n\t}\n}\n\n// --- Main wizard ---\n\nexport async function runInitWizard(): Promise<void> {\n\tconst cwd = process.cwd();\n\tconst configPath = join(cwd, \"translate-kit.config.ts\");\n\n\tp.intro(\"translate-kit setup\");\n\n\tif (existsSync(configPath)) {\n\t\tconst overwrite = await p.confirm({\n\t\t\tmessage: \"translate-kit.config.ts already exists. Overwrite?\",\n\t\t});\n\t\tif (p.isCancel(overwrite)) cancel();\n\t\tif (!overwrite) {\n\t\t\tp.outro(\"Keeping existing config.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst mode = await p.select({\n\t\tmessage: \"Translation mode:\",\n\t\toptions: [\n\t\t\t{\n\t\t\t\tvalue: \"keys\" as const,\n\t\t\t\tlabel: \"Keys mode\",\n\t\t\t\thint: \"t('key') + JSON files\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: \"inline\" as const,\n\t\t\t\tlabel: \"Inline mode\",\n\t\t\t\thint: \"<T id='key'>text</T>, text stays in code\",\n\t\t\t},\n\t\t],\n\t});\n\tif (p.isCancel(mode)) cancel();\n\n\tconst providerKey = await p.select({\n\t\tmessage: \"AI provider:\",\n\t\toptions: Object.entries(AI_PROVIDERS).map(([key, val]) => ({\n\t\t\tvalue: key as ProviderKey,\n\t\t\tlabel: key.charAt(0).toUpperCase() + key.slice(1),\n\t\t\thint: val.pkg,\n\t\t})),\n\t});\n\tif (p.isCancel(providerKey)) cancel();\n\n\tconst provider = AI_PROVIDERS[providerKey];\n\n\tconst modelName = await p.text({\n\t\tmessage: \"Model:\",\n\t\tinitialValue: provider.defaultModel,\n\t});\n\tif (p.isCancel(modelName)) cancel();\n\n\tconst sourceLocale = await p.text({\n\t\tmessage: \"Source locale:\",\n\t\tinitialValue: \"en\",\n\t\tvalidate(value = \"\") {\n\t\t\tif (!validateLocale(value)) {\n\t\t\t\treturn \"Invalid locale. Use only letters, numbers, hyphens, and underscores.\";\n\t\t\t}\n\t\t},\n\t});\n\tif (p.isCancel(sourceLocale)) cancel();\n\n\tconst targetLocales = await p.multiselect({\n\t\tmessage: \"Target locales:\",\n\t\toptions: LOCALE_OPTIONS.filter((o) => o.value !== sourceLocale),\n\t\trequired: true,\n\t});\n\tif (p.isCancel(targetLocales)) cancel();\n\n\tconst messagesDir = await p.text({\n\t\tmessage: \"Messages directory:\",\n\t\tinitialValue: \"./messages\",\n\t});\n\tif (p.isCancel(messagesDir)) cancel();\n\n\tlet splitByNamespace = false;\n\t{\n\t\tconst split = await p.confirm({\n\t\t\tmessage:\n\t\t\t\t\"Split messages by namespace? (messages/en/hero.json instead of en.json)\",\n\t\t\tinitialValue: false,\n\t\t});\n\t\tif (p.isCancel(split)) cancel();\n\t\tsplitByNamespace = split;\n\t}\n\n\tconst detected = detectIncludePatterns(cwd);\n\n\tconst patternsInput = await p.text({\n\t\tmessage: \"Include patterns (comma-separated):\",\n\t\tinitialValue: detected.join(\", \"),\n\t\tplaceholder: \"app/**/*.tsx, components/**/*.tsx\",\n\t});\n\tif (p.isCancel(patternsInput)) cancel();\n\tconst includePatterns = patternsInput.split(\",\").map((s) => s.trim());\n\n\tlet i18nImport = \"\";\n\tlet componentPath: string | undefined;\n\tlet typeSafe = false;\n\n\tif (mode === \"inline\") {\n\t\tconst cp = await p.text({\n\t\t\tmessage: \"Component import path:\",\n\t\t\tinitialValue: \"@/components/t\",\n\t\t});\n\t\tif (p.isCancel(cp)) cancel();\n\t\tcomponentPath = cp;\n\t} else {\n\t\ti18nImport = \"next-intl\";\n\n\t\tconst ts = await p.confirm({\n\t\t\tmessage: \"Generate TypeScript types for message keys? (next-intl.d.ts)\",\n\t\t\tinitialValue: true,\n\t\t});\n\t\tif (p.isCancel(ts)) cancel();\n\t\ttypeSafe = ts;\n\t}\n\n\tconst context = await p.text({\n\t\tmessage: \"Project context (optional, for better translations):\",\n\t\tplaceholder: \"e.g. E-commerce platform, SaaS dashboard\",\n\t});\n\tif (p.isCancel(context)) cancel();\n\n\tconst tone = await p.select({\n\t\tmessage: \"Tone:\",\n\t\toptions: [\n\t\t\t{ value: \"neutral\", label: \"Neutral\" },\n\t\t\t{ value: \"formal\", label: \"Formal\" },\n\t\t\t{ value: \"casual\", label: \"Casual\" },\n\t\t],\n\t});\n\tif (p.isCancel(tone)) cancel();\n\n\tawait ensurePackageInstalled(cwd, provider.pkg, \"AI provider\");\n\n\tif (mode !== \"inline\") {\n\t\tawait ensurePackageInstalled(cwd, \"next-intl\", \"next-intl\");\n\t}\n\n\tconst configContent = generateConfigFile({\n\t\tproviderKey,\n\t\tmodelName,\n\t\tsourceLocale,\n\t\ttargetLocales,\n\t\tmessagesDir,\n\t\tincludePatterns,\n\t\ti18nImport,\n\t\tcontext: context ?? \"\",\n\t\ttone,\n\t\tmode,\n\t\tcomponentPath,\n\t\tsplitByNamespace,\n\t\ttypeSafe,\n\t});\n\n\tawait writeFile(configPath, configContent, \"utf-8\");\n\tp.log.success(\"Created translate-kit.config.ts\");\n\n\tif (mode === \"inline\" && componentPath) {\n\t\tawait dropInlineComponents(cwd, componentPath, {\n\t\t\tsourceLocale,\n\t\t\ttargetLocales,\n\t\t\tmessagesDir,\n\t\t\tsplitByNamespace,\n\t\t});\n\t\tawait setupInlineI18n(\n\t\t\tcwd,\n\t\t\tcomponentPath,\n\t\t\tsourceLocale,\n\t\t\ttargetLocales,\n\t\t\tmessagesDir,\n\t\t\tsplitByNamespace,\n\t\t);\n\t} else {\n\t\tawait setupNextIntl(\n\t\t\tcwd,\n\t\t\tsourceLocale,\n\t\t\ttargetLocales,\n\t\t\tmessagesDir,\n\t\t\tsplitByNamespace,\n\t\t);\n\t}\n\n\tconst runPipeline = await p.confirm({\n\t\tmessage: \"Run the full pipeline now?\",\n\t});\n\tif (p.isCancel(runPipeline)) cancel();\n\n\tif (!runPipeline) {\n\t\tp.outro(\"You're all set! Run translate-kit scan when ready.\");\n\t\treturn;\n\t}\n\n\tlet config;\n\ttry {\n\t\tconfig = await loadTranslateKitConfig();\n\t} catch (err) {\n\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\tp.log.error(`Failed to load config: ${errMsg}`);\n\t\tp.outro(\"Config created but pipeline skipped.\");\n\t\treturn;\n\t}\n\n\tconst usageTracker = createUsageTracker();\n\n\t// --- SCAN ---\n\tconst s1 = p.spinner();\n\ts1.start(\"Scanning...\");\n\tconst scanResult = await runScanStep({\n\t\tconfig,\n\t\tcwd,\n\t\tcallbacks: {\n\t\t\tonScanProgress: (c, t) => s1.message(`Scanning... ${c}/${t} files`),\n\t\t\tonKeygenProgress: (c, t) => s1.message(`Generating keys... ${c}/${t}`),\n\t\t\tonUsage: (usage) => usageTracker.add(usage),\n\t\t},\n\t});\n\ts1.stop(\n\t\t`Found ${scanResult.bareStringCount} strings from ${scanResult.fileCount} files`,\n\t);\n\n\tif (scanResult.bareStringCount === 0) {\n\t\tp.log.warn(\"No translatable strings found. Check your include patterns.\");\n\t\tp.outro(\"Config created, but no strings to process.\");\n\t\treturn;\n\t}\n\n\t// --- CODEGEN ---\n\tconst s3 = p.spinner();\n\ts3.start(\"Codegen...\");\n\tconst codegenResult = await runCodegenStep({\n\t\tconfig,\n\t\tcwd,\n\t\ttextToKey: scanResult.textToKey,\n\t\tcallbacks: {\n\t\t\tonProgress: (c, t) => s3.message(`Codegen... ${c}/${t} files`),\n\t\t},\n\t});\n\ts3.stop(\n\t\t`Codegen... ${codegenResult.stringsWrapped} strings wrapped in ${codegenResult.filesModified} files`,\n\t);\n\n\t// Update layout with selective message passing if client namespaces were found\n\tif (codegenResult.clientNamespaces.length > 0) {\n\t\tawait updateLayoutWithSelectiveMessages(\n\t\t\tcwd,\n\t\t\tcodegenResult.clientNamespaces,\n\t\t);\n\t}\n\n\t// --- TRANSLATE ---\n\tfor (const locale of targetLocales) {\n\t\tconst st = p.spinner();\n\t\tst.start(`Translating ${locale}...`);\n\n\t\tawait runTranslateStep({\n\t\t\tconfig,\n\t\t\tsourceFlat: scanResult.sourceFlat,\n\t\t\tlocales: [locale],\n\t\t\tcallbacks: {\n\t\t\t\tonLocaleProgress: (_locale, c, t) =>\n\t\t\t\t\tst.message(`Translating ${locale}... ${c}/${t} keys`),\n\t\t\t\tonUsage: (usage) => usageTracker.add(usage),\n\t\t\t},\n\t\t});\n\n\t\tst.stop(`Translating ${locale}... done`);\n\t}\n\n\tconst usage = usageTracker.get();\n\tif (usage.totalTokens > 0) {\n\t\tconst cost = await estimateCost(config.model, usage);\n\t\tconst costStr = cost ? ` · ${formatCost(cost.totalUSD)}` : \"\";\n\t\tp.log.info(`${formatUsage(usage)}${costStr}`);\n\t}\n\n\tp.outro(\"You're all set!\");\n}\n","import \"dotenv/config\";\nimport { join } from \"node:path\";\nimport { defineCommand, runMain } from \"citty\";\nimport { parseTranslateFlags, validateLocale } from \"./cli-utils.js\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport {\n\tlogDryRun,\n\tlogError,\n\tlogInfo,\n\tlogLocaleResult,\n\tlogLocaleStart,\n\tlogProgress,\n\tlogProgressClear,\n\tlogScanResult,\n\tlogStart,\n\tlogSuccess,\n\tlogSummary,\n\tlogUsage,\n\tlogWarning,\n} from \"./logger.js\";\nimport {\n\tloadMapFile,\n\tloadSourceFlat,\n\trunCodegenStep,\n\trunScanStep,\n\trunTranslateStep,\n} from \"./pipeline.js\";\nimport { scan } from \"./scanner/index.js\";\nimport { generateNextIntlTypes } from \"./typegen.js\";\nimport type { TranslateKitConfig, TranslationResult } from \"./types.js\";\nimport {\n\tcreateUsageTracker,\n\testimateCost,\n\tformatCost,\n\tformatUsage,\n} from \"./usage.js\";\n\nfunction requireScanConfig(\n\tconfig: TranslateKitConfig,\n): asserts config is TranslateKitConfig & {\n\tscan: NonNullable<TranslateKitConfig[\"scan\"]>;\n} {\n\tif (!config.scan) {\n\t\tlogError(\n\t\t\t\"No scan configuration found. Add a 'scan' section to your config.\",\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction requireNonEmptySource(\n\tsourceFlat: Record<string, string>,\n\tmode: string,\n\tmessagesDir: string,\n\tsourceLocale: string,\n): void {\n\tif (Object.keys(sourceFlat).length === 0) {\n\t\tlogError(\n\t\t\tmode === \"inline\"\n\t\t\t\t? \"No keys found in .translate-map.json. Run 'translate-kit scan' first.\"\n\t\t\t\t: `No keys found in ${join(messagesDir, `${sourceLocale}.json`)}`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n\nconst translateCommand = defineCommand({\n\tmeta: {\n\t\tname: \"translate\",\n\t\tdescription: \"Translate messages to target locales\",\n\t},\n\targs: {\n\t\t\"dry-run\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Show what would be translated without executing\",\n\t\t\tdefault: false,\n\t\t},\n\t\tforce: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Ignore cache, re-translate everything\",\n\t\t\tdefault: false,\n\t\t},\n\t\tlocale: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Only translate a specific locale\",\n\t\t},\n\t\tverbose: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Verbose output\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst config = await loadTranslateKitConfig();\n\t\tconst { sourceLocale, targetLocales, messagesDir, model } = config;\n\t\tconst mode = config.mode;\n\n\t\tif (args.locale && !validateLocale(args.locale)) {\n\t\t\tlogError(\n\t\t\t\t`Invalid locale \"${args.locale}\". Locale must only contain letters, numbers, hyphens, and underscores.`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst locales = args.locale ? [args.locale] : targetLocales;\n\n\t\tif (args.locale && !targetLocales.includes(args.locale)) {\n\t\t\tlogWarning(\n\t\t\t\t`Locale \"${args.locale}\" is not in targetLocales [${targetLocales.join(\", \")}]`,\n\t\t\t);\n\t\t}\n\n\t\t// Dry-run: show diff counts per locale without translating\n\t\tif (args[\"dry-run\"]) {\n\t\t\tconst sourceFlat = await loadSourceFlat(config);\n\n\t\t\trequireNonEmptySource(sourceFlat, mode, messagesDir, sourceLocale);\n\n\t\t\tconst dryResult = await runTranslateStep({\n\t\t\t\tconfig,\n\t\t\t\tsourceFlat,\n\t\t\t\tlocales,\n\t\t\t\tforce: args.force,\n\t\t\t\tdryRun: true,\n\t\t\t});\n\n\t\t\tlogStart(sourceLocale, locales);\n\t\t\tfor (const r of dryResult.localeResults) {\n\t\t\t\tlogDryRun(r.locale, 0, 0, r.removed, r.cached);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Normal translation\n\t\tconst sourceFlat = await loadSourceFlat(config);\n\n\t\trequireNonEmptySource(sourceFlat, mode, messagesDir, sourceLocale);\n\n\t\tlogStart(sourceLocale, locales);\n\n\t\tconst usageTracker = createUsageTracker();\n\t\tconst results: TranslationResult[] = [];\n\n\t\tconst translateResult = await runTranslateStep({\n\t\t\tconfig,\n\t\t\tsourceFlat,\n\t\t\tlocales,\n\t\t\tforce: args.force,\n\t\t\tcallbacks: {\n\t\t\t\tonLocaleProgress: (locale, c, t) =>\n\t\t\t\t\tlogProgress(c, t, `Translating ${locale}...`),\n\t\t\t\tonUsage: (usage) => usageTracker.add(usage),\n\t\t\t},\n\t\t});\n\n\t\tfor (const r of translateResult.localeResults) {\n\t\t\tlogLocaleStart(r.locale);\n\t\t\tlogProgressClear();\n\t\t\tlogLocaleResult(r);\n\t\t\tresults.push(r);\n\t\t}\n\n\t\tlogSummary(results);\n\t\tconst usage = usageTracker.get();\n\t\tif (usage.totalTokens > 0) {\n\t\t\tconst cost = await estimateCost(model, usage);\n\t\t\tlogUsage(\n\t\t\t\tformatUsage(usage),\n\t\t\t\tcost ? formatCost(cost.totalUSD) : undefined,\n\t\t\t);\n\t\t}\n\t},\n});\n\nconst scanCommand = defineCommand({\n\tmeta: {\n\t\tname: \"scan\",\n\t\tdescription: \"Scan source code for translatable strings\",\n\t},\n\targs: {\n\t\t\"dry-run\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Show found strings without writing files\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst config = await loadTranslateKitConfig();\n\t\tconst mode = config.mode;\n\t\trequireScanConfig(config);\n\n\t\t// Dry-run: show found strings without writing anything\n\t\tif (args[\"dry-run\"]) {\n\t\t\tconst result = await scan(config.scan, process.cwd(), {\n\t\t\t\tonProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n\t\t\t});\n\t\t\tlogProgressClear();\n\n\t\t\tconst bareStrings = result.strings.filter((s) => {\n\t\t\t\tif (s.type === \"t-call\") return false;\n\t\t\t\tif (s.type === \"T-component\" && s.id) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\t\tlogScanResult(bareStrings.length, result.fileCount);\n\n\t\t\tfor (const str of bareStrings) {\n\t\t\t\tlogInfo(\n\t\t\t\t\t`\"${str.text}\" (${str.componentName ?? \"unknown\"}, ${str.file})`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (mode === \"inline\") {\n\t\t\t\tlogInfo(\n\t\t\t\t\t\"\\n Inline mode: no source locale JSON will be created. Source text remains in code.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Normal scan\n\t\tconst scanUsageTracker = createUsageTracker();\n\t\tconst scanResult = await runScanStep({\n\t\t\tconfig,\n\t\t\tcwd: process.cwd(),\n\t\t\tcallbacks: {\n\t\t\t\tonScanProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n\t\t\t\tonKeygenProgress: (c, t) => logProgress(c, t, \"Generating keys...\"),\n\t\t\t\tonUsage: (usage) => scanUsageTracker.add(usage),\n\t\t\t},\n\t\t});\n\t\tlogProgressClear();\n\n\t\tlogScanResult(scanResult.bareStringCount, scanResult.fileCount);\n\t\tlogSuccess(\n\t\t\t`Written .translate-map.json (${Object.keys(scanResult.textToKey).length} keys)`,\n\t\t);\n\n\t\tif (mode === \"inline\" && config.splitByNamespace) {\n\t\t\tlogInfo(\n\t\t\t\t\"Inline mode + split: source text stays in code, translations split by namespace.\",\n\t\t\t);\n\t\t} else if (mode === \"inline\") {\n\t\t\tlogInfo(\n\t\t\t\t\"Inline mode: source text stays in code, no source locale JSON created.\",\n\t\t\t);\n\t\t} else if (config.splitByNamespace) {\n\t\t\tlogSuccess(\n\t\t\t\t`Written to ${join(config.messagesDir, config.sourceLocale)}/`,\n\t\t\t);\n\t\t} else {\n\t\t\tconst sourceFile = join(\n\t\t\t\tconfig.messagesDir,\n\t\t\t\t`${config.sourceLocale}.json`,\n\t\t\t);\n\t\t\tlogSuccess(`Written to ${sourceFile}`);\n\t\t}\n\n\t\tconst scanUsage = scanUsageTracker.get();\n\t\tif (scanUsage.totalTokens > 0) {\n\t\t\tconst cost = await estimateCost(config.model, scanUsage);\n\t\t\tlogUsage(\n\t\t\t\tformatUsage(scanUsage),\n\t\t\t\tcost ? formatCost(cost.totalUSD) : undefined,\n\t\t\t);\n\t\t}\n\t},\n});\n\nconst codegenCommand = defineCommand({\n\tmeta: {\n\t\tname: \"codegen\",\n\t\tdescription: \"Replace strings in source code with t() calls\",\n\t},\n\targs: {\n\t\t\"dry-run\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Show what would be changed without modifying files\",\n\t\t\tdefault: false,\n\t\t},\n\t\t\"module-factory\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription:\n\t\t\t\t\"Convert module-level constants with translatable strings into factory functions\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst config = await loadTranslateKitConfig();\n\t\tconst mode = config.mode;\n\t\trequireScanConfig(config);\n\n\t\t// Dry-run: show what would be changed\n\t\tif (args[\"dry-run\"]) {\n\t\t\tconst textToKey = await loadMapFile(config.messagesDir);\n\n\t\t\tif (Object.keys(textToKey).length === 0) {\n\t\t\t\tlogError(\n\t\t\t\t\t\"No .translate-map.json found. Run 'translate-kit scan' first.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tif (mode === \"inline\") {\n\t\t\t\tlogInfo(\n\t\t\t\t\t`\\n Would wrap ${Object.keys(textToKey).length} strings with <T> components\\n`,\n\t\t\t\t);\n\t\t\t\tfor (const [text, key] of Object.entries(textToKey)) {\n\t\t\t\t\tlogInfo(`\"${text}\" → <T id=\"${key}\">${text}</T>`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlogInfo(\n\t\t\t\t\t`\\n Would replace ${Object.keys(textToKey).length} strings with t() calls\\n`,\n\t\t\t\t);\n\t\t\t\tfor (const [text, key] of Object.entries(textToKey)) {\n\t\t\t\t\tlogInfo(`\"${text}\" → t(\"${key}\")`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Normal codegen\n\t\tconst result = await runCodegenStep({\n\t\t\tconfig,\n\t\t\tcwd: process.cwd(),\n\t\t\tmoduleFactory: args[\"module-factory\"],\n\t\t\tcallbacks: {\n\t\t\t\tonProgress: (c, t) => logProgress(c, t, \"Processing files...\"),\n\t\t\t},\n\t\t});\n\t\tlogProgressClear();\n\n\t\tlogSuccess(\n\t\t\t`Codegen complete: ${result.stringsWrapped} strings wrapped in ${result.filesModified} files (${result.filesProcessed} files processed)`,\n\t\t);\n\t\tif (result.filesSkipped > 0) {\n\t\t\tlogWarning(\n\t\t\t\t`${result.filesSkipped} file(s) skipped due to invalid generated syntax`,\n\t\t\t);\n\t\t}\n\t},\n});\n\nconst typegenCommand = defineCommand({\n\tmeta: {\n\t\tname: \"typegen\",\n\t\tdescription: \"Generate TypeScript types for message keys (next-intl.d.ts)\",\n\t},\n\tasync run() {\n\t\tconst config = await loadTranslateKitConfig();\n\t\tif (config.mode === \"inline\") {\n\t\t\tlogWarning(\"Type generation is only available in keys mode.\");\n\t\t\treturn;\n\t\t}\n\t\tawait generateNextIntlTypes(\n\t\t\tconfig.messagesDir,\n\t\t\tconfig.sourceLocale,\n\t\t\tconfig.splitByNamespace,\n\t\t);\n\t\tlogSuccess(`Generated ${join(config.messagesDir, \"next-intl.d.ts\")}`);\n\t},\n});\n\nconst runCommand = defineCommand({\n\tmeta: {\n\t\tname: \"run\",\n\t\tdescription: \"Run the full pipeline: scan → codegen → translate\",\n\t},\n\targs: {\n\t\t\"dry-run\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdefault: false,\n\t\t\tdescription: \"Preview without writing\",\n\t\t},\n\t\tforce: {\n\t\t\ttype: \"boolean\",\n\t\t\tdefault: false,\n\t\t\tdescription: \"Ignore translation cache\",\n\t\t},\n\t\t\"module-factory\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription:\n\t\t\t\t\"Convert module-level constants with translatable strings into factory functions\",\n\t\t\tdefault: false,\n\t\t},\n\t\tverbose: {\n\t\t\ttype: \"boolean\",\n\t\t\tdefault: false,\n\t\t\tdescription: \"Verbose output\",\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tconst config = await loadTranslateKitConfig();\n\t\trequireScanConfig(config);\n\n\t\t// --- DRY-RUN ---\n\t\tif (args[\"dry-run\"]) {\n\t\t\tconst scanResult = await runScanStep({\n\t\t\t\tconfig,\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tcallbacks: {\n\t\t\t\t\tonScanProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n\t\t\t\t\tonKeygenProgress: (c, t) => logProgress(c, t, \"Generating keys...\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tlogProgressClear();\n\t\t\tlogScanResult(scanResult.bareStringCount, scanResult.fileCount);\n\n\t\t\tconst mode = config.mode;\n\t\t\tif (mode === \"inline\") {\n\t\t\t\tlogInfo(\n\t\t\t\t\t`\\n Would wrap ${Object.keys(scanResult.textToKey).length} strings with <T> components\\n`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlogInfo(\n\t\t\t\t\t`\\n Would replace ${Object.keys(scanResult.textToKey).length} strings with t() calls\\n`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst dryResult = await runTranslateStep({\n\t\t\t\tconfig,\n\t\t\t\tsourceFlat: scanResult.sourceFlat,\n\t\t\t\tlocales: config.targetLocales,\n\t\t\t\tforce: args.force,\n\t\t\t\tdryRun: true,\n\t\t\t});\n\t\t\tlogStart(config.sourceLocale, config.targetLocales);\n\t\t\tfor (const r of dryResult.localeResults) {\n\t\t\t\tlogDryRun(r.locale, 0, 0, r.removed, r.cached);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst usageTracker = createUsageTracker();\n\n\t\t// --- SCAN ---\n\t\tlogInfo(\"Scanning...\");\n\t\tconst scanResult = await runScanStep({\n\t\t\tconfig,\n\t\t\tcwd: process.cwd(),\n\t\t\tcallbacks: {\n\t\t\t\tonScanProgress: (c, t) => logProgress(c, t, \"Scanning...\"),\n\t\t\t\tonKeygenProgress: (c, t) => logProgress(c, t, \"Generating keys...\"),\n\t\t\t\tonUsage: (usage) => usageTracker.add(usage),\n\t\t\t},\n\t\t});\n\t\tlogProgressClear();\n\t\tlogSuccess(\n\t\t\t`Scan: ${scanResult.bareStringCount} strings from ${scanResult.fileCount} files`,\n\t\t);\n\n\t\tif (\n\t\t\tscanResult.bareStringCount === 0 &&\n\t\t\tObject.keys(scanResult.textToKey).length === 0\n\t\t) {\n\t\t\tlogWarning(\"No translatable strings found.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// --- CODEGEN ---\n\t\tconst codegenResult = await runCodegenStep({\n\t\t\tconfig,\n\t\t\tcwd: process.cwd(),\n\t\t\ttextToKey: scanResult.textToKey,\n\t\t\tmoduleFactory: args[\"module-factory\"],\n\t\t\tcallbacks: {\n\t\t\t\tonProgress: (c, t) => logProgress(c, t, \"Codegen...\"),\n\t\t\t},\n\t\t});\n\t\tlogProgressClear();\n\t\tlogSuccess(\n\t\t\t`Codegen: ${codegenResult.stringsWrapped} strings wrapped in ${codegenResult.filesModified} files`,\n\t\t);\n\n\t\t// --- TRANSLATE ---\n\t\tconst locales = config.targetLocales;\n\t\tlogStart(config.sourceLocale, locales);\n\n\t\tconst translateResult = await runTranslateStep({\n\t\t\tconfig,\n\t\t\tsourceFlat: scanResult.sourceFlat,\n\t\t\tlocales,\n\t\t\tforce: args.force,\n\t\t\tcallbacks: {\n\t\t\t\tonLocaleProgress: (locale, c, t) =>\n\t\t\t\t\tlogProgress(c, t, `Translating ${locale}...`),\n\t\t\t\tonUsage: (usage) => usageTracker.add(usage),\n\t\t\t},\n\t\t});\n\n\t\tfor (const r of translateResult.localeResults) {\n\t\t\tlogLocaleStart(r.locale);\n\t\t\tlogProgressClear();\n\t\t\tlogLocaleResult(r);\n\t\t}\n\t\tlogSummary(translateResult.localeResults);\n\n\t\tconst usage = usageTracker.get();\n\t\tif (usage.totalTokens > 0) {\n\t\t\tconst cost = await estimateCost(config.model, usage);\n\t\t\tlogUsage(\n\t\t\t\tformatUsage(usage),\n\t\t\t\tcost ? formatCost(cost.totalUSD) : undefined,\n\t\t\t);\n\t\t}\n\t},\n});\n\nconst initCommand = defineCommand({\n\tmeta: {\n\t\tname: \"init\",\n\t\tdescription: \"Interactive setup wizard for translate-kit\",\n\t},\n\tasync run() {\n\t\tconst { runInitWizard } = await import(\"./init.js\");\n\t\tawait runInitWizard();\n\t},\n});\n\nconst main = defineCommand({\n\tmeta: {\n\t\tname: \"translate-kit\",\n\t\tversion: \"0.1.0\",\n\t\tdescription: \"AI-powered translation SDK for build time\",\n\t},\n\tsubCommands: {\n\t\ttranslate: translateCommand,\n\t\tscan: scanCommand,\n\t\tcodegen: codegenCommand,\n\t\trun: runCommand,\n\t\ttypegen: typegenCommand,\n\t\tinit: initCommand,\n\t},\n\tasync run({ rawArgs }) {\n\t\tif (rawArgs.length === 0) {\n\t\t\tconsole.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 --module-factory Convert module-level constants into factory functions\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\t\t\treturn;\n\t\t}\n\n\t\tif (rawArgs[0]?.startsWith(\"-\")) {\n\t\t\tconst { dryRun, force, verbose, locale } = parseTranslateFlags(rawArgs);\n\n\t\t\tawait translateCommand.run!({\n\t\t\t\targs: {\n\t\t\t\t\t_: rawArgs,\n\t\t\t\t\t\"dry-run\": dryRun,\n\t\t\t\t\tforce,\n\t\t\t\t\tverbose,\n\t\t\t\t\tlocale: locale ?? \"\",\n\t\t\t\t},\n\t\t\t\trawArgs,\n\t\t\t\tcmd: translateCommand,\n\t\t\t});\n\t\t}\n\t},\n});\n\nrunMain(main);\n"],"mappings":"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","names":["text","p","current","text","t","p","text","keyNode","propName","valueNode","extracted","key","args","directive","output","translatorId","_traverse","traverse","text","readFile","join","_traverse","getNearestFunctionPath","functionContainsJSX","p","extractTextFromNode","text","traverse","parentTag","t","keyNode","propName","valueNode","readFile","pLimit","glob","pLimit","z","text","t","resolve","text","p","generateObject","pLimit","z","buildPrompt","resolve","writeFile","join","mkdir","readdir","writeFile","dirname","join","mkdir","readdir","readFile","writeFile","join","text","t","mkdir","readFile","writeFile","basename","join","cancel","p","t","usage","join","sourceFlat","t","usage","text","scanResult","runInitWizard"]}
|