@xndrjs/i18n 0.8.1 → 0.8.2-alpha.1

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.
Files changed (93) hide show
  1. package/README.md +1 -2
  2. package/dist/cli/audit.js +739 -0
  3. package/dist/cli/audit.js.map +1 -0
  4. package/dist/cli/codegen.js +1471 -0
  5. package/dist/cli/codegen.js.map +1 -0
  6. package/dist/cli/setup.js +148 -0
  7. package/dist/cli/setup.js.map +1 -0
  8. package/dist/codegen/index.js +43 -40
  9. package/dist/codegen/index.js.map +1 -1
  10. package/package.json +6 -9
  11. package/bin/audit.mjs +0 -14
  12. package/bin/codegen.mjs +0 -17
  13. package/bin/setup.mjs +0 -14
  14. package/src/IcuTranslationProviderMulti.test.ts +0 -215
  15. package/src/IcuTranslationProviderMulti.ts +0 -188
  16. package/src/audit/audit-dictionaries.test.ts +0 -134
  17. package/src/audit/audit-dictionaries.ts +0 -178
  18. package/src/audit/run-audit.test.ts +0 -169
  19. package/src/audit/run-audit.ts +0 -94
  20. package/src/builder-load-registry.test.ts +0 -44
  21. package/src/builder-load-registry.ts +0 -78
  22. package/src/builder-loaders.ts +0 -15
  23. package/src/builder-types.test.ts +0 -57
  24. package/src/builder-types.ts +0 -24
  25. package/src/builder.test.ts +0 -303
  26. package/src/builder.ts +0 -15
  27. package/src/codegen/codegen-config-schema.ts +0 -156
  28. package/src/codegen/config.test.ts +0 -231
  29. package/src/codegen/config.ts +0 -42
  30. package/src/codegen/constants.ts +0 -9
  31. package/src/codegen/delivery-artifacts.test.ts +0 -167
  32. package/src/codegen/delivery-artifacts.ts +0 -154
  33. package/src/codegen/dictionary-spec-contract.test.ts +0 -28
  34. package/src/codegen/dictionary-spec-contract.ts +0 -138
  35. package/src/codegen/emit/dictionary-schema-file.ts +0 -113
  36. package/src/codegen/emit/instance-file.test.ts +0 -71
  37. package/src/codegen/emit/instance-file.ts +0 -257
  38. package/src/codegen/emit/namespace-loaders-file.test.ts +0 -251
  39. package/src/codegen/emit/namespace-loaders-file.ts +0 -229
  40. package/src/codegen/emit/types-file.test.ts +0 -96
  41. package/src/codegen/emit/types-file.ts +0 -142
  42. package/src/codegen/fixtures/billing-namespace.json +0 -6
  43. package/src/codegen/generate-i18n-types.test.ts +0 -1137
  44. package/src/codegen/generate-i18n-types.ts +0 -20
  45. package/src/codegen/icu-analysis.ts +0 -110
  46. package/src/codegen/locale-fallback.ts +0 -73
  47. package/src/codegen/locale-policy.test.ts +0 -35
  48. package/src/codegen/locale-policy.ts +0 -30
  49. package/src/codegen/paths.ts +0 -44
  50. package/src/codegen/project-locales-set-namespace.test.ts +0 -134
  51. package/src/codegen/read-dictionary.test.ts +0 -594
  52. package/src/codegen/read-dictionary.ts +0 -260
  53. package/src/codegen/regenerate-namespaces.ts +0 -180
  54. package/src/codegen/run-codegen.test.ts +0 -230
  55. package/src/codegen/run-codegen.ts +0 -252
  56. package/src/codegen/types.ts +0 -10
  57. package/src/codegen/write-file-if-changed.test.ts +0 -42
  58. package/src/codegen/write-file-if-changed.ts +0 -20
  59. package/src/codegen-config/build-config.ts +0 -15
  60. package/src/codegen-config/codegen-config.test.ts +0 -36
  61. package/src/codegen-config/index.ts +0 -37
  62. package/src/codegen-config/type-names.ts +0 -20
  63. package/src/codegen-config/write-config.ts +0 -8
  64. package/src/engine.ts +0 -47
  65. package/src/fetch-artifact.ts +0 -16
  66. package/src/format-core.ts +0 -91
  67. package/src/i18n-handle.ts +0 -216
  68. package/src/icu/extract-variables.test.ts +0 -199
  69. package/src/icu/extract-variables.ts +0 -227
  70. package/src/icu/parse-template.ts +0 -31
  71. package/src/index.ts +0 -63
  72. package/src/load-state.ts +0 -15
  73. package/src/project-locales.test.ts +0 -280
  74. package/src/project-locales.ts +0 -211
  75. package/src/resolve-locale.test.ts +0 -91
  76. package/src/resolve-locale.ts +0 -88
  77. package/src/scope-multi.ts +0 -105
  78. package/src/scope-types.ts +0 -35
  79. package/src/scope.test.ts +0 -172
  80. package/src/serialized-state.test.ts +0 -114
  81. package/src/serialized-state.ts +0 -28
  82. package/src/setup/setup-i18n.test.ts +0 -85
  83. package/src/setup/setup-i18n.ts +0 -156
  84. package/src/types.ts +0 -65
  85. package/src/validation/create-args-schema.ts +0 -76
  86. package/src/validation/create-normalized-schema.ts +0 -52
  87. package/src/validation/errors.ts +0 -43
  88. package/src/validation/index.ts +0 -202
  89. package/src/validation/normalize.ts +0 -299
  90. package/src/validation/to-dictionary.ts +0 -67
  91. package/src/validation/types.ts +0 -82
  92. package/src/validation/validate-normalized.ts +0 -133
  93. package/src/validation/validation.test.ts +0 -562
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/codegen/constants.ts","../../src/codegen/delivery-artifacts.ts","../../src/codegen-config/type-names.ts","../../src/codegen/codegen-config-schema.ts","../../src/codegen/config.ts","../../src/resolve-locale.ts","../../src/project-locales.ts","../../src/codegen/paths.ts","../../src/codegen/write-file-if-changed.ts","../../src/codegen/read-dictionary.ts","../../src/audit/run-audit.ts","../../src/codegen/locale-fallback.ts","../../src/codegen/locale-policy.ts","../../src/audit/audit-dictionaries.ts"],"names":["path","fs","parseYaml","splitPaths","resolveNamespaces","readDictionaryFile"],"mappings":"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","file":"audit.js","sourcesContent":["export const SUPPORTED_IMPORT_EXTENSIONS = [\"none\", \".ts\", \".js\"] as const;\nexport type SupportedImportExtension = (typeof SUPPORTED_IMPORT_EXTENSIONS)[number];\n\n// Translation keys and namespace names become TypeScript identifiers and\n// template-literal type segments in the generated code, so they must be valid\n// identifiers (e.g. \"app.title\" would emit the broken type `\"app.title:...\"`).\nexport const IDENTIFIER_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nexport const IDENTIFIER_NAME_REQUIREMENT =\n \"allowed: letters, digits, underscore; must not start with a digit\";\n","/** Valid TypeScript identifier / filename segment for a delivery area id. */\nexport const DELIVERY_AREA_NAME_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]*$/;\n\nexport type DeliveryArtifactsMap = Record<string, readonly string[]>;\n\nexport type DeliveryArtifactsIssue = {\n path: (string | number)[];\n message: string;\n};\n\nexport function getDeliveryArtifactsStructureIssues(\n deliveryArtifacts: DeliveryArtifactsMap\n): DeliveryArtifactsIssue[] {\n const issues: DeliveryArtifactsIssue[] = [];\n\n for (const [area, locales] of Object.entries(deliveryArtifacts)) {\n if (!DELIVERY_AREA_NAME_PATTERN.test(area)) {\n issues.push({\n path: [\"deliveryArtifacts\", area],\n message: `Invalid delivery area name \"${area}\": must match ${DELIVERY_AREA_NAME_PATTERN.source}`,\n });\n }\n\n if (locales.length === 0) {\n issues.push({\n path: [\"deliveryArtifacts\", area],\n message: `Delivery area \"${area}\" must include at least one locale.`,\n });\n }\n }\n\n const localeToArea = new Map<string, string>();\n for (const [area, locales] of Object.entries(deliveryArtifacts)) {\n for (const locale of locales) {\n const previousArea = localeToArea.get(locale);\n if (previousArea) {\n issues.push({\n path: [\"deliveryArtifacts\", area],\n message: `Locale \"${locale}\" appears in both \"${previousArea}\" and \"${area}\".`,\n });\n } else {\n localeToArea.set(locale, area);\n }\n }\n }\n\n return issues;\n}\n\nexport function getDeliveryArtifactsPartitionIssues(\n deliveryArtifacts: DeliveryArtifactsMap,\n requestLocales: ReadonlySet<string>\n): DeliveryArtifactsIssue[] {\n const issues: DeliveryArtifactsIssue[] = [];\n const artifactLocales = new Set<string>();\n\n for (const locales of Object.values(deliveryArtifacts)) {\n for (const locale of locales) {\n artifactLocales.add(locale);\n }\n }\n\n const missing = [...requestLocales].filter((locale) => !artifactLocales.has(locale)).sort();\n if (missing.length > 0) {\n issues.push({\n path: [\"deliveryArtifacts\"],\n message: `deliveryArtifacts is missing locales required by dictionaries and localeFallback: ${missing.join(\", \")}`,\n });\n }\n\n const excess = [...artifactLocales].filter((locale) => !requestLocales.has(locale)).sort();\n if (excess.length > 0) {\n issues.push({\n path: [\"deliveryArtifacts\"],\n message: `deliveryArtifacts includes locales not required by dictionaries and localeFallback: ${excess.join(\", \")}`,\n });\n }\n\n return issues;\n}\n\n/** Pre-emit validation gate for `deliveryArtifacts` in custom delivery mode. */\nexport function getDeliveryArtifactsIssues(\n deliveryArtifacts: DeliveryArtifactsMap,\n requestLocales: ReadonlySet<string>\n): DeliveryArtifactsIssue[] {\n return [\n ...getDeliveryArtifactsStructureIssues(deliveryArtifacts),\n ...getDeliveryArtifactsPartitionIssues(deliveryArtifacts, requestLocales),\n ];\n}\n\nexport function getDeliveryAreaNames(deliveryArtifacts: DeliveryArtifactsMap): string[] {\n return Object.keys(deliveryArtifacts).sort();\n}\n\nexport function getLocaleDeliveryAreaMap(\n deliveryArtifacts: DeliveryArtifactsMap\n): Record<string, string> {\n const localeToArea: Record<string, string> = {};\n\n for (const [area, locales] of Object.entries(deliveryArtifacts)) {\n for (const locale of locales) {\n localeToArea[locale] = area;\n }\n }\n\n return localeToArea;\n}\n\nexport function formatLocaleDeliveryAreaBlock(\n deliveryArtifacts: DeliveryArtifactsMap,\n constName: string,\n localeTypeName: string,\n deliveryAreaTypeName: string\n): string {\n const localeToArea = getLocaleDeliveryAreaMap(deliveryArtifacts);\n const lines = Object.keys(localeToArea)\n .sort()\n .map((locale) => ` ${JSON.stringify(locale)}: ${JSON.stringify(localeToArea[locale])},`)\n .join(\"\\n\");\n\n return `export const ${constName} = {\\n${lines}\\n} as const satisfies Record<${localeTypeName}, ${deliveryAreaTypeName}>;\\n\\n`;\n}\n\nexport function getDeliveryArtifactsTypeName(deliveryAreaTypeName: string): string {\n return deliveryAreaTypeName.endsWith(\"DeliveryArea\")\n ? deliveryAreaTypeName.replace(/DeliveryArea$/, \"DeliveryArtifacts\")\n : `${deliveryAreaTypeName}Artifacts`;\n}\n\nexport function formatDeliveryArtifactsBlock(\n deliveryArtifacts: DeliveryArtifactsMap,\n constName: string,\n localeTypeName: string,\n deliveryAreaTypeName: string\n): string {\n const deliveryArtifactsTypeName = getDeliveryArtifactsTypeName(deliveryAreaTypeName);\n const areaEntries = getDeliveryAreaNames(deliveryArtifacts)\n .map((area) => {\n const locales = [...deliveryArtifacts[area]!]\n .sort()\n .map((locale) => JSON.stringify(locale))\n .join(\", \");\n return ` ${JSON.stringify(area)}: [${locales}] as const,`;\n })\n .join(\"\\n\");\n\n return (\n `export const ${constName} = {\\n${areaEntries}\\n} as const satisfies Record<${deliveryAreaTypeName}, readonly ${localeTypeName}[]>;\\n\\n` +\n `export type ${deliveryArtifactsTypeName} = typeof ${constName};\\n\\n` +\n `export type LocalesForDeliveryArea<A extends ${deliveryAreaTypeName}> = ${deliveryArtifactsTypeName}[A][number];\\n\\n`\n );\n}\n","export function inferProjectName(dirName: string): string {\n const parts = dirName.split(/[-_]+/).filter(Boolean);\n if (parts.length === 0) {\n return \"App\";\n }\n\n return parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(\"\");\n}\n\nexport function typeNamesForProject(project: string): {\n paramsTypeName: string;\n schemaTypeName: string;\n localeTypeName: string;\n} {\n return {\n paramsTypeName: `${project}Params`,\n schemaTypeName: `${project}Schema`,\n localeTypeName: `${project}Locale`,\n };\n}\n","import { z } from \"zod\";\nimport path from \"node:path\";\nimport { IDENTIFIER_NAME_PATTERN, IDENTIFIER_NAME_REQUIREMENT } from \"./constants.js\";\nimport { getDeliveryArtifactsStructureIssues } from \"./delivery-artifacts.js\";\nimport { typeNamesForProject } from \"../codegen-config/type-names.js\";\n\nconst localeFallbackSchema = z.record(z.string(), z.union([z.string(), z.null()]));\nconst deliveryArtifactsSchema = z.record(z.string(), z.array(z.string().min(1)));\n\nexport const DELIVERY_MODES = [\"split-by-locale\", \"custom\"] as const;\nexport type DeliveryMode = (typeof DELIVERY_MODES)[number];\n\nexport const LOADER_STRATEGIES = [\"import\", \"fetch\"] as const;\nexport type LoaderStrategy = (typeof LOADER_STRATEGIES)[number];\n\nconst PROJECT_NAME_PATTERN = /^[A-Z][a-zA-Z0-9]*$/;\n\nconst codegenConfigShape = {\n /** PascalCase project id — generates `{project}Params`, `{project}Schema`, `{project}Locale`. */\n projectName: z\n .string()\n .min(1)\n .regex(PROJECT_NAME_PATTERN, 'projectName must be PascalCase (e.g. \"MyApp\")'),\n namespaces: z.record(z.string(), z.string().min(1)),\n /**\n * Directory for generated TypeScript modules:\n * `i18n-types.generated.ts`, `instance.generated.ts`,\n * `namespace-loaders.generated.ts`, `dictionary-schema.generated.ts`.\n */\n codegenPath: z.string().min(1),\n localeFallback: localeFallbackSchema.optional(),\n delivery: z.enum(DELIVERY_MODES).optional().default(\"split-by-locale\"),\n deliveryArtifacts: deliveryArtifactsSchema.optional(),\n /** Directory for delivery JSON (`translations/`). Defaults to {@link codegenPath}. */\n artifactsPath: z.string().min(1).optional(),\n /**\n * How generated `namespaceLoaders` resolve artifacts.\n * - `import` (default): dynamic `import()` — JSON is bundled; content updates need a rebuild.\n * - `fetch`: runtime `fetchImpl({ locale, namespace, area? })` via required `createI18n({ fetchImpl })`.\n * Codegen does not know URLs — mapping id → transport is an application concern.\n */\n loaderStrategy: z.enum(LOADER_STRATEGIES).optional().default(\"import\"),\n};\n\nexport const codegenConfigKeys = Object.keys(\n codegenConfigShape\n) as (keyof typeof codegenConfigShape)[];\n\nexport const codegenConfigSchema = z\n .object(codegenConfigShape)\n .strict()\n .superRefine((config, ctx) => {\n for (const namespace of Object.keys(config.namespaces)) {\n if (!IDENTIFIER_NAME_PATTERN.test(namespace)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"namespaces\", namespace],\n message: `Invalid namespace name \"${namespace}\" (${IDENTIFIER_NAME_REQUIREMENT}).`,\n });\n }\n }\n\n if (config.delivery === \"custom\") {\n if (!config.deliveryArtifacts) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"deliveryArtifacts\"],\n message: 'deliveryArtifacts is required when delivery is \"custom\".',\n });\n } else {\n for (const issue of getDeliveryArtifactsStructureIssues(config.deliveryArtifacts)) {\n ctx.addIssue({\n code: \"custom\",\n path: issue.path,\n message: issue.message,\n });\n }\n }\n } else if (config.deliveryArtifacts !== undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"deliveryArtifacts\"],\n message: 'deliveryArtifacts is only allowed when delivery is \"custom\".',\n });\n }\n });\n\nexport type CodegenConfigInput = z.input<typeof codegenConfigSchema>;\nexport type CodegenConfig = z.infer<typeof codegenConfigSchema>;\n\nexport const GENERATED_BASENAMES = {\n types: \"i18n-types.generated.ts\",\n instance: \"instance.generated.ts\",\n namespaceLoaders: \"namespace-loaders.generated.ts\",\n dictionarySchema: \"dictionary-schema.generated.ts\",\n} as const;\n\nexport const DEFAULT_FACTORY_NAME = \"createI18n\";\nexport const DEFAULT_LOCALE_FALLBACK_CONST_NAME = \"LOCALE_FALLBACK\";\n\n/** Derived paths and symbol names from `projectName` + `codegenPath`. */\nexport interface ResolvedCodegenPaths {\n codegenPath: string;\n typesOutput: string;\n instanceOutput: string;\n namespaceLoadersOutput: string;\n dictionarySchemaOutput: string;\n artifactsPath: string;\n paramsTypeName: string;\n schemaTypeName: string;\n localeTypeName: string;\n localeFallbackConstName: string;\n factoryName: string;\n deliveryAreaTypeName: string;\n}\n\nexport function resolveCodegenPaths(\n config: Pick<CodegenConfig, \"projectName\" | \"codegenPath\" | \"artifactsPath\">\n): ResolvedCodegenPaths {\n const typeNames = typeNamesForProject(config.projectName);\n const codegenPath = config.codegenPath;\n return {\n codegenPath,\n typesOutput: path.join(codegenPath, GENERATED_BASENAMES.types),\n instanceOutput: path.join(codegenPath, GENERATED_BASENAMES.instance),\n namespaceLoadersOutput: path.join(codegenPath, GENERATED_BASENAMES.namespaceLoaders),\n dictionarySchemaOutput: path.join(codegenPath, GENERATED_BASENAMES.dictionarySchema),\n artifactsPath: config.artifactsPath ?? codegenPath,\n paramsTypeName: typeNames.paramsTypeName,\n schemaTypeName: typeNames.schemaTypeName,\n localeTypeName: typeNames.localeTypeName,\n localeFallbackConstName: DEFAULT_LOCALE_FALLBACK_CONST_NAME,\n factoryName: DEFAULT_FACTORY_NAME,\n deliveryAreaTypeName: `${config.projectName}DeliveryArea`,\n };\n}\n\nexport function resolveArtifactsPath(\n config: Pick<CodegenConfig, \"codegenPath\" | \"artifactsPath\">\n): string {\n return config.artifactsPath ?? config.codegenPath;\n}\n\nexport function formatCodegenConfigIssues(error: z.ZodError): string {\n const issueLines = error.issues.map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n return ` - ${path}: ${issue.message}`;\n });\n\n return [\n \"[Codegen Error] Invalid i18n.codegen.json:\",\n ...issueLines,\n \"\",\n `Allowed keys: ${codegenConfigKeys.join(\", \")}`,\n ].join(\"\\n\");\n}\n","import fs from \"node:fs\";\nimport type { NamespaceEntry } from \"./types.js\";\nimport {\n CodegenConfig,\n codegenConfigSchema,\n formatCodegenConfigIssues,\n} from \"./codegen-config-schema.js\";\n\nexport {\n resolveCodegenPaths,\n resolveArtifactsPath,\n GENERATED_BASENAMES,\n DEFAULT_FACTORY_NAME,\n DEFAULT_LOCALE_FALLBACK_CONST_NAME,\n} from \"./codegen-config-schema.js\";\n\n/** Parses and validates `i18n.codegen.json`; first step of the codegen pipeline. */\nexport function loadConfig(configPath: string): CodegenConfig {\n let raw: unknown;\n\n try {\n raw = JSON.parse(fs.readFileSync(configPath, \"utf8\"));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`[Codegen Error] Failed to parse config JSON (${configPath}): ${message}`);\n }\n\n const result = codegenConfigSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(formatCodegenConfigIssues(result.error));\n }\n\n return result.data;\n}\n\n/** Maps config namespaces to namespace entries. */\nexport function resolveNamespaces(config: CodegenConfig): NamespaceEntry[] {\n return Object.entries(config.namespaces).map(([namespace, filePath]) => ({\n namespace,\n filePath,\n }));\n}\n","export type LocaleFallbackMap = Record<string, string | null>;\n\nexport interface ResolvedLocaleTemplate {\n template: string;\n resolvedLocale: string;\n fallbackChain: readonly string[];\n}\n\nexport function validateLocaleFallback(map: LocaleFallbackMap): void {\n for (const startLocale of Object.keys(map)) {\n const visited = new Set<string>();\n let current: string | undefined = startLocale;\n\n while (current !== undefined) {\n if (visited.has(current)) {\n throw new Error(`[i18n] Circular locale fallback detected involving \"${current}\"`);\n }\n visited.add(current);\n\n const next: string | null | undefined = map[current];\n if (next === undefined || next === null) {\n break;\n }\n current = next;\n }\n }\n}\n\nexport function resolveLocaleTemplate(\n localeByKey: Record<string, string | undefined> | undefined,\n requestedLocale: string,\n fallbackMap?: LocaleFallbackMap\n): ResolvedLocaleTemplate | undefined {\n const chain: string[] = [requestedLocale];\n let currentLocale = requestedLocale;\n\n while (true) {\n const template = localeByKey?.[currentLocale];\n if (template !== undefined) {\n return { template, resolvedLocale: currentLocale, fallbackChain: chain };\n }\n\n if (!fallbackMap) {\n return undefined;\n }\n\n const fallback = fallbackMap[currentLocale];\n if (fallback === undefined || fallback === null) {\n return undefined;\n }\n\n if (chain.includes(fallback)) {\n throw new Error(\n `[i18n] Circular locale fallback detected: ${[...chain, fallback].join(\" → \")}`\n );\n }\n\n chain.push(fallback);\n currentLocale = fallback;\n }\n}\n\nexport function formatLocaleFallbackChain(\n requestedLocale: string,\n fallbackMap?: LocaleFallbackMap\n): string {\n if (!fallbackMap) {\n return requestedLocale;\n }\n\n const chain: string[] = [requestedLocale];\n let current = requestedLocale;\n\n while (true) {\n const fallback = fallbackMap[current];\n if (fallback === undefined || fallback === null) {\n break;\n }\n if (chain.includes(fallback)) {\n chain.push(fallback);\n break;\n }\n chain.push(fallback);\n current = fallback;\n }\n\n return chain.join(\" → \");\n}\n","import { resolveLocaleTemplate } from \"./resolve-locale.js\";\nimport type {\n KeyDictionary,\n LocaleFallbackMap,\n LocaleOfMulti,\n LocaleOfKeys,\n MultiDictionary,\n PartialKeyDictionary,\n PartialMultiDictionary,\n} from \"./types.js\";\n\nfunction classifyAreaLocales(\n areaLocales: readonly string[],\n localeFallback?: LocaleFallbackMap\n): { full: string[]; preserve: string[] } {\n const areaSet = new Set(areaLocales);\n const full: string[] = [];\n const preserve: string[] = [];\n\n for (const locale of areaLocales) {\n const fallback = localeFallback?.[locale];\n if (fallback !== null && fallback !== undefined && areaSet.has(fallback)) {\n preserve.push(locale);\n } else {\n full.push(locale);\n }\n }\n\n return { full, preserve };\n}\n\nfunction projectKeyDictionary<T extends KeyDictionary>(\n dictionary: T,\n locales: readonly string[],\n localeFallback?: LocaleFallbackMap\n): T {\n const targetLocales = [...new Set(locales)];\n const result = {} as T;\n\n for (const [key, localesByKey] of Object.entries(dictionary)) {\n const projected: Record<string, string> = {};\n\n for (const locale of targetLocales) {\n const resolved = resolveLocaleTemplate(localesByKey, locale, localeFallback);\n if (resolved !== undefined) {\n projected[locale] = resolved.template;\n }\n }\n\n if (Object.keys(projected).length > 0) {\n result[key as keyof T] = projected as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Builds a namespace dictionary that contains only the requested locales.\n * For each key and target locale, copies the direct template when present;\n * otherwise resolves through `localeFallback` (same rules as `.get()` at runtime).\n */\nexport function projectNamespaceLocalesCore<T extends KeyDictionary>(\n dictionary: T,\n locales: readonly string[],\n localeFallback?: LocaleFallbackMap\n): T {\n return projectKeyDictionary(dictionary, locales, localeFallback);\n}\n\n/**\n * Projects a single namespace for a custom delivery area.\n * Full locales resolve through `localeFallback` (e.g. external chains like `it → en-US`);\n * preserve locales copy only their direct canonical entry when present.\n */\nexport function projectNamespaceForDeliveryAreaCore<T extends KeyDictionary>(\n dictionary: T,\n areaLocales: readonly string[],\n localeFallback?: LocaleFallbackMap\n): T {\n const { full, preserve } = classifyAreaLocales(areaLocales, localeFallback);\n const fullProjection =\n full.length > 0 ? projectKeyDictionary(dictionary, full, localeFallback) : undefined;\n const result = {} as T;\n\n for (const [key, localesByKey] of Object.entries(dictionary)) {\n const projected: Record<string, string> = {};\n\n if (fullProjection !== undefined) {\n const fullEntry = fullProjection[key as keyof T];\n if (fullEntry !== undefined) {\n Object.assign(projected, fullEntry);\n }\n }\n\n for (const locale of preserve) {\n const template = localesByKey[locale];\n if (template !== undefined) {\n projected[locale] = template;\n }\n }\n\n if (Object.keys(projected).length > 0) {\n result[key as keyof T] = projected as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Projects a multi-namespace dictionary for a custom delivery area.\n * Each namespace uses the same delivery-area rules as `projectNamespaceForDeliveryAreaCore`.\n */\nexport function projectDictionaryForDeliveryAreaCore<T extends MultiDictionary>(\n dictionary: T,\n areaLocales: readonly string[],\n localeFallback?: LocaleFallbackMap\n): T {\n const result = {} as T;\n\n for (const namespace of Object.keys(dictionary) as (keyof T & string)[]) {\n const namespaceDictionary = dictionary[namespace];\n if (namespaceDictionary === undefined) {\n continue;\n }\n\n result[namespace] = projectNamespaceForDeliveryAreaCore(\n namespaceDictionary,\n areaLocales,\n localeFallback\n ) as T[typeof namespace];\n }\n\n return result;\n}\n\n/**\n * Projects every namespace in a multi-namespace dictionary.\n */\nexport function projectDictionaryLocalesCore<T extends MultiDictionary>(\n dictionary: T,\n locales: readonly string[],\n localeFallback?: LocaleFallbackMap\n): T {\n const result = {} as T;\n\n for (const namespace of Object.keys(dictionary) as (keyof T & string)[]) {\n const namespaceDictionary = dictionary[namespace];\n if (namespaceDictionary === undefined) {\n continue;\n }\n\n result[namespace] = projectKeyDictionary(\n namespaceDictionary,\n locales,\n localeFallback\n ) as T[typeof namespace];\n }\n\n return result;\n}\n\n/**\n * Merges locale entries per translation key without dropping keys or locales\n * already present in `existing`. Incoming locales overwrite the same locale on conflict.\n */\nexport function mergeNamespaceLocalesCore<\n T extends KeyDictionary,\n Locales extends string = LocaleOfKeys<T>,\n>(existing: T, incoming: PartialKeyDictionary<T, Locales>): T {\n const merged = structuredClone(existing);\n\n for (const [key, incomingLocales] of Object.entries(incoming)) {\n if (incomingLocales === undefined || typeof incomingLocales !== \"object\") {\n continue;\n }\n\n merged[key as keyof T] = {\n ...(merged[key as keyof T] ?? {}),\n ...incomingLocales,\n } as T[keyof T];\n }\n\n return merged;\n}\n\n/**\n * Merges locale entries per key in every namespace present in `incoming`.\n * Namespaces and keys not in `incoming` are preserved from `existing`.\n */\nexport function mergeDictionaryLocalesCore<\n T extends MultiDictionary,\n Locales extends string = LocaleOfMulti<T>,\n>(existing: T, incoming: PartialMultiDictionary<T, Locales>): T {\n const merged = structuredClone(existing) as T;\n\n for (const namespace of Object.keys(incoming) as (keyof T & string)[]) {\n const incomingNamespace = incoming[namespace];\n if (incomingNamespace === undefined) {\n continue;\n }\n\n merged[namespace] = mergeNamespaceLocalesCore(\n (merged[namespace] ?? {}) as T[typeof namespace],\n incomingNamespace as T[typeof namespace]\n ) as T[typeof namespace];\n }\n\n return merged;\n}\n","import path from \"node:path\";\nimport type { ImportExtension } from \"./types.js\";\n\nexport const GENERATED_FILE_BANNER = \"// Automatically generated code. Do not edit manually.\\n\";\nexport const DEFAULT_IMPORT_EXTENSION: ImportExtension = \"none\";\n\nexport function relativePosixPath(from: string, to: string): string {\n return path.relative(from, to).replace(/\\\\/g, \"/\");\n}\n\nexport function reportCodegenIssues(issues: readonly { message: string }[]): void {\n for (const issue of issues) {\n console.error(`[Codegen Error] ${issue.message}`);\n }\n}\n\nexport function toImportPath(fromFile: string, toFile: string): string {\n const relative = path.relative(path.dirname(fromFile), toFile).replace(/\\\\/g, \"/\");\n const withoutExt = relative.replace(/\\.(json|ya?ml)$/i, \"\");\n return withoutExt.startsWith(\".\") ? withoutExt : `./${withoutExt}`;\n}\n\nexport function toModuleBasename(filePath: string): string {\n return path.basename(filePath).replace(/\\.ts$/, \"\");\n}\n\nexport function importExtensionSuffix(importExtension: ImportExtension): string {\n return importExtension === \"none\" ? \"\" : importExtension;\n}\n\nexport function toRelativeModuleImport(\n moduleBasename: string,\n importExtension: ImportExtension\n): string {\n return `./${moduleBasename}${importExtensionSuffix(importExtension)}`;\n}\n\nexport function toImportIdentifier(namespace: string): string {\n const safe = namespace.replace(/[^a-zA-Z0-9_$]/g, \"_\");\n if (/^[0-9]/.test(safe)) {\n return `ns_${safe}`;\n }\n return `${safe}Ns`;\n}\n\nexport function toLocaleObjectKey(locale: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(locale) ? locale : JSON.stringify(locale);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Writes `content` to `absolutePath` only when it differs from the current\n * file content, keeping mtimes stable for downstream watchers/bundlers.\n * Returns true when the file was actually written.\n */\nexport function writeFileIfChanged(absolutePath: string, content: string): boolean {\n if (fs.existsSync(absolutePath)) {\n const currentContent = fs.readFileSync(absolutePath, \"utf8\");\n if (currentContent === content) {\n return false;\n }\n }\n\n fs.mkdirSync(path.dirname(absolutePath), { recursive: true });\n fs.writeFileSync(absolutePath, content);\n return true;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { IDENTIFIER_NAME_PATTERN, IDENTIFIER_NAME_REQUIREMENT } from \"./constants.js\";\nimport type { DeliveryMode } from \"./codegen-config-schema.js\";\nimport type { DeliveryArtifactsMap } from \"./delivery-artifacts.js\";\nimport {\n projectNamespaceForDeliveryAreaCore,\n projectNamespaceLocalesCore,\n} from \"../project-locales.js\";\nimport type { LocaleFallbackMap } from \"../types.js\";\nimport type { DictionaryJson, NamespaceEntry } from \"./types.js\";\nimport { relativePosixPath } from \"./paths.js\";\nimport { writeFileIfChanged } from \"./write-file-if-changed.js\";\n\n/**\n * Dictionary I/O for codegen and audit: read/validate source files (`readDictionaryFile`)\n * and write compiled or split JSON artifacts (`prepareDictionaryEntries`).\n */\nexport const SUPPORTED_DICTIONARY_EXTENSIONS = [\".json\", \".yaml\", \".yml\"] as const;\nexport type DictionaryFormat = \"json\" | \"yaml\";\n\nexport function getDictionaryFormat(filePath: string): DictionaryFormat | null {\n const extension = path.extname(filePath).toLowerCase();\n if (extension === \".json\") {\n return \"json\";\n }\n if (extension === \".yaml\" || extension === \".yml\") {\n return \"yaml\";\n }\n return null;\n}\n\nexport function resolveCompiledJsonPath(sourcePath: string, generatedDirRelative: string): string {\n const baseName = `${path.basename(sourcePath, path.extname(sourcePath))}.json`;\n return path.join(generatedDirRelative, \"translations\", baseName).replace(/\\\\/g, \"/\");\n}\n\nexport function resolveSplitJsonPath(\n sourcePath: string,\n locale: string,\n generatedDirRelative: string\n): string {\n const baseName = path.basename(sourcePath, path.extname(sourcePath));\n return path\n .join(generatedDirRelative, \"translations\", `${baseName}.${locale}.json`)\n .replace(/\\\\/g, \"/\");\n}\n\nexport function resolveAreaJsonPath(\n sourcePath: string,\n area: string,\n generatedDirRelative: string\n): string {\n const baseName = path.basename(sourcePath, path.extname(sourcePath));\n return path\n .join(generatedDirRelative, \"translations\", `${baseName}.${area}.json`)\n .replace(/\\\\/g, \"/\");\n}\n\n/** Projects a canonical dictionary into per-locale slices for split-by-locale delivery. */\nexport function splitDictionaryByLocale(\n dictionary: DictionaryJson,\n locales: readonly string[],\n localeFallback?: LocaleFallbackMap\n): Record<string, DictionaryJson> {\n const byLocale: Record<string, DictionaryJson> = {};\n\n for (const locale of locales) {\n byLocale[locale] = projectNamespaceLocalesCore(dictionary, [locale], localeFallback);\n }\n\n return byLocale;\n}\n\n/** Projects a canonical dictionary into per-area slices for custom delivery. */\nexport function splitDictionaryByDeliveryArea(\n dictionary: DictionaryJson,\n deliveryArtifacts: DeliveryArtifactsMap,\n localeFallback?: LocaleFallbackMap\n): Record<string, DictionaryJson> {\n const byArea: Record<string, DictionaryJson> = {};\n\n for (const [area, areaLocales] of Object.entries(deliveryArtifacts)) {\n byArea[area] = projectNamespaceForDeliveryAreaCore(dictionary, areaLocales, localeFallback);\n }\n\n return byArea;\n}\n\nfunction assertDictionaryShape(value: unknown, context: string): asserts value is DictionaryJson {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`[Codegen Error] ${context} must be a plain object.`);\n }\n\n for (const [key, localesByKey] of Object.entries(value)) {\n if (!IDENTIFIER_NAME_PATTERN.test(key)) {\n throw new Error(\n `[Codegen Error] ${context}: invalid key \"${key}\" (${IDENTIFIER_NAME_REQUIREMENT}).`\n );\n }\n\n if (localesByKey === null || typeof localesByKey !== \"object\" || Array.isArray(localesByKey)) {\n throw new Error(`[Codegen Error] ${context}: key \"${key}\" must map locales to strings.`);\n }\n\n for (const [locale, template] of Object.entries(localesByKey)) {\n if (typeof template !== \"string\") {\n throw new Error(\n `[Codegen Error] ${context}: key \"${key}\", locale \"${locale}\" must be a string.`\n );\n }\n }\n }\n}\n\n/** Reads and shape-validates a dictionary file from disk (JSON or YAML). */\nexport function readDictionaryFile(absolutePath: string): DictionaryJson {\n const format = getDictionaryFormat(absolutePath);\n if (!format) {\n throw new Error(\n `[Codegen Error] Unsupported dictionary format \"${path.extname(absolutePath)}\" for ${absolutePath}. Use .json, .yaml, or .yml.`\n );\n }\n\n const source = fs.readFileSync(absolutePath, \"utf8\");\n let parsed: unknown;\n\n try {\n parsed = format === \"json\" ? JSON.parse(source) : parseYaml(source);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`[Codegen Error] Failed to parse dictionary ${absolutePath}: ${message}`);\n }\n\n assertDictionaryShape(parsed, `Dictionary file ${absolutePath}`);\n return parsed;\n}\n\nfunction writeCompiledJson(absoluteJsonPath: string, dictionary: DictionaryJson): boolean {\n return writeFileIfChanged(absoluteJsonPath, `${JSON.stringify(dictionary, null, 2)}\\n`);\n}\n\nexport interface PrepareDictionaryEntriesOptions {\n dictionariesByNamespace: Record<string, DictionaryJson>;\n delivery: DeliveryMode;\n localeFallback?: LocaleFallbackMap | undefined;\n requestLocales?: readonly string[] | undefined;\n deliveryArtifacts?: DeliveryArtifactsMap | undefined;\n}\n\nexport interface PrepareDictionariesResult {\n resolvedEntries: NamespaceEntry[];\n splitPathsByNamespace: Record<string, Record<string, string>>;\n compiledFiles: string[];\n}\n\n/**\n * Phase 2 of codegen: materialize JSON artifacts on disk (locale/area split).\n * Returns `splitPathsByNamespace` consumed by namespace-loader emitters.\n */\nexport function prepareDictionaryEntries(\n projectRoot: string,\n entries: NamespaceEntry[],\n generatedDirRelative: string,\n options: PrepareDictionaryEntriesOptions\n): PrepareDictionariesResult {\n const delivery = options.delivery;\n const { dictionariesByNamespace, localeFallback, requestLocales, deliveryArtifacts } = options;\n const resolvedEntries: NamespaceEntry[] = [];\n const splitPathsByNamespace: Record<string, Record<string, string>> = {};\n const compiledFiles: string[] = [];\n\n if (delivery === \"split-by-locale\" && (!requestLocales || requestLocales.length === 0)) {\n throw new Error(\n \"[Codegen Error] split-by-locale delivery requires at least one request locale.\"\n );\n }\n\n if (\n delivery === \"custom\" &&\n (!deliveryArtifacts || Object.keys(deliveryArtifacts).length === 0)\n ) {\n throw new Error(\"[Codegen Error] custom delivery requires deliveryArtifacts.\");\n }\n\n for (const entry of entries) {\n const sourceAbsolutePath = path.resolve(projectRoot, entry.filePath);\n const format = getDictionaryFormat(entry.filePath);\n\n if (!format) {\n throw new Error(\n `[Codegen Error] Namespace \"${entry.namespace}\" uses unsupported dictionary extension in \"${entry.filePath}\". Use .json, .yaml, or .yml.`\n );\n }\n\n const dictionary = dictionariesByNamespace[entry.namespace];\n if (!dictionary) {\n throw new Error(\n `[Codegen Error] Missing parsed dictionary for namespace \"${entry.namespace}\".`\n );\n }\n\n if (delivery === \"split-by-locale\") {\n const splitPaths: Record<string, string> = {};\n const dictionariesByLocale = splitDictionaryByLocale(\n dictionary,\n requestLocales!,\n localeFallback\n );\n\n for (const locale of requestLocales!) {\n const splitRelativePath = resolveSplitJsonPath(\n entry.filePath,\n locale,\n generatedDirRelative\n );\n const splitAbsolutePath = path.resolve(projectRoot, splitRelativePath);\n const wroteFile = writeCompiledJson(splitAbsolutePath, dictionariesByLocale[locale]!);\n\n if (wroteFile) {\n compiledFiles.push(\n `${relativePosixPath(projectRoot, sourceAbsolutePath)} → ${splitRelativePath}`\n );\n }\n\n splitPaths[locale] = splitRelativePath;\n }\n\n splitPathsByNamespace[entry.namespace] = splitPaths;\n resolvedEntries.push(entry);\n continue;\n }\n\n const splitPaths: Record<string, string> = {};\n const dictionariesByArea = splitDictionaryByDeliveryArea(\n dictionary,\n deliveryArtifacts!,\n localeFallback\n );\n\n for (const area of Object.keys(deliveryArtifacts!).sort()) {\n const areaRelativePath = resolveAreaJsonPath(entry.filePath, area, generatedDirRelative);\n const areaAbsolutePath = path.resolve(projectRoot, areaRelativePath);\n const wroteFile = writeCompiledJson(areaAbsolutePath, dictionariesByArea[area]!);\n\n if (wroteFile) {\n compiledFiles.push(\n `${relativePosixPath(projectRoot, sourceAbsolutePath)} → ${areaRelativePath}`\n );\n }\n\n splitPaths[area] = areaRelativePath;\n }\n\n splitPathsByNamespace[entry.namespace] = splitPaths;\n resolvedEntries.push(entry);\n }\n\n return { resolvedEntries, splitPathsByNamespace, compiledFiles };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { CodegenConfig } from \"../codegen/codegen-config-schema.js\";\nimport { loadConfig } from \"../codegen/config.js\";\nimport { type FailOnCriterion, runAuditFromConfig } from \"./audit-dictionaries.js\";\n\nconst FAIL_ON_VALUES = new Set<FailOnCriterion>([\"effective\", \"direct\", \"any\"]);\n\nexport interface AuditCliOptions {\n configPath: string;\n outPath?: string;\n failOn?: FailOnCriterion;\n treatEmptyAsMissing: boolean;\n}\n\nexport function parseAuditArgs(argv: string[]): AuditCliOptions {\n const configArgIndex = argv.indexOf(\"--config\");\n const outArgIndex = argv.indexOf(\"--out\");\n const failOnArgIndex = argv.indexOf(\"--fail-on\");\n\n const configPath = path.resolve(\n process.cwd(),\n configArgIndex >= 0 ? argv[configArgIndex + 1]! : \"i18n/i18n.codegen.json\"\n );\n\n const outPath =\n outArgIndex >= 0 ? path.resolve(process.cwd(), argv[outArgIndex + 1]!) : undefined;\n\n let failOn: FailOnCriterion | undefined;\n if (failOnArgIndex >= 0) {\n const value = argv[failOnArgIndex + 1];\n if (!value || !FAIL_ON_VALUES.has(value as FailOnCriterion)) {\n throw new Error(`[Audit Error] --fail-on must be one of: effective, direct, any`);\n }\n failOn = value as FailOnCriterion;\n }\n\n const treatEmptyAsMissing = !argv.includes(\"--allow-empty\");\n\n return {\n configPath,\n treatEmptyAsMissing,\n ...(outPath !== undefined ? { outPath } : {}),\n ...(failOn !== undefined ? { failOn } : {}),\n };\n}\n\nexport async function runAuditCli(argv = process.argv.slice(2)): Promise<number> {\n let options: AuditCliOptions;\n let config: CodegenConfig;\n\n try {\n options = parseAuditArgs(argv);\n\n if (!fs.existsSync(options.configPath)) {\n console.error(`[Audit Error] Config file not found: ${options.configPath}`);\n return 2;\n }\n\n config = loadConfig(options.configPath);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 2;\n }\n\n const projectRoot = path.dirname(options.configPath);\n\n const { report, exitCode } = await runAuditFromConfig({\n projectRoot,\n config,\n treatEmptyAsMissing: options.treatEmptyAsMissing,\n ...(options.failOn !== undefined ? { failOn: options.failOn } : {}),\n });\n\n const json = `${JSON.stringify(report, null, 2)}\\n`;\n\n if (options.outPath) {\n fs.mkdirSync(path.dirname(options.outPath), { recursive: true });\n fs.writeFileSync(options.outPath, json);\n } else {\n process.stdout.write(json);\n }\n\n return exitCode;\n}\n\nasync function main(): Promise<void> {\n const exitCode = await runAuditCli();\n process.exit(exitCode);\n}\n\nif (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {\n void main();\n}\n","import { validateLocaleFallback } from \"../resolve-locale.js\";\n\n/**\n * Union of locales found in dictionaries plus every locale referenced by `localeFallback`.\n * Drives split-by-locale partitioning and the generated locale union type.\n */\nexport function collectRequestLocales(\n dictionaryLocales: Set<string>,\n fallback?: Record<string, string | null>\n): Set<string> {\n const all = new Set(dictionaryLocales);\n if (!fallback) {\n return all;\n }\n\n for (const [locale, target] of Object.entries(fallback)) {\n all.add(locale);\n if (target !== null) {\n all.add(target);\n }\n }\n\n return all;\n}\n\nexport type LocaleFallbackIssue = {\n path: (string | number)[];\n message: string;\n};\n\n/** Pre-emit validation gate for `localeFallback` config against discovered dictionary locales. */\nexport function getCodegenLocaleFallbackIssues(\n fallback: Record<string, string | null>,\n dictionaryLocales: Set<string>\n): LocaleFallbackIssue[] {\n const issues: LocaleFallbackIssue[] = [];\n\n try {\n validateLocaleFallback(fallback);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n issues.push({ path: [\"localeFallback\"], message });\n }\n\n for (const [locale, target] of Object.entries(fallback)) {\n if (target !== null && !(target in fallback) && !dictionaryLocales.has(target)) {\n issues.push({\n path: [\"localeFallback\", locale],\n message: `localeFallback: \"${locale}\" points to \"${target}\" which is not defined in the fallback map or dictionary locales`,\n });\n }\n }\n\n return issues;\n}\n\nexport function formatLocaleFallbackBlock(\n fallback: Record<string, string | null>,\n constName: string,\n typeName: string\n): string {\n const lines = Object.entries(fallback)\n .map(\n ([locale, target]) =>\n ` ${JSON.stringify(locale)}: ${target === null ? \"null\" : JSON.stringify(target)},`\n )\n .join(\"\\n\");\n\n return (\n `export const ${constName} = {\\n${lines}\\n} as const satisfies Record<string, string | null>;\\n\\n` +\n `export type ${typeName} = typeof ${constName};\\n\\n`\n );\n}\n","import { collectRequestLocales } from \"./locale-fallback.js\";\n\nexport function buildRequiredLocales(\n dictionaryLocales: Set<string>,\n configFallback?: Record<string, string | null>\n): string[] {\n return [...collectRequestLocales(dictionaryLocales, configFallback)].sort();\n}\n\n/**\n * Completes `localeFallback` with explicit `null` entries for every request locale,\n * producing a stable map emitted into `i18n-types.generated.ts`.\n */\nexport function enrichLocaleFallback(\n dictionaryLocales: Set<string>,\n configFallback: Record<string, string | null>\n): Record<string, string | null> {\n const enriched: Record<string, string | null> = { ...configFallback };\n\n for (const locale of buildRequiredLocales(dictionaryLocales, configFallback)) {\n if (!(locale in enriched)) {\n enriched[locale] = null;\n }\n }\n\n const sortedEntries = Object.entries(enriched).sort(([left], [right]) =>\n left.localeCompare(right)\n );\n return Object.fromEntries(sortedEntries);\n}\n","import path from \"node:path\";\nimport type { DictionaryJson } from \"../codegen/types.js\";\nimport { buildRequiredLocales, enrichLocaleFallback } from \"../codegen/locale-policy.js\";\nimport { resolveLocaleTemplate } from \"../resolve-locale.js\";\nimport { CodegenConfig } from \"../codegen/codegen-config-schema.js\";\n\nexport type FailOnCriterion = \"effective\" | \"direct\" | \"any\";\n\nexport interface I18nAuditReport {\n requiredLocales: string[];\n localeFallback?: Record<string, string | null>;\n summary: Record<string, Record<string, { missingDirect: number; missingEffective: number }>>;\n missingDirectByLocale: Record<string, Record<string, string[]>>;\n missingEffectiveByLocale: Record<string, Record<string, string[]>>;\n}\n\nexport interface AuditDictionariesOptions {\n namespaces: Record<string, DictionaryJson>;\n config: Pick<CodegenConfig, \"localeFallback\">;\n treatEmptyAsMissing?: boolean;\n}\n\nfunction isDirectlyMissing(\n localesByKey: Record<string, string>,\n locale: string,\n treatEmptyAsMissing: boolean\n): boolean {\n const template = localesByKey[locale];\n if (template === undefined) {\n return true;\n }\n return treatEmptyAsMissing && template === \"\";\n}\n\nfunction isEffectivelyMissing(\n localesByKey: Record<string, string>,\n locale: string,\n localeFallback: Record<string, string | null> | undefined,\n treatEmptyAsMissing: boolean\n): boolean {\n const resolved = resolveLocaleTemplate(localesByKey, locale, localeFallback);\n if (resolved === undefined) {\n return true;\n }\n return treatEmptyAsMissing && resolved.template === \"\";\n}\n\nfunction collectDictionaryLocales(namespaces: Record<string, DictionaryJson>): Set<string> {\n const locales = new Set<string>();\n\n for (const dictionary of Object.values(namespaces)) {\n for (const localesByKey of Object.values(dictionary)) {\n for (const locale of Object.keys(localesByKey)) {\n locales.add(locale);\n }\n }\n }\n\n return locales;\n}\n\n/**\n * Audit pipeline: reports missing translations per namespace/locale (direct and\n * effective via fallback), using the same locale policy as codegen.\n */\nexport function auditDictionaries(options: AuditDictionariesOptions): I18nAuditReport {\n const { namespaces, config, treatEmptyAsMissing = true } = options;\n const dictionaryLocales = collectDictionaryLocales(namespaces);\n const requiredLocales = buildRequiredLocales(dictionaryLocales, config.localeFallback);\n const localeFallbackForAudit = config.localeFallback\n ? enrichLocaleFallback(dictionaryLocales, config.localeFallback)\n : undefined;\n\n const summary: I18nAuditReport[\"summary\"] = {};\n const missingDirectByLocale: I18nAuditReport[\"missingDirectByLocale\"] = {};\n const missingEffectiveByLocale: I18nAuditReport[\"missingEffectiveByLocale\"] = {};\n\n for (const [namespace, dictionary] of Object.entries(namespaces)) {\n summary[namespace] = {};\n missingDirectByLocale[namespace] = {};\n missingEffectiveByLocale[namespace] = {};\n\n for (const locale of requiredLocales) {\n summary[namespace]![locale] = { missingDirect: 0, missingEffective: 0 };\n missingDirectByLocale[namespace]![locale] = [];\n missingEffectiveByLocale[namespace]![locale] = [];\n }\n\n for (const [key, localesByKey] of Object.entries(dictionary)) {\n for (const locale of requiredLocales) {\n if (isDirectlyMissing(localesByKey, locale, treatEmptyAsMissing)) {\n summary[namespace]![locale]!.missingDirect += 1;\n missingDirectByLocale[namespace]![locale]!.push(key);\n }\n\n if (\n isEffectivelyMissing(localesByKey, locale, localeFallbackForAudit, treatEmptyAsMissing)\n ) {\n summary[namespace]![locale]!.missingEffective += 1;\n missingEffectiveByLocale[namespace]![locale]!.push(key);\n }\n }\n }\n\n for (const locale of requiredLocales) {\n missingDirectByLocale[namespace]![locale]!.sort();\n missingEffectiveByLocale[namespace]![locale]!.sort();\n }\n }\n\n return {\n requiredLocales,\n ...(localeFallbackForAudit !== undefined ? { localeFallback: localeFallbackForAudit } : {}),\n summary,\n missingDirectByLocale,\n missingEffectiveByLocale,\n };\n}\n\nexport function reportHasGaps(report: I18nAuditReport, criterion: FailOnCriterion): boolean {\n for (const namespace of Object.keys(report.missingDirectByLocale)) {\n for (const locale of report.requiredLocales) {\n const direct = report.missingDirectByLocale[namespace]?.[locale] ?? [];\n const effective = report.missingEffectiveByLocale[namespace]?.[locale] ?? [];\n\n if (criterion === \"direct\" && direct.length > 0) {\n return true;\n }\n if (criterion === \"effective\" && effective.length > 0) {\n return true;\n }\n if (criterion === \"any\" && (direct.length > 0 || effective.length > 0)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport interface RunAuditOptions {\n projectRoot: string;\n config: CodegenConfig;\n treatEmptyAsMissing?: boolean;\n failOn?: FailOnCriterion;\n}\n\nexport interface RunAuditResult {\n report: I18nAuditReport;\n exitCode: 0 | 1;\n}\n\nexport async function runAuditFromConfig(options: RunAuditOptions): Promise<RunAuditResult> {\n const { resolveNamespaces } = await import(\"../codegen/config.js\");\n const { readDictionaryFile } = await import(\"../codegen/read-dictionary.js\");\n\n const config = options.config;\n const entries = resolveNamespaces(config);\n const namespaces: Record<string, DictionaryJson> = {};\n\n for (const entry of entries) {\n const absolutePath = path.resolve(options.projectRoot, entry.filePath);\n namespaces[entry.namespace] = readDictionaryFile(absolutePath);\n }\n\n const report = auditDictionaries({\n namespaces,\n config,\n ...(options.treatEmptyAsMissing !== undefined\n ? { treatEmptyAsMissing: options.treatEmptyAsMissing }\n : {}),\n });\n\n const exitCode =\n options.failOn && reportHasGaps(report, options.failOn) ? (1 as const) : (0 as const);\n\n return { report, exitCode };\n}\n"]}