1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import { isSome } from './helpers.js';
- export function mergeDeep(sources, respectPrototype = false) {
- const target = sources[0] || {};
- const output = {};
- if (respectPrototype) {
- Object.setPrototypeOf(output, Object.create(Object.getPrototypeOf(target)));
- }
- for (const source of sources) {
- if (isObject(target) && isObject(source)) {
- if (respectPrototype) {
- const outputPrototype = Object.getPrototypeOf(output);
- const sourcePrototype = Object.getPrototypeOf(source);
- if (sourcePrototype) {
- for (const key of Object.getOwnPropertyNames(sourcePrototype)) {
- const descriptor = Object.getOwnPropertyDescriptor(sourcePrototype, key);
- if (isSome(descriptor)) {
- Object.defineProperty(outputPrototype, key, descriptor);
- }
- }
- }
- }
- for (const key in source) {
- if (isObject(source[key])) {
- if (!(key in output)) {
- Object.assign(output, { [key]: source[key] });
- }
- else {
- output[key] = mergeDeep([output[key], source[key]], respectPrototype);
- }
- }
- else {
- Object.assign(output, { [key]: source[key] });
- }
- }
- }
- }
- return output;
- }
- function isObject(item) {
- return item && typeof item === 'object' && !Array.isArray(item);
- }
|