mergekit
Version:
Uniquely flexible and light-weight utility for cloning and deep (recursive) merging of JavaScript objects. Supports descriptor values, accessor functions, and custom prototypes. Provides advanced options for customizing the clone/merge process.
1 lines • 26.8 kB
Source Map (JSON)
{"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"]}