You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					162 lines
				
				4.5 KiB
			
		
		
			
		
	
	
					162 lines
				
				4.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// based on https://github.com/TehShrike/deepmerge
							 | 
						||
| 
								 | 
							
								// MIT License
							 | 
						||
| 
								 | 
							
								// Copyright (c) 2012 - 2022 James Halliday, Josh Duff, and other contributors of deepmerge
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const JSON_PROTO = Object.getPrototypeOf({})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function deepmergeConstructor (options) {
							 | 
						||
| 
								 | 
							
								  function isNotPrototypeKey (value) {
							 | 
						||
| 
								 | 
							
								    return (
							 | 
						||
| 
								 | 
							
								      value !== 'constructor' &&
							 | 
						||
| 
								 | 
							
								      value !== 'prototype' &&
							 | 
						||
| 
								 | 
							
								      value !== '__proto__'
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function cloneArray (value) {
							 | 
						||
| 
								 | 
							
								    let i = 0
							 | 
						||
| 
								 | 
							
								    const il = value.length
							 | 
						||
| 
								 | 
							
								    const result = new Array(il)
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < il; ++i) {
							 | 
						||
| 
								 | 
							
								      result[i] = clone(value[i])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function cloneObject (target) {
							 | 
						||
| 
								 | 
							
								    const result = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (cloneProtoObject && Object.getPrototypeOf(target) !== JSON_PROTO) {
							 | 
						||
| 
								 | 
							
								      return cloneProtoObject(target)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const targetKeys = getKeys(target)
							 | 
						||
| 
								 | 
							
								    let i, il, key
							 | 
						||
| 
								 | 
							
								    for (i = 0, il = targetKeys.length; i < il; ++i) {
							 | 
						||
| 
								 | 
							
								      isNotPrototypeKey(key = targetKeys[i]) &&
							 | 
						||
| 
								 | 
							
								        (result[key] = clone(target[key]))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function concatArrays (target, source) {
							 | 
						||
| 
								 | 
							
								    const tl = target.length
							 | 
						||
| 
								 | 
							
								    const sl = source.length
							 | 
						||
| 
								 | 
							
								    let i = 0
							 | 
						||
| 
								 | 
							
								    const result = new Array(tl + sl)
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < tl; ++i) {
							 | 
						||
| 
								 | 
							
								      result[i] = clone(target[i])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < sl; ++i) {
							 | 
						||
| 
								 | 
							
								      result[i + tl] = clone(source[i])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const propertyIsEnumerable = Object.prototype.propertyIsEnumerable
							 | 
						||
| 
								 | 
							
								  function getSymbolsAndKeys (value) {
							 | 
						||
| 
								 | 
							
								    const result = Object.keys(value)
							 | 
						||
| 
								 | 
							
								    const keys = Object.getOwnPropertySymbols(value)
							 | 
						||
| 
								 | 
							
								    for (let i = 0, il = keys.length; i < il; ++i) {
							 | 
						||
| 
								 | 
							
								      propertyIsEnumerable.call(value, keys[i]) && result.push(keys[i])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const getKeys = options && options.symbols
							 | 
						||
| 
								 | 
							
								    ? getSymbolsAndKeys
							 | 
						||
| 
								 | 
							
								    : Object.keys
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const cloneProtoObject = typeof options?.cloneProtoObject === 'function'
							 | 
						||
| 
								 | 
							
								    ? options.cloneProtoObject
							 | 
						||
| 
								 | 
							
								    : undefined
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function isMergeableObject (value) {
							 | 
						||
| 
								 | 
							
								    return typeof value === 'object' && value !== null && !(value instanceof RegExp) && !(value instanceof Date)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function isPrimitive (value) {
							 | 
						||
| 
								 | 
							
								    return typeof value !== 'object' || value === null
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const isPrimitiveOrBuiltIn = typeof Buffer !== 'undefined'
							 | 
						||
| 
								 | 
							
								    ? (value) => typeof value !== 'object' || value === null || value instanceof RegExp || value instanceof Date || value instanceof Buffer
							 | 
						||
| 
								 | 
							
								    : (value) => typeof value !== 'object' || value === null || value instanceof RegExp || value instanceof Date
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const mergeArray = options && typeof options.mergeArray === 'function'
							 | 
						||
| 
								 | 
							
								    ? options.mergeArray({ clone, deepmerge: _deepmerge, getKeys, isMergeableObject })
							 | 
						||
| 
								 | 
							
								    : concatArrays
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function clone (entry) {
							 | 
						||
| 
								 | 
							
								    return isMergeableObject(entry)
							 | 
						||
| 
								 | 
							
								      ? Array.isArray(entry)
							 | 
						||
| 
								 | 
							
								        ? cloneArray(entry)
							 | 
						||
| 
								 | 
							
								        : cloneObject(entry)
							 | 
						||
| 
								 | 
							
								      : entry
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function mergeObject (target, source) {
							 | 
						||
| 
								 | 
							
								    const result = {}
							 | 
						||
| 
								 | 
							
								    const targetKeys = getKeys(target)
							 | 
						||
| 
								 | 
							
								    const sourceKeys = getKeys(source)
							 | 
						||
| 
								 | 
							
								    let i, il, key
							 | 
						||
| 
								 | 
							
								    for (i = 0, il = targetKeys.length; i < il; ++i) {
							 | 
						||
| 
								 | 
							
								      isNotPrototypeKey(key = targetKeys[i]) &&
							 | 
						||
| 
								 | 
							
								      (sourceKeys.indexOf(key) === -1) &&
							 | 
						||
| 
								 | 
							
								      (result[key] = clone(target[key]))
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (i = 0, il = sourceKeys.length; i < il; ++i) {
							 | 
						||
| 
								 | 
							
								      isNotPrototypeKey(key = sourceKeys[i]) &&
							 | 
						||
| 
								 | 
							
								      (
							 | 
						||
| 
								 | 
							
								        key in target && (targetKeys.indexOf(key) !== -1 && (result[key] = _deepmerge(target[key], source[key])), true) || // eslint-disable-line no-mixed-operators
							 | 
						||
| 
								 | 
							
								        (result[key] = clone(source[key]))
							 | 
						||
| 
								 | 
							
								      )
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function _deepmerge (target, source) {
							 | 
						||
| 
								 | 
							
								    const sourceIsArray = Array.isArray(source)
							 | 
						||
| 
								 | 
							
								    const targetIsArray = Array.isArray(target)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (isPrimitive(source)) {
							 | 
						||
| 
								 | 
							
								      return source
							 | 
						||
| 
								 | 
							
								    } else if (isPrimitiveOrBuiltIn(target)) {
							 | 
						||
| 
								 | 
							
								      return clone(source)
							 | 
						||
| 
								 | 
							
								    } else if (sourceIsArray && targetIsArray) {
							 | 
						||
| 
								 | 
							
								      return mergeArray(target, source)
							 | 
						||
| 
								 | 
							
								    } else if (sourceIsArray !== targetIsArray) {
							 | 
						||
| 
								 | 
							
								      return clone(source)
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return mergeObject(target, source)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function _deepmergeAll () {
							 | 
						||
| 
								 | 
							
								    switch (arguments.length) {
							 | 
						||
| 
								 | 
							
								      case 0:
							 | 
						||
| 
								 | 
							
								        return {}
							 | 
						||
| 
								 | 
							
								      case 1:
							 | 
						||
| 
								 | 
							
								        return clone(arguments[0])
							 | 
						||
| 
								 | 
							
								      case 2:
							 | 
						||
| 
								 | 
							
								        return _deepmerge(arguments[0], arguments[1])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    let result
							 | 
						||
| 
								 | 
							
								    for (let i = 0, il = arguments.length; i < il; ++i) {
							 | 
						||
| 
								 | 
							
								      result = _deepmerge(result, arguments[i])
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return options && options.all
							 | 
						||
| 
								 | 
							
								    ? _deepmergeAll
							 | 
						||
| 
								 | 
							
								    : _deepmerge
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = deepmergeConstructor
							 | 
						||
| 
								 | 
							
								module.exports.default = deepmergeConstructor
							 | 
						||
| 
								 | 
							
								module.exports.deepmerge = deepmergeConstructor
							 |