lodash.merge
Advanced tools
Comparing version 3.3.2 to 4.0.0
1131
index.js
/** | ||
* lodash 3.3.2 (Custom Build) <https://lodash.com/> | ||
* Build: `lodash modern modularize exports="npm" -o ./` | ||
* Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/> | ||
* lodash 4.0.0 (Custom Build) <https://lodash.com/> | ||
* Build: `lodash modularize exports="npm" -o ./` | ||
* Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> | ||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> | ||
* Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | ||
* Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | ||
* Available under MIT license <https://lodash.com/license> | ||
*/ | ||
var arrayCopy = require('lodash._arraycopy'), | ||
var Stack = require('lodash._stack'), | ||
arrayEach = require('lodash._arrayeach'), | ||
createAssigner = require('lodash._createassigner'), | ||
isArguments = require('lodash.isarguments'), | ||
isArray = require('lodash.isarray'), | ||
baseFor = require('lodash._basefor'), | ||
isPlainObject = require('lodash.isplainobject'), | ||
isTypedArray = require('lodash.istypedarray'), | ||
keys = require('lodash.keys'), | ||
toPlainObject = require('lodash.toplainobject'); | ||
keysIn = require('lodash.keysin'), | ||
rest = require('lodash.rest'); | ||
/** Used as references for various `Number` constants. */ | ||
var MAX_SAFE_INTEGER = 9007199254740991; | ||
/** `Object#toString` result references. */ | ||
var argsTag = '[object Arguments]', | ||
arrayTag = '[object Array]', | ||
boolTag = '[object Boolean]', | ||
dateTag = '[object Date]', | ||
errorTag = '[object Error]', | ||
funcTag = '[object Function]', | ||
genTag = '[object GeneratorFunction]', | ||
mapTag = '[object Map]', | ||
numberTag = '[object Number]', | ||
objectTag = '[object Object]', | ||
regexpTag = '[object RegExp]', | ||
setTag = '[object Set]', | ||
stringTag = '[object String]', | ||
symbolTag = '[object Symbol]', | ||
weakMapTag = '[object WeakMap]'; | ||
var arrayBufferTag = '[object ArrayBuffer]', | ||
float32Tag = '[object Float32Array]', | ||
float64Tag = '[object Float64Array]', | ||
int8Tag = '[object Int8Array]', | ||
int16Tag = '[object Int16Array]', | ||
int32Tag = '[object Int32Array]', | ||
uint8Tag = '[object Uint8Array]', | ||
uint8ClampedTag = '[object Uint8ClampedArray]', | ||
uint16Tag = '[object Uint16Array]', | ||
uint32Tag = '[object Uint32Array]'; | ||
/** Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns). */ | ||
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; | ||
/** Used to match `RegExp` flags from their coerced string values. */ | ||
var reFlags = /\w*$/; | ||
/** Used to detect host constructors (Safari > 5). */ | ||
var reIsHostCtor = /^\[object .+?Constructor\]$/; | ||
/** Used to detect unsigned integer values. */ | ||
var reIsUint = /^(?:0|[1-9]\d*)$/; | ||
/** Used to identify `toStringTag` values of typed arrays. */ | ||
var typedArrayTags = {}; | ||
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = | ||
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = | ||
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = | ||
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = | ||
typedArrayTags[uint32Tag] = true; | ||
typedArrayTags[argsTag] = typedArrayTags[arrayTag] = | ||
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = | ||
typedArrayTags[dateTag] = typedArrayTags[errorTag] = | ||
typedArrayTags[funcTag] = typedArrayTags[mapTag] = | ||
typedArrayTags[numberTag] = typedArrayTags[objectTag] = | ||
typedArrayTags[regexpTag] = typedArrayTags[setTag] = | ||
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; | ||
/** Used to identify `toStringTag` values supported by `_.clone`. */ | ||
var cloneableTags = {}; | ||
cloneableTags[argsTag] = cloneableTags[arrayTag] = | ||
cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = | ||
cloneableTags[dateTag] = cloneableTags[float32Tag] = | ||
cloneableTags[float64Tag] = cloneableTags[int8Tag] = | ||
cloneableTags[int16Tag] = cloneableTags[int32Tag] = | ||
cloneableTags[mapTag] = cloneableTags[numberTag] = | ||
cloneableTags[objectTag] = cloneableTags[regexpTag] = | ||
cloneableTags[setTag] = cloneableTags[stringTag] = | ||
cloneableTags[symbolTag] = cloneableTags[uint8Tag] = | ||
cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = | ||
cloneableTags[uint32Tag] = true; | ||
cloneableTags[errorTag] = cloneableTags[funcTag] = | ||
cloneableTags[weakMapTag] = false; | ||
/** | ||
* Checks if `value` is object-like. | ||
* Adds the key-value `pair` to `map`. | ||
* | ||
* @private | ||
* @param {Object} map The map to modify. | ||
* @param {Array} pair The key-value pair to add. | ||
* @returns {Object} Returns `map`. | ||
*/ | ||
function addMapEntry(map, pair) { | ||
map.set(pair[0], pair[1]); | ||
return map; | ||
} | ||
/** | ||
* Adds `value` to `set`. | ||
* | ||
* @private | ||
* @param {Object} set The set to modify. | ||
* @param {*} value The value to add. | ||
* @returns {Object} Returns `set`. | ||
*/ | ||
function addSetEntry(set, value) { | ||
set.add(value); | ||
return set; | ||
} | ||
/** | ||
* A specialized version of `_.reduce` for arrays without support for | ||
* iteratee shorthands. | ||
* | ||
* @private | ||
* @param {Array} array The array to iterate over. | ||
* @param {Function} iteratee The function invoked per iteration. | ||
* @param {*} [accumulator] The initial value. | ||
* @param {boolean} [initFromArray] Specify using the first element of `array` as the initial value. | ||
* @returns {*} Returns the accumulated value. | ||
*/ | ||
function arrayReduce(array, iteratee, accumulator, initFromArray) { | ||
var index = -1, | ||
length = array.length; | ||
if (initFromArray && length) { | ||
accumulator = array[++index]; | ||
} | ||
while (++index < length) { | ||
accumulator = iteratee(accumulator, array[index], index, array); | ||
} | ||
return accumulator; | ||
} | ||
/** | ||
* Checks if `value` is a host object in IE < 9. | ||
* | ||
* @private | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is object-like, else `false`. | ||
* @returns {boolean} Returns `true` if `value` is a host object, else `false`. | ||
*/ | ||
function isObjectLike(value) { | ||
return !!value && typeof value == 'object'; | ||
function isHostObject(value) { | ||
// Many host objects are `Object` objects that can coerce to strings | ||
// despite having improperly defined `toString` methods. | ||
var result = false; | ||
if (value != null && typeof value.toString != 'function') { | ||
try { | ||
result = !!(value + ''); | ||
} catch (e) {} | ||
} | ||
return result; | ||
} | ||
/** | ||
* Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) | ||
* of an array-like value. | ||
* Checks if `value` is a valid array-like index. | ||
* | ||
* @private | ||
* @param {*} value The value to check. | ||
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. | ||
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`. | ||
*/ | ||
var MAX_SAFE_INTEGER = 9007199254740991; | ||
function isIndex(value, length) { | ||
value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; | ||
length = length == null ? MAX_SAFE_INTEGER : length; | ||
return value > -1 && value % 1 == 0 && value < length; | ||
} | ||
/** | ||
* The base implementation of `_.merge` without support for argument juggling, | ||
* multiple sources, and `this` binding `customizer` functions. | ||
* Converts `map` to an array. | ||
* | ||
* @private | ||
* @param {Object} map The map to convert. | ||
* @returns {Array} Returns the converted array. | ||
*/ | ||
function mapToArray(map) { | ||
var index = -1, | ||
result = Array(map.size); | ||
map.forEach(function(value, key) { | ||
result[++index] = [key, value]; | ||
}); | ||
return result; | ||
} | ||
/** | ||
* Converts `set` to an array. | ||
* | ||
* @private | ||
* @param {Object} set The set to convert. | ||
* @returns {Array} Returns the converted array. | ||
*/ | ||
function setToArray(set) { | ||
var index = -1, | ||
result = Array(set.size); | ||
set.forEach(function(value) { | ||
result[++index] = value; | ||
}); | ||
return result; | ||
} | ||
/** Used for built-in method references. */ | ||
var objectProto = global.Object.prototype; | ||
/** Used to resolve the decompiled source of functions. */ | ||
var funcToString = global.Function.prototype.toString; | ||
/** Used to check objects for own properties. */ | ||
var hasOwnProperty = objectProto.hasOwnProperty; | ||
/** | ||
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) | ||
* of values. | ||
*/ | ||
var objectToString = objectProto.toString; | ||
/** Used to detect if a method is native. */ | ||
var reIsNative = RegExp('^' + | ||
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') | ||
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' | ||
); | ||
/** Built-in value references. */ | ||
var _Symbol = global.Symbol, | ||
Uint8Array = global.Uint8Array, | ||
getOwnPropertySymbols = Object.getOwnPropertySymbols, | ||
propertyIsEnumerable = objectProto.propertyIsEnumerable; | ||
/* Built-in method references that are verified to be native. */ | ||
var Map = getNative(global, 'Map'), | ||
Set = getNative(global, 'Set'); | ||
/** Used to detect maps and sets. */ | ||
var mapCtorString = Map ? funcToString.call(Map) : '', | ||
setCtorString = Set ? funcToString.call(Set) : ''; | ||
/** Used to convert symbols to primitives and strings. */ | ||
var symbolProto = _Symbol ? _Symbol.prototype : undefined, | ||
symbolValueOf = _Symbol ? symbolProto.valueOf : undefined; | ||
/** | ||
* This function is like `assignValue` except that it doesn't assign `undefined` values. | ||
* | ||
* @private | ||
* @param {Object} object The object to modify. | ||
* @param {string} key The key of the property to assign. | ||
* @param {*} value The value to assign. | ||
*/ | ||
function assignMergeValue(object, key, value) { | ||
if ((value !== undefined && !eq(object[key], value)) || | ||
(typeof key == 'number' && value === undefined && !(key in object))) { | ||
object[key] = value; | ||
} | ||
} | ||
/** | ||
* Assigns `value` to `key` of `object` if the existing value is not equivalent | ||
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) | ||
* for equality comparisons. | ||
* | ||
* @private | ||
* @param {Object} object The object to modify. | ||
* @param {string} key The key of the property to assign. | ||
* @param {*} value The value to assign. | ||
*/ | ||
function assignValue(object, key, value) { | ||
var objValue = object[key]; | ||
if ((!eq(objValue, value) || | ||
(eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) || | ||
(value === undefined && !(key in object))) { | ||
object[key] = value; | ||
} | ||
} | ||
/** | ||
* The base implementation of `_.assign` without support for multiple sources | ||
* or `customizer` functions. | ||
* | ||
* @private | ||
* @param {Object} object The destination object. | ||
* @param {Object} source The source object. | ||
* @param {Function} [customizer] The function to customize merged values. | ||
* @param {Array} [stackA=[]] Tracks traversed source objects. | ||
* @param {Array} [stackB=[]] Associates values with source counterparts. | ||
* @returns {Object} Returns `object`. | ||
*/ | ||
function baseMerge(object, source, customizer, stackA, stackB) { | ||
if (!isObject(object)) { | ||
return object; | ||
function baseAssign(object, source) { | ||
return object && copyObject(source, keys(source), object); | ||
} | ||
/** | ||
* The base implementation of `_.clone` and `_.cloneDeep` which tracks | ||
* traversed objects. | ||
* | ||
* @private | ||
* @param {*} value The value to clone. | ||
* @param {boolean} [isDeep] Specify a deep clone. | ||
* @param {Function} [customizer] The function to customize cloning. | ||
* @param {string} [key] The key of `value`. | ||
* @param {Object} [object] The parent object of `value`. | ||
* @param {Object} [stack] Tracks traversed objects and their clone counterparts. | ||
* @returns {*} Returns the cloned value. | ||
*/ | ||
function baseClone(value, isDeep, customizer, key, object, stack) { | ||
var result; | ||
if (customizer) { | ||
result = object ? customizer(value, key, object, stack) : customizer(value); | ||
} | ||
var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)), | ||
props = isSrcArr ? undefined : keys(source); | ||
if (result !== undefined) { | ||
return result; | ||
} | ||
if (!isObject(value)) { | ||
return value; | ||
} | ||
var isArr = isArray(value); | ||
if (isArr) { | ||
result = initCloneArray(value); | ||
if (!isDeep) { | ||
return copyArray(value, result); | ||
} | ||
} else { | ||
var tag = getTag(value), | ||
isFunc = tag == funcTag || tag == genTag; | ||
if (tag == objectTag || tag == argsTag || (isFunc && !object)) { | ||
if (isHostObject(value)) { | ||
return object ? value : {}; | ||
} | ||
result = initCloneObject(isFunc ? {} : value); | ||
if (!isDeep) { | ||
return copySymbols(value, baseAssign(result, value)); | ||
} | ||
} else { | ||
return cloneableTags[tag] | ||
? initCloneByTag(value, tag, isDeep) | ||
: (object ? value : {}); | ||
} | ||
} | ||
// Check for circular references and return its corresponding clone. | ||
stack || (stack = new Stack); | ||
var stacked = stack.get(value); | ||
if (stacked) { | ||
return stacked; | ||
} | ||
stack.set(value, result); | ||
// Recursively populate clone (susceptible to call stack limits). | ||
(isArr ? arrayEach : baseForOwn)(value, function(subValue, key) { | ||
assignValue(result, key, baseClone(subValue, isDeep, customizer, key, value, stack)); | ||
}); | ||
return isArr ? result : copySymbols(value, result); | ||
} | ||
/** | ||
* The base implementation of `_.create` without support for assigning | ||
* properties to the created object. | ||
* | ||
* @private | ||
* @param {Object} prototype The object to inherit from. | ||
* @returns {Object} Returns the new object. | ||
*/ | ||
var baseCreate = (function() { | ||
function object() {} | ||
return function(prototype) { | ||
if (isObject(prototype)) { | ||
object.prototype = prototype; | ||
var result = new object; | ||
object.prototype = undefined; | ||
} | ||
return result || {}; | ||
}; | ||
}()); | ||
/** | ||
* The base implementation of `_.forOwn` without support for iteratee shorthands. | ||
* | ||
* @private | ||
* @param {Object} object The object to iterate over. | ||
* @param {Function} iteratee The function invoked per iteration. | ||
* @returns {Object} Returns `object`. | ||
*/ | ||
function baseForOwn(object, iteratee) { | ||
return object && baseFor(object, iteratee, keys); | ||
} | ||
/** | ||
* The base implementation of `_.merge` without support for multiple sources. | ||
* | ||
* @private | ||
* @param {Object} object The destination object. | ||
* @param {Object} source The source object. | ||
* @param {Function} [customizer] The function to customize merged values. | ||
* @param {Object} [stack] Tracks traversed source values and their merged counterparts. | ||
*/ | ||
function baseMerge(object, source, customizer, stack) { | ||
if (object === source) { | ||
return; | ||
} | ||
var props = (isArray(source) || isTypedArray(source)) ? undefined : keysIn(source); | ||
arrayEach(props || source, function(srcValue, key) { | ||
@@ -60,22 +408,14 @@ if (props) { | ||
} | ||
if (isObjectLike(srcValue)) { | ||
stackA || (stackA = []); | ||
stackB || (stackB = []); | ||
baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); | ||
if (isObject(srcValue)) { | ||
stack || (stack = new Stack); | ||
baseMergeDeep(object, source, key, baseMerge, customizer, stack); | ||
} | ||
else { | ||
var value = object[key], | ||
result = customizer ? customizer(value, srcValue, key, object, source) : undefined, | ||
isCommon = result === undefined; | ||
if (isCommon) { | ||
result = srcValue; | ||
var newValue = customizer ? customizer(object[key], srcValue, (key + ''), object, source, stack) : undefined; | ||
if (newValue === undefined) { | ||
newValue = srcValue; | ||
} | ||
if ((result !== undefined || (isSrcArr && !(key in object))) && | ||
(isCommon || (result === result ? (result !== value) : (value === value)))) { | ||
object[key] = result; | ||
} | ||
assignMergeValue(object, key, newValue); | ||
} | ||
}); | ||
return object; | ||
} | ||
@@ -93,48 +433,40 @@ | ||
* @param {Function} mergeFunc The function to merge values. | ||
* @param {Function} [customizer] The function to customize merged values. | ||
* @param {Array} [stackA=[]] Tracks traversed source objects. | ||
* @param {Array} [stackB=[]] Associates values with source counterparts. | ||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. | ||
* @param {Function} [customizer] The function to customize assigned values. | ||
* @param {Object} [stack] Tracks traversed source values and their merged counterparts. | ||
*/ | ||
function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) { | ||
var length = stackA.length, | ||
srcValue = source[key]; | ||
function baseMergeDeep(object, source, key, mergeFunc, customizer, stack) { | ||
var objValue = object[key], | ||
srcValue = source[key], | ||
stacked = stack.get(srcValue) || stack.get(objValue); | ||
while (length--) { | ||
if (stackA[length] == srcValue) { | ||
object[key] = stackB[length]; | ||
return; | ||
} | ||
if (stacked) { | ||
assignMergeValue(object, key, stacked); | ||
return; | ||
} | ||
var value = object[key], | ||
result = customizer ? customizer(value, srcValue, key, object, source) : undefined, | ||
isCommon = result === undefined; | ||
var newValue = customizer ? customizer(objValue, srcValue, (key + ''), object, source, stack) : undefined, | ||
isCommon = newValue === undefined; | ||
if (isCommon) { | ||
result = srcValue; | ||
if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) { | ||
result = isArray(value) | ||
? value | ||
: (isArrayLike(value) ? arrayCopy(value) : []); | ||
newValue = srcValue; | ||
if (isArray(srcValue) || isTypedArray(srcValue)) { | ||
newValue = isArray(objValue) | ||
? objValue | ||
: ((isArrayLikeObject(objValue)) ? copyArray(objValue) : baseClone(srcValue)); | ||
} | ||
else if (isPlainObject(srcValue) || isArguments(srcValue)) { | ||
result = isArguments(value) | ||
? toPlainObject(value) | ||
: (isPlainObject(value) ? value : {}); | ||
newValue = isArguments(objValue) | ||
? toPlainObject(objValue) | ||
: (isObject(objValue) ? objValue : baseClone(srcValue)); | ||
} | ||
else { | ||
isCommon = false; | ||
isCommon = isFunction(srcValue); | ||
} | ||
} | ||
// Add the source value to the stack of traversed objects and associate | ||
// it with its merged value. | ||
stackA.push(srcValue); | ||
stackB.push(result); | ||
stack.set(srcValue, newValue); | ||
if (isCommon) { | ||
// Recursively merge objects and arrays (susceptible to call stack limits). | ||
object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB); | ||
} else if (result === result ? (result !== value) : (value === value)) { | ||
object[key] = result; | ||
mergeFunc(newValue, srcValue, customizer, stack); | ||
} | ||
assignMergeValue(object, key, newValue); | ||
} | ||
@@ -156,2 +488,183 @@ | ||
/** | ||
* Creates a clone of `buffer`. | ||
* | ||
* @private | ||
* @param {ArrayBuffer} buffer The array buffer to clone. | ||
* @returns {ArrayBuffer} Returns the cloned array buffer. | ||
*/ | ||
function cloneBuffer(buffer) { | ||
var Ctor = buffer.constructor, | ||
result = new Ctor(buffer.byteLength), | ||
view = new Uint8Array(result); | ||
view.set(new Uint8Array(buffer)); | ||
return result; | ||
} | ||
/** | ||
* Creates a clone of `map`. | ||
* | ||
* @private | ||
* @param {Object} map The map to clone. | ||
* @returns {Object} Returns the cloned map. | ||
*/ | ||
function cloneMap(map) { | ||
var Ctor = map.constructor; | ||
return arrayReduce(mapToArray(map), addMapEntry, new Ctor); | ||
} | ||
/** | ||
* Creates a clone of `regexp`. | ||
* | ||
* @private | ||
* @param {Object} regexp The regexp to clone. | ||
* @returns {Object} Returns the cloned regexp. | ||
*/ | ||
function cloneRegExp(regexp) { | ||
var Ctor = regexp.constructor, | ||
result = new Ctor(regexp.source, reFlags.exec(regexp)); | ||
result.lastIndex = regexp.lastIndex; | ||
return result; | ||
} | ||
/** | ||
* Creates a clone of `set`. | ||
* | ||
* @private | ||
* @param {Object} set The set to clone. | ||
* @returns {Object} Returns the cloned set. | ||
*/ | ||
function cloneSet(set) { | ||
var Ctor = set.constructor; | ||
return arrayReduce(setToArray(set), addSetEntry, new Ctor); | ||
} | ||
/** | ||
* Creates a clone of the `symbol` object. | ||
* | ||
* @private | ||
* @param {Object} symbol The symbol object to clone. | ||
* @returns {Object} Returns the cloned symbol object. | ||
*/ | ||
function cloneSymbol(symbol) { | ||
return _Symbol ? Object(symbolValueOf.call(symbol)) : {}; | ||
} | ||
/** | ||
* Creates a clone of `typedArray`. | ||
* | ||
* @private | ||
* @param {Object} typedArray The typed array to clone. | ||
* @param {boolean} [isDeep] Specify a deep clone. | ||
* @returns {Object} Returns the cloned typed array. | ||
*/ | ||
function cloneTypedArray(typedArray, isDeep) { | ||
var buffer = typedArray.buffer, | ||
Ctor = typedArray.constructor; | ||
return new Ctor(isDeep ? cloneBuffer(buffer) : buffer, typedArray.byteOffset, typedArray.length); | ||
} | ||
/** | ||
* Copies the values of `source` to `array`. | ||
* | ||
* @private | ||
* @param {Array} source The array to copy values from. | ||
* @param {Array} [array=[]] The array to copy values to. | ||
* @returns {Array} Returns `array`. | ||
*/ | ||
function copyArray(source, array) { | ||
var index = -1, | ||
length = source.length; | ||
array || (array = Array(length)); | ||
while (++index < length) { | ||
array[index] = source[index]; | ||
} | ||
return array; | ||
} | ||
/** | ||
* Copies properties of `source` to `object`. | ||
* | ||
* @private | ||
* @param {Object} source The object to copy properties from. | ||
* @param {Array} props The property names to copy. | ||
* @param {Object} [object={}] The object to copy properties to. | ||
* @returns {Object} Returns `object`. | ||
*/ | ||
function copyObject(source, props, object) { | ||
return copyObjectWith(source, props, object); | ||
} | ||
/** | ||
* This function is like `copyObject` except that it accepts a function to | ||
* customize copied values. | ||
* | ||
* @private | ||
* @param {Object} source The object to copy properties from. | ||
* @param {Array} props The property names to copy. | ||
* @param {Object} [object={}] The object to copy properties to. | ||
* @param {Function} [customizer] The function to customize copied values. | ||
* @returns {Object} Returns `object`. | ||
*/ | ||
function copyObjectWith(source, props, object, customizer) { | ||
object || (object = {}); | ||
var index = -1, | ||
length = props.length; | ||
while (++index < length) { | ||
var key = props[index], | ||
newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key]; | ||
assignValue(object, key, newValue); | ||
} | ||
return object; | ||
} | ||
/** | ||
* Copies own symbol properties of `source` to `object`. | ||
* | ||
* @private | ||
* @param {Object} source The object to copy symbols from. | ||
* @param {Object} [object={}] The object to copy symbols to. | ||
* @returns {Object} Returns `object`. | ||
*/ | ||
function copySymbols(source, object) { | ||
return copyObject(source, getSymbols(source), object); | ||
} | ||
/** | ||
* Creates a function like `_.assign`. | ||
* | ||
* @private | ||
* @param {Function} assigner The function to assign values. | ||
* @returns {Function} Returns the new assigner function. | ||
*/ | ||
function createAssigner(assigner) { | ||
return rest(function(object, sources) { | ||
var index = -1, | ||
length = sources.length, | ||
customizer = length > 1 ? sources[length - 1] : undefined, | ||
guard = length > 2 ? sources[2] : undefined; | ||
customizer = typeof customizer == 'function' ? (length--, customizer) : undefined; | ||
if (guard && isIterateeCall(sources[0], sources[1], guard)) { | ||
customizer = length < 3 ? undefined : customizer; | ||
length = 1; | ||
} | ||
object = Object(object); | ||
while (++index < length) { | ||
var source = sources[index]; | ||
if (source) { | ||
assigner(object, source, customizer); | ||
} | ||
} | ||
return object; | ||
}); | ||
} | ||
/** | ||
* Gets the "length" property value of `object`. | ||
@@ -169,20 +682,339 @@ * | ||
/** | ||
* Checks if `value` is array-like. | ||
* Gets the native function at `key` of `object`. | ||
* | ||
* @private | ||
* @param {Object} object The object to query. | ||
* @param {string} key The key of the method to get. | ||
* @returns {*} Returns the function if it's native, else `undefined`. | ||
*/ | ||
function getNative(object, key) { | ||
var value = object == null ? undefined : object[key]; | ||
return isNative(value) ? value : undefined; | ||
} | ||
/** | ||
* Creates an array of the own symbol properties of `object`. | ||
* | ||
* @private | ||
* @param {Object} object The object to query. | ||
* @returns {Array} Returns the array of symbols. | ||
*/ | ||
var getSymbols = getOwnPropertySymbols || function() { | ||
return []; | ||
}; | ||
/** | ||
* Gets the `toStringTag` of `value`. | ||
* | ||
* @private | ||
* @param {*} value The value to query. | ||
* @returns {string} Returns the `toStringTag`. | ||
*/ | ||
function getTag(value) { | ||
return objectToString.call(value); | ||
} | ||
// Fallback for IE 11 providing `toStringTag` values for maps and sets. | ||
if ((Map && getTag(new Map) != mapTag) || (Set && getTag(new Set) != setTag)) { | ||
getTag = function(value) { | ||
var result = objectToString.call(value), | ||
Ctor = result == objectTag ? value.constructor : null, | ||
ctorString = typeof Ctor == 'function' ? funcToString.call(Ctor) : ''; | ||
if (ctorString) { | ||
if (ctorString == mapCtorString) { | ||
return mapTag; | ||
} | ||
if (ctorString == setCtorString) { | ||
return setTag; | ||
} | ||
} | ||
return result; | ||
}; | ||
} | ||
/** | ||
* Initializes an array clone. | ||
* | ||
* @private | ||
* @param {Array} array The array to clone. | ||
* @returns {Array} Returns the initialized clone. | ||
*/ | ||
function initCloneArray(array) { | ||
var length = array.length, | ||
result = array.constructor(length); | ||
// Add properties assigned by `RegExp#exec`. | ||
if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { | ||
result.index = array.index; | ||
result.input = array.input; | ||
} | ||
return result; | ||
} | ||
/** | ||
* Initializes an object clone. | ||
* | ||
* @private | ||
* @param {Object} object The object to clone. | ||
* @returns {Object} Returns the initialized clone. | ||
*/ | ||
function initCloneObject(object) { | ||
var Ctor = object.constructor; | ||
return baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined); | ||
} | ||
/** | ||
* Initializes an object clone based on its `toStringTag`. | ||
* | ||
* **Note:** This function only supports cloning values with tags of | ||
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. | ||
* | ||
* @private | ||
* @param {Object} object The object to clone. | ||
* @param {string} tag The `toStringTag` of the object to clone. | ||
* @param {boolean} [isDeep] Specify a deep clone. | ||
* @returns {Object} Returns the initialized clone. | ||
*/ | ||
function initCloneByTag(object, tag, isDeep) { | ||
var Ctor = object.constructor; | ||
switch (tag) { | ||
case arrayBufferTag: | ||
return cloneBuffer(object); | ||
case boolTag: | ||
case dateTag: | ||
return new Ctor(+object); | ||
case float32Tag: case float64Tag: | ||
case int8Tag: case int16Tag: case int32Tag: | ||
case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: | ||
return cloneTypedArray(object, isDeep); | ||
case mapTag: | ||
return cloneMap(object); | ||
case numberTag: | ||
case stringTag: | ||
return new Ctor(object); | ||
case regexpTag: | ||
return cloneRegExp(object); | ||
case setTag: | ||
return cloneSet(object); | ||
case symbolTag: | ||
return cloneSymbol(object); | ||
} | ||
} | ||
/** | ||
* Checks if the provided arguments are from an iteratee call. | ||
* | ||
* @private | ||
* @param {*} value The potential iteratee value argument. | ||
* @param {*} index The potential iteratee index or key argument. | ||
* @param {*} object The potential iteratee object argument. | ||
* @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. | ||
*/ | ||
function isIterateeCall(value, index, object) { | ||
if (!isObject(object)) { | ||
return false; | ||
} | ||
var type = typeof index; | ||
if (type == 'number' | ||
? (isArrayLike(object) && isIndex(index, object.length)) | ||
: (type == 'string' && index in object)) { | ||
return eq(object[index], value); | ||
} | ||
return false; | ||
} | ||
/** | ||
* Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) | ||
* comparison between two values to determine if they are equivalent. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to compare. | ||
* @param {*} other The other value to compare. | ||
* @returns {boolean} Returns `true` if the values are equivalent, else `false`. | ||
* @example | ||
* | ||
* var object = { 'user': 'fred' }; | ||
* var other = { 'user': 'fred' }; | ||
* | ||
* _.eq(object, object); | ||
* // => true | ||
* | ||
* _.eq(object, other); | ||
* // => false | ||
* | ||
* _.eq('a', 'a'); | ||
* // => true | ||
* | ||
* _.eq('a', Object('a')); | ||
* // => false | ||
* | ||
* _.eq(NaN, NaN); | ||
* // => true | ||
*/ | ||
function eq(value, other) { | ||
return value === other || (value !== value && other !== other); | ||
} | ||
/** | ||
* Checks if `value` is likely an `arguments` object. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | ||
* @example | ||
* | ||
* _.isArguments(function() { return arguments; }()); | ||
* // => true | ||
* | ||
* _.isArguments([1, 2, 3]); | ||
* // => false | ||
*/ | ||
function isArguments(value) { | ||
// Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode. | ||
return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && | ||
(!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); | ||
} | ||
/** | ||
* Checks if `value` is classified as an `Array` object. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @type Function | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | ||
* @example | ||
* | ||
* _.isArray([1, 2, 3]); | ||
* // => true | ||
* | ||
* _.isArray(document.body.children); | ||
* // => false | ||
* | ||
* _.isArray('abc'); | ||
* // => false | ||
* | ||
* _.isArray(_.noop); | ||
* // => false | ||
*/ | ||
var isArray = Array.isArray; | ||
/** | ||
* Checks if `value` is array-like. A value is considered array-like if it's | ||
* not a function and has a `value.length` that's an integer greater than or | ||
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @type Function | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is array-like, else `false`. | ||
* @example | ||
* | ||
* _.isArrayLike([1, 2, 3]); | ||
* // => true | ||
* | ||
* _.isArrayLike(document.body.children); | ||
* // => true | ||
* | ||
* _.isArrayLike('abc'); | ||
* // => true | ||
* | ||
* _.isArrayLike(_.noop); | ||
* // => false | ||
*/ | ||
function isArrayLike(value) { | ||
return value != null && isLength(getLength(value)); | ||
return value != null && | ||
!(typeof value == 'function' && isFunction(value)) && isLength(getLength(value)); | ||
} | ||
/** | ||
* This method is like `_.isArrayLike` except that it also checks if `value` | ||
* is an object. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @type Function | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is an array-like object, else `false`. | ||
* @example | ||
* | ||
* _.isArrayLikeObject([1, 2, 3]); | ||
* // => true | ||
* | ||
* _.isArrayLikeObject(document.body.children); | ||
* // => true | ||
* | ||
* _.isArrayLikeObject('abc'); | ||
* // => false | ||
* | ||
* _.isArrayLikeObject(_.noop); | ||
* // => false | ||
*/ | ||
function isArrayLikeObject(value) { | ||
return isObjectLike(value) && isArrayLike(value); | ||
} | ||
/** | ||
* Checks if `value` is classified as a `Function` object. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | ||
* @example | ||
* | ||
* _.isFunction(_); | ||
* // => true | ||
* | ||
* _.isFunction(/abc/); | ||
* // => false | ||
*/ | ||
function isFunction(value) { | ||
// The use of `Object#toString` avoids issues with the `typeof` operator | ||
// in Safari 8 which returns 'object' for typed array constructors, and | ||
// PhantomJS 1.9 which returns 'function' for `NodeList` instances. | ||
var tag = isObject(value) ? objectToString.call(value) : ''; | ||
return tag == funcTag || tag == genTag; | ||
} | ||
/** | ||
* Checks if `value` is a valid array-like length. | ||
* | ||
* **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). | ||
* **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). | ||
* | ||
* @private | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`. | ||
* @example | ||
* | ||
* _.isLength(3); | ||
* // => true | ||
* | ||
* _.isLength(Number.MIN_VALUE); | ||
* // => false | ||
* | ||
* _.isLength(Infinity); | ||
* // => false | ||
* | ||
* _.isLength('3'); | ||
* // => false | ||
*/ | ||
@@ -210,3 +1042,6 @@ function isLength(value) { | ||
* | ||
* _.isObject(1); | ||
* _.isObject(_.noop); | ||
* // => true | ||
* | ||
* _.isObject(null); | ||
* // => false | ||
@@ -222,17 +1057,117 @@ */ | ||
/** | ||
* Recursively merges own enumerable properties of the source object(s), that | ||
* don't resolve to `undefined` into the destination object. Subsequent sources | ||
* overwrite property assignments of previous sources. If `customizer` is | ||
* provided it is invoked to produce the merged values of the destination and | ||
* source properties. If `customizer` returns `undefined` merging is handled | ||
* by the method instead. The `customizer` is bound to `thisArg` and invoked | ||
* with five arguments: (objectValue, sourceValue, key, object, source). | ||
* Checks if `value` is object-like. A value is object-like if it's not `null` | ||
* and has a `typeof` result of "object". | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is object-like, else `false`. | ||
* @example | ||
* | ||
* _.isObjectLike({}); | ||
* // => true | ||
* | ||
* _.isObjectLike([1, 2, 3]); | ||
* // => true | ||
* | ||
* _.isObjectLike(_.noop); | ||
* // => false | ||
* | ||
* _.isObjectLike(null); | ||
* // => false | ||
*/ | ||
function isObjectLike(value) { | ||
return !!value && typeof value == 'object'; | ||
} | ||
/** | ||
* Checks if `value` is a native function. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is a native function, else `false`. | ||
* @example | ||
* | ||
* _.isNative(Array.prototype.push); | ||
* // => true | ||
* | ||
* _.isNative(_); | ||
* // => false | ||
*/ | ||
function isNative(value) { | ||
if (value == null) { | ||
return false; | ||
} | ||
if (isFunction(value)) { | ||
return reIsNative.test(funcToString.call(value)); | ||
} | ||
return isObjectLike(value) && | ||
(isHostObject(value) ? reIsNative : reIsHostCtor).test(value); | ||
} | ||
/** | ||
* Checks if `value` is classified as a typed array. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. | ||
* @example | ||
* | ||
* _.isTypedArray(new Uint8Array); | ||
* // => true | ||
* | ||
* _.isTypedArray([]); | ||
* // => false | ||
*/ | ||
function isTypedArray(value) { | ||
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; | ||
} | ||
/** | ||
* Converts `value` to a plain object flattening inherited enumerable | ||
* properties of `value` to own properties of the plain object. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Lang | ||
* @param {*} value The value to convert. | ||
* @returns {Object} Returns the converted plain object. | ||
* @example | ||
* | ||
* function Foo() { | ||
* this.b = 2; | ||
* } | ||
* | ||
* Foo.prototype.c = 3; | ||
* | ||
* _.assign({ 'a': 1 }, new Foo); | ||
* // => { 'a': 1, 'b': 2 } | ||
* | ||
* _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); | ||
* // => { 'a': 1, 'b': 2, 'c': 3 } | ||
*/ | ||
function toPlainObject(value) { | ||
return copyObject(value, keysIn(value)); | ||
} | ||
/** | ||
* Recursively merges own and inherited enumerable properties of source | ||
* objects into the destination object, skipping source properties that resolve | ||
* to `undefined`. Array and plain object properties are merged recursively. | ||
* Other objects and value types are overridden by assignment. Source objects | ||
* are applied from left to right. Subsequent sources overwrite property | ||
* assignments of previous sources. | ||
* | ||
* **Note:** This method mutates `object`. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @category Object | ||
* @param {Object} object The destination object. | ||
* @param {...Object} [sources] The source objects. | ||
* @param {Function} [customizer] The function to customize assigned values. | ||
* @param {*} [thisArg] The `this` binding of `customizer`. | ||
* @returns {Object} Returns `object`. | ||
@@ -251,23 +1186,7 @@ * @example | ||
* // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] } | ||
* | ||
* // using a customizer callback | ||
* var object = { | ||
* 'fruits': ['apple'], | ||
* 'vegetables': ['beet'] | ||
* }; | ||
* | ||
* var other = { | ||
* 'fruits': ['banana'], | ||
* 'vegetables': ['carrot'] | ||
* }; | ||
* | ||
* _.merge(object, other, function(a, b) { | ||
* if (_.isArray(a)) { | ||
* return a.concat(b); | ||
* } | ||
* }); | ||
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] } | ||
*/ | ||
var merge = createAssigner(baseMerge); | ||
var merge = createAssigner(function(object, source) { | ||
baseMerge(object, source); | ||
}); | ||
module.exports = merge; |
{ | ||
"name": "lodash.merge", | ||
"version": "3.3.2", | ||
"description": "The modern build of lodash’s `_.merge` as a module.", | ||
"version": "4.0.0", | ||
"description": "The lodash method `_.merge` exported as a module.", | ||
"homepage": "https://lodash.com/", | ||
"icon": "https://lodash.com/icon.svg", | ||
"license": "MIT", | ||
"keywords": "lodash, lodash-modularized, stdlib, util", | ||
"keywords": "lodash, lodash-modularized, stdlib, util, merge", | ||
"author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)", | ||
"contributors": [ | ||
"John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)", | ||
"Benjamin Tan <demoneaux@gmail.com> (https://d10.github.io/)", | ||
"Blaine Bublitz <blaine@iceddev.com> (http://www.iceddev.com/)", | ||
"Kit Cambridge <github@kitcambridge.be> (http://kitcambridge.be/)", | ||
"Blaine Bublitz <blaine@iceddev.com> (https://github.com/phated)", | ||
"Mathias Bynens <mathias@qiwi.be> (https://mathiasbynens.be/)" | ||
@@ -20,14 +18,10 @@ ], | ||
"dependencies": { | ||
"lodash._arraycopy": "^3.0.0", | ||
"lodash._arrayeach": "^3.0.0", | ||
"lodash._createassigner": "^3.0.0", | ||
"lodash._getnative": "^3.0.0", | ||
"lodash.isarguments": "^3.0.0", | ||
"lodash.isarray": "^3.0.0", | ||
"lodash.isplainobject": "^3.0.0", | ||
"lodash.istypedarray": "^3.0.0", | ||
"lodash.keys": "^3.0.0", | ||
"lodash.keysin": "^3.0.0", | ||
"lodash.toplainobject": "^3.0.0" | ||
"lodash._basefor": "^3.0.0", | ||
"lodash._stack": "^3.0.0", | ||
"lodash.isplainobject": "^4.0.0", | ||
"lodash.keys": "^4.0.0", | ||
"lodash.keysin": "^4.0.0", | ||
"lodash.rest": "^4.0.0" | ||
} | ||
} |
@@ -1,4 +0,4 @@ | ||
# lodash.merge v3.3.2 | ||
# lodash.merge v4.0.0 | ||
The [modern build](https://github.com/lodash/lodash/wiki/Build-Differences) of [lodash’s](https://lodash.com/) `_.merge` exported as a [Node.js](http://nodejs.org/)/[io.js](https://iojs.org/) module. | ||
The [lodash](https://lodash.com/) method `_.merge` exported as a [Node.js](https://nodejs.org/) module. | ||
@@ -8,3 +8,2 @@ ## Installation | ||
Using npm: | ||
```bash | ||
@@ -15,4 +14,3 @@ $ {sudo -H} npm i -g npm | ||
In Node.js/io.js: | ||
In Node.js: | ||
```js | ||
@@ -22,2 +20,2 @@ var merge = require('lodash.merge'); | ||
See the [documentation](https://lodash.com/docs#merge) or [package source](https://github.com/lodash/lodash/blob/3.3.2-npm-packages/lodash.merge) for more details. | ||
See the [documentation](https://lodash.com/docs#merge) or [package source](https://github.com/lodash/lodash/blob/4.0.0-npm-packages/lodash.merge) for more details. |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
35863
7
1092
19
1
+ Addedlodash._basefor@^3.0.0
+ Addedlodash._stack@^3.0.0
+ Addedlodash.rest@^4.0.0
+ Addedlodash.isplainobject@4.0.6(transitive)
+ Addedlodash.keys@4.2.0(transitive)
+ Addedlodash.keysin@4.2.0(transitive)
+ Addedlodash.rest@4.0.5(transitive)
- Removedlodash._arraycopy@^3.0.0
- Removedlodash._createassigner@^3.0.0
- Removedlodash._getnative@^3.0.0
- Removedlodash.isarguments@^3.0.0
- Removedlodash.isarray@^3.0.0
- Removedlodash.istypedarray@^3.0.0
- Removedlodash.toplainobject@^3.0.0
- Removedlodash._arraycopy@3.0.0(transitive)
- Removedlodash._basecopy@3.0.1(transitive)
- Removedlodash._bindcallback@3.0.1(transitive)
- Removedlodash._createassigner@3.1.1(transitive)
- Removedlodash._getnative@3.9.1(transitive)
- Removedlodash._isiterateecall@3.0.9(transitive)
- Removedlodash.isarguments@3.1.0(transitive)
- Removedlodash.isarray@3.0.4(transitive)
- Removedlodash.isplainobject@3.2.0(transitive)
- Removedlodash.istypedarray@3.0.6(transitive)
- Removedlodash.keys@3.1.2(transitive)
- Removedlodash.keysin@3.0.8(transitive)
- Removedlodash.restparam@3.6.1(transitive)
- Removedlodash.toplainobject@3.0.0(transitive)
Updatedlodash.isplainobject@^4.0.0
Updatedlodash.keys@^4.0.0
Updatedlodash.keysin@^4.0.0