{"version":3,"file":"orderDictionaries.mjs","names":[],"sources":["../../../src/dictionaryManipulator/orderDictionaries.ts"],"sourcesContent":["import { editor } from '@intlayer/config/built';\nimport type { Dictionary } from '@intlayer/types/dictionary';\n\n/**\n * Orders dictionaries based on the dictionary priority strategy.\n *\n * @param dictionaries - Array of dictionaries to order\n * @param priorityStrategy - The priority strategy ('local_first' or 'distant_first')\n * @returns Ordered array of dictionaries\n */\nexport const orderDictionaries = (\n  dictionaries: Dictionary[],\n  config?: {\n    editor: {\n      dictionaryPriorityStrategy: 'local_first' | 'distant_first';\n    };\n  }\n): Dictionary[] => {\n  const dictionaryPriorityStrategy =\n    config?.editor?.dictionaryPriorityStrategy ??\n    editor.dictionaryPriorityStrategy;\n\n  if (dictionaries.length <= 1) {\n    return dictionaries;\n  }\n\n  // Stabilize original indices to preserve relative order for complete ties\n  const withIndex = dictionaries.map((dictionary, index) => ({\n    dictionary,\n    index,\n  }));\n\n  const getPriority = (dictionary: Dictionary): number => {\n    const p = dictionary.priority ?? 0;\n\n    return Number.isFinite(p) ? p : 0;\n  };\n\n  const getLocationWeight = (d: Dictionary): number => {\n    const location = d.location;\n\n    // undefined location should always be last\n    if (location === undefined) {\n      return 2;\n    }\n\n    if (dictionaryPriorityStrategy === 'distant_first') {\n      // distant should come first\n      return location === 'remote' ? 0 : 1;\n    }\n    // default: local_first\n    return location === 'local' ? 0 : 1;\n  };\n\n  withIndex.sort((a, b) => {\n    // 1) Non-autoFilled before autoFilled (autoFilled have lower precedence)\n    const aAuto = a.dictionary.filled ? 1 : 0;\n    const bAuto = b.dictionary.filled ? 1 : 0;\n    if (aAuto !== bAuto) return aAuto - bAuto; // 0 before 1\n\n    // 2) Higher priority first (larger number wins)\n    const aP = getPriority(a.dictionary);\n    const bP = getPriority(b.dictionary);\n    if (aP !== bP) return bP - aP; // descending\n\n    // 3) Location according to strategy\n    const aLocation = getLocationWeight(a.dictionary);\n    const bLocation = getLocationWeight(b.dictionary);\n    if (aLocation !== bLocation) return aLocation - bLocation;\n\n    // 4) Stable fallback by original index\n    return a.index - b.index;\n  });\n\n  return withIndex.map(({ dictionary }) => dictionary);\n};\n"],"mappings":";;;;;;;;;;AAUA,MAAa,qBACX,cACA,WAKiB;CACjB,MAAM,6BACJ,QAAQ,QAAQ,8BAChB,OAAO;AAET,KAAI,aAAa,UAAU,EACzB,QAAO;CAIT,MAAM,YAAY,aAAa,KAAK,YAAY,WAAW;EACzD;EACA;EACD,EAAE;CAEH,MAAM,eAAe,eAAmC;EACtD,MAAM,IAAI,WAAW,YAAY;AAEjC,SAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;CAGlC,MAAM,qBAAqB,MAA0B;EACnD,MAAM,WAAW,EAAE;AAGnB,MAAI,aAAa,OACf,QAAO;AAGT,MAAI,+BAA+B,gBAEjC,QAAO,aAAa,WAAW,IAAI;AAGrC,SAAO,aAAa,UAAU,IAAI;;AAGpC,WAAU,MAAM,GAAG,MAAM;EAEvB,MAAM,QAAQ,EAAE,WAAW,SAAS,IAAI;EACxC,MAAM,QAAQ,EAAE,WAAW,SAAS,IAAI;AACxC,MAAI,UAAU,MAAO,QAAO,QAAQ;EAGpC,MAAM,KAAK,YAAY,EAAE,WAAW;EACpC,MAAM,KAAK,YAAY,EAAE,WAAW;AACpC,MAAI,OAAO,GAAI,QAAO,KAAK;EAG3B,MAAM,YAAY,kBAAkB,EAAE,WAAW;EACjD,MAAM,YAAY,kBAAkB,EAAE,WAAW;AACjD,MAAI,cAAc,UAAW,QAAO,YAAY;AAGhD,SAAO,EAAE,QAAQ,EAAE;GACnB;AAEF,QAAO,UAAU,KAAK,EAAE,iBAAiB,WAAW"}