translate-kit 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -5
- package/dist/cli.js +418 -107
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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/tokens.ts","../src/usage.ts","../src/cost.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/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\tfallbackModel: z\n\t\t\t.custom<TranslateKitConfig[\"fallbackModel\"]>(\n\t\t\t\t(val) => val == null || typeof val === \"object\",\n\t\t\t\t{ message: \"fallbackModel must be an AI SDK LanguageModel instance\" },\n\t\t\t)\n\t\t\t.optional(),\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\ttargetBatchTokens: z.number().int().positive().default(2000).optional(),\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\tmaxCostPerRun: z.number().positive().optional(),\n\t\t\t\tconfirmAbove: z.number().positive().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","export function estimateTokens(text: string): number {\n\treturn Math.max(1, Math.ceil(text.length / 4));\n}\n\nexport function estimateEntryTokens(key: string, value: string): number {\n\treturn estimateTokens(key) + estimateTokens(value);\n}\n\nexport function estimateTotalTokens(entries: Record<string, string>): number {\n\tlet total = 0;\n\tfor (const [key, value] of Object.entries(entries)) {\n\t\ttotal += estimateEntryTokens(key, value);\n\t}\n\treturn total;\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","import type { LanguageModel } from \"ai\";\nimport { estimateTotalTokens } from \"./tokens.js\";\nimport type { TranslationOptions } from \"./types.js\";\nimport { estimateCost } from \"./usage.js\";\n\nexport interface CostEstimate {\n\testimatedInputTokens: number;\n\testimatedOutputTokens: number;\n\ttotalTokens: number;\n\testimatedCostUSD: number | null;\n}\n\nexport async function estimateTranslationCost(\n\tmodel: LanguageModel,\n\tentries: Record<string, string>,\n\tlocaleCount: number,\n\toptions?: TranslationOptions,\n): Promise<CostEstimate> {\n\tconst entryTokens = estimateTotalTokens(entries);\n\tconst batchSize = options?.batchSize ?? 50;\n\tconst entryCount = Object.keys(entries).length;\n\tconst batchCount = Math.max(1, Math.ceil(entryCount / batchSize));\n\n\t// Prompt overhead: ~200 tokens per batch for instructions/rules\n\tconst promptOverhead = batchCount * 200;\n\tconst estimatedInputTokens = (entryTokens + promptOverhead) * localeCount;\n\t// Output tokens roughly equal to entry tokens (translated strings ~ same length)\n\tconst estimatedOutputTokens = entryTokens * localeCount;\n\tconst totalTokens = estimatedInputTokens + estimatedOutputTokens;\n\n\tlet estimatedCostUSD: number | null = null;\n\tconst costResult = await estimateCost(model, {\n\t\tinputTokens: estimatedInputTokens,\n\t\toutputTokens: estimatedOutputTokens,\n\t\ttotalTokens,\n\t});\n\tif (costResult) {\n\t\testimatedCostUSD = costResult.totalUSD;\n\t}\n\n\treturn {\n\t\testimatedInputTokens,\n\t\testimatedOutputTokens,\n\t\ttotalTokens,\n\t\testimatedCostUSD,\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\nfunction getTagName(element: JSXElement): string {\n\tconst name = element.openingElement.name;\n\tif (name.type === \"JSXIdentifier\") return name.name;\n\tif (name.type === \"JSXMemberExpression\") return name.property.name;\n\treturn \"unknown\";\n}\n\nfunction getExpressionLabel(\n\texpr: JSXExpressionContainer[\"expression\"],\n): string {\n\tif (expr.type === \"Identifier\") return expr.name;\n\tif (expr.type === \"MemberExpression\" && expr.property.type === \"Identifier\")\n\t\treturn expr.property.name;\n\treturn \"expr\";\n}\n\nfunction buildCompositeContext(\n\tparentElement: JSXElement,\n): string | undefined {\n\tlet textFragmentCount = 0;\n\tlet nonTextCount = 0;\n\n\tfor (const child of parentElement.children) {\n\t\tif (child.type === \"JSXText\") {\n\t\t\tif (child.value.trim()) textFragmentCount++;\n\t\t} else if (child.type === \"JSXElement\") {\n\t\t\tnonTextCount++;\n\t\t} else if (child.type === \"JSXExpressionContainer\") {\n\t\t\tif (child.expression.type !== \"JSXEmptyExpression\") nonTextCount++;\n\t\t} else if (child.type === \"JSXFragment\") {\n\t\t\tnonTextCount++;\n\t\t}\n\t}\n\n\tif (textFragmentCount === 0 || nonTextCount === 0) return undefined;\n\n\tconst parts: string[] = [];\n\tlet elementIndex = 1;\n\n\tfor (const child of parentElement.children) {\n\t\tif (child.type === \"JSXText\") {\n\t\t\tconst trimmed = child.value.trim();\n\t\t\tif (trimmed) parts.push(trimmed);\n\t\t} else if (child.type === \"JSXElement\") {\n\t\t\tconst tag = getTagName(child);\n\t\t\tparts.push(`<${tag}>{${elementIndex}}</${tag}>`);\n\t\t\telementIndex++;\n\t\t} else if (child.type === \"JSXExpressionContainer\") {\n\t\t\tif (child.expression.type !== \"JSXEmptyExpression\") {\n\t\t\t\tconst label = getExpressionLabel(child.expression);\n\t\t\t\tparts.push(`{${label}}`);\n\t\t\t}\n\t\t} else if (child.type === \"JSXFragment\") {\n\t\t\tparts.push(`{${elementIndex}}`);\n\t\t\telementIndex++;\n\t\t}\n\t}\n\n\treturn parts.join(\" \");\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\tlet compositeContext: string | undefined;\n\t\t\tif (path.parentPath?.isJSXElement()) {\n\t\t\t\tcompositeContext = buildCompositeContext(\n\t\t\t\t\tpath.parentPath.node as JSXElement,\n\t\t\t\t);\n\t\t\t}\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\t...(compositeContext && { compositeContext }),\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\tfallbackModel?: 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\tif (str.compositeContext) parts.push(`composite: \"${str.compositeContext}\"`);\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 attemptKeyGeneration(\n\ttargetModel: 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: targetModel,\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\nasync function generateKeysBatchWithRetry(\n\tmodel: LanguageModel,\n\tstrings: ExtractedString[],\n\tretries: number,\n\texistingMap?: Record<string, string>,\n\tfallbackModel?: LanguageModel,\n): Promise<KeyBatchResult> {\n\ttry {\n\t\treturn await attemptKeyGeneration(model, strings, retries, existingMap);\n\t} catch (primaryError) {\n\t\tif (fallbackModel) {\n\t\t\tlogWarning(\"Primary model failed for key generation, falling back to secondary model...\");\n\t\t\treturn await attemptKeyGeneration(fallbackModel, strings, retries, existingMap);\n\t\t}\n\t\tthrow primaryError;\n\t}\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\tfallbackModel,\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\tfallbackModel,\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 { estimateEntryTokens } from \"./tokens.js\";\nimport type { TranslationContextEntry, 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\tcontext?: Record<string, TranslationContextEntry>;\n\tpreviousTranslations?: Record<string, { source: string; translated: string }>;\n\tfallbackModel?: LanguageModel;\n}\n\nfunction buildContextHint(\n\tkey: string,\n\tctx: TranslationContextEntry,\n): string | undefined {\n\tconst hints: string[] = [];\n\tif (ctx.compositeContext) hints.push(`part of: \"${ctx.compositeContext}\"`);\n\tif (ctx.parentTag) hints.push(`HTML: <${ctx.parentTag}>`);\n\tif (ctx.componentName) hints.push(`component: ${ctx.componentName}`);\n\tif (ctx.propName) hints.push(`prop: ${ctx.propName}`);\n\tif (ctx.routePath) hints.push(`route: ${ctx.routePath}`);\n\tif (hints.length === 0) return undefined;\n\treturn ` ^ ${hints.join(\", \")}`;\n}\n\nfunction buildPrompt(\n\tentries: Record<string, string>,\n\tsourceLocale: string,\n\ttargetLocale: string,\n\toptions?: TranslationOptions,\n\tcontext?: Record<string, TranslationContextEntry>,\n\tpreviousTranslations?: Record<string, { source: string; translated: string }>,\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\tif (previousTranslations && Object.keys(previousTranslations).length > 0) {\n\t\tlines.push(\"\\nPreviously translated (maintain consistency):\");\n\t\tfor (const [key, { source, translated }] of Object.entries(previousTranslations)) {\n\t\t\tlines.push(` \"${key}\": \"${source}\" → \"${translated}\"`);\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\tif (context?.[key]) {\n\t\t\tconst hint = buildContextHint(key, context[key]);\n\t\t\tif (hint) lines.push(hint);\n\t\t}\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 attemptTranslation(\n\ttargetModel: LanguageModel,\n\tentries: Record<string, string>,\n\tprompt: string,\n\tschema: z.ZodObject<Record<string, z.ZodString>>,\n\tretries: number,\n\tshouldValidate: boolean,\n): Promise<BatchResult> {\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: targetModel,\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\nasync function translateBatchWithRetry(\n\tinput: TranslateBatchInput,\n\tretries: number,\n): Promise<BatchResult> {\n\tconst { model, entries, sourceLocale, targetLocale, options, context, previousTranslations, fallbackModel } = input;\n\tconst keys = Object.keys(entries);\n\tconst prompt = buildPrompt(entries, sourceLocale, targetLocale, options, context, previousTranslations);\n\tconst schema = buildSchema(keys);\n\tconst shouldValidate = options?.validatePlaceholders !== false;\n\n\ttry {\n\t\treturn await attemptTranslation(model, entries, prompt, schema, retries, shouldValidate);\n\t} catch (primaryError) {\n\t\tif (fallbackModel) {\n\t\t\tlogWarning(\"Primary model failed, falling back to secondary model...\");\n\t\t\treturn await attemptTranslation(fallbackModel, entries, prompt, schema, retries, shouldValidate);\n\t\t}\n\t\tthrow primaryError;\n\t}\n}\n\nexport interface TranslateAllInput {\n\tmodel: LanguageModel;\n\tentries: Record<string, string>;\n\tsourceLocale: string;\n\ttargetLocale: string;\n\toptions?: TranslationOptions;\n\tcontext?: Record<string, TranslationContextEntry>;\n\tfallbackModel?: LanguageModel;\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 function chunkByTokens(\n\tentries: Record<string, string>,\n\toptions: { targetTokens: number; maxEntriesPerBatch: number },\n): Record<string, string>[] {\n\tconst { targetTokens, maxEntriesPerBatch } = options;\n\tconst batches: Record<string, string>[] = [];\n\tlet current: Record<string, string> = {};\n\tlet currentTokens = 0;\n\tlet currentCount = 0;\n\n\tfor (const [key, value] of Object.entries(entries)) {\n\t\tconst entryTokens = estimateEntryTokens(key, value);\n\n\t\tif (currentCount > 0 && (currentTokens + entryTokens > targetTokens || currentCount >= maxEntriesPerBatch)) {\n\t\t\tbatches.push(current);\n\t\t\tcurrent = {};\n\t\t\tcurrentTokens = 0;\n\t\t\tcurrentCount = 0;\n\t\t}\n\n\t\tcurrent[key] = value;\n\t\tcurrentTokens += entryTokens;\n\t\tcurrentCount++;\n\t}\n\n\tif (currentCount > 0) {\n\t\tbatches.push(current);\n\t}\n\n\treturn batches;\n}\n\nexport function selectContextEntries(\n\taccumulated: Record<string, string>,\n\tcurrentBatchKeys: string[],\n\tsourceEntries: Record<string, string>,\n\tmaxEntries = 15,\n): Record<string, { source: string; translated: string }> {\n\tconst result: Record<string, { source: string; translated: string }> = {};\n\tconst accKeys = Object.keys(accumulated);\n\tif (accKeys.length === 0) return result;\n\n\t// Determine the namespaces of the current batch\n\tconst batchNamespaces = new Set(\n\t\tcurrentBatchKeys.map((k) => k.split(\".\")[0]).filter(Boolean),\n\t);\n\n\t// Prioritize entries from the same namespace\n\tconst sameNs: string[] = [];\n\tconst otherNs: string[] = [];\n\tfor (const key of accKeys) {\n\t\tconst ns = key.split(\".\")[0];\n\t\tif (ns && batchNamespaces.has(ns)) {\n\t\t\tsameNs.push(key);\n\t\t} else {\n\t\t\totherNs.push(key);\n\t\t}\n\t}\n\n\tconst ordered = [...sameNs, ...otherNs];\n\tfor (const key of ordered.slice(0, maxEntries)) {\n\t\tconst source = sourceEntries[key];\n\t\tif (source) {\n\t\t\tresult[key] = { source, translated: accumulated[key] };\n\t\t}\n\t}\n\n\treturn result;\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\tcontext,\n\t\tfallbackModel,\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 concurrency = options?.concurrency ?? 3;\n\tconst retries = options?.retries ?? 2;\n\tconst targetTokens = options?.targetBatchTokens ?? 2000;\n\tconst maxEntriesPerBatch = options?.batchSize ?? 50;\n\n\tconst batches = chunkByTokens(entries, { targetTokens, maxEntriesPerBatch });\n\n\t// Wave-based execution: groups of `concurrency` batches\n\tconst waves: Record<string, string>[][] = [];\n\tfor (let i = 0; i < batches.length; i += concurrency) {\n\t\twaves.push(batches.slice(i, i + concurrency));\n\t}\n\n\tconst results: Record<string, string> = {};\n\tconst accumulated: Record<string, string> = {};\n\tlet completedKeys = 0;\n\tlet totalInputTokens = 0;\n\tlet totalOutputTokens = 0;\n\n\tconst limit = pLimit(concurrency);\n\n\tfor (const wave of waves) {\n\t\tconst previousTranslations = selectContextEntries(\n\t\t\taccumulated,\n\t\t\twave.flatMap((b) => Object.keys(b)),\n\t\t\tentries,\n\t\t);\n\n\t\tawait Promise.all(\n\t\t\twave.map((batch) =>\n\t\t\t\tlimit(async () => {\n\t\t\t\t\tconst batchInput: TranslateBatchInput = {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tentries: batch,\n\t\t\t\t\t\tsourceLocale,\n\t\t\t\t\t\ttargetLocale,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tpreviousTranslations: Object.keys(previousTranslations).length > 0 ? previousTranslations : undefined,\n\t\t\t\t\t\tfallbackModel,\n\t\t\t\t\t};\n\n\t\t\t\t\tconst { translations, usage } = await translateBatchWithRetry(\n\t\t\t\t\t\tbatchInput,\n\t\t\t\t\t\tretries,\n\t\t\t\t\t);\n\t\t\t\t\tObject.assign(results, translations);\n\t\t\t\t\tObject.assign(accumulated, translations);\n\t\t\t\t\ttotalInputTokens += usage.inputTokens;\n\t\t\t\t\ttotalOutputTokens += usage.outputTokens;\n\t\t\t\t\tcompletedKeys += Object.keys(batch).length;\n\t\t\t\t\tonProgress?.(completedKeys, keys.length);\n\t\t\t\t\tonBatchComplete?.(translations);\n\t\t\t\t}),\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 { type CostEstimate, estimateTranslationCost } from \"./cost.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 {\n\tExtractedString,\n\tTranslateKitConfig,\n\tTranslationContextEntry,\n} 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 writeContextFile(\n\tmessagesDir: string,\n\ttextToKey: Record<string, string>,\n\tstrings: ExtractedString[],\n): Promise<void> {\n\tconst contextMap: Record<string, TranslationContextEntry> = {};\n\tconst textIndex = new Map<string, ExtractedString>();\n\tfor (const str of strings) {\n\t\tif (!textIndex.has(str.text)) {\n\t\t\ttextIndex.set(str.text, str);\n\t\t}\n\t}\n\n\tfor (const [text, key] of Object.entries(textToKey)) {\n\t\tconst str = textIndex.get(text);\n\t\tif (!str) continue;\n\t\tconst entry: TranslationContextEntry = { type: str.type };\n\t\tif (str.componentName) entry.componentName = str.componentName;\n\t\tif (str.parentTag) entry.parentTag = str.parentTag;\n\t\tif (str.routePath) entry.routePath = str.routePath;\n\t\tif (str.sectionHeading) entry.sectionHeading = str.sectionHeading;\n\t\tif (str.siblingTexts?.length) entry.siblingTexts = str.siblingTexts;\n\t\tif (str.compositeContext) entry.compositeContext = str.compositeContext;\n\t\tif (str.propName) entry.propName = str.propName;\n\t\tcontextMap[key] = entry;\n\t}\n\n\tconst contextPath = join(messagesDir, \".translate-context.json\");\n\tawait mkdir(messagesDir, { recursive: true });\n\tawait writeFile(contextPath, `${JSON.stringify(contextMap, null, 2)}\\n`, \"utf-8\");\n}\n\nexport async function loadContextFile(\n\tmessagesDir: string,\n): Promise<Record<string, TranslationContextEntry>> {\n\tconst contextPath = join(messagesDir, \".translate-context.json\");\n\ttry {\n\t\tconst content = await readFile(contextPath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn {};\n\t}\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\tfallbackModel: config.fallbackModel,\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\tawait writeContextFile(config.messagesDir, textToKey, result.strings);\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\tonConfirmCost?: (estimate: CostEstimate) => Promise<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 context = await loadContextFile(config.messagesDir);\n\n\t// Pre-flight cost check (skip for dry runs)\n\tif (!input.dryRun && sourceFlat && Object.keys(sourceFlat).length > 0) {\n\t\tconst maxCost = config.translation?.maxCostPerRun;\n\t\tif (maxCost != null || input.onConfirmCost) {\n\t\t\tconst estimate = await estimateTranslationCost(\n\t\t\t\tconfig.model,\n\t\t\t\tsourceFlat,\n\t\t\t\tlocales.filter((l) => l !== config.sourceLocale).length,\n\t\t\t\tconfig.translation,\n\t\t\t);\n\n\t\t\tif (maxCost != null && estimate.estimatedCostUSD != null && estimate.estimatedCostUSD > maxCost) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Estimated cost $${estimate.estimatedCostUSD.toFixed(4)} exceeds maxCostPerRun $${maxCost.toFixed(4)}. Aborting.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (input.onConfirmCost) {\n\t\t\t\tconst confirmed = await input.onConfirmCost(estimate);\n\t\t\t\tif (!confirmed) {\n\t\t\t\t\treturn { localeResults: [] };\n\t\t\t\t}\n\t\t\t}\n\t\t}\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\tcontext,\n\t\t\t\t\tfallbackModel: config.fallbackModel,\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","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 * as p from \"@clack/prompts\";\nimport { defineCommand, runMain } from \"citty\";\nimport { parseTranslateFlags, validateLocale } from \"./cli-utils.js\";\nimport { loadTranslateKitConfig } from \"./config.js\";\nimport type { CostEstimate } from \"./cost.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\nfunction buildCostConfirmCallback(\n\tconfig: TranslateKitConfig,\n): ((estimate: CostEstimate) => Promise<boolean>) | undefined {\n\tconst confirmAbove = config.translation?.confirmAbove;\n\tif (confirmAbove == null) return undefined;\n\n\treturn async (estimate: CostEstimate) => {\n\t\tif (estimate.estimatedCostUSD == null) return true;\n\t\tif (estimate.estimatedCostUSD <= confirmAbove) return true;\n\n\t\tlogInfo(\n\t\t\t`Estimated cost: ~$${estimate.estimatedCostUSD.toFixed(4)} (${estimate.totalTokens.toLocaleString()} tokens)`,\n\t\t);\n\n\t\tconst confirmed = await p.confirm({\n\t\t\tmessage: `Estimated cost $${estimate.estimatedCostUSD.toFixed(4)} exceeds $${confirmAbove.toFixed(2)} threshold. Continue?`,\n\t\t});\n\n\t\treturn confirmed === true;\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\tonConfirmCost: buildCostConfirmCallback(config),\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\tonConfirmCost: buildCostConfirmCallback(config),\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","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","p","sourceFlat","t","usage","text","scanResult","runInitWizard"]}
|