{"version":3,"file":"buildIntlayerDictionary.mjs","names":[],"sources":["../../../src/buildIntlayerDictionary/buildIntlayerDictionary.ts"],"sourcesContent":["import { IMPORT_MODE, OUTPUT_FORMAT } from '@intlayer/config/defaultValues';\nimport { colorizeKey, getAppLogger } from '@intlayer/config/logger';\nimport {\n  getNestedDictionaryGraph,\n  isQualifiedDictionaryGroup,\n} from '@intlayer/core/dictionaryManipulator';\nimport type { IntlayerConfig } from '@intlayer/types/config';\nimport type { Dictionary } from '@intlayer/types/dictionary';\nimport { readDictionariesFromDisk } from '../utils/readDictionariesFromDisk';\nimport {\n  type LocalizedDictionaryOutput,\n  type QualifiedMergedDictionaryOutput,\n  writeDynamicDictionary,\n  writeDynamicQualifiedDictionaries,\n} from './writeDynamicDictionary';\nimport { writeFetchDictionary } from './writeFetchDictionary';\nimport {\n  type PlainMergedDictionaryOutput,\n  writeMergedDictionaries,\n} from './writeMergedDictionary';\nimport { writeNestedDictionaries } from './writeNestedDictionary';\nimport { writeUnmergedDictionaries } from './writeUnmergedDictionary';\n\nexport type BuildDictionariesOptions = Partial<{\n  formats: typeof OUTPUT_FORMAT;\n  importOtherDictionaries: boolean;\n  env: 'prod' | 'dev';\n}>;\n\nconst defaultOptions = {\n  formats: OUTPUT_FORMAT,\n  importOtherDictionaries: true,\n  env: 'dev',\n} as const satisfies BuildDictionariesOptions;\n\n/**\n * This function transpile the bundled code to to make dictionaries as JSON files\n */\nexport const buildDictionary = async (\n  localDictionariesEntries: Dictionary[],\n  configuration: IntlayerConfig,\n  options?: BuildDictionariesOptions\n) => {\n  const importMode =\n    configuration?.build?.importMode ??\n    configuration?.dictionary?.importMode ??\n    IMPORT_MODE;\n\n  const { importOtherDictionaries, env, formats } = {\n    ...defaultOptions,\n    ...options,\n  };\n\n  const unmergedDictionariesToUpdate: Dictionary[] = [\n    ...localDictionariesEntries,\n  ];\n\n  if (importOtherDictionaries) {\n    const prevUnmergedDictionaries: Record<string, Dictionary[]> =\n      readDictionariesFromDisk(configuration.system.unmergedDictionariesDir);\n\n    // Reinsert other dictionaries with the same key to avoid merging errors\n    for (const dictionaryToWrite of localDictionariesEntries) {\n      const allPrebuiltUnmergedDictionaries =\n        prevUnmergedDictionaries[dictionaryToWrite.key]!;\n\n      if (allPrebuiltUnmergedDictionaries?.length > 0) {\n        // Do not add the same dictionary again by filtering out the one with the same localId\n        const otherUnmergedDictionaries =\n          allPrebuiltUnmergedDictionaries?.filter(\n            (unmergedDictionary) =>\n              unmergedDictionary.localId !== dictionaryToWrite.localId\n          );\n\n        unmergedDictionariesToUpdate.push(...(otherUnmergedDictionaries ?? []));\n      }\n    }\n  }\n\n  const unmergedDictionaries = await writeUnmergedDictionaries(\n    unmergedDictionariesToUpdate,\n    configuration,\n    env\n  );\n\n  const mergedDictionaries = await writeMergedDictionaries(\n    unmergedDictionaries,\n    configuration\n  );\n\n  // `nest()` dependency graph, read back from disk so it stays complete on\n  // incremental rebuilds where only a subset of dictionaries was regenerated.\n  // Every artifact kind attaches its dependencies, letting `getNesting` resolve\n  // them locally instead of through the registry the optimizer strips.\n  const nestedDictionaryGraph = getNestedDictionaryGraph(\n    Object.values(\n      readDictionariesFromDisk<Record<string, Dictionary>>(\n        configuration.system.dictionariesDir\n      )\n    )\n  );\n\n  await writeNestedDictionaries(nestedDictionaryGraph, configuration, formats);\n\n  const dictionariesToBuildDynamic: PlainMergedDictionaryOutput = {};\n  const qualifiedDictionariesToBuildDynamic: QualifiedMergedDictionaryOutput =\n    {};\n  const keysToBuildFetch = new Set<string>();\n\n  for (const [key, mergedResult] of Object.entries(mergedDictionaries)) {\n    const dictionary = mergedResult.dictionary;\n\n    if (isQualifiedDictionaryGroup(dictionary)) {\n      // Collections / variants resolve their qualifier at\n      // runtime from a selector. Static mode keeps every entry in one JSON;\n      // dynamic mode splits them into one chunk per (locale, qualifierId).\n      const entryMode = dictionary.importMode ?? importMode;\n\n      if (entryMode === 'dynamic') {\n        qualifiedDictionariesToBuildDynamic[key] = {\n          dictionaryPath: mergedResult.dictionaryPath,\n          dictionary,\n        };\n      } else if (entryMode === 'fetch') {\n        const appLogger = getAppLogger(configuration);\n        appLogger(\n          `Dictionary ${colorizeKey(key)} uses 'fetch' import mode with (${dictionary.qualifierTypes.join(', ')}) entries — fetch mode is not qualifier-aware yet, falling back to static import.`,\n          { level: 'warn' }\n        );\n      }\n\n      continue;\n    }\n\n    const mode = dictionary.importMode ?? importMode;\n\n    if (mode === 'dynamic' || mode === 'fetch') {\n      dictionariesToBuildDynamic[key] = {\n        dictionaryPath: mergedResult.dictionaryPath,\n        dictionary,\n      };\n    }\n\n    if (mode === 'fetch') {\n      keysToBuildFetch.add(key);\n    }\n  }\n\n  // A lazily loaded dictionary resolves its `nest()` references from chunks\n  // loaded by the same loader, so its nest targets need dynamic artifacts of\n  // their own — whatever import mode they declare for their own call sites.\n  for (const consumerKey of Object.keys(dictionariesToBuildDynamic)) {\n    for (const nestedKey of nestedDictionaryGraph.get(consumerKey) ?? []) {\n      if (dictionariesToBuildDynamic[nestedKey]) continue;\n\n      const nestedResult = mergedDictionaries[nestedKey];\n      if (\n        !nestedResult ||\n        isQualifiedDictionaryGroup(nestedResult.dictionary)\n      ) {\n        continue;\n      }\n\n      dictionariesToBuildDynamic[nestedKey] = {\n        dictionaryPath: nestedResult.dictionaryPath,\n        dictionary: nestedResult.dictionary,\n      };\n    }\n  }\n\n  let dynamicDictionaries: LocalizedDictionaryOutput | null = null;\n\n  if (Object.keys(dictionariesToBuildDynamic).length > 0) {\n    dynamicDictionaries = await writeDynamicDictionary(\n      dictionariesToBuildDynamic,\n      configuration,\n      formats,\n      nestedDictionaryGraph\n    );\n  }\n\n  if (Object.keys(qualifiedDictionariesToBuildDynamic).length > 0) {\n    await writeDynamicQualifiedDictionaries(\n      qualifiedDictionariesToBuildDynamic,\n      configuration,\n      formats\n    );\n  }\n\n  let fetchDictionaries: LocalizedDictionaryOutput | null = null;\n\n  if (dynamicDictionaries && keysToBuildFetch.size > 0) {\n    const dictionariesToBuildFetch: LocalizedDictionaryOutput = {};\n\n    for (const key of keysToBuildFetch) {\n      if (dynamicDictionaries[key]) {\n        dictionariesToBuildFetch[key] = dynamicDictionaries[key];\n      }\n    }\n\n    if (Object.keys(dictionariesToBuildFetch).length > 0) {\n      fetchDictionaries = await writeFetchDictionary(\n        dictionariesToBuildFetch,\n        configuration,\n        formats,\n        nestedDictionaryGraph\n      );\n    }\n  }\n\n  return {\n    unmergedDictionaries,\n    mergedDictionaries,\n    dynamicDictionaries,\n    fetchDictionaries,\n  };\n};\n"],"mappings":";;;;;;;;;;;AA6BA,MAAM,iBAAiB;CACrB,SAAS;CACT,yBAAyB;CACzB,KAAK;AACP;;;;AAKA,MAAa,kBAAkB,OAC7B,0BACA,eACA,YACG;CACH,MAAM,aACJ,eAAe,OAAO,cACtB,eAAe,YAAY,cAC3B;CAEF,MAAM,EAAE,yBAAyB,KAAK,YAAY;EAChD,GAAG;EACH,GAAG;CACL;CAEA,MAAM,+BAA6C,CACjD,GAAG,wBACL;CAEA,IAAI,yBAAyB;EAC3B,MAAM,2BACJ,yBAAyB,cAAc,OAAO,uBAAuB;EAGvE,KAAK,MAAM,qBAAqB,0BAA0B;GACxD,MAAM,kCACJ,yBAAyB,kBAAkB;GAE7C,IAAI,iCAAiC,SAAS,GAAG;IAE/C,MAAM,4BACJ,iCAAiC,QAC9B,uBACC,mBAAmB,YAAY,kBAAkB,OACrD;IAEF,6BAA6B,KAAK,GAAI,6BAA6B,CAAC,CAAE;GACxE;EACF;CACF;CAEA,MAAM,uBAAuB,MAAM,0BACjC,8BACA,eACA,GACF;CAEA,MAAM,qBAAqB,MAAM,wBAC/B,sBACA,aACF;CAMA,MAAM,wBAAwB,yBAC5B,OAAO,OACL,yBACE,cAAc,OAAO,eACvB,CACF,CACF;CAEA,MAAM,wBAAwB,uBAAuB,eAAe,OAAO;CAE3E,MAAM,6BAA0D,CAAC;CACjE,MAAM,sCACJ,CAAC;CACH,MAAM,mCAAmB,IAAI,IAAY;CAEzC,KAAK,MAAM,CAAC,KAAK,iBAAiB,OAAO,QAAQ,kBAAkB,GAAG;EACpE,MAAM,aAAa,aAAa;EAEhC,IAAI,2BAA2B,UAAU,GAAG;GAI1C,MAAM,YAAY,WAAW,cAAc;GAE3C,IAAI,cAAc,WAChB,oCAAoC,OAAO;IACzC,gBAAgB,aAAa;IAC7B;GACF;QACK,IAAI,cAAc,SAEvB,AADkB,aAAa,aACvB,CAAC,CACP,cAAc,YAAY,GAAG,EAAE,kCAAkC,WAAW,eAAe,KAAK,IAAI,EAAE,oFACtG,EAAE,OAAO,OAAO,CAClB;GAGF;EACF;EAEA,MAAM,OAAO,WAAW,cAAc;EAEtC,IAAI,SAAS,aAAa,SAAS,SACjC,2BAA2B,OAAO;GAChC,gBAAgB,aAAa;GAC7B;EACF;EAGF,IAAI,SAAS,SACX,iBAAiB,IAAI,GAAG;CAE5B;CAKA,KAAK,MAAM,eAAe,OAAO,KAAK,0BAA0B,GAC9D,KAAK,MAAM,aAAa,sBAAsB,IAAI,WAAW,KAAK,CAAC,GAAG;EACpE,IAAI,2BAA2B,YAAY;EAE3C,MAAM,eAAe,mBAAmB;EACxC,IACE,CAAC,gBACD,2BAA2B,aAAa,UAAU,GAElD;EAGF,2BAA2B,aAAa;GACtC,gBAAgB,aAAa;GAC7B,YAAY,aAAa;EAC3B;CACF;CAGF,IAAI,sBAAwD;CAE5D,IAAI,OAAO,KAAK,0BAA0B,CAAC,CAAC,SAAS,GACnD,sBAAsB,MAAM,uBAC1B,4BACA,eACA,SACA,qBACF;CAGF,IAAI,OAAO,KAAK,mCAAmC,CAAC,CAAC,SAAS,GAC5D,MAAM,kCACJ,qCACA,eACA,OACF;CAGF,IAAI,oBAAsD;CAE1D,IAAI,uBAAuB,iBAAiB,OAAO,GAAG;EACpD,MAAM,2BAAsD,CAAC;EAE7D,KAAK,MAAM,OAAO,kBAChB,IAAI,oBAAoB,MACtB,yBAAyB,OAAO,oBAAoB;EAIxD,IAAI,OAAO,KAAK,wBAAwB,CAAC,CAAC,SAAS,GACjD,oBAAoB,MAAM,qBACxB,0BACA,eACA,SACA,qBACF;CAEJ;CAEA,OAAO;EACL;EACA;EACA;EACA;CACF;AACF"}