sentry-javascript
Version:
A generic Javascript SDK based on Self-Hosted Sentry.
53 lines (43 loc) • 1.22 kB
text/typescript
/**
* @method Object deep merge
*/
export function deepMerge<T extends object>(
target: T,
...sources: object[]
): T {
// References for tracking objects
const seen: WeakSet<object> = new WeakSet()
const merge = (target: any, source: any): any => {
if (typeof target !== 'object' || typeof source !== 'object') {
return source
}
if (seen.has(source)) {
return source
}
seen.add(source)
const result = Array.isArray(target) ? [...target] : { ...target }
if (Array.isArray(source)) {
for (let i = 0; i < source.length; i++) {
result[i] = i in target
? merge(target[i], source[i])
: source[i]
}
} else {
for (const key in source) {
const sourceValue = source[key]
const targetValue = result[key]
result[key] = (typeof sourceValue === 'object' && sourceValue !== null)
? (typeof targetValue === 'object' && targetValue !== null)
? merge(targetValue, sourceValue)
: sourceValue
: sourceValue
}
}
seen.delete(source)
return result as T
}
sources.forEach((source) => {
target = merge(target, source)
})
return target
}