{"version":3,"file":"index.cjs","sources":[""],"sourcesContent":["export type TGetMergedObjArgs = Parameters<typeof getMergedObj>;\n\r\nexport type TGetMergedObjReturn = ReturnType<typeof getMergedObj>;\r\n\r\n/**\r\n * Gets one deeply merged object from two objects while preserving circular references.\n * @template TTarget,TSource\r\n * @param {TTarget} [target={}] Target object (cloned internally)\r\n * @param {TSource} [source={}] Source object\r\n * @param {{ isMergeArrays?: boolean; arrayStrategy?: \"concat\" | \"target\" | \"replace\" | \"unique\"; }} [options={}] Merge options\r\n * @param {boolean} [options.isMergeArrays=true] Concat nested arrays or keep target arrays (deprecated; use arrayStrategy)\r\n * @param {\"concat\"|\"target\"|\"replace\"|\"unique\"} [options.arrayStrategy=\"concat\"] Array merge strategy\r\n * @returns {TTarget & TSource} Deeply merged object\r\n * @example\r\n * // How to deeply merge two objects?\r\n * const targetObj = { first: [ \"foo\" ] };\r\n * const sourceObj = { first: [ \"moo\" ], boo: 12 };\n * getMergedObj(targetObj, sourceObj) // => { first: [ \"foo\", \"moo\" ], boo: 12 }\n * @example\n * // Merge user preferences with defaults and replace inherited arrays\n * const settings = getMergedObj(defaultSettings, userSettings, {\n *   arrayStrategy: \"replace\",\n * });\n */\nexport const getMergedObj = <\r\n  TTarget extends Record<string, any> = Record<string, any>,\r\n  TSource extends Record<string, any> = Record<string, any>\r\n>(\r\n  target: TTarget = {} as TTarget,\r\n  source: TSource = {} as TSource,\r\n  options: { isMergeArrays?: boolean; arrayStrategy?: \"concat\" | \"target\" | \"replace\" | \"unique\"; } = {}\r\n): TTarget & TSource => {\r\n\r\n  const settings = {\r\n    arrayStrategy: \"concat\" as const,\r\n    ...options,\r\n  };\r\n\r\n  if (options?.isMergeArrays !== undefined) {\r\n    settings.arrayStrategy = options.isMergeArrays ? \"concat\" : \"target\";\r\n  }\r\n\r\n  const isPlainObject = (obj: unknown): obj is Record<string, unknown> => {\r\n    if (!obj || typeof obj !== \"object\") {\r\n      return false;\r\n    }\r\n    const proto = Object.getPrototypeOf(obj);\r\n    return (proto === Object.prototype || proto === null) && !Array.isArray(obj);\r\n  };\r\n\r\n  const deepClone = (val: any, visited: WeakMap<object, any>): any => {\n    if (val && typeof val === \"object\") {\n      if (visited.has(val)) {\n        return visited.get(val);\n      }\n\n      if (val instanceof Date) {\n        const result = new Date(val);\n        visited.set(val, result);\n        return result;\n      }\n      if (val instanceof RegExp) {\n        // eslint-disable-next-line security/detect-non-literal-regexp\n        const result = new RegExp(val.source, val.flags);\n        result.lastIndex = val.lastIndex;\n        visited.set(val, result);\n        return result;\n      }\n      if (val instanceof Map) {\n        const result = new Map();\n        visited.set(val, result);\n        val.forEach((v, k) => result.set(deepClone(k, visited), deepClone(v, visited)));\n        return result;\n      }\n      if (val instanceof Set) {\n        const result = new Set();\r\n        visited.set(val, result);\r\n        val.forEach((v) => result.add(deepClone(v, visited)));\n        return result;\n      }\n      if (val instanceof ArrayBuffer) {\n        const result = val.slice(0);\n        visited.set(val, result);\n        return result;\n      }\n      if (ArrayBuffer.isView(val)) {\n        const result = val instanceof DataView\n          ? new DataView(val.buffer.slice(0), val.byteOffset, val.byteLength)\n          : new (val.constructor as new (source: ArrayLike<number>) => ArrayBufferView)(\n            val as unknown as ArrayLike<number>\n          );\n        visited.set(val, result);\n        return result;\n      }\n      if (Array.isArray(val) || isPlainObject(val)) {\n        const result: Record<PropertyKey, unknown> | any[] = Array.isArray(val)\n          ? []\n          : Object.create(Object.getPrototypeOf(val));\n        visited.set(val, result);\n        Reflect.ownKeys(val).forEach((key) => {\n          const descriptor = Object.getOwnPropertyDescriptor(val, key);\n          if (!descriptor) {\n            return;\n          }\n          if (\"value\" in descriptor) {\n            descriptor.value = deepClone(descriptor.value, visited);\n          }\n          Object.defineProperty(result, key, descriptor);\n        });\n        return result;\n      }\n\n      return val;\n    }\r\n\r\n    return val;\r\n  };\r\n\r\n  const mergeArrays = (\n    a: any[],\n    b: any[],\n    targetClones: WeakMap<object, any>,\n    sourceClones: WeakMap<object, any>\n  ): any[] => {\n    switch (settings.arrayStrategy) {\n      case \"target\": return deepClone(a, targetClones);\n      case \"replace\": return deepClone(b, sourceClones);\n      case \"unique\": {\n        if (sourceClones.has(b)) {\n          return sourceClones.get(b);\n        }\n        const targetItems = deepClone(a, targetClones) as any[];\n        const out = targetItems;\n        sourceClones.set(b, out);\n        const seen = new Set<any>();\n        const items = [ ...out ];\n        out.length = 0;\n\n        const addToOut = (item: any, clones: WeakMap<object, any>) => {\n          const cloned = deepClone(item, clones);\n          const key = typeof cloned === \"object\" && cloned !== null\n            ? JSON.stringify(cloned)\n            : cloned;\n          if (!seen.has(key)) {\r\n            seen.add(key);\r\n            out.push(cloned);\r\n          }\n        };\n\n        items.forEach((item) => addToOut(item, targetClones));\n        b.forEach((item) => addToOut(item, sourceClones));\n        return out;\n      }\n      case \"concat\": {\n        if (sourceClones.has(b)) {\n          return sourceClones.get(b);\n        }\n        const out = deepClone(a, targetClones) as any[];\n        sourceClones.set(b, out);\n        b.forEach((item) => out.push(deepClone(item, sourceClones)));\n        return out;\n      }\n      default: return deepClone(b, sourceClones);\n    }\n  };\n\n  const merge = (\n    t: any,\n    s: any,\n    targetClones: WeakMap<object, any>,\n    sourceClones: WeakMap<object, any>\n  ): any => {\n    if (Array.isArray(t) && Array.isArray(s)) {\n      return mergeArrays(t, s, targetClones, sourceClones);\n    }\n\n    if (!isPlainObject(t) || !isPlainObject(s)) {\n      return deepClone(s, sourceClones);\n    }\n\n    if (sourceClones.has(s)) {\n      return sourceClones.get(s);\n    }\n\n    const out = deepClone(t, targetClones) as Record<PropertyKey, any>;\n    sourceClones.set(s, out);\n\n    Reflect.ownKeys(s).forEach((key) => {\n      const descriptor = Object.getOwnPropertyDescriptor(s, key);\n      if (!descriptor?.enumerable) {\n        return;\n      }\n      if (!(\"value\" in descriptor)) {\n        Object.defineProperty(out, key, descriptor);\n        return;\n      }\n\n      const tv = (t as Record<PropertyKey, any>)[key];\n      const sv = descriptor.value;\n      if (Array.isArray(tv) && Array.isArray(sv)) {\n        descriptor.value = mergeArrays(tv, sv, targetClones, sourceClones);\n      } else if (isPlainObject(tv) && isPlainObject(sv)) {\n        descriptor.value = merge(tv, sv, targetClones, sourceClones);\n      } else {\n        descriptor.value = deepClone(sv, sourceClones);\n      }\n      Object.defineProperty(out, key, descriptor);\n    });\n\n    return out;\n  };\n\n  return merge(target, source, new WeakMap(), new WeakMap());\n};\n"],"names":["getMergedObj","target","source","options","settings","arrayStrategy","isMergeArrays","undefined","isPlainObject","obj","proto","Object","getPrototypeOf","prototype","Array","isArray","deepClone","val","visited","has","get","Date","result","set","RegExp","flags","lastIndex","Map","forEach","v","k","Set","add","ArrayBuffer","slice","isView","DataView","buffer","byteOffset","byteLength","constructor","create","Reflect","ownKeys","key","descriptor","getOwnPropertyDescriptor","value","defineProperty","mergeArrays","a","b","targetClones","sourceClones","targetItems","out","seen","items","length","addToOut","item","clones","cloned","JSON","stringify","push","merge","t","s","enumerable","tv","sv","WeakMap"],"mappings":"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"}