{"version":3,"file":"loadRemoteDictionaries.cjs","names":["sortAlphabetically","fetchDistantDictionaries"],"sources":["../../../src/loadDictionaries/loadRemoteDictionaries.ts"],"sourcesContent":["import { getIntlayerAPIProxy } from '@intlayer/api';\n// @ts-ignore @intlayer/backend is not build yet\nimport type { DictionaryAPI } from '@intlayer/backend';\nimport { getConfiguration } from '@intlayer/config/node';\nimport { getRemoteDictionaries } from '@intlayer/remote-dictionaries-entry';\nimport type {\n  Dictionary,\n  DictionaryId,\n  DictionaryKey,\n} from '@intlayer/types/dictionary';\nimport { fetchDistantDictionaries } from '../fetchDistantDictionaries';\nimport type { DictionariesStatus } from '../loadDictionaries/loadDictionaries';\nimport { sortAlphabetically } from '../utils/sortAlphabetically';\n\nexport const formatDistantDictionaries = (\n  dictionaries: (DictionaryAPI | Dictionary)[]\n): Dictionary[] =>\n  dictionaries.map((dict) => ({\n    ...dict,\n    localId: `${dict.key}::remote::${dict.id}`,\n    location: 'remote' as const,\n  }));\n\nexport const loadRemoteDictionaries = async (\n  configuration = getConfiguration(),\n  onStatusUpdate?: (status: DictionariesStatus[]) => void,\n  options?: {\n    onStartRemoteCheck?: () => void;\n    onStopRemoteCheck?: () => void;\n    onError?: (error: Error) => void;\n  }\n): Promise<Dictionary[]> => {\n  const { editor } = configuration;\n  const remoteDictionariesRecord = getRemoteDictionaries(configuration);\n\n  const hasRemoteDictionaries = Boolean(editor.clientId && editor.clientSecret);\n\n  if (!hasRemoteDictionaries) return [];\n\n  try {\n    options?.onStartRemoteCheck?.();\n\n    const intlayerAPI = getIntlayerAPIProxy(undefined, configuration);\n\n    // Get the list of dictionary keys\n    const getDictionariesKeysResult =\n      await intlayerAPI.dictionary.getDictionariesUpdateTimestamp();\n\n    const distantDictionaryUpdateTimeStamp: Record<\n      DictionaryId,\n      { key: DictionaryKey; updatedAt: number }\n    > | null = getDictionariesKeysResult.data;\n\n    if (!distantDictionaryUpdateTimeStamp) {\n      throw new Error('No distant dictionaries found');\n    }\n\n    const dictionariesIdToFetch = Object.entries(\n      distantDictionaryUpdateTimeStamp\n    ).filter(([dictionaryId, data]) => {\n      // If remote doesn't provide updatedAt, fetch to be safe\n      if (!data.updatedAt) return true;\n\n      // If no local cache exists, fetch\n      const local: Dictionary | undefined = remoteDictionariesRecord[\n        data.key\n      ]?.find((dictionary) => dictionary.id === dictionaryId);\n      if (!local) return true;\n\n      const localUpdatedAtRaw = (local as any)?.updatedAt as\n        | number\n        | string\n        | undefined;\n\n      const localUpdatedAt =\n        typeof localUpdatedAtRaw === 'number'\n          ? localUpdatedAtRaw\n          : localUpdatedAtRaw\n            ? new Date(localUpdatedAtRaw).getTime()\n            : undefined;\n\n      // If local timestamp missing or older than remote, fetch\n      if (typeof localUpdatedAt !== 'number') return true;\n\n      return data.updatedAt > localUpdatedAt;\n    });\n\n    const flatRemoteDictionariesRecord: DictionaryAPI[] = Object.values(\n      remoteDictionariesRecord\n    ).flat();\n\n    const cachedDictionaries: Dictionary[] =\n      flatRemoteDictionariesRecord.filter((dictionary) => {\n        const remoteUpdatedAt =\n          distantDictionaryUpdateTimeStamp[dictionary.id!].updatedAt;\n\n        const localUpdatedAtRaw = dictionary.updatedAt;\n\n        const localUpdatedAt =\n          typeof localUpdatedAtRaw === 'number'\n            ? localUpdatedAtRaw\n            : localUpdatedAtRaw\n              ? new Date(localUpdatedAtRaw).getTime()\n              : undefined;\n\n        // Consider as cached/imported when local exists and is up-to-date or newer\n        return (\n          typeof localUpdatedAt === 'number' &&\n          typeof remoteUpdatedAt === 'number' &&\n          localUpdatedAt >= remoteUpdatedAt\n        );\n      });\n\n    // Report cached as already imported\n    if (cachedDictionaries.length > 0) {\n      onStatusUpdate?.(\n        cachedDictionaries.map((dictionary) => ({\n          dictionaryKey: dictionary.key,\n          type: 'remote',\n          status: 'imported',\n        }))\n      );\n    }\n\n    const orderedDistantDictionaryKeys = dictionariesIdToFetch\n      .map(([, data]) => data.key)\n      .sort(sortAlphabetically);\n\n    // Report pending for keys to be fetched so totals are visible immediately\n    if (orderedDistantDictionaryKeys.length > 0) {\n      onStatusUpdate?.(\n        orderedDistantDictionaryKeys.map((key) => ({\n          dictionaryKey: key,\n          type: 'remote',\n          status: 'pending',\n        }))\n      );\n    }\n\n    const distantDictionariesData = await fetchDistantDictionaries(\n      {\n        dictionaryKeys: orderedDistantDictionaryKeys,\n      },\n      onStatusUpdate\n    );\n\n    const distantDictionaries: Dictionary[] = formatDistantDictionaries(\n      distantDictionariesData\n    );\n\n    return [...cachedDictionaries, ...distantDictionaries];\n  } catch (error) {\n    options?.onError?.(error as Error);\n    return [];\n  } finally {\n    options?.onStopRemoteCheck?.();\n  }\n};\n"],"mappings":";;;;;;;;;AAcA,MAAa,6BACX,iBAEA,aAAa,KAAK,UAAU;CAC1B,GAAG;CACH,SAAS,GAAG,KAAK,IAAI,YAAY,KAAK;CACtC,UAAU;AACZ,EAAE;AAEJ,MAAa,yBAAyB,OACpC,4DAAiC,GACjC,gBACA,YAK0B;CAC1B,MAAM,EAAE,WAAW;CACnB,MAAM,0FAAiD,aAAa;CAIpE,IAAI,CAF0B,QAAQ,OAAO,YAAY,OAAO,YAEvC,GAAG,OAAO,CAAC;CAEpC,IAAI;EACF,SAAS,qBAAqB;EAQ9B,MAAM,oCAGK,6CAT6B,QAAW,aAIjC,EAAE,WAAW,+BAA+B,GAKzB;EAErC,IAAI,CAAC,kCACH,MAAM,IAAI,MAAM,+BAA+B;EAGjD,MAAM,wBAAwB,OAAO,QACnC,gCACF,EAAE,QAAQ,CAAC,cAAc,UAAU;GAEjC,IAAI,CAAC,KAAK,WAAW,OAAO;GAG5B,MAAM,QAAgC,yBACpC,KAAK,MACJ,MAAM,eAAe,WAAW,OAAO,YAAY;GACtD,IAAI,CAAC,OAAO,OAAO;GAEnB,MAAM,oBAAqB,OAAe;GAK1C,MAAM,iBACJ,OAAO,sBAAsB,WACzB,oBACA,oBACE,IAAI,KAAK,iBAAiB,EAAE,QAAQ,IACpC;GAGR,IAAI,OAAO,mBAAmB,UAAU,OAAO;GAE/C,OAAO,KAAK,YAAY;EAC1B,CAAC;EAMD,MAAM,qBAJgD,OAAO,OAC3D,wBACF,EAAE,KAG2B,EAAE,QAAQ,eAAe;GAClD,MAAM,kBACJ,iCAAiC,WAAW,IAAK;GAEnD,MAAM,oBAAoB,WAAW;GAErC,MAAM,iBACJ,OAAO,sBAAsB,WACzB,oBACA,oBACE,IAAI,KAAK,iBAAiB,EAAE,QAAQ,IACpC;GAGR,OACE,OAAO,mBAAmB,YAC1B,OAAO,oBAAoB,YAC3B,kBAAkB;EAEtB,CAAC;EAGH,IAAI,mBAAmB,SAAS,GAC9B,iBACE,mBAAmB,KAAK,gBAAgB;GACtC,eAAe,WAAW;GAC1B,MAAM;GACN,QAAQ;EACV,EAAE,CACJ;EAGF,MAAM,+BAA+B,sBAClC,KAAK,GAAG,UAAU,KAAK,GAAG,EAC1B,KAAKA,mDAAkB;EAG1B,IAAI,6BAA6B,SAAS,GACxC,iBACE,6BAA6B,KAAK,SAAS;GACzC,eAAe;GACf,MAAM;GACN,QAAQ;EACV,EAAE,CACJ;EAUF,MAAM,sBAAoC,0BACxC,MARoCC,0DACpC,EACE,gBAAgB,6BAClB,GACA,cACF,CAIA;EAEA,OAAO,CAAC,GAAG,oBAAoB,GAAG,mBAAmB;CACvD,SAAS,OAAO;EACd,SAAS,UAAU,KAAc;EACjC,OAAO,CAAC;CACV,UAAU;EACR,SAAS,oBAAoB;CAC/B;AACF"}