{"version":3,"file":"merge.cjs","names":["isPlainObject"],"sources":["../../src/utils/merge.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { isPlainObject } from './lodash.merge';\n\nconst MAX_LEVEL = 20;\n\ninterface ObjectInto {\n  obj: any;\n  key: string;\n}\n\n/**\n * Merges objects together\n * @param args - objects / values to be merged\n */\nexport function merge(...args: any[]): any {\n  let result: any = args.shift();\n  const objects: WeakMap<any, ObjectInto[]> | undefined = new WeakMap<\n    any,\n    ObjectInto[]\n  >();\n  while (args.length > 0) {\n    result = mergeTwoObjects(result, args.shift(), 0, objects);\n  }\n\n  return result;\n}\n\nfunction takeValue(value: any): any {\n  if (isArray(value)) {\n    return value.slice();\n  }\n  return value;\n}\n\n/**\n * Merges two objects\n * @param one - first object\n * @param two - second object\n * @param level - current deep level\n * @param objects - objects holder that has been already referenced - to prevent\n * cyclic dependency\n */\nfunction mergeTwoObjects(\n  one: any,\n  two: any,\n  level = 0,\n  objects: WeakMap<any, ObjectInto[]>\n): any {\n  let result: any;\n  if (level > MAX_LEVEL) {\n    return undefined;\n  }\n  level++;\n  if (isPrimitive(one) || isPrimitive(two) || isFunction(two)) {\n    result = takeValue(two);\n  } else if (isArray(one)) {\n    result = one.slice();\n    if (isArray(two)) {\n      for (let i = 0, j = two.length; i < j; i++) {\n        result.push(takeValue(two[i]));\n      }\n    } else if (isObject(two)) {\n      const keys = Object.keys(two);\n      for (let i = 0, j = keys.length; i < j; i++) {\n        const key = keys[i];\n        if (\n          key === '__proto__' ||\n          key === 'constructor' ||\n          key === 'prototype'\n        ) {\n          continue;\n        }\n        result[key] = takeValue(two[key]);\n      }\n    }\n  } else if (isObject(one)) {\n    if (isObject(two)) {\n      if (!shouldMerge(one, two)) {\n        return two;\n      }\n      result = Object.assign({}, one);\n      const keys = Object.keys(two);\n\n      for (let i = 0, j = keys.length; i < j; i++) {\n        const key = keys[i];\n        if (\n          key === '__proto__' ||\n          key === 'constructor' ||\n          key === 'prototype'\n        ) {\n          continue;\n        }\n        const twoValue = two[key];\n\n        if (isPrimitive(twoValue)) {\n          if (typeof twoValue === 'undefined') {\n            delete result[key];\n          } else {\n            // result[key] = takeValue(twoValue);\n            result[key] = twoValue;\n          }\n        } else {\n          const obj1 = result[key];\n          const obj2 = twoValue;\n\n          if (\n            wasObjectReferenced(one, key, objects) ||\n            wasObjectReferenced(two, key, objects)\n          ) {\n            delete result[key];\n          } else {\n            if (isObject(obj1) && isObject(obj2)) {\n              const arr1 = objects.get(obj1) || [];\n              const arr2 = objects.get(obj2) || [];\n              arr1.push({ obj: one, key });\n              arr2.push({ obj: two, key });\n              objects.set(obj1, arr1);\n              objects.set(obj2, arr2);\n            }\n\n            result[key] = mergeTwoObjects(\n              result[key],\n              twoValue,\n              level,\n              objects\n            );\n          }\n        }\n      }\n    } else {\n      result = two;\n    }\n  }\n\n  return result;\n}\n\n/**\n * Function to check if object has been already reference\n * @param obj\n * @param key\n * @param objects\n */\nfunction wasObjectReferenced(\n  obj: any,\n  key: string,\n  objects: WeakMap<any, ObjectInto[]>\n): boolean {\n  const arr = objects.get(obj[key]) || [];\n  for (let i = 0, j = arr.length; i < j; i++) {\n    const info = arr[i];\n    if (info.key === key && info.obj === obj) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction isArray(value: any): boolean {\n  return Array.isArray(value);\n}\n\nfunction isFunction(value: any): boolean {\n  return typeof value === 'function';\n}\n\nfunction isObject(value: any): boolean {\n  return (\n    !isPrimitive(value) &&\n    !isArray(value) &&\n    !isFunction(value) &&\n    typeof value === 'object'\n  );\n}\n\nfunction isPrimitive(value: any): boolean {\n  return (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    typeof value === 'undefined' ||\n    value instanceof Date ||\n    value instanceof RegExp ||\n    value === null\n  );\n}\n\nfunction shouldMerge(one: any, two: any): boolean {\n  if (!isPlainObject(one) || !isPlainObject(two)) {\n    return false;\n  }\n\n  return true;\n}\n"],"mappings":"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"}