@xndrjs/i18n 0.7.0 → 0.8.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 +67 -872
- package/dist/codegen/index.d.ts +117 -51
- package/dist/codegen/index.js +1585 -93
- package/dist/codegen/index.js.map +1 -1
- package/dist/index.d.ts +100 -234
- package/dist/index.js +74 -638
- package/dist/index.js.map +1 -1
- package/dist/validation/index.d.ts +5 -0
- package/dist/validation/index.js.map +1 -1
- package/package.json +2 -2
- package/src/IcuTranslationProviderMulti.test.ts +18 -40
- package/src/IcuTranslationProviderMulti.ts +27 -37
- package/src/audit/audit-dictionaries.ts +1 -1
- package/src/audit/run-audit.test.ts +6 -7
- package/src/builder-load-registry.ts +26 -5
- package/src/builder-loaders.ts +8 -11
- package/src/builder-types.test.ts +11 -42
- package/src/builder.test.ts +82 -243
- package/src/builder.ts +8 -110
- package/src/codegen/codegen-config-schema.ts +82 -77
- package/src/codegen/config.test.ts +55 -143
- package/src/codegen/config.ts +10 -67
- package/src/codegen/dictionary-spec-contract.test.ts +28 -0
- package/src/codegen/dictionary-spec-contract.ts +138 -0
- package/src/codegen/emit/dictionary-schema-file.ts +7 -43
- package/src/codegen/emit/instance-file.test.ts +35 -52
- package/src/codegen/emit/instance-file.ts +170 -268
- package/src/codegen/emit/namespace-loaders-file.test.ts +72 -74
- package/src/codegen/emit/namespace-loaders-file.ts +147 -90
- package/src/codegen/emit/types-file.test.ts +20 -41
- package/src/codegen/emit/types-file.ts +48 -74
- package/src/codegen/generate-i18n-types.test.ts +163 -492
- package/src/codegen/generate-i18n-types.ts +7 -269
- package/src/codegen/paths.ts +0 -14
- package/src/codegen/project-locales-set-namespace.test.ts +44 -86
- package/src/codegen/read-dictionary.test.ts +27 -9
- package/src/codegen/read-dictionary.ts +18 -40
- package/src/codegen/regenerate-namespaces.ts +180 -0
- package/src/codegen/run-codegen.test.ts +230 -0
- package/src/codegen/run-codegen.ts +252 -0
- package/src/codegen/types.ts +0 -6
- package/src/codegen-config/build-config.ts +4 -23
- package/src/codegen-config/codegen-config.test.ts +10 -6
- package/src/codegen-config/index.ts +18 -3
- package/src/engine.ts +3 -27
- package/src/fetch-artifact.ts +16 -0
- package/src/i18n-handle.ts +202 -0
- package/src/index.ts +15 -34
- package/src/project-locales.ts +2 -2
- package/src/scope-multi.ts +1 -20
- package/src/scope-types.ts +14 -6
- package/src/scope.test.ts +3 -312
- package/src/serialized-state.test.ts +114 -0
- package/src/serialized-state.ts +28 -0
- package/src/setup/setup-i18n.test.ts +22 -33
- package/src/setup/setup-i18n.ts +22 -27
- package/src/types.ts +3 -3
- package/src/validation/index.ts +4 -0
- package/src/IcuTranslationProviderSingle.test.ts +0 -177
- package/src/IcuTranslationProviderSingle.ts +0 -114
- package/src/builder-multi.ts +0 -481
- package/src/codegen/emit/dictionary-file.test.ts +0 -215
- package/src/codegen/emit/dictionary-file.ts +0 -244
- package/src/deep-freeze.test.ts +0 -40
- package/src/deep-freeze.ts +0 -22
- package/src/patch-key.test.ts +0 -186
- package/src/patch-key.ts +0 -140
- package/src/scope-single.ts +0 -85
- package/src/single-builder.ts +0 -153
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/codegen/constants.ts","../../src/codegen/delivery-artifacts.ts","../../src/codegen/codegen-config-schema.ts","../../src/codegen-config/type-names.ts","../../src/codegen-config/build-config.ts","../../src/codegen-config/write-config.ts"],"names":["path"],"mappings":"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","file":"index.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","import { z } from \"zod\";\nimport path from \"node:path\";\nimport {\n IDENTIFIER_NAME_PATTERN,\n IDENTIFIER_NAME_REQUIREMENT,\n SUPPORTED_IMPORT_EXTENSIONS,\n} from \"./constants.js\";\nimport { getDeliveryArtifactsStructureIssues } from \"./delivery-artifacts.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 = [\"canonical\", \"split-by-locale\", \"custom\"] as const;\nexport type DeliveryMode = (typeof DELIVERY_MODES)[number];\n\nconst codegenConfigShape = {\n dictionary: z.string().min(1).optional(),\n namespaces: z.record(z.string(), z.string().min(1)).optional(),\n defaultNamespace: z.string().min(1).optional(),\n typesOutput: z.string().min(1),\n dictionaryOutput: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Output path for dictionary.generated.ts when emitted (canonical, or split/custom with eager namespaces). Omitted in split/custom when every namespace is lazy — defaults to \"{dirname(typesOutput)}/dictionary.generated.ts\" for stale-file cleanup only.'\n ),\n instanceOutput: z.string().min(1),\n dictionarySchemaOutput: z.string().min(1).optional(),\n loadOnInit: z.array(z.string().min(1)).optional(),\n namespaceLoadersOutput: z.string().min(1).optional(),\n importExtension: z.enum(SUPPORTED_IMPORT_EXTENSIONS).optional(),\n paramsTypeName: z.string().min(1),\n schemaTypeName: z.string().min(1),\n localeTypeName: z.string().min(1).optional(),\n localeFallbackConstName: z.string().min(1).optional(),\n localeFallback: localeFallbackSchema.optional(),\n factoryName: z.string().min(1).optional(),\n delivery: z.enum(DELIVERY_MODES).optional().default(\"canonical\"),\n deliveryArtifacts: deliveryArtifactsSchema.optional(),\n deliveryOutput: z.string().min(1).optional(),\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 const hasDictionary = config.dictionary !== undefined;\n const hasNamespaces = config.namespaces !== undefined;\n\n if (hasDictionary === hasNamespaces) {\n ctx.addIssue({\n code: \"custom\",\n message: 'Specify exactly one of \"dictionary\" or \"namespaces\".',\n });\n }\n\n if (config.namespaces) {\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\n if (\n config.defaultNamespace !== undefined &&\n !IDENTIFIER_NAME_PATTERN.test(config.defaultNamespace)\n ) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"defaultNamespace\"],\n message: `Invalid namespace name \"${config.defaultNamespace}\" (${IDENTIFIER_NAME_REQUIREMENT}).`,\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 if (config.loadOnInit !== undefined && config.delivery !== \"canonical\") {\n ctx.addIssue({\n code: \"custom\",\n path: [\"loadOnInit\"],\n message: 'loadOnInit is only allowed when delivery is \"canonical\".',\n });\n }\n });\n\nexport type CodegenConfigInput = z.input<typeof codegenConfigSchema>;\nexport type CodegenConfig = z.infer<typeof codegenConfigSchema>;\n\nexport function resolveDeliveryOutputDir(\n config: Pick<CodegenConfig, \"typesOutput\" | \"deliveryOutput\">\n): string {\n return config.deliveryOutput ?? path.dirname(config.typesOutput);\n}\n\nconst DEFAULT_DICTIONARY_BASENAME = \"dictionary.generated.ts\";\n\n/** Resolved path for dictionary.generated.ts (explicit config or default next to typesOutput). */\nexport function resolveDictionaryOutputPath(\n config: Pick<CodegenConfig, \"typesOutput\" | \"dictionaryOutput\">\n): string {\n return (\n config.dictionaryOutput ??\n path.join(path.dirname(config.typesOutput), DEFAULT_DICTIONARY_BASENAME)\n );\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","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 type { CodegenConfigInput } from \"../codegen/codegen-config-schema.js\";\nimport { typeNamesForProject } from \"./type-names.js\";\n\nexport type SetupMode = \"single\" | \"multi\";\n\nconst GENERATED_DIR = \"generated\";\nconst TRANSLATIONS_DIR = \"translations\";\n\nexport function buildCodegenConfig(mode: SetupMode, project: string): CodegenConfigInput {\n const typeNames = typeNamesForProject(project);\n const base = {\n typesOutput: `${GENERATED_DIR}/i18n-types.generated.ts`,\n dictionaryOutput: `${GENERATED_DIR}/dictionary.generated.ts`,\n instanceOutput: `${GENERATED_DIR}/instance.generated.ts`,\n paramsTypeName: typeNames.paramsTypeName,\n schemaTypeName: typeNames.schemaTypeName,\n localeTypeName: typeNames.localeTypeName,\n factoryName: \"createI18n\",\n } satisfies CodegenConfigInput;\n\n if (mode === \"single\") {\n return {\n dictionary: `${TRANSLATIONS_DIR}/translations.json`,\n ...base,\n };\n }\n\n return {\n namespaces: {\n default: `${TRANSLATIONS_DIR}/default.json`,\n },\n ...base,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { CodegenConfigInput } from \"../codegen/codegen-config-schema.js\";\n\nexport function writeCodegenConfig(configPath: string, config: CodegenConfigInput): void {\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n}\n"]}
|
|
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/codegen-config/build-config.ts","../../src/codegen-config/write-config.ts","../../src/codegen/paths.ts","../../src/codegen/emit/dictionary-schema-file.ts","../../src/codegen/emit/instance-file.ts","../../src/codegen/emit/namespace-loaders-file.ts","../../src/resolve-locale.ts","../../src/codegen/locale-fallback.ts","../../src/codegen/emit/types-file.ts","../../src/icu/extract-variables.ts","../../src/project-locales.ts","../../src/codegen/write-file-if-changed.ts","../../src/codegen/read-dictionary.ts","../../src/codegen/icu-analysis.ts","../../src/codegen/locale-policy.ts","../../src/codegen/run-codegen.ts","../../src/codegen/dictionary-spec-contract.ts","../../src/codegen/regenerate-namespaces.ts"],"names":["path","fs","engineBlock","loaderEntries","parseYaml","splitPaths","configPath"],"mappings":"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","file":"index.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","import type { CodegenConfigInput } from \"../codegen/codegen-config-schema.js\";\n\nconst GENERATED_DIR = \"generated\";\nconst TRANSLATIONS_DIR = \"translations\";\n\nexport function buildCodegenConfig(project: string): CodegenConfigInput {\n return {\n projectName: project,\n namespaces: {\n default: `${TRANSLATIONS_DIR}/default.json`,\n },\n delivery: \"split-by-locale\",\n codegenPath: GENERATED_DIR,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { CodegenConfigInput } from \"../codegen/codegen-config-schema.js\";\n\nexport function writeCodegenConfig(configPath: string, config: CodegenConfigInput): void {\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`);\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 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 type { VariableSpec } from \"../../icu/extract-variables.js\";\nimport { GENERATED_FILE_BANNER, toRelativeModuleImport } from \"../paths.js\";\nimport type { ImportExtension, NamespaceEntry } from \"../types.js\";\n\nfunction formatVariableSpecObject(spec: VariableSpec): string {\n const entries = Object.entries(spec);\n if (entries.length === 0) {\n return \"{}\";\n }\n\n const lines = entries.map(\n ([name, type]) => ` ${JSON.stringify(name)}: ${JSON.stringify(type)},`\n );\n return `{\\n${lines.join(\"\\n\")}\\n }`;\n}\n\n/** Builds the `DICTIONARY_SPEC` constant from ICU analysis output (keys + variable args). */\nexport function formatDictionarySpecBlock(\n entries: NamespaceEntry[],\n argsSpecByNamespace: Record<string, Record<string, VariableSpec>>\n): string {\n const requiredKeysLines = entries\n .map((entry) => {\n const keys = Object.keys(argsSpecByNamespace[entry.namespace] ?? {})\n .map((key) => JSON.stringify(key))\n .join(\", \");\n return ` ${JSON.stringify(entry.namespace)}: [${keys}] as const,`;\n })\n .join(\"\\n\");\n\n const argsByKeyLines = entries\n .map((entry) => {\n const argsByKey = argsSpecByNamespace[entry.namespace] ?? {};\n const keyLines = Object.entries(argsByKey)\n .map(([key, spec]) => ` ${JSON.stringify(key)}: ${formatVariableSpecObject(spec)},`)\n .join(\"\\n\");\n return ` ${JSON.stringify(entry.namespace)}: {\\n${keyLines}\\n },`;\n })\n .join(\"\\n\");\n\n return (\n `export const DICTIONARY_SPEC = {\\n` +\n ` mode: 'multi' as const,\\n` +\n ` requiredKeys: {\\n${requiredKeysLines}\\n },\\n` +\n ` argsByKey: {\\n${argsByKeyLines}\\n },\\n` +\n `} satisfies DictionarySpec;\\n`\n );\n}\n\n/**\n * Emits the optional dictionary-schema module: `DICTIONARY_SPEC` plus thin wrappers\n * around `@xndrjs/i18n/validation` for validating external payloads before\n * updating authoring / `regenerateNamespaces` (e.g. CMS → authoring JSON), not for runtime key patches.\n */\nexport function formatDictionarySchemaFile(\n schemaTypeName: string,\n typesModule: string,\n dictionarySpecBlock: string,\n importExtension: ImportExtension\n): string {\n const typesImport = toRelativeModuleImport(typesModule, importExtension);\n const partialImport =\n ` validateExternalDictionaryPartial as validateExternalDictionaryPartialCore,\\n` +\n ` validateExternalNamespacePartial as validateExternalNamespacePartialCore,\\n` +\n ` validateExternalKey as validateExternalKeyCore,\\n`;\n\n const multiValidators =\n `export function validateExternalNamespacePartial<NS extends keyof ${schemaTypeName}>(\\n` +\n ` namespace: NS,\\n` +\n ` input: unknown,\\n` +\n `): ValidationResult<Partial<${schemaTypeName}[NS]>> {\\n` +\n ` return validateExternalNamespacePartialCore<Partial<${schemaTypeName}[NS]>>(\\n` +\n ` namespace as string,\\n` +\n ` input,\\n` +\n ` DICTIONARY_SPEC,\\n` +\n ` );\\n` +\n `}\\n\\n` +\n `export function validateExternalKey<\\n` +\n ` NS extends keyof ${schemaTypeName},\\n` +\n ` K extends keyof ${schemaTypeName}[NS],\\n` +\n `>(\\n` +\n ` namespace: NS,\\n` +\n ` key: K,\\n` +\n ` input: unknown,\\n` +\n `): ValidationResult<Pick<${schemaTypeName}[NS], K>> {\\n` +\n ` return validateExternalKeyCore<Pick<${schemaTypeName}[NS], K>>(\\n` +\n ` namespace as string,\\n` +\n ` key as string,\\n` +\n ` input,\\n` +\n ` DICTIONARY_SPEC,\\n` +\n ` );\\n` +\n `}\\n\\n`;\n\n return (\n `${GENERATED_FILE_BANNER}` +\n `import {\\n` +\n partialImport +\n ` type DictionarySpec,\\n` +\n ` type ValidationResult,\\n` +\n `} from '@xndrjs/i18n/validation';\\n` +\n `import type { ${schemaTypeName} } from '${typesImport}';\\n\\n` +\n `${dictionarySpecBlock}\\n` +\n `export function validateExternalDictionaryPartial(\\n` +\n ` input: unknown,\\n` +\n `): ValidationResult<Partial<${schemaTypeName}>> {\\n` +\n ` return validateExternalDictionaryPartialCore<Partial<${schemaTypeName}>>(\\n` +\n ` input,\\n` +\n ` DICTIONARY_SPEC,\\n` +\n ` );\\n` +\n `}\\n\\n` +\n multiValidators\n );\n}\n","import { GENERATED_FILE_BANNER, toModuleBasename, toRelativeModuleImport } from \"../paths.js\";\nimport type { DeliveryMode, LoaderStrategy } from \"../codegen-config-schema.js\";\nimport type { ImportExtension } from \"../types.js\";\n\n/** Emits the generated instance module: `createI18n` factory wrapping the ICU provider. */\nexport interface InstanceFileOptions {\n typesOutputPath: string;\n namespaceLoadersOutputPath: string;\n paramsTypeName: string;\n schemaTypeName: string;\n localeTypeName: string;\n localeFallbackConstName: string;\n factoryName: string;\n hasLocaleFallback: boolean;\n hasLocaleType: boolean;\n importExtension: ImportExtension;\n delivery: DeliveryMode;\n localeDeliveryAreaConstName?: string;\n loaderStrategy?: LoaderStrategy;\n}\n\nconst STATE_TYPE = `{ dictionary: InitialSchema; resources?: readonly (readonly [string, string])[] }`;\n\nexport function formatInstanceFile(options: InstanceFileOptions): string {\n const {\n typesOutputPath,\n namespaceLoadersOutputPath,\n paramsTypeName,\n schemaTypeName,\n localeTypeName,\n localeFallbackConstName,\n factoryName,\n hasLocaleFallback,\n hasLocaleType,\n importExtension,\n delivery,\n localeDeliveryAreaConstName = \"LOCALE_DELIVERY_AREA\",\n loaderStrategy = \"import\",\n } = options;\n\n const providerClass = \"IcuTranslationProviderMulti\";\n const typesModule = toModuleBasename(typesOutputPath);\n const typesImport = toRelativeModuleImport(typesModule, importExtension);\n const loadersModule = toModuleBasename(namespaceLoadersOutputPath);\n const loadersImport = toRelativeModuleImport(loadersModule, importExtension);\n const schemaTypesImport = `import type { ${paramsTypeName}, ${schemaTypeName}, InitialSchema } from '${typesImport}';\\n`;\n const typesImportLine = formatTypesValueImport({\n hasLocaleType,\n hasLocaleFallback,\n localeTypeName,\n localeFallbackConstName,\n localeDeliveryAreaConstName,\n delivery,\n typesImport,\n });\n const packageImports = formatPackageImports(providerClass, loaderStrategy);\n const loadersImportLine =\n loaderStrategy === \"fetch\"\n ? `import { createNamespaceLoaders } from '${loadersImport}';\\n`\n : `import { namespaceLoaders } from '${loadersImport}';\\n`;\n\n const createFactoryBlock = formatCreateI18nFactory({\n providerClass,\n schemaTypeName,\n paramsTypeName,\n localeTypeName,\n localeFallbackConstName,\n factoryName,\n hasLocaleFallback,\n delivery,\n localeDeliveryAreaConstName,\n loaderStrategy,\n });\n\n return (\n `${GENERATED_FILE_BANNER}` +\n `import {\\n` +\n ` ${packageImports},\\n` +\n `} from '@xndrjs/i18n';\\n` +\n schemaTypesImport +\n typesImportLine +\n loadersImportLine +\n `\\n` +\n createFactoryBlock\n );\n}\n\nfunction formatTypesValueImport(options: {\n hasLocaleType: boolean;\n hasLocaleFallback: boolean;\n localeTypeName: string;\n localeFallbackConstName: string;\n localeDeliveryAreaConstName: string;\n delivery: DeliveryMode;\n typesImport: string;\n}): string {\n const {\n hasLocaleType,\n hasLocaleFallback,\n localeTypeName,\n localeFallbackConstName,\n localeDeliveryAreaConstName,\n delivery,\n typesImport,\n } = options;\n\n if (!hasLocaleType && delivery !== \"custom\") {\n return \"\";\n }\n\n const valueNames: string[] = [];\n if (hasLocaleFallback) {\n valueNames.push(localeFallbackConstName);\n }\n if (delivery === \"custom\") {\n valueNames.push(localeDeliveryAreaConstName);\n }\n\n if (valueNames.length > 0 && hasLocaleType) {\n return `import { ${valueNames.join(\", \")}, type ${localeTypeName} } from '${typesImport}';\\n`;\n }\n if (valueNames.length > 0) {\n return `import { ${valueNames.join(\", \")} } from '${typesImport}';\\n`;\n }\n if (hasLocaleType) {\n return `import type { ${localeTypeName} } from '${typesImport}';\\n`;\n }\n return \"\";\n}\n\nfunction formatCreateI18nFactory(options: {\n providerClass: string;\n schemaTypeName: string;\n paramsTypeName: string;\n localeTypeName: string;\n localeFallbackConstName: string;\n factoryName: string;\n hasLocaleFallback: boolean;\n delivery: DeliveryMode;\n localeDeliveryAreaConstName: string;\n loaderStrategy: LoaderStrategy;\n}): string {\n const {\n providerClass,\n schemaTypeName,\n paramsTypeName,\n localeTypeName,\n localeFallbackConstName,\n factoryName,\n hasLocaleFallback,\n delivery,\n localeDeliveryAreaConstName,\n loaderStrategy,\n } = options;\n\n const providerTypeArgs = hasLocaleFallback\n ? `${schemaTypeName}, ${paramsTypeName}, ${localeTypeName}, typeof ${localeFallbackConstName}`\n : `${schemaTypeName}, ${paramsTypeName}`;\n const handleReturnType = `I18nHandle<${schemaTypeName}, ${paramsTypeName}, ${localeTypeName}>`;\n const handleTypeArgs = `<${schemaTypeName}, ${paramsTypeName}, ${localeTypeName}>`;\n\n const partitionForLocale =\n delivery === \"custom\"\n ? ` partitionForLocale: (locale) => ${localeDeliveryAreaConstName}[locale],\\n`\n : ` partitionForLocale: (locale) => locale,\\n`;\n\n const optionsType =\n loaderStrategy === \"fetch\"\n ? `{ fetchImpl: FetchArtifact; state?: ${STATE_TYPE}; onMissing?: OnMissingTranslation }`\n : `{ state?: ${STATE_TYPE}; onMissing?: OnMissingTranslation }`;\n\n const optionsParam =\n loaderStrategy === \"fetch\" ? ` options: ${optionsType},\\n` : ` options?: ${optionsType},\\n`;\n\n const namespaceLoadersLine =\n loaderStrategy === \"fetch\"\n ? ` namespaceLoaders: createNamespaceLoaders(fetchImpl),\\n`\n : ` namespaceLoaders,\\n`;\n\n return (\n `export function ${factoryName}(\\n` +\n optionsParam +\n `): ${handleReturnType} {\\n` +\n formatBody({\n providerClass,\n providerTypeArgs,\n hasLocaleFallback,\n localeFallbackConstName,\n loaderStrategy,\n }) +\n ` engine.seedBuilderResources(normalized.resources);\\n` +\n ` return createI18nHandle${handleTypeArgs}(engine, {\\n` +\n namespaceLoadersLine +\n partitionForLocale +\n ` } as I18nHandleOptions<${schemaTypeName}, ${localeTypeName}>);\\n` +\n `}\\n`\n );\n}\n\nfunction formatBody(options: {\n providerClass: string;\n providerTypeArgs: string;\n hasLocaleFallback: boolean;\n localeFallbackConstName: string;\n loaderStrategy: LoaderStrategy;\n}): string {\n const {\n providerClass,\n providerTypeArgs,\n hasLocaleFallback,\n localeFallbackConstName,\n loaderStrategy,\n } = options;\n\n if (loaderStrategy === \"fetch\") {\n const engineBlock = hasLocaleFallback\n ? ` const engine = new ${providerClass}<${providerTypeArgs}>(normalized.dictionary, {\\n` +\n ` localeFallback: ${localeFallbackConstName},\\n` +\n ` ...providerOptions,\\n` +\n ` });\\n`\n : ` const engine = new ${providerClass}<${providerTypeArgs}>(normalized.dictionary, providerOptions);\\n`;\n\n return (\n ` const { fetchImpl, state, ...providerOptions } = options;\\n` +\n ` const normalized = normalizeI18nCreateInput(state);\\n` +\n engineBlock\n );\n }\n\n const engineBlock = hasLocaleFallback\n ? ` const engine = new ${providerClass}<${providerTypeArgs}>(normalized.dictionary, {\\n` +\n ` localeFallback: ${localeFallbackConstName},\\n` +\n ` ...providerOptions,\\n` +\n ` });\\n`\n : ` const engine = new ${providerClass}<${providerTypeArgs}>(normalized.dictionary, providerOptions);\\n`;\n\n return (\n ` const { state, ...providerOptions } = options ?? {};\\n` +\n ` const normalized = normalizeI18nCreateInput(state);\\n` +\n engineBlock\n );\n}\n\nfunction formatPackageImports(providerClass: string, loaderStrategy: LoaderStrategy): string {\n const names = [\n providerClass,\n \"createI18nHandle\",\n \"normalizeI18nCreateInput\",\n \"type I18nHandle\",\n \"type I18nHandleOptions\",\n \"type OnMissingTranslation\",\n ];\n if (loaderStrategy === \"fetch\") {\n names.push(\"type FetchArtifact\");\n }\n return names.join(\",\\n \");\n}\n","import path from \"node:path\";\nimport type { DeliveryMode, LoaderStrategy } from \"../codegen-config-schema.js\";\nimport { GENERATED_FILE_BANNER, toImportPath, toRelativeModuleImport } from \"../paths.js\";\nimport type { ImportExtension, NamespaceEntry } from \"../types.js\";\n\n/**\n * Emits the generated `namespace-loaders.generated.ts` module: dynamic `import()`\n * or injectable `fetchImpl(resourceId)` loaders, shaped by delivery mode.\n */\nexport interface NamespaceLoadersFileOptions {\n loadersOutputPath: string;\n lazyEntries: (NamespaceEntry & { absolutePath: string })[];\n schemaTypeName: string;\n localeTypeName: string;\n typesModule: string;\n importExtension: ImportExtension;\n projectRoot: string;\n delivery: DeliveryMode;\n splitPathsByNamespace?: Record<string, Record<string, string>>;\n requestLocales?: readonly string[];\n deliveryAreaTypeName?: string;\n deliveryAreaNames?: readonly string[];\n loaderStrategy?: LoaderStrategy;\n}\n\ninterface PartitionedNamespaceLoadersParams {\n partitionKeys: readonly string[];\n paramName: string;\n paramTypeName: string;\n}\n\nfunction formatDefaultNamespacesLiteral(lazyEntries: NamespaceEntry[]): string {\n return [...lazyEntries]\n .map((entry) => entry.namespace)\n .sort()\n .map((namespace) => JSON.stringify(namespace))\n .join(\", \");\n}\n\nfunction formatPartitionedTypesImport(\n options: NamespaceLoadersFileOptions,\n paramTypeName: string\n): string {\n const { schemaTypeName, typesModule, importExtension } = options;\n return `import type { ${schemaTypeName}, LazyNamespace, ${paramTypeName} } from '${toRelativeModuleImport(typesModule, importExtension)}';\\n\\n`;\n}\n\nfunction formatImportCase(\n loadersOutputPath: string,\n projectRoot: string,\n splitRelativePath: string\n): string {\n const importPath = toImportPath(loadersOutputPath, path.resolve(projectRoot, splitRelativePath));\n return `return import('${importPath}.json').then((m) => m.default);`;\n}\n\nfunction indentBlock(text: string, spaces: number): string {\n const pad = \" \".repeat(spaces);\n return text\n .split(\"\\n\")\n .map((line) => (line.length === 0 ? line : `${pad}${line}`))\n .join(\"\\n\");\n}\n\nfunction formatImportNamespaceLoaderEntry(options: {\n namespace: string;\n paramName: string;\n partitionKeys: readonly string[];\n splitPathsByNamespace: Record<string, Record<string, string>>;\n loadersOutputPath: string;\n projectRoot: string;\n}): string {\n const {\n namespace,\n paramName,\n partitionKeys,\n splitPathsByNamespace,\n loadersOutputPath,\n projectRoot,\n } = options;\n\n const caseBodies = partitionKeys.map((partitionKey) => {\n const splitRelativePath = splitPathsByNamespace[namespace]?.[partitionKey];\n if (!splitRelativePath) {\n throw new Error(\n `[Codegen Error] Missing split path for namespace \"${namespace}\", ${paramName} \"${partitionKey}\".`\n );\n }\n const body = formatImportCase(loadersOutputPath, projectRoot, splitRelativePath);\n return [`case ${JSON.stringify(partitionKey)}:`, ` ${body}`].join(\"\\n\");\n });\n\n const switchBody = [\n ...caseBodies,\n `default:`,\n ` throw new Error(\\`[i18n] No translation artifact for namespace ${JSON.stringify(namespace)} and ${paramName} \"\\${String(${paramName})}\".\\`);`,\n ].join(\"\\n\");\n\n const entry = [\n `${namespace}: (${paramName}) => {`,\n ` switch (${paramName}) {`,\n indentBlock(switchBody, 4),\n ` }`,\n `},`,\n ].join(\"\\n\");\n\n return indentBlock(entry, 2);\n}\n\n/** Fetch loaders forward a resource id; URL mapping is left to `fetchImpl`. */\nfunction formatFetchNamespaceLoaderEntry(options: {\n namespace: string;\n paramName: string;\n schemaTypeName: string;\n delivery: DeliveryMode;\n}): string {\n const { namespace, paramName, schemaTypeName, delivery } = options;\n const nsLiteral = JSON.stringify(namespace);\n const resourceId =\n delivery === \"custom\"\n ? `{ locale, namespace: ${nsLiteral}, area }`\n : `{ locale, namespace: ${nsLiteral} }`;\n\n // Custom: partition is area; locale comes from load() context.\n // Split-by-locale: partition is locale (second arg unused).\n const signature = delivery === \"custom\" ? `(${paramName}, { locale })` : `(${paramName})`;\n\n return indentBlock(\n `${namespace}: ${signature} =>\\n` +\n ` fetchImpl(${resourceId}) as Promise<${schemaTypeName}[${nsLiteral}]>,`,\n 4\n );\n}\n\nfunction formatPartitionedNamespaceLoadersFile(\n options: NamespaceLoadersFileOptions,\n params: PartitionedNamespaceLoadersParams\n): string {\n const { partitionKeys, paramName, paramTypeName } = params;\n const {\n loadersOutputPath,\n lazyEntries,\n schemaTypeName,\n projectRoot,\n delivery,\n splitPathsByNamespace = {},\n } = options;\n const loaderStrategy = options.loaderStrategy ?? \"import\";\n\n const loaderValueType = `${schemaTypeName}[K]`;\n const typesImport = formatPartitionedTypesImport(options, paramTypeName);\n\n if (loaderStrategy === \"fetch\") {\n // Fetch loaders ignore partition-key switches: the resource id is enough for the app.\n const fetchLoadersType = `{\\n [K in LazyNamespace]: (${\n delivery === \"custom\"\n ? `${paramName}: ${paramTypeName}, context: { locale: string }`\n : `${paramName}: ${paramTypeName}`\n }) => Promise<${loaderValueType}>;\\n}`;\n\n const loaderEntries = lazyEntries\n .map((entry) =>\n formatFetchNamespaceLoaderEntry({\n namespace: entry.namespace,\n paramName,\n schemaTypeName,\n delivery,\n })\n )\n .join(\"\\n\");\n\n return (\n `${GENERATED_FILE_BANNER}` +\n `import type { FetchArtifact } from '@xndrjs/i18n';\\n` +\n typesImport +\n `export type NamespaceLoaders = ${fetchLoadersType};\\n\\n` +\n `/** Build loaders that resolve artifacts via the injected {@link FetchArtifact} (resource id only). */\\n` +\n `export function createNamespaceLoaders(fetchImpl: FetchArtifact): NamespaceLoaders {\\n` +\n ` return {\\n${loaderEntries}\\n };\\n` +\n `}\\n\\n` +\n `export const defaultLazyNamespaces = [${formatDefaultNamespacesLiteral(lazyEntries)}] as const;\\n`\n );\n }\n\n const loaderEntries = lazyEntries\n .map((entry) =>\n formatImportNamespaceLoaderEntry({\n namespace: entry.namespace,\n paramName,\n partitionKeys,\n splitPathsByNamespace,\n loadersOutputPath,\n projectRoot,\n })\n )\n .join(\"\\n\");\n\n // Import loaders only use the partition key; context is accepted for a uniform NamespaceLoader shape.\n const importLoadersType = `{\\n [K in LazyNamespace]: (${paramName}: ${paramTypeName}) => Promise<${loaderValueType}>;\\n}`;\n\n return (\n `${GENERATED_FILE_BANNER}` +\n typesImport +\n `export const namespaceLoaders: ${importLoadersType} = {\\n${loaderEntries}\\n};\\n` +\n `\\n` +\n `export const defaultLazyNamespaces = [${formatDefaultNamespacesLiteral(lazyEntries)}] as const;\\n`\n );\n}\n\n/**\n * Builds `namespace-loaders.generated.ts` for split-by-locale or custom delivery areas.\n */\nexport function formatNamespaceLoadersFile(options: NamespaceLoadersFileOptions): string {\n if (options.delivery === \"split-by-locale\") {\n return formatPartitionedNamespaceLoadersFile(options, {\n partitionKeys: options.requestLocales ?? [],\n paramName: \"locale\",\n paramTypeName: options.localeTypeName,\n });\n }\n if (!options.deliveryAreaTypeName) {\n throw new Error(\"[Codegen Error] deliveryAreaTypeName is required for custom delivery.\");\n }\n return formatPartitionedNamespaceLoadersFile(options, {\n partitionKeys: options.deliveryAreaNames ?? [],\n paramName: \"area\",\n paramTypeName: options.deliveryAreaTypeName,\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 { 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 {\n formatDeliveryArtifactsBlock,\n formatLocaleDeliveryAreaBlock,\n type DeliveryArtifactsMap,\n} from \"../delivery-artifacts.js\";\nimport { formatLocaleFallbackBlock } from \"../locale-fallback.js\";\nimport { GENERATED_FILE_BANNER } from \"../paths.js\";\nimport type { NamespaceEntry } from \"../types.js\";\n\n/**\n * Emits lazy-load type aliases. Every namespace is lazy; `InitialSchema` is empty\n * (cold start / hydrate via `resources` only).\n */\nexport function formatLazyTypesBlock(lazyEntries: NamespaceEntry[]): string {\n const lazyUnion =\n lazyEntries.length > 0\n ? lazyEntries.map((entry) => `'${entry.namespace}'`).join(\" | \")\n : \"never\";\n\n return (\n `export type LazyNamespace = ${lazyUnion};\\n` +\n `/** Empty cold-start schema — namespaces arrive via \\`namespaceLoaders\\`. */\\n` +\n `export type InitialSchema = Record<string, never>;\\n\\n`\n );\n}\n\nexport function formatLocaleTemplateType(localeTypeName: string, hasLocaleUnion: boolean): string {\n if (!hasLocaleUnion) {\n return \"Partial<Record<string, string>>\";\n }\n return `Partial<Record<${localeTypeName}, string>>`;\n}\n\nexport interface TypesFileOptions {\n entries: NamespaceEntry[];\n projectRoot: string;\n typesOutputPath: string;\n paramsTypeName: string;\n schemaTypeName: string;\n localeTypeName: string;\n localeFallbackConstName: string;\n localeFallbackTypeName: string;\n localeFallback?: Record<string, string | null> | undefined;\n paramsByNamespace: Record<string, Record<string, string>>;\n /** Sorted request locales — emits `ProjectLocales` const + `ProjectLocale` type. */\n requestLocales: readonly string[];\n deliveryAreaTypeName?: string;\n /** Sorted delivery area names — emits `ProjectDeliveryAreas` const + type. */\n deliveryAreaNames?: readonly string[];\n deliveryArtifacts?: DeliveryArtifactsMap;\n localeDeliveryAreaConstName?: string;\n lazyEntries: NamespaceEntry[];\n}\n\nexport function formatTypesFile(options: TypesFileOptions): string {\n const {\n entries,\n paramsTypeName,\n schemaTypeName,\n localeTypeName,\n localeFallbackConstName,\n localeFallbackTypeName,\n localeFallback,\n paramsByNamespace,\n requestLocales,\n deliveryAreaTypeName,\n deliveryAreaNames,\n deliveryArtifacts,\n localeDeliveryAreaConstName = \"LOCALE_DELIVERY_AREA\",\n lazyEntries,\n } = options;\n\n const hasLocaleUnion = requestLocales.length > 0;\n const localeTemplateType = formatLocaleTemplateType(localeTypeName, hasLocaleUnion);\n const localesConstName = `${localeTypeName}s`;\n\n const localeBlock = hasLocaleUnion\n ? `${localeFallback ? formatLocaleFallbackBlock(localeFallback, localeFallbackConstName, localeFallbackTypeName) : \"\"}` +\n `export const ${localesConstName} = [${requestLocales.map((locale) => JSON.stringify(locale)).join(\", \")}] as const;\\n` +\n `export type ${localeTypeName} = (typeof ${localesConstName})[number];\\n\\n`\n : \"\";\n\n const deliveryAreasConstName = deliveryAreaTypeName ? `${deliveryAreaTypeName}s` : undefined;\n const deliveryAreaBlock =\n deliveryAreaTypeName &&\n deliveryAreasConstName &&\n deliveryAreaNames &&\n deliveryAreaNames.length > 0\n ? `export const ${deliveryAreasConstName} = [${deliveryAreaNames.map((area) => JSON.stringify(area)).join(\", \")}] as const;\\n` +\n `export type ${deliveryAreaTypeName} = (typeof ${deliveryAreasConstName})[number];\\n\\n` +\n (deliveryArtifacts\n ? formatDeliveryArtifactsBlock(\n deliveryArtifacts,\n \"DELIVERY_ARTIFACTS\",\n localeTypeName,\n deliveryAreaTypeName\n ) +\n formatLocaleDeliveryAreaBlock(\n deliveryArtifacts,\n localeDeliveryAreaConstName,\n localeTypeName,\n deliveryAreaTypeName\n )\n : \"\")\n : \"\";\n\n const namespaceBlocks = entries\n .map((entry) => {\n const keyTypes = paramsByNamespace[entry.namespace] ?? {};\n const lines = Object.entries(keyTypes)\n .map(([key, type]) => ` ${key}: ${type};`)\n .join(\"\\n\");\n return ` ${entry.namespace}: {\\n${lines}\\n };`;\n })\n .join(\"\\n\");\n\n const paramsBlock = `export type ${paramsTypeName} = {\\n${namespaceBlocks}\\n};`;\n\n const schemaLines = entries\n .map((entry) => {\n const keyTypes = paramsByNamespace[entry.namespace] ?? {};\n const lines = Object.keys(keyTypes)\n .map((key) => ` ${key}: ${localeTemplateType};`)\n .join(\"\\n\");\n return ` ${entry.namespace}: {\\n${lines}\\n };`;\n })\n .join(\"\\n\");\n\n const schemaBlock = `export type ${schemaTypeName} = {\\n${schemaLines}\\n};`;\n\n const lazyTypesBlock = formatLazyTypesBlock(lazyEntries);\n\n return (\n `${GENERATED_FILE_BANNER}` +\n `export const I18N_MODE = 'multi' as const;\\n\\n` +\n `${localeBlock}` +\n `${deliveryAreaBlock}` +\n `${paramsBlock}\\n\\n` +\n `${schemaBlock}\\n` +\n `${lazyTypesBlock}`\n );\n}\n","import type { parse } from \"@formatjs/icu-messageformat-parser\";\n\nexport type VariableType = \"string\" | \"number\" | \"date\";\nexport type VariableSpec = Record<string, VariableType>;\n\nexport type VariableRole =\n | \"simple\"\n | \"plural\"\n | \"selectordinal\"\n | \"select\"\n | \"number\"\n | \"date\"\n | \"time\";\n\nexport type VariableMeta = {\n type: VariableType;\n roles: Set<VariableRole>;\n};\n\nexport type VariableMetaSpec = Record<string, VariableMeta>;\n\ntype IcuAst = ReturnType<typeof parse>;\ntype IcuNode = IcuAst[number];\n\nfunction isPluralOrOrdinalNode(node: IcuNode): node is Extract<IcuNode, { type: 6 }> {\n return node.type === 6 && \"pluralType\" in node && Boolean(node.pluralType);\n}\n\nfunction hasVariableName(node: IcuNode): node is Extract<IcuNode, { value: string }> {\n return \"value\" in node && typeof node.value === \"string\";\n}\n\nfunction addVariableMeta(\n variables: VariableMetaSpec,\n name: string,\n type: VariableType,\n role: VariableRole\n): void {\n const existing = variables[name];\n if (!existing) {\n variables[name] = { type, roles: new Set([role]) };\n return;\n }\n\n existing.roles.add(role);\n existing.type = mergeVariableTypes(existing.type, type);\n}\n\nfunction mergeVariableTypes(left: VariableType, right: VariableType): VariableType {\n if (left === right) {\n return left;\n }\n\n if ((left === \"string\" && right === \"number\") || (left === \"number\" && right === \"string\")) {\n return \"number\";\n }\n\n return right;\n}\n\nexport function extractVariableMeta(nodes: IcuAst): VariableMetaSpec {\n const variables: VariableMetaSpec = {};\n\n const walk = (walkNodes: IcuAst) => {\n for (const node of walkNodes) {\n if (node.type === 1 && hasVariableName(node)) {\n addVariableMeta(variables, node.value, \"string\", \"simple\");\n } else if (node.type === 2 && hasVariableName(node)) {\n addVariableMeta(variables, node.value, \"number\", \"number\");\n } else if (isPluralOrOrdinalNode(node) && hasVariableName(node)) {\n const role = node.pluralType === \"ordinal\" ? \"selectordinal\" : \"plural\";\n addVariableMeta(variables, node.value, \"number\", role);\n } else if (node.type === 3 && hasVariableName(node)) {\n addVariableMeta(variables, node.value, \"date\", \"date\");\n } else if (node.type === 4 && hasVariableName(node)) {\n addVariableMeta(variables, node.value, \"date\", \"time\");\n } else if (node.type === 5 && hasVariableName(node)) {\n addVariableMeta(variables, node.value, \"string\", \"select\");\n }\n\n if (\"options\" in node && node.options) {\n for (const option of Object.values(node.options)) {\n walk(option.value);\n }\n }\n\n if (\"children\" in node && Array.isArray(node.children)) {\n walk(node.children);\n }\n }\n };\n\n walk(nodes);\n return variables;\n}\n\nexport function variableMetaToSpec(meta: VariableMetaSpec): VariableSpec {\n return Object.fromEntries(Object.entries(meta).map(([name, entry]) => [name, entry.type]));\n}\n\nexport function extractVariables(nodes: IcuAst): VariableSpec {\n return variableMetaToSpec(extractVariableMeta(nodes));\n}\n\nexport function inferMergedVariableType(roles: Set<VariableRole>): VariableType | \"CONFLICT\" {\n const hasPlural = roles.has(\"plural\");\n const hasSelectordinal = roles.has(\"selectordinal\");\n const hasSelect = roles.has(\"select\");\n const hasSimple = roles.has(\"simple\");\n const hasNumber = roles.has(\"number\");\n const hasDate = roles.has(\"date\");\n const hasTime = roles.has(\"time\");\n\n // Incompatible numeric ICU constructs on the same variable.\n if (hasPlural && hasSelectordinal) {\n return \"CONFLICT\";\n }\n\n // Select (string-family) vs plural / ordinal / number-format (number-family).\n if (hasSelect && (hasPlural || hasSelectordinal || hasNumber)) {\n return \"CONFLICT\";\n }\n\n // Legacy explicit pairs — covered by the rule above, kept for clarity.\n if (hasPlural && hasSelect) {\n return \"CONFLICT\";\n }\n\n if (hasSelectordinal && hasSelect) {\n return \"CONFLICT\";\n }\n\n if (hasDate || hasTime) {\n if (hasPlural || hasSelect || hasSelectordinal || hasSimple || hasNumber) {\n return \"CONFLICT\";\n }\n return \"date\";\n }\n\n if (hasPlural || hasSelectordinal || hasNumber) {\n return \"number\";\n }\n\n if (hasSelect || hasSimple) {\n return \"string\";\n }\n\n return \"string\";\n}\n\nexport function mergeVariableMetaAcrossLocales(\n localeMetas: readonly VariableMetaSpec[]\n): { ok: true; merged: VariableSpec } | { ok: false; message: string } {\n const keySignatures = localeMetas.map((meta) => Object.keys(meta).sort().join(\",\"));\n if (new Set(keySignatures).size > 1) {\n return {\n ok: false,\n message: `Inconsistent ICU variable names across locales (keys: ${keySignatures.join(\" vs \")})`,\n };\n }\n\n const merged: VariableSpec = {};\n const variableNames = new Set(localeMetas.flatMap((meta) => Object.keys(meta)));\n\n for (const variableName of variableNames) {\n const combinedRoles = new Set<VariableRole>();\n\n for (const meta of localeMetas) {\n for (const role of meta[variableName]?.roles ?? []) {\n combinedRoles.add(role);\n }\n }\n\n const mergedType = inferMergedVariableType(combinedRoles);\n if (mergedType === \"CONFLICT\") {\n const rolesByLocale = localeMetas\n .map((meta) => {\n const entry = meta[variableName];\n if (!entry) {\n return null;\n }\n return [...entry.roles].sort().join(\"|\");\n })\n .filter((value): value is string => value !== null);\n\n return {\n ok: false,\n message: `Incompatible ICU variable \"${variableName}\" across locales (roles: ${rolesByLocale.join(\" vs \")})`,\n };\n }\n\n merged[variableName] = mergedType;\n }\n\n return { ok: true, merged };\n}\n\nexport function mergeVariableSpecs(target: VariableSpec, source: VariableSpec): VariableSpec {\n const merged = { ...target };\n\n for (const [varName, varType] of Object.entries(source)) {\n const existing = merged[varName];\n if (existing && existing !== varType) {\n merged[varName] = \"number\";\n } else {\n merged[varName] = varType;\n }\n }\n\n return merged;\n}\n\nexport function variableSpecsEqual(a: VariableSpec, b: VariableSpec): boolean {\n const aKeys = Object.keys(a).sort();\n const bKeys = Object.keys(b).sort();\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n return aKeys.every((key, index) => {\n if (key !== bKeys[index]) {\n return false;\n }\n return a[key] === b[key];\n });\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 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 { 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 `${path.relative(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 `${path.relative(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 { parse } from \"@formatjs/icu-messageformat-parser\";\nimport {\n extractVariableMeta,\n mergeVariableMetaAcrossLocales,\n type VariableSpec,\n} from \"../icu/extract-variables.js\";\nimport type { DictionaryJson, NamespaceEntry } from \"./types.js\";\nimport { readDictionaryFile } from \"./read-dictionary.js\";\n\nexport function paramsTypeForVariables(variables: VariableSpec): string {\n const keys = Object.keys(variables);\n if (keys.length === 0) {\n return \"never\";\n }\n\n const props = keys.map((key) => {\n const type = variables[key] === \"date\" ? \"Date | number\" : variables[key];\n return `${key}: ${type}`;\n });\n return `{ ${props.join(\"; \")} }`;\n}\n\nexport interface DictionaryAnalysis {\n paramsByNamespace: Record<string, Record<string, string>>;\n argsSpecByNamespace: Record<string, Record<string, VariableSpec>>;\n locales: Set<string>;\n dictionariesByNamespace: Record<string, DictionaryJson>;\n}\n\n/**\n * Phase 1 of codegen: read source dictionaries, validate ICU syntax, infer param types.\n * Output feeds type emission, optional `DICTIONARY_SPEC`, and `prepareDictionaryEntries`.\n */\nexport function analyzeDictionaries(\n projectRoot: string,\n entries: NamespaceEntry[]\n): { ok: true; analysis: DictionaryAnalysis } | { ok: false } {\n const paramsByNamespace: Record<string, Record<string, string>> = {};\n const argsSpecByNamespace: Record<string, Record<string, VariableSpec>> = {};\n const locales = new Set<string>();\n const dictionariesByNamespace: Record<string, DictionaryJson> = {};\n let hasErrors = false;\n\n for (const entry of entries) {\n const absolutePath = path.resolve(projectRoot, entry.filePath);\n\n if (!fs.existsSync(absolutePath)) {\n console.error(\n `[Codegen Error] Dictionary file not found for namespace \"${entry.namespace}\": ${absolutePath}`\n );\n hasErrors = true;\n continue;\n }\n\n const dictionary = readDictionaryFile(absolutePath);\n dictionariesByNamespace[entry.namespace] = dictionary;\n paramsByNamespace[entry.namespace] = {};\n argsSpecByNamespace[entry.namespace] = {};\n\n for (const [key, localesByKey] of Object.entries(dictionary)) {\n const localeMetas: ReturnType<typeof extractVariableMeta>[] = [];\n\n for (const locale of Object.keys(localesByKey)) {\n locales.add(locale);\n }\n\n for (const [locale, template] of Object.entries(localesByKey)) {\n try {\n const ast = parse(template);\n localeMetas.push(extractVariableMeta(ast));\n } catch (error) {\n hasErrors = true;\n const message = error instanceof Error ? error.message : String(error);\n console.error(\n `[Codegen Error] ICU syntax error — namespace \"${entry.namespace}\", key \"${key}\", locale \"${locale}\": ${message}`\n );\n }\n }\n\n if (localeMetas.length === 0) {\n continue;\n }\n\n const mergedVariables = mergeVariableMetaAcrossLocales(localeMetas);\n if (!mergedVariables.ok) {\n hasErrors = true;\n console.error(\n `[Codegen Error] ${mergedVariables.message} — namespace \"${entry.namespace}\", key \"${key}\"`\n );\n continue;\n }\n\n const variables = mergedVariables.merged;\n\n paramsByNamespace[entry.namespace]![key] = paramsTypeForVariables(variables);\n argsSpecByNamespace[entry.namespace]![key] = variables;\n }\n }\n\n if (hasErrors) {\n return { ok: false };\n }\n\n return {\n ok: true,\n analysis: { paramsByNamespace, argsSpecByNamespace, locales, dictionariesByNamespace },\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 fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n loadConfig,\n resolveArtifactsPath,\n resolveCodegenPaths,\n resolveNamespaces,\n} from \"./config.js\";\nimport type { CodegenConfig } from \"./codegen-config-schema.js\";\nimport {\n formatDictionarySchemaFile,\n formatDictionarySpecBlock,\n} from \"./emit/dictionary-schema-file.js\";\nimport { formatInstanceFile } from \"./emit/instance-file.js\";\nimport { formatNamespaceLoadersFile } from \"./emit/namespace-loaders-file.js\";\nimport { formatTypesFile } from \"./emit/types-file.js\";\nimport { analyzeDictionaries } from \"./icu-analysis.js\";\nimport { getDeliveryArtifactsIssues } from \"./delivery-artifacts.js\";\nimport { collectRequestLocales, getCodegenLocaleFallbackIssues } from \"./locale-fallback.js\";\nimport { enrichLocaleFallback } from \"./locale-policy.js\";\nimport { DEFAULT_IMPORT_EXTENSION, reportCodegenIssues, toModuleBasename } from \"./paths.js\";\nimport { prepareDictionaryEntries } from \"./read-dictionary.js\";\nimport { writeFileIfChanged } from \"./write-file-if-changed.js\";\n\nexport type RunCodegenInput =\n | string\n | {\n configPath?: string;\n config?: CodegenConfig;\n projectRoot?: string;\n /** When false, skip console.log summaries (default true). */\n log?: boolean;\n };\n\nexport interface RunCodegenResult {\n projectRoot: string;\n generatedFiles: string[];\n compiledFiles: string[];\n}\n\nfunction resolveRunCodegenInput(input?: RunCodegenInput): {\n projectRoot: string;\n config: CodegenConfig;\n log: boolean;\n} {\n if (typeof input === \"string\" || input === undefined) {\n const configPath = path.resolve(\n process.cwd(),\n typeof input === \"string\" ? input : \"i18n/i18n.codegen.json\"\n );\n if (!fs.existsSync(configPath)) {\n throw new Error(`[Codegen Error] Config file not found: ${configPath}`);\n }\n return {\n projectRoot: path.dirname(configPath),\n config: loadConfig(configPath),\n log: true,\n };\n }\n\n const log = input.log !== false;\n\n if (input.config !== undefined) {\n const projectRoot = path.resolve(input.projectRoot ?? process.cwd());\n return { projectRoot, config: input.config, log };\n }\n\n const configPath = path.resolve(process.cwd(), input.configPath ?? \"i18n/i18n.codegen.json\");\n if (!fs.existsSync(configPath)) {\n throw new Error(`[Codegen Error] Config file not found: ${configPath}`);\n }\n return {\n projectRoot: path.dirname(configPath),\n config: loadConfig(configPath),\n log,\n };\n}\n\n/**\n * Full codegen pipeline: types + instance + loaders + delivery JSON (+ schema).\n * Run at build time or when the *contract* changes (keys, params, namespaces, locales).\n * Content-only refreshes (same ICU contract) should use {@link regenerateNamespaces} instead.\n */\nexport function runCodegen(input?: RunCodegenInput): RunCodegenResult {\n const { projectRoot, config, log } = resolveRunCodegenInput(input);\n const sourceEntries = resolveNamespaces(config);\n const artifactsPathRelative = resolveArtifactsPath(config);\n const delivery = config.delivery ?? \"split-by-locale\";\n const loaderStrategy = config.loaderStrategy ?? \"import\";\n\n const analysisResult = analyzeDictionaries(projectRoot, sourceEntries);\n if (!analysisResult.ok) {\n throw new Error(\"[Codegen Error] Dictionary ICU analysis failed. See messages above.\");\n }\n\n const { paramsByNamespace, argsSpecByNamespace, locales, dictionariesByNamespace } =\n analysisResult.analysis;\n\n if (config.localeFallback) {\n const localeFallbackIssues = getCodegenLocaleFallbackIssues(config.localeFallback, locales);\n if (localeFallbackIssues.length > 0) {\n reportCodegenIssues(localeFallbackIssues);\n throw new Error(\"[Codegen Error] Invalid localeFallback configuration.\");\n }\n }\n\n const paths = resolveCodegenPaths(config);\n const {\n paramsTypeName,\n schemaTypeName,\n localeTypeName,\n localeFallbackConstName,\n factoryName,\n deliveryAreaTypeName: resolvedDeliveryAreaTypeName,\n } = paths;\n const localeFallbackTypeName = `${localeTypeName}Fallback`;\n const importExtension = DEFAULT_IMPORT_EXTENSION;\n\n const requestLocales = collectRequestLocales(locales, config.localeFallback);\n const requestLocalesList = [...requestLocales].sort();\n\n if (delivery === \"custom\" && config.deliveryArtifacts) {\n const deliveryArtifactsIssues = getDeliveryArtifactsIssues(\n config.deliveryArtifacts,\n requestLocales\n );\n if (deliveryArtifactsIssues.length > 0) {\n reportCodegenIssues(deliveryArtifactsIssues);\n throw new Error(\"[Codegen Error] Invalid deliveryArtifacts configuration.\");\n }\n }\n\n const {\n resolvedEntries: entries,\n splitPathsByNamespace,\n compiledFiles,\n } = prepareDictionaryEntries(projectRoot, sourceEntries, artifactsPathRelative, {\n dictionariesByNamespace,\n delivery,\n localeFallback: config.localeFallback,\n requestLocales: delivery === \"split-by-locale\" ? requestLocalesList : undefined,\n deliveryArtifacts: delivery === \"custom\" ? config.deliveryArtifacts : undefined,\n });\n\n const typesOutputPath = path.resolve(projectRoot, paths.typesOutput);\n const instanceOutputPath = path.resolve(projectRoot, paths.instanceOutput);\n const namespaceLoadersOutputPath = path.resolve(projectRoot, paths.namespaceLoadersOutput);\n const dictionarySchemaOutputPath = path.resolve(projectRoot, paths.dictionarySchemaOutput);\n const typesModule = toModuleBasename(typesOutputPath);\n\n const deliveryAreaNames =\n delivery === \"custom\" && config.deliveryArtifacts\n ? Object.keys(config.deliveryArtifacts).sort()\n : undefined;\n const deliveryAreaTypeName = delivery === \"custom\" ? resolvedDeliveryAreaTypeName : undefined;\n\n const localeFallbackForEmit = config.localeFallback\n ? enrichLocaleFallback(locales, config.localeFallback)\n : undefined;\n\n const typesContent = formatTypesFile({\n entries,\n projectRoot,\n typesOutputPath,\n paramsTypeName,\n schemaTypeName,\n localeTypeName,\n localeFallbackConstName,\n localeFallbackTypeName,\n localeFallback: localeFallbackForEmit,\n paramsByNamespace,\n requestLocales: requestLocalesList,\n ...(deliveryAreaTypeName && deliveryAreaNames\n ? {\n deliveryAreaTypeName,\n deliveryAreaNames,\n ...(delivery === \"custom\" && config.deliveryArtifacts\n ? { deliveryArtifacts: config.deliveryArtifacts }\n : {}),\n }\n : {}),\n lazyEntries: entries,\n });\n\n const instanceContent = formatInstanceFile({\n typesOutputPath,\n namespaceLoadersOutputPath,\n paramsTypeName,\n schemaTypeName,\n localeTypeName,\n localeFallbackConstName,\n factoryName,\n hasLocaleFallback: Boolean(config.localeFallback),\n hasLocaleType: requestLocalesList.length > 0,\n importExtension,\n delivery,\n loaderStrategy,\n ...(delivery === \"custom\" ? { localeDeliveryAreaConstName: \"LOCALE_DELIVERY_AREA\" } : {}),\n });\n\n writeFileIfChanged(typesOutputPath, typesContent);\n\n const generatedFiles = [\n path.relative(projectRoot, typesOutputPath),\n path.relative(projectRoot, instanceOutputPath),\n ];\n\n writeFileIfChanged(instanceOutputPath, instanceContent);\n\n const dictionarySpecBlock = formatDictionarySpecBlock(entries, argsSpecByNamespace);\n const dictionarySchemaContent = formatDictionarySchemaFile(\n schemaTypeName,\n typesModule,\n dictionarySpecBlock,\n importExtension\n );\n writeFileIfChanged(dictionarySchemaOutputPath, dictionarySchemaContent);\n generatedFiles.push(path.relative(projectRoot, dictionarySchemaOutputPath));\n\n const lazyEntriesWithPaths = entries.map((entry) => ({\n ...entry,\n absolutePath: path.resolve(projectRoot, entry.filePath),\n }));\n const namespaceLoadersContent = formatNamespaceLoadersFile({\n loadersOutputPath: namespaceLoadersOutputPath,\n lazyEntries: lazyEntriesWithPaths,\n schemaTypeName,\n localeTypeName,\n typesModule,\n importExtension,\n projectRoot,\n delivery,\n splitPathsByNamespace,\n loaderStrategy,\n ...(delivery === \"split-by-locale\" ? { requestLocales: requestLocalesList } : {}),\n ...(delivery === \"custom\" && deliveryAreaTypeName && deliveryAreaNames\n ? { deliveryAreaTypeName, deliveryAreaNames }\n : {}),\n });\n\n writeFileIfChanged(namespaceLoadersOutputPath, namespaceLoadersContent);\n generatedFiles.push(path.relative(projectRoot, namespaceLoadersOutputPath));\n\n if (log) {\n console.log(`✅ Generated: ${generatedFiles.join(\", \")}`);\n if (compiledFiles.length > 0) {\n console.log(`✅ Compiled: ${compiledFiles.join(\", \")}`);\n }\n }\n\n return { projectRoot, generatedFiles, compiledFiles };\n}\n","import fs from \"node:fs\";\nimport type { VariableSpec } from \"../icu/extract-variables.js\";\nimport type { DictionarySpec } from \"../validation/types.js\";\nimport type { NamespaceEntry } from \"./types.js\";\n\n/** Builds a multi-mode {@link DictionarySpec} from ICU analysis for the given entries. */\nexport function buildDictionarySpecFromAnalysis(\n entries: NamespaceEntry[],\n argsSpecByNamespace: Record<string, Record<string, VariableSpec>>\n): Extract<DictionarySpec, { mode: \"multi\" }> {\n const requiredKeys: Record<string, readonly string[]> = {};\n const argsByKey: Record<string, Record<string, VariableSpec>> = {};\n\n for (const entry of entries) {\n const argsByKeyForNs = argsSpecByNamespace[entry.namespace] ?? {};\n requiredKeys[entry.namespace] = Object.keys(argsByKeyForNs).sort();\n argsByKey[entry.namespace] = argsByKeyForNs;\n }\n\n return {\n mode: \"multi\",\n requiredKeys,\n argsByKey,\n };\n}\n\n/**\n * Loads `DICTIONARY_SPEC` from a previously generated `dictionary-schema.generated.ts`.\n * Sync parse of the emitter format from {@link formatDictionarySpecBlock} (no TS runtime import).\n */\nexport function loadDictionarySpecFromSchemaFile(\n absoluteSchemaPath: string\n): Extract<DictionarySpec, { mode: \"multi\" }> {\n if (!fs.existsSync(absoluteSchemaPath)) {\n throw new Error(\n `[Codegen Error] Missing dictionary schema at ${absoluteSchemaPath}. Run runCodegen first.`\n );\n }\n\n const source = fs.readFileSync(absoluteSchemaPath, \"utf8\");\n const match = source.match(\n /export const DICTIONARY_SPEC = (\\{[\\s\\S]*?\\n\\}) satisfies DictionarySpec;/\n );\n if (!match?.[1]) {\n throw new Error(\n `[Codegen Error] Could not parse DICTIONARY_SPEC from ${absoluteSchemaPath}. Re-run runCodegen.`\n );\n }\n\n const cleaned = match[1].replace(/ as const/g, \"\");\n let parsed: unknown;\n try {\n parsed = new Function(`\"use strict\"; return (${cleaned});`)();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `[Codegen Error] Failed to evaluate DICTIONARY_SPEC from ${absoluteSchemaPath}: ${message}`\n );\n }\n\n if (\n !parsed ||\n typeof parsed !== \"object\" ||\n (parsed as DictionarySpec).mode !== \"multi\" ||\n !(\"requiredKeys\" in parsed) ||\n !(\"argsByKey\" in parsed)\n ) {\n throw new Error(\n `[Codegen Error] DICTIONARY_SPEC in ${absoluteSchemaPath} is not a multi-mode DictionarySpec.`\n );\n }\n\n return parsed as Extract<DictionarySpec, { mode: \"multi\" }>;\n}\n\nfunction sortedKeys(keys: readonly string[]): string[] {\n return [...keys].sort();\n}\n\nfunction variableSpecsEqual(a: VariableSpec, b: VariableSpec): boolean {\n const aKeys = Object.keys(a).sort();\n const bKeys = Object.keys(b).sort();\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n for (let i = 0; i < aKeys.length; i++) {\n const key = aKeys[i]!;\n if (key !== bKeys[i] || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n}\n\nfunction namespaceArgsEqual(\n a: Readonly<Record<string, VariableSpec>> | undefined,\n b: Readonly<Record<string, VariableSpec>> | undefined\n): boolean {\n const aKeys = Object.keys(a ?? {}).sort();\n const bKeys = Object.keys(b ?? {}).sort();\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n for (const key of aKeys) {\n if (!bKeys.includes(key)) {\n return false;\n }\n if (!variableSpecsEqual(a![key]!, b![key]!)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Returns true when `current` matches `established` for every namespace in `namespaces`\n * (same keys + same ICU VariableSpec per key).\n */\nexport function namespaceContractsMatch(\n namespaces: readonly string[],\n current: Extract<DictionarySpec, { mode: \"multi\" }>,\n established: Extract<DictionarySpec, { mode: \"multi\" }>\n): boolean {\n for (const namespace of namespaces) {\n const currentKeys = sortedKeys(current.requiredKeys[namespace] ?? []);\n const establishedKeys = sortedKeys(established.requiredKeys[namespace] ?? []);\n if (\n currentKeys.length !== establishedKeys.length ||\n currentKeys.some((key, index) => key !== establishedKeys[index])\n ) {\n return false;\n }\n if (!namespaceArgsEqual(current.argsByKey[namespace], established.argsByKey[namespace])) {\n return false;\n }\n }\n return true;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { CodegenConfig } from \"./codegen-config-schema.js\";\nimport {\n loadConfig,\n resolveArtifactsPath,\n resolveCodegenPaths,\n resolveNamespaces,\n} from \"./config.js\";\nimport { getDeliveryArtifactsIssues } from \"./delivery-artifacts.js\";\nimport {\n buildDictionarySpecFromAnalysis,\n loadDictionarySpecFromSchemaFile,\n namespaceContractsMatch,\n} from \"./dictionary-spec-contract.js\";\nimport { analyzeDictionaries } from \"./icu-analysis.js\";\nimport { collectRequestLocales, getCodegenLocaleFallbackIssues } from \"./locale-fallback.js\";\nimport { reportCodegenIssues } from \"./paths.js\";\nimport { prepareDictionaryEntries } from \"./read-dictionary.js\";\nimport type { DictionaryJson } from \"./types.js\";\n\nexport interface RegenerateNamespacesInput {\n /** Namespaces whose delivery JSON should be refreshed from authoring sources. */\n namespaces: readonly string[];\n configPath?: string;\n config?: CodegenConfig;\n projectRoot?: string;\n /** When false, skip console.log summaries (default true). */\n log?: boolean;\n}\n\nexport interface RegenerateNamespacesResult {\n projectRoot: string;\n compiledFiles: string[];\n splitPathsByNamespace: Record<string, Record<string, string>>;\n}\n\nfunction resolveRegenerateInput(input: RegenerateNamespacesInput): {\n projectRoot: string;\n config: CodegenConfig;\n namespaces: readonly string[];\n log: boolean;\n} {\n const log = input.log !== false;\n const namespaces = input.namespaces;\n\n if (input.config !== undefined) {\n return {\n projectRoot: path.resolve(input.projectRoot ?? process.cwd()),\n config: input.config,\n namespaces,\n log,\n };\n }\n\n const configPath = path.resolve(process.cwd(), input.configPath ?? \"i18n/i18n.codegen.json\");\n if (!fs.existsSync(configPath)) {\n throw new Error(`[Codegen Error] Config file not found: ${configPath}`);\n }\n return {\n projectRoot: path.dirname(configPath),\n config: loadConfig(configPath),\n namespaces,\n log,\n };\n}\n\n/**\n * Content-only refresh: re-materialize delivery JSON for selected namespaces from\n * current authoring files, without rewriting generated TypeScript.\n *\n * Must not change the ICU key/param contract established by a prior {@link runCodegen}.\n * If authoring changed keys or ICU args, this throws — run {@link runCodegen} and ship a release.\n *\n * Authoring updates are out of scope for this library (CMS or editors write those files).\n * End-to-end without app rebuild requires `loaderStrategy: \"fetch\"`.\n */\nexport function regenerateNamespaces(input: RegenerateNamespacesInput): RegenerateNamespacesResult {\n const { projectRoot, config, namespaces, log } = resolveRegenerateInput(input);\n\n if (namespaces.length === 0) {\n throw new Error(\"[Codegen Error] regenerateNamespaces requires a non-empty namespaces list.\");\n }\n\n const sourceEntries = resolveNamespaces(config);\n const known = new Set(sourceEntries.map((entry) => entry.namespace));\n const unknown = namespaces.filter((namespace) => !known.has(namespace));\n if (unknown.length > 0) {\n throw new Error(\n `[Codegen Error] Unknown namespace(s) for regenerateNamespaces: ${unknown.join(\", \")}.`\n );\n }\n\n const requested = new Set(namespaces);\n const selectedEntries = sourceEntries.filter((entry) => requested.has(entry.namespace));\n\n const paths = resolveCodegenPaths(config);\n const schemaPath = path.resolve(projectRoot, paths.dictionarySchemaOutput);\n const established = loadDictionarySpecFromSchemaFile(schemaPath);\n\n const artifactsPathRelative = resolveArtifactsPath(config);\n const delivery = config.delivery ?? \"split-by-locale\";\n\n // Analyze all namespaces so locale unions / deliveryArtifacts stay consistent with full codegen.\n const analysisResult = analyzeDictionaries(projectRoot, sourceEntries);\n if (!analysisResult.ok) {\n throw new Error(\n \"[Codegen Error] Dictionary ICU analysis failed while regenerating namespaces.\"\n );\n }\n\n const {\n argsSpecByNamespace,\n locales,\n dictionariesByNamespace: sourceDictionaries,\n } = analysisResult.analysis;\n\n const current = buildDictionarySpecFromAnalysis(selectedEntries, argsSpecByNamespace);\n if (!namespaceContractsMatch(namespaces, current, established)) {\n throw new Error(\n \"[Codegen Error] Namespace ICU contract changed (keys or params). Contract change requires runCodegen.\"\n );\n }\n\n if (config.localeFallback) {\n const localeFallbackIssues = getCodegenLocaleFallbackIssues(config.localeFallback, locales);\n if (localeFallbackIssues.length > 0) {\n reportCodegenIssues(localeFallbackIssues);\n throw new Error(\"[Codegen Error] Invalid localeFallback configuration.\");\n }\n }\n\n const requestLocales = collectRequestLocales(locales, config.localeFallback);\n const requestLocalesList = [...requestLocales].sort();\n\n if (delivery === \"custom\" && config.deliveryArtifacts) {\n const deliveryArtifactsIssues = getDeliveryArtifactsIssues(\n config.deliveryArtifacts,\n requestLocales\n );\n if (deliveryArtifactsIssues.length > 0) {\n reportCodegenIssues(deliveryArtifactsIssues);\n throw new Error(\"[Codegen Error] Invalid deliveryArtifacts configuration.\");\n }\n }\n\n const dictionariesByNamespace: Record<string, DictionaryJson> = {};\n for (const entry of selectedEntries) {\n const dictionary = sourceDictionaries[entry.namespace];\n if (!dictionary) {\n throw new Error(\n `[Codegen Error] Missing parsed dictionary for namespace \"${entry.namespace}\".`\n );\n }\n dictionariesByNamespace[entry.namespace] = dictionary;\n }\n\n const { splitPathsByNamespace, compiledFiles } = prepareDictionaryEntries(\n projectRoot,\n selectedEntries,\n artifactsPathRelative,\n {\n dictionariesByNamespace,\n delivery,\n localeFallback: config.localeFallback,\n requestLocales: delivery === \"split-by-locale\" ? requestLocalesList : undefined,\n deliveryArtifacts: delivery === \"custom\" ? config.deliveryArtifacts : undefined,\n }\n );\n\n if (log) {\n if (compiledFiles.length > 0) {\n console.log(`✅ Regenerated delivery artifacts: ${compiledFiles.join(\", \")}`);\n } else {\n console.log(\"✅ Regenerated delivery artifacts: unchanged\");\n }\n }\n\n return { projectRoot, compiledFiles, splitPathsByNamespace };\n}\n"]}
|