{"version":3,"file":"merge.mjs","names":["merge"],"sources":["../../../src/Form/components/merge.ts"],"sourcesContent":["import { isEmpty, isObject, type merge as _merge, mergeWith, pickBy } from 'es-toolkit/compat';\n\nexport const removeUndefined = (obj: any): any => {\n  if (!isObject(obj)) return obj;\n\n  if (Array.isArray(obj)) {\n    return obj.map((item) => removeUndefined(item)).filter((item) => item !== undefined);\n  }\n\n  return pickBy(\n    Object.entries(obj).reduce((acc: any, [key, value]) => {\n      acc[key] = removeUndefined(value);\n      return acc;\n    }, {}),\n    (value) => value !== undefined,\n  );\n};\n\n/**\n * 用于合并对象，如果是数组则直接替换\n * @param target\n * @param source\n */\nexport const merge: typeof _merge = <T = object>(target: T, source: T) =>\n  mergeWith({}, target, source, (obj, src) => {\n    if (Array.isArray(obj)) return src;\n  });\n\ntype MergeableItem = {\n  [key: string]: any;\n  id: string;\n};\n\n/**\n * Merge two arrays based on id, preserving metadata from default items\n * @param defaultItems Items with default configuration and metadata\n * @param userItems User-defined items with higher priority\n */\nexport const mergeArrayById = <T extends MergeableItem>(defaultItems: T[], userItems: T[]): T[] => {\n  // Create a map of default items for faster lookup\n  const defaultItemsMap = new Map(defaultItems.map((item) => [item.id, item]));\n\n  // 使用 Map 存储合并结果，这样重复 ID 的后项会自然覆盖前项\n  const mergedItemsMap = new Map<string, T>();\n\n  // Process user items with default metadata\n  for (const userItem of userItems) {\n    const defaultItem = defaultItemsMap.get(userItem.id);\n    if (!defaultItem) {\n      mergedItemsMap.set(userItem.id, userItem);\n      continue;\n    }\n\n    const mergedItem: T = { ...defaultItem };\n    for (const [key, value] of Object.entries(userItem)) {\n      if (value !== null && value !== undefined && !(typeof value === 'object' && isEmpty(value))) {\n        // @ts-expect-error\n        mergedItem[key] = value;\n      }\n\n      if (typeof value === 'object' && !isEmpty(value)) {\n        // @ts-expect-error\n        mergedItem[key] = merge(defaultItem[key], value);\n      }\n    }\n\n    mergedItemsMap.set(userItem.id, mergedItem);\n  }\n\n  // 添加只在默认配置中存在的项\n  for (const item of defaultItems) {\n    if (!mergedItemsMap.has(item.id)) {\n      mergedItemsMap.set(item.id, item);\n    }\n  }\n\n  return [...mergedItemsMap.values()];\n};\n"],"mappings":";;AAEA,MAAa,mBAAmB,QAAkB;AAChD,KAAI,CAAC,SAAS,IAAI,CAAE,QAAO;AAE3B,KAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,IAAI,KAAK,SAAS,gBAAgB,KAAK,CAAC,CAAC,QAAQ,SAAS,SAAS,KAAA,EAAU;AAGtF,QAAO,OACL,OAAO,QAAQ,IAAI,CAAC,QAAQ,KAAU,CAAC,KAAK,WAAW;AACrD,MAAI,OAAO,gBAAgB,MAAM;AACjC,SAAO;IACN,EAAE,CAAC,GACL,UAAU,UAAU,KAAA,EACtB;;;;;;;AAQH,MAAaA,WAAoC,QAAW,WAC1D,UAAU,EAAE,EAAE,QAAQ,SAAS,KAAK,QAAQ;AAC1C,KAAI,MAAM,QAAQ,IAAI,CAAE,QAAO;EAC/B"}