UNPKG

@opentelemetry/core

Version:

OpenTelemetry Core provides constants and utilities shared by all OpenTelemetry SDK packages.

1 lines • 7.19 kB
{"version":3,"file":"merge.mjs","names":[],"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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"}