{"version":3,"sources":["../../src/index.ts","../../src/utils.ts"],"sourcesContent":["import {\n  getInMultiple,\n  getInAll,\n  getNotInMultiple,\n  getNotInAll,\n  getObjectKeys,\n  isObject,\n  isPropDescriptor\n} from './utils';\n\nimport type { MergekitOptions } from './types';\n\nconst defaults: MergekitOptions = {\n  // Keys\n  onlyKeys: [],\n  skipKeys: [],\n  onlyCommonKeys: false,\n  onlyUniversalKeys: false,\n  skipCommonKeys: false,\n  skipUniversalKeys: false,\n  onlyObjectWithKeyValues: [],\n\n  // Values\n  invokeGetters: false,\n  skipSetters: false,\n  // Arrays\n  appendArrays: false,\n  prependArrays: false,\n  dedupArrays: false,\n  sortArrays: false,\n  // Prototype\n  hoistEnumerable: false,\n  hoistProto: false,\n  skipProto: false,\n  // Callbacks\n  onCircular: () => {}\n};\n\n/**\n * Merges multiple objects into one, with various options for customization.\n *\n * @param {object[] | object} objects - The objects to be merged. Can be a single object or an array of objects.\n * @param {Partial<MergekitOptions>} [options=defaults] - Optional settings to customize the merge behavior.\n * @returns {object} - The merged object.\n *\n * @example\n * // Basic usage\n * const obj1 = { a: 1, b: 2 };\n * const obj2 = { b: 3, c: 4 };\n * const result = mergekit([obj1, obj2]);\n * // result: { a: 1, b: 3, c: 4 }\n *\n * @example\n * // Using options\n * const obj1 = { a: 1, b: 2 };\n * const obj2 = { b: 3, c: 4 };\n * const options = { onlyCommonKeys: true };\n * const result = mergekit([obj1, obj2], options);\n * // result: { b: 3 }\n *\n * @example\n * // Merging with custom prototype properties\n * function CustomProto() {}\n * CustomProto.prototype.customMethod = function() { return 'custom'; };\n * const obj1 = new CustomProto();\n * obj1.a = 1;\n * const obj2 = { b: 2 };\n * const result = mergekit([obj1, obj2]);\n * // result: { a: 1, b: 2, customMethod: [Function] }\n */\nexport function mergekit(\n  objects: object[] | object,\n  options: Partial<MergekitOptions> = defaults\n) {\n  const settings = { ...defaults, ...options };\n\n  const dedupArrayMap = new Map();\n  const sortArrayMap = new Map();\n  const sortArrayFn =\n    typeof settings.sortArrays === 'function' ? settings.sortArrays : undefined;\n\n  // Store circular references from source and reassign to target\n  // Key = original source reference\n  // Value = cloned/merged target reference\n  const circularRefs = new WeakMap();\n\n  let mergeDepth = 0;\n\n  function _getObjectKeys(obj) {\n    return getObjectKeys(obj, settings.hoistEnumerable);\n  }\n\n  function _mergekit(...objects) {\n    let mergeKeyList;\n\n    /**\n     * If multiple objects are being merged, filter keys based on settings:\n     * - onlyCommonKeys: Only include keys that appear in multiple objects\n     * - onlyUniversalKeys: Only include keys that appear in all objects\n     * - skipCommonKeys: Skip keys that appear in multiple objects\n     * - skipUniversalKeys: Skip keys that appear in all objects\n     */\n    if (objects.length > 1) {\n      if (settings.onlyCommonKeys) {\n        mergeKeyList = getInMultiple(\n          ...objects.map(obj => _getObjectKeys(obj))\n        );\n      } else if (settings.onlyUniversalKeys) {\n        mergeKeyList = getInAll(...objects.map(obj => _getObjectKeys(obj)));\n      } else if (settings.skipCommonKeys) {\n        mergeKeyList = getNotInMultiple(\n          ...objects.map(obj => _getObjectKeys(obj))\n        );\n      } else if (settings.skipUniversalKeys) {\n        mergeKeyList = getNotInAll(...objects.map(obj => _getObjectKeys(obj)));\n      }\n    }\n\n    if (!mergeKeyList && settings.onlyKeys.length) {\n      mergeKeyList = settings.onlyKeys;\n    }\n\n    if (\n      mergeKeyList &&\n      mergeKeyList !== settings.onlyKeys &&\n      settings.onlyKeys.length\n    ) {\n      mergeKeyList = mergeKeyList.filter(key =>\n        settings.onlyKeys.includes(key)\n      );\n    }\n\n    const newObjProps = objects.reduce((targetObj, srcObj) => {\n      circularRefs.set(srcObj, targetObj);\n\n      let keys = mergeKeyList || _getObjectKeys(srcObj);\n\n      if (settings.skipKeys.length) {\n        keys = keys.filter(key => settings.skipKeys.indexOf(key) === -1);\n      }\n\n      if (settings.onlyObjectWithKeyValues.length > 0) {\n        const hasValue = settings.onlyObjectWithKeyValues.every(\n          ({ key, value }) => {\n            if (!Object.keys(srcObj).includes(key)) {\n              return true;\n            }\n\n            return srcObj[key] === value;\n          }\n        );\n\n        if (!hasValue) {\n          return targetObj;\n        }\n      }\n\n      for (let i = 0; i < keys.length; i++) {\n        const key = keys[i];\n        const targetVal = targetObj[key];\n        const mergeDescriptor: PropertyDescriptor = {\n          configurable: true,\n          enumerable: true\n        };\n\n        if (key in srcObj === false) {\n          continue;\n        }\n\n        let isReturnVal = false;\n        let mergeVal = srcObj[key];\n\n        const srcDescriptor = Object.getOwnPropertyDescriptor(srcObj, key);\n        const isSetterOnly =\n          srcDescriptor &&\n          typeof srcDescriptor.set === 'function' &&\n          typeof srcDescriptor.get !== 'function';\n\n        if (isSetterOnly) {\n          if (!settings.skipSetters) {\n            Object.defineProperty(targetObj, key, srcDescriptor);\n          }\n\n          continue;\n        }\n\n        if (settings.filter !== defaults.filter) {\n          const returnVal = settings.filter({\n            depth: mergeDepth,\n            key,\n            srcObj,\n            srcVal: mergeVal,\n            targetObj,\n            targetVal\n          });\n\n          if (returnVal !== undefined && !returnVal) {\n            continue;\n          }\n        }\n\n        if (settings.beforeEach !== defaults.beforeEach) {\n          const returnVal = settings.beforeEach({\n            depth: mergeDepth,\n            key,\n            srcObj,\n            srcVal: mergeVal,\n            targetObj,\n            targetVal\n          });\n\n          if (returnVal !== undefined) {\n            isReturnVal = true;\n            mergeVal = returnVal;\n          }\n        }\n\n        // Circular references\n        if (\n          settings.onCircular &&\n          typeof mergeVal === 'object' &&\n          mergeVal !== null\n        ) {\n          if (circularRefs.has(srcObj[key])) {\n            const returnVal = settings.onCircular({\n              depth: mergeDepth,\n              key,\n              srcObj,\n              srcVal: srcObj[key],\n              targetObj,\n              targetVal\n            });\n\n            if (returnVal === undefined) {\n              mergeVal = circularRefs.get(srcObj[key]);\n              targetObj[key] = mergeVal;\n              continue;\n            }\n\n            isReturnVal = true;\n            mergeVal = returnVal;\n          }\n        }\n\n        // Arrays\n        if (Array.isArray(mergeVal)) {\n          mergeVal = [...mergeVal];\n\n          if (Array.isArray(targetVal)) {\n            if (settings.appendArrays) {\n              mergeVal = [...targetVal, ...mergeVal];\n            } else if (settings.prependArrays) {\n              mergeVal = [...mergeVal, ...targetVal];\n            }\n          }\n\n          if (settings.dedupArrays) {\n            // If a user-defined afterEach callback exists, remove\n            // duplicates so the expected value is returned (slower)\n            if (settings.afterEach !== defaults.afterEach) {\n              mergeVal = [...new Set(mergeVal)];\n            }\n            // If not, store a reference to the array so duplicates\n            // can be removed after merge is complete (faster)\n            else {\n              const keyArray = dedupArrayMap.get(targetObj);\n\n              if (keyArray && !keyArray.includes(key)) {\n                keyArray.push(key);\n              } else {\n                dedupArrayMap.set(targetObj, [key]);\n              }\n            }\n          }\n\n          if (settings.sortArrays) {\n            // If a user-defined afterEach callback exists, sort the\n            // array so the expected value is returned (slower)\n            if (settings.afterEach !== defaults.afterEach) {\n              mergeVal = mergeVal.sort(sortArrayFn);\n            }\n            // If not, store a reference to the array so duplicates\n            // can be removed after merge is complete (faster)\n            else {\n              const keyArray = sortArrayMap.get(targetObj);\n\n              if (keyArray && !keyArray.includes(key)) {\n                keyArray.push(key);\n              } else {\n                sortArrayMap.set(targetObj, [key]);\n              }\n            }\n          }\n        }\n        // Dates\n        else if (mergeVal instanceof Date) {\n          mergeVal = new Date(mergeVal);\n        }\n        // Buffers\n        else if (Buffer.isBuffer(mergeVal)) {\n          mergeVal = mergeVal.toString('utf-8');\n        }\n        // Objects\n        else if (\n          isObject(mergeVal) &&\n          (!isReturnVal || !isPropDescriptor(mergeVal))\n        ) {\n          mergeDepth++;\n\n          if (isObject(targetVal)) {\n            mergeVal = _mergekit(targetVal, mergeVal);\n          } else {\n            mergeVal = _mergekit(mergeVal);\n          }\n\n          mergeDepth--;\n        }\n\n        if (settings.afterEach !== defaults.afterEach) {\n          const returnVal = settings.afterEach({\n            depth: mergeDepth,\n            key,\n            mergeVal,\n            srcObj,\n            targetObj\n          });\n\n          if (returnVal !== undefined) {\n            isReturnVal = true;\n            mergeVal = returnVal;\n          }\n        }\n\n        if (isReturnVal) {\n          const returnDescriptor = isPropDescriptor(mergeVal)\n            ? mergeVal\n            : {\n                configurable: true,\n                enumerable: true,\n                value: mergeVal,\n                writable: true\n              };\n\n          Object.defineProperty(targetObj, key, returnDescriptor);\n\n          continue;\n        }\n\n        if (srcDescriptor) {\n          const { configurable, enumerable, get, set, writable } =\n            srcDescriptor;\n\n          Object.assign(mergeDescriptor, {\n            configurable,\n            enumerable\n          });\n\n          // Invoke getters\n          if (typeof get === 'function') {\n            if (settings.invokeGetters) {\n              mergeDescriptor.value = mergeVal;\n            } else {\n              mergeDescriptor.get = get;\n            }\n          }\n\n          // Skip setters\n          if (\n            !settings.skipSetters &&\n            typeof set === 'function' &&\n            !('value' in mergeDescriptor)\n          ) {\n            mergeDescriptor.set = set;\n          }\n\n          // Set writable property if not accessors are defined\n          if (!('get' in mergeDescriptor) && !('set' in mergeDescriptor)) {\n            mergeDescriptor.writable = Boolean(writable);\n          }\n        }\n\n        if (\n          !mergeDescriptor.get &&\n          !mergeDescriptor.set &&\n          !('value' in mergeDescriptor)\n        ) {\n          mergeDescriptor.value = mergeVal;\n          mergeDescriptor.writable =\n            srcDescriptor && 'writable' in srcDescriptor\n              ? srcDescriptor.writable\n              : true;\n        }\n\n        Object.defineProperty(targetObj, key, mergeDescriptor);\n      }\n\n      return targetObj;\n    }, {});\n\n    // Remove duplicate\n    for (const [obj, keyArray] of dedupArrayMap.entries()) {\n      for (const key of keyArray) {\n        const propDescriptor = Object.getOwnPropertyDescriptor(obj, key);\n        const { configurable, enumerable, writable } = propDescriptor;\n\n        let value = [...new Set(obj[key])];\n\n        // Handle arrays of objects\n        if (Array.isArray(obj[key]) && typeof obj[key][0] === 'object') {\n          value = [...new Set(obj[key].map(item => JSON.stringify(item)))];\n          value = value.map(item => JSON.parse(item as string));\n        }\n\n        // Set static value to handle arrays received from srcObj getter\n        Object.defineProperty(obj, key, {\n          configurable,\n          enumerable,\n          value: value,\n          writable: writable !== undefined ? writable : true\n        });\n      }\n    }\n\n    // Sort arrays\n    for (const [obj, keyArray] of sortArrayMap.entries()) {\n      for (const key of keyArray) {\n        obj[key].sort(sortArrayFn);\n      }\n    }\n\n    let newObj = newObjProps;\n\n    // Detect and merge custom prototype properties if available\n    if (!settings.skipProto) {\n      const customProtos = objects.reduce((protosArr, obj) => {\n        const proto = Object.getPrototypeOf(obj);\n\n        if (proto && proto !== Object.prototype) {\n          protosArr.push(proto);\n        }\n\n        return protosArr;\n      }, []);\n\n      if (customProtos.length) {\n        const newObjProto = _mergekit(...customProtos);\n\n        if (settings.hoistProto) {\n          newObj = _mergekit(newObjProto, newObjProps);\n        } else {\n          newObj = Object.create(\n            newObjProto,\n            Object.getOwnPropertyDescriptors(newObjProps)\n          );\n        }\n      }\n    }\n\n    return newObj;\n  }\n\n  const objectsArray = Array.isArray(objects) ? objects : [objects];\n  return _mergekit(...objectsArray);\n}\n","/**\n * Returns a map of array values and their occurrence count\n *\n * @example\n * countOccurrences([1, 2], [2, 3]); // { 1: 1, 2: 2, 3: 1 }\n *\n * @param {...unknown[]} arrays - Arrays to be compared\n * @return {Record<string, number>} Array values and their occurrence count\n */\nexport function countOccurrences(\n  ...arrays: unknown[][]\n): Record<string, number> {\n  const countObj: Record<string, number> = {};\n\n  arrays.forEach(array => {\n    array.forEach(v => {\n      const key = String(v);\n      countObj[key] = key in countObj ? ++countObj[key] : 1;\n    });\n  });\n\n  return countObj;\n}\n\n/**\n * Returns values found in all arrays\n *\n * @example\n * getInAll([1, 2], [2, 3]); // [2]\n * getInAll([1, 2, 3], [2, 3, 4], [3, 4, 5]); // [3]\n * getInAll([1, 2, 3, 'x'], [2, 3, 4, 'x'], [3, 4, 5]); // [3]\n *\n * @param {...unknown[]} arrays - Arrays to be compared\n * @return {unknown[]} List of values\n */\nexport function getInAll(...arrays: unknown[][]): unknown[] {\n  return arrays.reduce((acc, curr) =>\n    acc.filter(value => new Set(curr).has(value))\n  );\n}\n\n/**\n * Returns values found in multiple (possibly all) arrays\n *\n * @example\n * getInMultiple([1, 2], [2, 3]); // [2]\n * getInMultiple([1, 2, 3], [2, 3, 4], [3, 4, 5]); // [2, 3, 4]\n * getInMultiple([1, 2, 3, 'x'], [2, 3, 4, 'x'], [3, 4, 5]); // [2, 3, 4, 'x']\n *\n * @param {...unknown[]} arrays - Arrays to be compared\n * @return {unknown[]} List of values\n */\nexport function getInMultiple(...arrays: unknown[][]): unknown[] {\n  const countObj = countOccurrences(...arrays);\n\n  return Object.keys(countObj)\n    .filter(v => countObj[v] > 1)\n    .map(key => parseValue(key));\n}\n\n/**\n * Returns values not found in all arrays\n *\n * @example\n * getNotInAll([1, 2], [2, 3]); // [1, 3]\n * getNotInAll([1, 2, 3], [2, 3, 4], [3, 4, 5]); // [1, 2, 4, 5]\n * getNotInAll([1, 2, 3, 'x'], [2, 3, 4, 'x'], [3, 4, 5]); // [1, 2, 4, 5, 'x']\n *\n * @param {...unknown[]} arrays - Arrays to be compared\n * @return {unknown[]} List of values\n */\nexport function getNotInAll(...arrays: unknown[][]): unknown[] {\n  const countObj = countOccurrences(...arrays);\n\n  return Object.keys(countObj)\n    .filter(v => countObj[v] < arrays.length)\n    .map(key => parseValue(key));\n}\n\n/**\n * Returns values found in one array only (i.e. not multiple)\n *\n * @example\n * getNotInMultiple([1, 2], [2, 3]); // [1, 3]\n * getNotInMultiple([1, 2, 3], [2, 3, 4], [3, 4, 5]); // [1, 5]\n * getNotInMultiple([1, 2, 3, 'x'], [2, 3, 4, 'x'], [3, 4, 5]); // [1, 5]\n *\n * @param {...unknown[]} arrays - Arrays to be compared\n * @return {unknown[]} List of values\n */\nexport function getNotInMultiple(...arrays: unknown[][]): unknown[] {\n  const countObj = countOccurrences(...arrays);\n\n  return Object.keys(countObj)\n    .filter(v => countObj[v] === 1)\n    .map(key => parseValue(key));\n}\n\n/**\n * Returns array of an object's own keys and (optionally) the enumerable keys\n * from the object's prototype chain.\n *\n * @example\n * getObjectKeys({ a: 1 }); // ['a']\n * getObjectKeys({ a: 1 }, true); // ['a', 'b', 'c', ...]\n *\n * @param {object} obj - Object to parse\n * @param {boolean} [hoistEnumerable=false] include enumerable prototype properties\n * @return {string[]} List of keys\n */\nexport function getObjectKeys(\n  obj: object,\n  hoistEnumerable: boolean = false\n): string[] {\n  const keys: string[] = Object.getOwnPropertyNames(obj);\n\n  if (hoistEnumerable) {\n    for (const key in obj) {\n      if (!keys.includes(key)) {\n        keys.push(key);\n      }\n    }\n  }\n\n  return keys;\n}\n\n/**\n * Determines if the value passed was created using the Object constructor\n *\n * @param {*} value - Value to test\n * @return {boolean}\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Determines if the value passed is a property descriptor\n *\n * @param {*} obj - Value to test\n * @return {boolean}\n */\nexport function isPropDescriptor(obj: unknown): obj is PropertyDescriptor {\n  if (!isObject(obj)) {\n    return false;\n  }\n\n  const hasFlagKey = ['writable', 'enumerable', 'configurable'].some(\n    key => key in obj\n  );\n  const hasMethod = ['get', 'set'].some(key => typeof obj[key] === 'function');\n  const hasMethodKeys = ['get', 'set'].every(key => key in obj);\n\n  let isDescriptor =\n    ('value' in obj && hasFlagKey) ||\n    (hasMethod && (hasMethodKeys || hasFlagKey));\n\n  // Test for invalid key(s)\n  if (isDescriptor) {\n    const validKeys = new Set([\n      'configurable',\n      'get',\n      'set',\n      'enumerable',\n      'value',\n      'writable'\n    ]);\n\n    isDescriptor = Object.keys(obj).every(key => validKeys.has(key));\n  }\n\n  return isDescriptor;\n}\n\n/**\n * Helper function to parse string keys back to their original types.\n * Note: This assumes that the original values can be correctly parsed from strings.\n *\n * @param key - The key to parse.\n * @returns The parsed value.\n */\nfunction parseValue(key: string): unknown {\n  try {\n    return JSON.parse(key);\n  } catch {\n    return key;\n  }\n}\n"],"mappings":"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","names":["objects"]}