diff --git a/README.md b/README.md index c92622899..71c898e9a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# lodash-amd v4.16.6 +# lodash-amd v4.17.0 The [Lodash](https://lodash.com/) library exported as [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules. @@ -27,4 +27,4 @@ require({ }); ``` -See the [package source](https://github.com/lodash/lodash/tree/4.16.6-amd) for more details. +See the [package source](https://github.com/lodash/lodash/tree/4.17.0-amd) for more details. diff --git a/_baseAssignIn.js b/_baseAssignIn.js new file mode 100644 index 000000000..386b8b083 --- /dev/null +++ b/_baseAssignIn.js @@ -0,0 +1,17 @@ +define(['./_copyObject', './keysIn'], function(copyObject, keysIn) { + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + return baseAssignIn; +}); diff --git a/_baseAt.js b/_baseAt.js index 0bd0c270b..77b04d756 100644 --- a/_baseAt.js +++ b/_baseAt.js @@ -8,7 +8,7 @@ define(['./get'], function(get) { * * @private * @param {Object} object The object to iterate over. - * @param {string[]} paths The property paths of elements to pick. + * @param {string[]} paths The property paths to pick. * @returns {Array} Returns the picked elements. */ function baseAt(object, paths) { diff --git a/_baseClone.js b/_baseClone.js index e1cc0c3b1..e3f39950a 100644 --- a/_baseClone.js +++ b/_baseClone.js @@ -1,8 +1,13 @@ -define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_cloneBuffer', './_copyArray', './_copySymbols', './_getAllKeys', './_getTag', './_initCloneArray', './_initCloneByTag', './_initCloneObject', './isArray', './isBuffer', './isObject', './keys'], function(Stack, arrayEach, assignValue, baseAssign, cloneBuffer, copyArray, copySymbols, getAllKeys, getTag, initCloneArray, initCloneByTag, initCloneObject, isArray, isBuffer, isObject, keys) { +define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_baseAssignIn', './_cloneBuffer', './_copyArray', './_copySymbols', './_copySymbolsIn', './_getAllKeys', './_getAllKeysIn', './_getTag', './_initCloneArray', './_initCloneByTag', './_initCloneObject', './isArray', './isBuffer', './isObject', './keys'], function(Stack, arrayEach, assignValue, baseAssign, baseAssignIn, cloneBuffer, copyArray, copySymbols, copySymbolsIn, getAllKeys, getAllKeysIn, getTag, initCloneArray, initCloneByTag, initCloneObject, isArray, isBuffer, isObject, keys) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', @@ -54,16 +59,22 @@ define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_clone * * @private * @param {*} value The value to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @param {boolean} [isFull] Specify a clone including symbols. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols * @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, isFull, customizer, key, object, stack) { - var result; + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + if (customizer) { result = object ? customizer(value, key, object, stack) : customizer(value); } @@ -87,9 +98,11 @@ define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_clone return cloneBuffer(value, isDeep); } if (tag == objectTag || tag == argsTag || (isFunc && !object)) { - result = initCloneObject(isFunc ? {} : value); + result = (isFlat || isFunc) ? {} : initCloneObject(value); if (!isDeep) { - return copySymbols(value, baseAssign(result, value)); + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); } } else { if (!cloneableTags[tag]) { @@ -106,14 +119,18 @@ define(['./_Stack', './_arrayEach', './_assignValue', './_baseAssign', './_clone } stack.set(value, result); - var props = isArr ? undefined : (isFull ? getAllKeys : keys)(value); + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); arrayEach(props || value, function(subValue, key) { if (props) { key = subValue; subValue = value[key]; } // Recursively populate clone (susceptible to call stack limits). - assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack)); + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); }); return result; } diff --git a/_baseIsEqual.js b/_baseIsEqual.js index 6cdbf701c..51a34a2ca 100644 --- a/_baseIsEqual.js +++ b/_baseIsEqual.js @@ -7,22 +7,21 @@ define(['./_baseIsEqualDeep', './isObject', './isObjectLike'], function(baseIsEq * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. - * @param {boolean} [bitmask] The bitmask of comparison flags. - * The bitmask may be composed of the following flags: - * 1 - Unordered comparison - * 2 - Partial comparison * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ - function baseIsEqual(value, other, customizer, bitmask, stack) { + function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { return value !== value && other !== other; } - return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } return baseIsEqual; diff --git a/_baseIsEqualDeep.js b/_baseIsEqualDeep.js index e6ae0bed4..bfa76075d 100644 --- a/_baseIsEqualDeep.js +++ b/_baseIsEqualDeep.js @@ -1,7 +1,7 @@ define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_getTag', './isArray', './isBuffer', './isTypedArray'], function(Stack, equalArrays, equalByTag, equalObjects, getTag, isArray, isBuffer, isTypedArray) { - /** Used to compose bitmasks for comparison styles. */ - var PARTIAL_COMPARE_FLAG = 2; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', @@ -22,14 +22,13 @@ define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_ge * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Function} [customizer] The function to customize comparisons. - * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` - * for more details. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ - function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = arrayTag, @@ -57,10 +56,10 @@ define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_ge if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) - ? equalArrays(object, other, equalFunc, customizer, bitmask, stack) - : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack); + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } - if (!(bitmask & PARTIAL_COMPARE_FLAG)) { + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); @@ -69,14 +68,14 @@ define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_ge othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack); - return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) { return false; } stack || (stack = new Stack); - return equalObjects(object, other, equalFunc, customizer, bitmask, stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } return baseIsEqualDeep; diff --git a/_baseIsMatch.js b/_baseIsMatch.js index 3f559d973..8443f100e 100644 --- a/_baseIsMatch.js +++ b/_baseIsMatch.js @@ -3,9 +3,9 @@ define(['./_Stack', './_baseIsEqual'], function(Stack, baseIsEqual) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; - /** Used to compose bitmasks for comparison styles. */ - var UNORDERED_COMPARE_FLAG = 1, - PARTIAL_COMPARE_FLAG = 2; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.isMatch` without support for iteratee shorthands. @@ -51,7 +51,7 @@ define(['./_Stack', './_baseIsEqual'], function(Stack, baseIsEqual) { var result = customizer(objValue, srcValue, key, object, source, stack); } if (!(result === undefined - ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result )) { return false; diff --git a/_baseMatchesProperty.js b/_baseMatchesProperty.js index af9de12e5..b52b02df8 100644 --- a/_baseMatchesProperty.js +++ b/_baseMatchesProperty.js @@ -3,9 +3,9 @@ define(['./_baseIsEqual', './get', './hasIn', './_isKey', './_isStrictComparable /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; - /** Used to compose bitmasks for comparison styles. */ - var UNORDERED_COMPARE_FLAG = 1, - PARTIAL_COMPARE_FLAG = 2; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. @@ -23,7 +23,7 @@ define(['./_baseIsEqual', './get', './hasIn', './_isKey', './_isStrictComparable var objValue = get(object, path); return (objValue === undefined && objValue === srcValue) ? hasIn(object, path) - : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG); + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); }; } diff --git a/_basePick.js b/_basePick.js index 705e10709..f2946a09f 100644 --- a/_basePick.js +++ b/_basePick.js @@ -1,4 +1,4 @@ -define(['./_basePickBy'], function(basePickBy) { +define(['./_basePickBy', './hasIn'], function(basePickBy, hasIn) { /** * The base implementation of `_.pick` without support for individual @@ -6,13 +6,13 @@ define(['./_basePickBy'], function(basePickBy) { * * @private * @param {Object} object The source object. - * @param {string[]} props The property identifiers to pick. + * @param {string[]} paths The property paths to pick. * @returns {Object} Returns the new object. */ - function basePick(object, props) { + function basePick(object, paths) { object = Object(object); - return basePickBy(object, props, function(value, key) { - return key in object; + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); }); } diff --git a/_basePickBy.js b/_basePickBy.js index 9072e2b06..e48d1abef 100644 --- a/_basePickBy.js +++ b/_basePickBy.js @@ -1,25 +1,25 @@ -define(['./_baseAssignValue'], function(baseAssignValue) { +define(['./_baseGet', './_baseSet'], function(baseGet, baseSet) { /** * The base implementation of `_.pickBy` without support for iteratee shorthands. * * @private * @param {Object} object The source object. - * @param {string[]} props The property identifiers to pick from. + * @param {string[]} paths The property paths to pick. * @param {Function} predicate The function invoked per property. * @returns {Object} Returns the new object. */ - function basePickBy(object, props, predicate) { + function basePickBy(object, paths, predicate) { var index = -1, - length = props.length, + length = paths.length, result = {}; while (++index < length) { - var key = props[index], - value = object[key]; + var path = paths[index], + value = baseGet(object, path); - if (predicate(value, key)) { - baseAssignValue(result, key, value); + if (predicate(value, path)) { + baseSet(result, path, value); } } return result; diff --git a/_baseUnset.js b/_baseUnset.js index 8899ef343..d39a37e22 100644 --- a/_baseUnset.js +++ b/_baseUnset.js @@ -11,7 +11,7 @@ define(['./_castPath', './_isKey', './last', './_parent', './_toKey'], function( * * @private * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to unset. + * @param {Array|string} path The property path to unset. * @returns {boolean} Returns `true` if the property is deleted, else `false`. */ function baseUnset(object, path) { diff --git a/_cloneMap.js b/_cloneMap.js index 0a258709b..d49b83b2e 100644 --- a/_cloneMap.js +++ b/_cloneMap.js @@ -1,5 +1,8 @@ define(['./_addMapEntry', './_arrayReduce', './_mapToArray'], function(addMapEntry, arrayReduce, mapToArray) { + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + /** * Creates a clone of `map`. * @@ -10,7 +13,7 @@ define(['./_addMapEntry', './_arrayReduce', './_mapToArray'], function(addMapEnt * @returns {Object} Returns the cloned map. */ function cloneMap(map, isDeep, cloneFunc) { - var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map); + var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map); return arrayReduce(array, addMapEntry, new map.constructor); } diff --git a/_cloneSet.js b/_cloneSet.js index f87c6788e..bf2f18037 100644 --- a/_cloneSet.js +++ b/_cloneSet.js @@ -1,5 +1,8 @@ define(['./_addSetEntry', './_arrayReduce', './_setToArray'], function(addSetEntry, arrayReduce, setToArray) { + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + /** * Creates a clone of `set`. * @@ -10,7 +13,7 @@ define(['./_addSetEntry', './_arrayReduce', './_setToArray'], function(addSetEnt * @returns {Object} Returns the cloned set. */ function cloneSet(set, isDeep, cloneFunc) { - var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set); + var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set); return arrayReduce(array, addSetEntry, new set.constructor); } diff --git a/_copySymbols.js b/_copySymbols.js index 1b87b0660..fe0909e37 100644 --- a/_copySymbols.js +++ b/_copySymbols.js @@ -1,7 +1,7 @@ define(['./_copyObject', './_getSymbols'], function(copyObject, getSymbols) { /** - * Copies own symbol properties of `source` to `object`. + * Copies own symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. diff --git a/_copySymbolsIn.js b/_copySymbolsIn.js new file mode 100644 index 000000000..5cf5c9110 --- /dev/null +++ b/_copySymbolsIn.js @@ -0,0 +1,16 @@ +define(['./_copyObject', './_getSymbolsIn'], function(copyObject, getSymbolsIn) { + + /** + * Copies own and inherited symbols 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 copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + return copySymbolsIn; +}); diff --git a/_createBind.js b/_createBind.js index 7b89d84ee..e93ee8840 100644 --- a/_createBind.js +++ b/_createBind.js @@ -1,7 +1,7 @@ define(['./_createCtor', './_root'], function(createCtor, root) { /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1; + var WRAP_BIND_FLAG = 1; /** * Creates a function that wraps `func` to invoke it with the optional `this` @@ -14,7 +14,7 @@ define(['./_createCtor', './_root'], function(createCtor, root) { * @returns {Function} Returns the new wrapped function. */ function createBind(func, bitmask, thisArg) { - var isBind = bitmask & BIND_FLAG, + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); function wrapper() { diff --git a/_createFlow.js b/_createFlow.js index 8ff1b6be7..d400f6768 100644 --- a/_createFlow.js +++ b/_createFlow.js @@ -10,10 +10,10 @@ define(['./_LodashWrapper', './_flatRest', './_getData', './_getFuncName', './is var FUNC_ERROR_TEXT = 'Expected a function'; /** Used to compose bitmasks for function metadata. */ - var CURRY_FLAG = 8, - PARTIAL_FLAG = 32, - ARY_FLAG = 128, - REARG_FLAG = 256; + var WRAP_CURRY_FLAG = 8, + WRAP_PARTIAL_FLAG = 32, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256; /** * Creates a `_.flow` or `_.flowRight` function. @@ -48,7 +48,7 @@ define(['./_LodashWrapper', './_flatRest', './_getData', './_getFuncName', './is data = funcName == 'wrapper' ? getData(func) : undefined; if (data && isLaziable(data[0]) && - data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1 ) { wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); diff --git a/_createHybrid.js b/_createHybrid.js index 8e9c24d05..d8ec75880 100644 --- a/_createHybrid.js +++ b/_createHybrid.js @@ -4,12 +4,12 @@ define(['./_composeArgs', './_composeArgsRight', './_countHolders', './_createCt var undefined; /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_FLAG = 8, - CURRY_RIGHT_FLAG = 16, - ARY_FLAG = 128, - FLIP_FLAG = 512; + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_ARY_FLAG = 128, + WRAP_FLIP_FLAG = 512; /** * Creates a function that wraps `func` to invoke it with optional `this` @@ -31,11 +31,11 @@ define(['./_composeArgs', './_composeArgsRight', './_countHolders', './_createCt * @returns {Function} Returns the new wrapped function. */ function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { - var isAry = bitmask & ARY_FLAG, - isBind = bitmask & BIND_FLAG, - isBindKey = bitmask & BIND_KEY_FLAG, - isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG), - isFlip = bitmask & FLIP_FLAG, + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined : createCtor(func); function wrapper() { diff --git a/_createPartial.js b/_createPartial.js index b42c70c15..fa3a0886b 100644 --- a/_createPartial.js +++ b/_createPartial.js @@ -1,7 +1,7 @@ define(['./_apply', './_createCtor', './_root'], function(apply, createCtor, root) { /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1; + var WRAP_BIND_FLAG = 1; /** * Creates a function that wraps `func` to invoke it with the `this` binding @@ -16,7 +16,7 @@ define(['./_apply', './_createCtor', './_root'], function(apply, createCtor, roo * @returns {Function} Returns the new wrapped function. */ function createPartial(func, bitmask, thisArg, partials) { - var isBind = bitmask & BIND_FLAG, + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); function wrapper() { diff --git a/_createRecurry.js b/_createRecurry.js index 65eef4187..c4f4509e9 100644 --- a/_createRecurry.js +++ b/_createRecurry.js @@ -4,12 +4,12 @@ define(['./_isLaziable', './_setData', './_setWrapToString'], function(isLaziabl var undefined; /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_BOUND_FLAG = 4, - CURRY_FLAG = 8, - PARTIAL_FLAG = 32, - PARTIAL_RIGHT_FLAG = 64; + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64; /** * Creates a function that wraps `func` to continue currying. @@ -29,17 +29,17 @@ define(['./_isLaziable', './_setData', './_setWrapToString'], function(isLaziabl * @returns {Function} Returns the new wrapped function. */ function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { - var isCurry = bitmask & CURRY_FLAG, + var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined, newHoldersRight = isCurry ? undefined : holders, newPartials = isCurry ? partials : undefined, newPartialsRight = isCurry ? undefined : partials; - bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); - bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); - if (!(bitmask & CURRY_BOUND_FLAG)) { - bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); } var newData = [ func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, diff --git a/_createWrap.js b/_createWrap.js index 4282340b5..38cbe4cc5 100644 --- a/_createWrap.js +++ b/_createWrap.js @@ -7,12 +7,12 @@ define(['./_baseSetData', './_createBind', './_createCurry', './_createHybrid', var FUNC_ERROR_TEXT = 'Expected a function'; /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_FLAG = 8, - CURRY_RIGHT_FLAG = 16, - PARTIAL_FLAG = 32, - PARTIAL_RIGHT_FLAG = 64; + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeMax = Math.max; @@ -24,17 +24,16 @@ define(['./_baseSetData', './_createBind', './_createCurry', './_createHybrid', * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask flags. - * The bitmask may be composed of the following flags: - * 1 - `_.bind` - * 2 - `_.bindKey` - * 4 - `_.curry` or `_.curryRight` of a bound function - * 8 - `_.curry` - * 16 - `_.curryRight` - * 32 - `_.partial` - * 64 - `_.partialRight` - * 128 - `_.rearg` - * 256 - `_.ary` - * 512 - `_.flip` + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to be partially applied. * @param {Array} [holders] The `partials` placeholder indexes. @@ -44,20 +43,20 @@ define(['./_baseSetData', './_createBind', './_createCurry', './_createHybrid', * @returns {Function} Returns the new wrapped function. */ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { - var isBindKey = bitmask & BIND_KEY_FLAG; + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; if (!isBindKey && typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } var length = partials ? partials.length : 0; if (!length) { - bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); partials = holders = undefined; } ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); arity = arity === undefined ? arity : toInteger(arity); length -= holders ? holders.length : 0; - if (bitmask & PARTIAL_RIGHT_FLAG) { + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { var partialsRight = partials, holdersRight = holders; @@ -82,14 +81,14 @@ define(['./_baseSetData', './_createBind', './_createCurry', './_createHybrid', ? (isBindKey ? 0 : func.length) : nativeMax(newData[9] - length, 0); - if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) { - bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG); + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); } - if (!bitmask || bitmask == BIND_FLAG) { + if (!bitmask || bitmask == WRAP_BIND_FLAG) { var result = createBind(func, bitmask, thisArg); - } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) { + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { result = createCurry(func, bitmask, arity); - } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) { + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { result = createPartial(func, bitmask, thisArg, partials); } else { result = createHybrid.apply(undefined, newData); diff --git a/_equalArrays.js b/_equalArrays.js index 5bfcd381b..383df5d1c 100644 --- a/_equalArrays.js +++ b/_equalArrays.js @@ -3,9 +3,9 @@ define(['./_SetCache', './_arraySome', './_cacheHas'], function(SetCache, arrayS /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; - /** Used to compose bitmasks for comparison styles. */ - var UNORDERED_COMPARE_FLAG = 1, - PARTIAL_COMPARE_FLAG = 2; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; /** * A specialized version of `baseIsEqualDeep` for arrays with support for @@ -14,15 +14,14 @@ define(['./_SetCache', './_arraySome', './_cacheHas'], function(SetCache, arrayS * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. - * @param {Function} equalFunc The function to determine equivalents of values. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. - * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` - * for more details. + * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ - function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { - var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; @@ -36,7 +35,7 @@ define(['./_SetCache', './_arraySome', './_cacheHas'], function(SetCache, arrayS } var index = -1, result = true, - seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined; + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; stack.set(array, other); stack.set(other, array); @@ -62,7 +61,7 @@ define(['./_SetCache', './_arraySome', './_cacheHas'], function(SetCache, arrayS if (seen) { if (!arraySome(other, function(othValue, othIndex) { if (!cacheHas(seen, othIndex) && - (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { return seen.push(othIndex); } })) { @@ -71,7 +70,7 @@ define(['./_SetCache', './_arraySome', './_cacheHas'], function(SetCache, arrayS } } else if (!( arrValue === othValue || - equalFunc(arrValue, othValue, customizer, bitmask, stack) + equalFunc(arrValue, othValue, bitmask, customizer, stack) )) { result = false; break; diff --git a/_equalByTag.js b/_equalByTag.js index 51df7a919..98f7da124 100644 --- a/_equalByTag.js +++ b/_equalByTag.js @@ -3,9 +3,9 @@ define(['./_Symbol', './_Uint8Array', './eq', './_equalArrays', './_mapToArray', /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; - /** Used to compose bitmasks for comparison styles. */ - var UNORDERED_COMPARE_FLAG = 1, - PARTIAL_COMPARE_FLAG = 2; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; /** `Object#toString` result references. */ var boolTag = '[object Boolean]', @@ -36,14 +36,13 @@ define(['./_Symbol', './_Uint8Array', './eq', './_equalArrays', './_mapToArray', * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. - * @param {Function} equalFunc The function to determine equivalents of values. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. - * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` - * for more details. + * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ - function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { case dataViewTag: if ((object.byteLength != other.byteLength) || @@ -81,7 +80,7 @@ define(['./_Symbol', './_Uint8Array', './eq', './_equalArrays', './_mapToArray', var convert = mapToArray; case setTag: - var isPartial = bitmask & PARTIAL_COMPARE_FLAG; + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; convert || (convert = setToArray); if (object.size != other.size && !isPartial) { @@ -92,11 +91,11 @@ define(['./_Symbol', './_Uint8Array', './eq', './_equalArrays', './_mapToArray', if (stacked) { return stacked == other; } - bitmask |= UNORDERED_COMPARE_FLAG; + bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). stack.set(object, other); - var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack['delete'](object); return result; diff --git a/_equalObjects.js b/_equalObjects.js index df4cc37b5..ec7bd4d16 100644 --- a/_equalObjects.js +++ b/_equalObjects.js @@ -3,8 +3,8 @@ define(['./keys'], function(keys) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; - /** Used to compose bitmasks for comparison styles. */ - var PARTIAL_COMPARE_FLAG = 2; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1; /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -19,15 +19,14 @@ define(['./keys'], function(keys) { * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. - * @param {Function} equalFunc The function to determine equivalents of values. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. - * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` - * for more details. + * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ - function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { - var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = keys(object), objLength = objProps.length, othProps = keys(other), @@ -65,7 +64,7 @@ define(['./keys'], function(keys) { } // Recursively compare objects (susceptible to call stack limits). if (!(compared === undefined - ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)) + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) : compared )) { result = false; diff --git a/_getSymbols.js b/_getSymbols.js index abdb4b185..50a9e4fce 100644 --- a/_getSymbols.js +++ b/_getSymbols.js @@ -4,7 +4,7 @@ define(['./_overArg', './stubArray'], function(overArg, stubArray) { var nativeGetSymbols = Object.getOwnPropertySymbols; /** - * Creates an array of the own enumerable symbol properties of `object`. + * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. diff --git a/_getSymbolsIn.js b/_getSymbolsIn.js index f7f9cb270..a0ffda697 100644 --- a/_getSymbolsIn.js +++ b/_getSymbolsIn.js @@ -4,8 +4,7 @@ define(['./_arrayPush', './_getPrototype', './_getSymbols', './stubArray'], func var nativeGetSymbols = Object.getOwnPropertySymbols; /** - * Creates an array of the own and inherited enumerable symbol properties - * of `object`. + * Creates an array of the own and inherited enumerable symbols of `object`. * * @private * @param {Object} object The object to query. diff --git a/_hasUnicode.js b/_hasUnicode.js index ce9d5c0e8..0e2901dab 100644 --- a/_hasUnicode.js +++ b/_hasUnicode.js @@ -2,15 +2,17 @@ define([], function() { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', - rsComboSymbolsRange = '\\u20d0-\\u20f0', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsZWJ = '\\u200d'; /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ - var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']'); + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); /** * Checks if `string` contains Unicode symbols. diff --git a/_mergeData.js b/_mergeData.js index ba1aed3ae..5431c52b9 100644 --- a/_mergeData.js +++ b/_mergeData.js @@ -4,12 +4,12 @@ define(['./_composeArgs', './_composeArgsRight', './_replaceHolders'], function( var PLACEHOLDER = '__lodash_placeholder__'; /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_BOUND_FLAG = 4, - CURRY_FLAG = 8, - ARY_FLAG = 128, - REARG_FLAG = 256; + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeMin = Math.min; @@ -34,22 +34,22 @@ define(['./_composeArgs', './_composeArgsRight', './_replaceHolders'], function( var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, - isCommon = newBitmask < (BIND_FLAG | BIND_KEY_FLAG | ARY_FLAG); + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); var isCombo = - ((srcBitmask == ARY_FLAG) && (bitmask == CURRY_FLAG)) || - ((srcBitmask == ARY_FLAG) && (bitmask == REARG_FLAG) && (data[7].length <= source[8])) || - ((srcBitmask == (ARY_FLAG | REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == CURRY_FLAG)); + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); // Exit early if metadata can't be merged. if (!(isCommon || isCombo)) { return data; } // Use source `thisArg` if available. - if (srcBitmask & BIND_FLAG) { + if (srcBitmask & WRAP_BIND_FLAG) { data[2] = source[2]; // Set when currying a bound function. - newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG; + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; } // Compose partial arguments. var value = source[3]; @@ -71,7 +71,7 @@ define(['./_composeArgs', './_composeArgsRight', './_replaceHolders'], function( data[7] = value; } // Use source `ary` if it's smaller. - if (srcBitmask & ARY_FLAG) { + if (srcBitmask & WRAP_ARY_FLAG) { data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); } // Use source `arity` if one is not provided. diff --git a/_nodeUtil.js b/_nodeUtil.js index 8e1cb7aa4..e8e7e9ab3 100644 --- a/_nodeUtil.js +++ b/_nodeUtil.js @@ -15,7 +15,7 @@ define(['./_freeGlobal'], function(freeGlobal) { /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { - return freeProcess && freeProcess.binding('util'); + return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); diff --git a/_unicodeSize.js b/_unicodeSize.js index 166d412b8..a1f8822df 100644 --- a/_unicodeSize.js +++ b/_unicodeSize.js @@ -2,13 +2,15 @@ define([], function() { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', - rsComboSymbolsRange = '\\u20d0-\\u20f0', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsAstral = '[' + rsAstralRange + ']', - rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']', + rsCombo = '[' + rsComboRange + ']', rsFitz = '\\ud83c[\\udffb-\\udfff]', rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', rsNonAstral = '[^' + rsAstralRange + ']', diff --git a/_unicodeToArray.js b/_unicodeToArray.js index 1ab668d5b..58590d2d6 100644 --- a/_unicodeToArray.js +++ b/_unicodeToArray.js @@ -2,13 +2,15 @@ define([], function() { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', - rsComboSymbolsRange = '\\u20d0-\\u20f0', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsAstral = '[' + rsAstralRange + ']', - rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']', + rsCombo = '[' + rsComboRange + ']', rsFitz = '\\ud83c[\\udffb-\\udfff]', rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', rsNonAstral = '[^' + rsAstralRange + ']', diff --git a/_unicodeWords.js b/_unicodeWords.js index 0fb4c8f63..10ea2346e 100644 --- a/_unicodeWords.js +++ b/_unicodeWords.js @@ -2,8 +2,10 @@ define([], function() { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', - rsComboSymbolsRange = '\\u20d0-\\u20f0', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = '\\u2700-\\u27bf', rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', @@ -17,7 +19,7 @@ define([], function() { /** Used to compose unicode capture groups. */ var rsApos = "['\u2019]", rsBreak = '[' + rsBreakRange + ']', - rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']', + rsCombo = '[' + rsComboRange + ']', rsDigits = '\\d+', rsDingbat = '[' + rsDingbatRange + ']', rsLower = '[' + rsLowerRange + ']', diff --git a/_updateWrapDetails.js b/_updateWrapDetails.js index 43a7d8871..b9e1c6b48 100644 --- a/_updateWrapDetails.js +++ b/_updateWrapDetails.js @@ -1,27 +1,27 @@ define(['./_arrayEach', './_arrayIncludes'], function(arrayEach, arrayIncludes) { /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_FLAG = 8, - CURRY_RIGHT_FLAG = 16, - PARTIAL_FLAG = 32, - PARTIAL_RIGHT_FLAG = 64, - ARY_FLAG = 128, - REARG_FLAG = 256, - FLIP_FLAG = 512; + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; /** Used to associate wrap methods with their bit flags. */ var wrapFlags = [ - ['ary', ARY_FLAG], - ['bind', BIND_FLAG], - ['bindKey', BIND_KEY_FLAG], - ['curry', CURRY_FLAG], - ['curryRight', CURRY_RIGHT_FLAG], - ['flip', FLIP_FLAG], - ['partial', PARTIAL_FLAG], - ['partialRight', PARTIAL_RIGHT_FLAG], - ['rearg', REARG_FLAG] + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] ]; /** diff --git a/ary.js b/ary.js index dc5d06ec8..e2f9096f0 100644 --- a/ary.js +++ b/ary.js @@ -4,7 +4,7 @@ define(['./_createWrap'], function(createWrap) { var undefined; /** Used to compose bitmasks for function metadata. */ - var ARY_FLAG = 128; + var WRAP_ARY_FLAG = 128; /** * Creates a function that invokes `func`, with up to `n` arguments, @@ -26,7 +26,7 @@ define(['./_createWrap'], function(createWrap) { function ary(func, n, guard) { n = guard ? undefined : n; n = (func && n == null) ? func.length : n; - return createWrap(func, ARY_FLAG, undefined, undefined, undefined, undefined, n); + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); } return ary; diff --git a/at.js b/at.js index fa34f44d6..7c63ed3e0 100644 --- a/at.js +++ b/at.js @@ -8,7 +8,7 @@ define(['./_baseAt', './_flatRest'], function(baseAt, flatRest) { * @since 1.0.0 * @category Object * @param {Object} object The object to iterate over. - * @param {...(string|string[])} [paths] The property paths of elements to pick. + * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Array} Returns the picked values. * @example * diff --git a/bind.js b/bind.js index 614465939..318747de3 100644 --- a/bind.js +++ b/bind.js @@ -1,8 +1,8 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], function(baseRest, createWrap, getHolder, replaceHolders) { /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - PARTIAL_FLAG = 32; + var WRAP_BIND_FLAG = 1, + WRAP_PARTIAL_FLAG = 32; /** * Creates a function that invokes `func` with the `this` binding of `thisArg` @@ -40,10 +40,10 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], fu * // => 'hi fred!' */ var bind = baseRest(function(func, thisArg, partials) { - var bitmask = BIND_FLAG; + var bitmask = WRAP_BIND_FLAG; if (partials.length) { var holders = replaceHolders(partials, getHolder(bind)); - bitmask |= PARTIAL_FLAG; + bitmask |= WRAP_PARTIAL_FLAG; } return createWrap(func, bitmask, thisArg, partials, holders); }); diff --git a/bindKey.js b/bindKey.js index c4cbe271e..7e2f947d9 100644 --- a/bindKey.js +++ b/bindKey.js @@ -1,9 +1,9 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], function(baseRest, createWrap, getHolder, replaceHolders) { /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - PARTIAL_FLAG = 32; + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_PARTIAL_FLAG = 32; /** * Creates a function that invokes the method at `object[key]` with `partials` @@ -51,10 +51,10 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], fu * // => 'hiya fred!' */ var bindKey = baseRest(function(object, key, partials) { - var bitmask = BIND_FLAG | BIND_KEY_FLAG; + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; if (partials.length) { var holders = replaceHolders(partials, getHolder(bindKey)); - bitmask |= PARTIAL_FLAG; + bitmask |= WRAP_PARTIAL_FLAG; } return createWrap(key, bitmask, object, partials, holders); }); diff --git a/clone.js b/clone.js index 37caad72d..f80908d68 100644 --- a/clone.js +++ b/clone.js @@ -1,5 +1,8 @@ define(['./_baseClone'], function(baseClone) { + /** Used to compose bitmasks for cloning. */ + var CLONE_SYMBOLS_FLAG = 4; + /** * Creates a shallow clone of `value`. * @@ -27,7 +30,7 @@ define(['./_baseClone'], function(baseClone) { * // => true */ function clone(value) { - return baseClone(value, false, true); + return baseClone(value, CLONE_SYMBOLS_FLAG); } return clone; diff --git a/cloneDeep.js b/cloneDeep.js index 013c222f5..5ee4e0bda 100644 --- a/cloneDeep.js +++ b/cloneDeep.js @@ -1,5 +1,9 @@ define(['./_baseClone'], function(baseClone) { + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_SYMBOLS_FLAG = 4; + /** * This method is like `_.clone` except that it recursively clones `value`. * @@ -19,7 +23,7 @@ define(['./_baseClone'], function(baseClone) { * // => false */ function cloneDeep(value) { - return baseClone(value, true, true); + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); } return cloneDeep; diff --git a/cloneDeepWith.js b/cloneDeepWith.js index 38d53fb70..fed9ab4a6 100644 --- a/cloneDeepWith.js +++ b/cloneDeepWith.js @@ -3,6 +3,10 @@ define(['./_baseClone'], function(baseClone) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_SYMBOLS_FLAG = 4; + /** * This method is like `_.cloneWith` except that it recursively clones `value`. * @@ -33,7 +37,7 @@ define(['./_baseClone'], function(baseClone) { */ function cloneDeepWith(value, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; - return baseClone(value, true, true, customizer); + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); } return cloneDeepWith; diff --git a/cloneWith.js b/cloneWith.js index 86cb498ec..6ef3e995d 100644 --- a/cloneWith.js +++ b/cloneWith.js @@ -3,6 +3,9 @@ define(['./_baseClone'], function(baseClone) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; + /** Used to compose bitmasks for cloning. */ + var CLONE_SYMBOLS_FLAG = 4; + /** * This method is like `_.clone` except that it accepts `customizer` which * is invoked to produce the cloned value. If `customizer` returns `undefined`, @@ -36,7 +39,7 @@ define(['./_baseClone'], function(baseClone) { */ function cloneWith(value, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; - return baseClone(value, false, true, customizer); + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); } return cloneWith; diff --git a/conforms.js b/conforms.js index f5d9fb3fd..bcde4d859 100644 --- a/conforms.js +++ b/conforms.js @@ -1,5 +1,8 @@ define(['./_baseClone', './_baseConforms'], function(baseClone, baseConforms) { + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + /** * Creates a function that invokes the predicate properties of `source` with * the corresponding property values of a given object, returning `true` if @@ -25,7 +28,7 @@ define(['./_baseClone', './_baseConforms'], function(baseClone, baseConforms) { * // => [{ 'a': 1, 'b': 2 }] */ function conforms(source) { - return baseConforms(baseClone(source, true)); + return baseConforms(baseClone(source, CLONE_DEEP_FLAG)); } return conforms; diff --git a/curry.js b/curry.js index e5c8b5442..07572e3dd 100644 --- a/curry.js +++ b/curry.js @@ -4,7 +4,7 @@ define(['./_createWrap'], function(createWrap) { var undefined; /** Used to compose bitmasks for function metadata. */ - var CURRY_FLAG = 8; + var WRAP_CURRY_FLAG = 8; /** * Creates a function that accepts arguments of `func` and either invokes @@ -49,7 +49,7 @@ define(['./_createWrap'], function(createWrap) { */ function curry(func, arity, guard) { arity = guard ? undefined : arity; - var result = createWrap(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); result.placeholder = curry.placeholder; return result; } diff --git a/curryRight.js b/curryRight.js index d12df475c..c4c0eb0ff 100644 --- a/curryRight.js +++ b/curryRight.js @@ -4,7 +4,7 @@ define(['./_createWrap'], function(createWrap) { var undefined; /** Used to compose bitmasks for function metadata. */ - var CURRY_RIGHT_FLAG = 16; + var WRAP_CURRY_RIGHT_FLAG = 16; /** * This method is like `_.curry` except that arguments are applied to `func` @@ -46,7 +46,7 @@ define(['./_createWrap'], function(createWrap) { */ function curryRight(func, arity, guard) { arity = guard ? undefined : arity; - var result = createWrap(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); result.placeholder = curryRight.placeholder; return result; } diff --git a/deburr.js b/deburr.js index 3e23e9c0e..3570e70c3 100644 --- a/deburr.js +++ b/deburr.js @@ -4,11 +4,13 @@ define(['./_deburrLetter', './toString'], function(deburrLetter, toString) { var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; /** Used to compose unicode character classes. */ - var rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', - rsComboSymbolsRange = '\\u20d0-\\u20f0'; + var rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange; /** Used to compose unicode capture groups. */ - var rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']'; + var rsCombo = '[' + rsComboRange + ']'; /** * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and diff --git a/flip.js b/flip.js index 33969dd12..46f732ecb 100644 --- a/flip.js +++ b/flip.js @@ -1,7 +1,7 @@ define(['./_createWrap'], function(createWrap) { /** Used to compose bitmasks for function metadata. */ - var FLIP_FLAG = 512; + var WRAP_FLIP_FLAG = 512; /** * Creates a function that invokes `func` with arguments reversed. @@ -22,7 +22,7 @@ define(['./_createWrap'], function(createWrap) { * // => ['d', 'c', 'b', 'a'] */ function flip(func) { - return createWrap(func, FLIP_FLAG); + return createWrap(func, WRAP_FLIP_FLAG); } return flip; diff --git a/isEqualWith.js b/isEqualWith.js index c4e62066c..05fa4a3f5 100644 --- a/isEqualWith.js +++ b/isEqualWith.js @@ -38,7 +38,7 @@ define(['./_baseIsEqual'], function(baseIsEqual) { function isEqualWith(value, other, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; var result = customizer ? customizer(value, other) : undefined; - return result === undefined ? baseIsEqual(value, other, customizer) : !!result; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; } return isEqualWith; diff --git a/isNative.js b/isNative.js index 0befcc831..e1b6fd087 100644 --- a/isNative.js +++ b/isNative.js @@ -1,7 +1,7 @@ define(['./_baseIsNative', './_isMaskable'], function(baseIsNative, isMaskable) { /** Error message constants. */ - var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://github.com/es-shims.'; + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.'; /** * Checks if `value` is a pristine native function. diff --git a/iteratee.js b/iteratee.js index 1acae35b3..8f633e963 100644 --- a/iteratee.js +++ b/iteratee.js @@ -1,5 +1,8 @@ define(['./_baseClone', './_baseIteratee'], function(baseClone, baseIteratee) { + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + /** * Creates a function that invokes `func` with the arguments of the created * function. If `func` is a property name, the created function returns the @@ -43,7 +46,7 @@ define(['./_baseClone', './_baseIteratee'], function(baseClone, baseIteratee) { * // => ['def'] */ function iteratee(func) { - return baseIteratee(typeof func == 'function' ? func : baseClone(func, true)); + return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG)); } return iteratee; diff --git a/main.js b/main.js index 7f3226538..fe28c60ed 100644 --- a/main.js +++ b/main.js @@ -1,6 +1,6 @@ /** * @license - * lodash (Custom Build) + * Lodash (Custom Build) * Build: `lodash exports="amd" -d -o ./main.js` * Copyright JS Foundation and other contributors * Released under MIT license @@ -13,13 +13,13 @@ var undefined; /** Used as the semantic version number. */ - var VERSION = '4.16.6'; + var VERSION = '4.17.0'; /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** Error message constants. */ - var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://github.com/es-shims.', + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', FUNC_ERROR_TEXT = 'Expected a function'; /** Used to stand-in for `undefined` hash values. */ @@ -31,21 +31,26 @@ /** Used as the internal argument placeholder. */ var PLACEHOLDER = '__lodash_placeholder__'; - /** Used to compose bitmasks for function metadata. */ - var BIND_FLAG = 1, - BIND_KEY_FLAG = 2, - CURRY_BOUND_FLAG = 4, - CURRY_FLAG = 8, - CURRY_RIGHT_FLAG = 16, - PARTIAL_FLAG = 32, - PARTIAL_RIGHT_FLAG = 64, - ARY_FLAG = 128, - REARG_FLAG = 256, - FLIP_FLAG = 512; + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; - /** Used to compose bitmasks for comparison styles. */ - var UNORDERED_COMPARE_FLAG = 1, - PARTIAL_COMPARE_FLAG = 2; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; /** Used as default options for `_.truncate`. */ var DEFAULT_TRUNC_LENGTH = 30, @@ -73,15 +78,15 @@ /** Used to associate wrap methods with their bit flags. */ var wrapFlags = [ - ['ary', ARY_FLAG], - ['bind', BIND_FLAG], - ['bindKey', BIND_KEY_FLAG], - ['curry', CURRY_FLAG], - ['curryRight', CURRY_RIGHT_FLAG], - ['flip', FLIP_FLAG], - ['partial', PARTIAL_FLAG], - ['partialRight', PARTIAL_RIGHT_FLAG], - ['rearg', REARG_FLAG] + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] ]; /** `Object#toString` result references. */ @@ -200,8 +205,10 @@ /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', - rsComboSymbolsRange = '\\u20d0-\\u20f0', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = '\\u2700-\\u27bf', rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', @@ -216,7 +223,7 @@ var rsApos = "['\u2019]", rsAstral = '[' + rsAstralRange + ']', rsBreak = '[' + rsBreakRange + ']', - rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']', + rsCombo = '[' + rsComboRange + ']', rsDigits = '\\d+', rsDingbat = '[' + rsDingbatRange + ']', rsLower = '[' + rsLowerRange + ']', @@ -268,7 +275,7 @@ ].join('|'), 'g'); /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ - var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']'); + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); /** Used to detect strings that need a more robust regexp to match words. */ var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; @@ -431,7 +438,7 @@ /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { - return freeProcess && freeProcess.binding('util'); + return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); @@ -2559,6 +2566,19 @@ return object && copyObject(source, keys(source), object); } + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. @@ -2586,7 +2606,7 @@ * * @private * @param {Object} object The object to iterate over. - * @param {string[]} paths The property paths of elements to pick. + * @param {string[]} paths The property paths to pick. * @returns {Array} Returns the picked elements. */ function baseAt(object, paths) { @@ -2628,16 +2648,22 @@ * * @private * @param {*} value The value to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @param {boolean} [isFull] Specify a clone including symbols. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols * @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, isFull, customizer, key, object, stack) { - var result; + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + if (customizer) { result = object ? customizer(value, key, object, stack) : customizer(value); } @@ -2661,9 +2687,11 @@ return cloneBuffer(value, isDeep); } if (tag == objectTag || tag == argsTag || (isFunc && !object)) { - result = initCloneObject(isFunc ? {} : value); + result = (isFlat || isFunc) ? {} : initCloneObject(value); if (!isDeep) { - return copySymbols(value, baseAssign(result, value)); + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); } } else { if (!cloneableTags[tag]) { @@ -2680,14 +2708,18 @@ } stack.set(value, result); - var props = isArr ? undefined : (isFull ? getAllKeys : keys)(value); + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); arrayEach(props || value, function(subValue, key) { if (props) { key = subValue; subValue = value[key]; } // Recursively populate clone (susceptible to call stack limits). - assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack)); + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); }); return result; } @@ -3260,22 +3292,21 @@ * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. - * @param {boolean} [bitmask] The bitmask of comparison flags. - * The bitmask may be composed of the following flags: - * 1 - Unordered comparison - * 2 - Partial comparison * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ - function baseIsEqual(value, other, customizer, bitmask, stack) { + function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { return value !== value && other !== other; } - return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } /** @@ -3286,14 +3317,13 @@ * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Function} [customizer] The function to customize comparisons. - * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` - * for more details. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ - function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = arrayTag, @@ -3321,10 +3351,10 @@ if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) - ? equalArrays(object, other, equalFunc, customizer, bitmask, stack) - : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack); + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } - if (!(bitmask & PARTIAL_COMPARE_FLAG)) { + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); @@ -3333,14 +3363,14 @@ othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack); - return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) { return false; } stack || (stack = new Stack); - return equalObjects(object, other, equalFunc, customizer, bitmask, stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } /** @@ -3398,7 +3428,7 @@ var result = customizer(objValue, srcValue, key, object, source, stack); } if (!(result === undefined - ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result )) { return false; @@ -3588,7 +3618,7 @@ var objValue = get(object, path); return (objValue === undefined && objValue === srcValue) ? hasIn(object, path) - : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG); + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); }; } @@ -3750,13 +3780,13 @@ * * @private * @param {Object} object The source object. - * @param {string[]} props The property identifiers to pick. + * @param {string[]} paths The property paths to pick. * @returns {Object} Returns the new object. */ - function basePick(object, props) { + function basePick(object, paths) { object = Object(object); - return basePickBy(object, props, function(value, key) { - return key in object; + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); }); } @@ -3765,21 +3795,21 @@ * * @private * @param {Object} object The source object. - * @param {string[]} props The property identifiers to pick from. + * @param {string[]} paths The property paths to pick. * @param {Function} predicate The function invoked per property. * @returns {Object} Returns the new object. */ - function basePickBy(object, props, predicate) { + function basePickBy(object, paths, predicate) { var index = -1, - length = props.length, + length = paths.length, result = {}; while (++index < length) { - var key = props[index], - value = object[key]; + var path = paths[index], + value = baseGet(object, path); - if (predicate(value, key)) { - baseAssignValue(result, key, value); + if (predicate(value, path)) { + baseSet(result, path, value); } } return result; @@ -4323,7 +4353,7 @@ * * @private * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to unset. + * @param {Array|string} path The property path to unset. * @returns {boolean} Returns `true` if the property is deleted, else `false`. */ function baseUnset(object, path) { @@ -4568,7 +4598,7 @@ * @returns {Object} Returns the cloned map. */ function cloneMap(map, isDeep, cloneFunc) { - var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map); + var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map); return arrayReduce(array, addMapEntry, new map.constructor); } @@ -4595,7 +4625,7 @@ * @returns {Object} Returns the cloned set. */ function cloneSet(set, isDeep, cloneFunc) { - var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set); + var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set); return arrayReduce(array, addSetEntry, new set.constructor); } @@ -4830,7 +4860,7 @@ } /** - * Copies own symbol properties of `source` to `object`. + * Copies own symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. @@ -4841,6 +4871,18 @@ return copyObject(source, getSymbols(source), object); } + /** + * Copies own and inherited symbols 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 copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + /** * Creates a function like `_.groupBy`. * @@ -4955,7 +4997,7 @@ * @returns {Function} Returns the new wrapped function. */ function createBind(func, bitmask, thisArg) { - var isBind = bitmask & BIND_FLAG, + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); function wrapper() { @@ -5128,7 +5170,7 @@ data = funcName == 'wrapper' ? getData(func) : undefined; if (data && isLaziable(data[0]) && - data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1 ) { wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); @@ -5177,11 +5219,11 @@ * @returns {Function} Returns the new wrapped function. */ function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { - var isAry = bitmask & ARY_FLAG, - isBind = bitmask & BIND_FLAG, - isBindKey = bitmask & BIND_KEY_FLAG, - isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG), - isFlip = bitmask & FLIP_FLAG, + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined : createCtor(func); function wrapper() { @@ -5332,7 +5374,7 @@ * @returns {Function} Returns the new wrapped function. */ function createPartial(func, bitmask, thisArg, partials) { - var isBind = bitmask & BIND_FLAG, + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); function wrapper() { @@ -5414,17 +5456,17 @@ * @returns {Function} Returns the new wrapped function. */ function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { - var isCurry = bitmask & CURRY_FLAG, + var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined, newHoldersRight = isCurry ? undefined : holders, newPartials = isCurry ? partials : undefined, newPartialsRight = isCurry ? undefined : partials; - bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); - bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); - if (!(bitmask & CURRY_BOUND_FLAG)) { - bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); } var newData = [ func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, @@ -5502,17 +5544,16 @@ * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask flags. - * The bitmask may be composed of the following flags: - * 1 - `_.bind` - * 2 - `_.bindKey` - * 4 - `_.curry` or `_.curryRight` of a bound function - * 8 - `_.curry` - * 16 - `_.curryRight` - * 32 - `_.partial` - * 64 - `_.partialRight` - * 128 - `_.rearg` - * 256 - `_.ary` - * 512 - `_.flip` + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to be partially applied. * @param {Array} [holders] The `partials` placeholder indexes. @@ -5522,20 +5563,20 @@ * @returns {Function} Returns the new wrapped function. */ function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { - var isBindKey = bitmask & BIND_KEY_FLAG; + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; if (!isBindKey && typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } var length = partials ? partials.length : 0; if (!length) { - bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); partials = holders = undefined; } ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); arity = arity === undefined ? arity : toInteger(arity); length -= holders ? holders.length : 0; - if (bitmask & PARTIAL_RIGHT_FLAG) { + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { var partialsRight = partials, holdersRight = holders; @@ -5560,14 +5601,14 @@ ? (isBindKey ? 0 : func.length) : nativeMax(newData[9] - length, 0); - if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) { - bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG); + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); } - if (!bitmask || bitmask == BIND_FLAG) { + if (!bitmask || bitmask == WRAP_BIND_FLAG) { var result = createBind(func, bitmask, thisArg); - } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) { + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { result = createCurry(func, bitmask, arity); - } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) { + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { result = createPartial(func, bitmask, thisArg, partials); } else { result = createHybrid.apply(undefined, newData); @@ -5583,15 +5624,14 @@ * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. - * @param {Function} equalFunc The function to determine equivalents of values. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. - * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` - * for more details. + * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ - function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { - var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; @@ -5605,7 +5645,7 @@ } var index = -1, result = true, - seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined; + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; stack.set(array, other); stack.set(other, array); @@ -5631,7 +5671,7 @@ if (seen) { if (!arraySome(other, function(othValue, othIndex) { if (!cacheHas(seen, othIndex) && - (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { return seen.push(othIndex); } })) { @@ -5640,7 +5680,7 @@ } } else if (!( arrValue === othValue || - equalFunc(arrValue, othValue, customizer, bitmask, stack) + equalFunc(arrValue, othValue, bitmask, customizer, stack) )) { result = false; break; @@ -5662,14 +5702,13 @@ * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. - * @param {Function} equalFunc The function to determine equivalents of values. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. - * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` - * for more details. + * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ - function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { case dataViewTag: if ((object.byteLength != other.byteLength) || @@ -5707,7 +5746,7 @@ var convert = mapToArray; case setTag: - var isPartial = bitmask & PARTIAL_COMPARE_FLAG; + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; convert || (convert = setToArray); if (object.size != other.size && !isPartial) { @@ -5718,11 +5757,11 @@ if (stacked) { return stacked == other; } - bitmask |= UNORDERED_COMPARE_FLAG; + bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). stack.set(object, other); - var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack['delete'](object); return result; @@ -5741,15 +5780,14 @@ * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. - * @param {Function} equalFunc The function to determine equivalents of values. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. - * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` - * for more details. + * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ - function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { - var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = keys(object), objLength = objProps.length, othProps = keys(other), @@ -5787,7 +5825,7 @@ } // Recursively compare objects (susceptible to call stack limits). if (!(compared === undefined - ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)) + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) : compared )) { result = false; @@ -5984,7 +6022,7 @@ } /** - * Creates an array of the own enumerable symbol properties of `object`. + * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. @@ -5993,8 +6031,7 @@ var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray; /** - * Creates an array of the own and inherited enumerable symbol properties - * of `object`. + * Creates an array of the own and inherited enumerable symbols of `object`. * * @private * @param {Object} object The object to query. @@ -6426,22 +6463,22 @@ var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, - isCommon = newBitmask < (BIND_FLAG | BIND_KEY_FLAG | ARY_FLAG); + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); var isCombo = - ((srcBitmask == ARY_FLAG) && (bitmask == CURRY_FLAG)) || - ((srcBitmask == ARY_FLAG) && (bitmask == REARG_FLAG) && (data[7].length <= source[8])) || - ((srcBitmask == (ARY_FLAG | REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == CURRY_FLAG)); + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); // Exit early if metadata can't be merged. if (!(isCommon || isCombo)) { return data; } // Use source `thisArg` if available. - if (srcBitmask & BIND_FLAG) { + if (srcBitmask & WRAP_BIND_FLAG) { data[2] = source[2]; // Set when currying a bound function. - newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG; + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; } // Compose partial arguments. var value = source[3]; @@ -6463,7 +6500,7 @@ data[7] = value; } // Use source `ary` if it's smaller. - if (srcBitmask & ARY_FLAG) { + if (srcBitmask & WRAP_ARY_FLAG) { data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); } // Use source `arity` if one is not provided. @@ -8780,7 +8817,7 @@ * @memberOf _ * @since 1.0.0 * @category Seq - * @param {...(string|string[])} [paths] The property paths of elements to pick. + * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new `lodash` wrapper instance. * @example * @@ -9999,7 +10036,7 @@ function ary(func, n, guard) { n = guard ? undefined : n; n = (func && n == null) ? func.length : n; - return createWrap(func, ARY_FLAG, undefined, undefined, undefined, undefined, n); + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); } /** @@ -10072,10 +10109,10 @@ * // => 'hi fred!' */ var bind = baseRest(function(func, thisArg, partials) { - var bitmask = BIND_FLAG; + var bitmask = WRAP_BIND_FLAG; if (partials.length) { var holders = replaceHolders(partials, getHolder(bind)); - bitmask |= PARTIAL_FLAG; + bitmask |= WRAP_PARTIAL_FLAG; } return createWrap(func, bitmask, thisArg, partials, holders); }); @@ -10126,10 +10163,10 @@ * // => 'hiya fred!' */ var bindKey = baseRest(function(object, key, partials) { - var bitmask = BIND_FLAG | BIND_KEY_FLAG; + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; if (partials.length) { var holders = replaceHolders(partials, getHolder(bindKey)); - bitmask |= PARTIAL_FLAG; + bitmask |= WRAP_PARTIAL_FLAG; } return createWrap(key, bitmask, object, partials, holders); }); @@ -10177,7 +10214,7 @@ */ function curry(func, arity, guard) { arity = guard ? undefined : arity; - var result = createWrap(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); result.placeholder = curry.placeholder; return result; } @@ -10222,7 +10259,7 @@ */ function curryRight(func, arity, guard) { arity = guard ? undefined : arity; - var result = createWrap(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); result.placeholder = curryRight.placeholder; return result; } @@ -10467,7 +10504,7 @@ * // => ['d', 'c', 'b', 'a'] */ function flip(func) { - return createWrap(func, FLIP_FLAG); + return createWrap(func, WRAP_FLIP_FLAG); } /** @@ -10678,7 +10715,7 @@ */ var partial = baseRest(function(func, partials) { var holders = replaceHolders(partials, getHolder(partial)); - return createWrap(func, PARTIAL_FLAG, undefined, partials, holders); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); }); /** @@ -10715,7 +10752,7 @@ */ var partialRight = baseRest(function(func, partials) { var holders = replaceHolders(partials, getHolder(partialRight)); - return createWrap(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); }); /** @@ -10741,7 +10778,7 @@ * // => ['a', 'b', 'c'] */ var rearg = flatRest(function(func, indexes) { - return createWrap(func, REARG_FLAG, undefined, undefined, undefined, indexes); + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); }); /** @@ -10818,11 +10855,15 @@ start = start === undefined ? 0 : nativeMax(toInteger(start), 0); return baseRest(function(args) { var array = args[start], + lastIndex = args.length - 1, otherArgs = castSlice(args, 0, start); if (array) { arrayPush(otherArgs, array); } + if (start != lastIndex) { + arrayPush(otherArgs, castSlice(args, start + 1)); + } return apply(func, this, otherArgs); }); } @@ -11004,7 +11045,7 @@ * // => true */ function clone(value) { - return baseClone(value, false, true); + return baseClone(value, CLONE_SYMBOLS_FLAG); } /** @@ -11040,7 +11081,7 @@ */ function cloneWith(value, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; - return baseClone(value, false, true, customizer); + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); } /** @@ -11062,7 +11103,7 @@ * // => false */ function cloneDeep(value) { - return baseClone(value, true, true); + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); } /** @@ -11095,7 +11136,7 @@ */ function cloneDeepWith(value, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; - return baseClone(value, true, true, customizer); + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); } /** @@ -11544,7 +11585,7 @@ function isEqualWith(value, other, customizer) { customizer = typeof customizer == 'function' ? customizer : undefined; var result = customizer ? customizer(value, other) : undefined; - return result === undefined ? baseIsEqual(value, other, customizer) : !!result; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; } /** @@ -12687,7 +12728,7 @@ * @since 1.0.0 * @category Object * @param {Object} object The object to iterate over. - * @param {...(string|string[])} [paths] The property paths of elements to pick. + * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Array} Returns the picked values. * @example * @@ -13414,15 +13455,16 @@ /** * The opposite of `_.pick`; this method creates an object composed of the - * own and inherited enumerable string keyed properties of `object` that are - * not omitted. + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. - * @param {...(string|string[])} [props] The property identifiers to omit. + * @param {...(string|string[])} [paths] The property paths to omit. * @returns {Object} Returns the new object. * @example * @@ -13431,12 +13473,19 @@ * _.omit(object, ['a', 'c']); * // => { 'b': '2' } */ - var omit = flatRest(function(object, props) { + var omit = flatRest(function(object, paths) { + var result = {}; if (object == null) { - return {}; + return result; } - props = arrayMap(props, toKey); - return basePick(object, baseDifference(getAllKeysIn(object), props)); + copyObject(object, getAllKeysIn(object), result); + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG); + + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; }); /** @@ -13471,7 +13520,7 @@ * @memberOf _ * @category Object * @param {Object} object The source object. - * @param {...(string|string[])} [props] The property identifiers to pick. + * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new object. * @example * @@ -13480,8 +13529,8 @@ * _.pick(object, ['a', 'c']); * // => { 'a': 1, 'c': 3 } */ - var pick = flatRest(function(object, props) { - return object == null ? {} : basePick(object, arrayMap(props, toKey)); + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, arrayMap(paths, toKey)); }); /** @@ -15274,7 +15323,7 @@ * // => [{ 'a': 1, 'b': 2 }] */ function conforms(source) { - return baseConforms(baseClone(source, true)); + return baseConforms(baseClone(source, CLONE_DEEP_FLAG)); } /** @@ -15436,7 +15485,7 @@ * // => ['def'] */ function iteratee(func) { - return baseIteratee(typeof func == 'function' ? func : baseClone(func, true)); + return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG)); } /** @@ -15468,7 +15517,7 @@ * // => [{ 'a': 4, 'b': 5, 'c': 6 }] */ function matches(source) { - return baseMatches(baseClone(source, true)); + return baseMatches(baseClone(source, CLONE_DEEP_FLAG)); } /** @@ -15498,7 +15547,7 @@ * // => { 'a': 4, 'b': 5, 'c': 6 } */ function matchesProperty(path, srcValue) { - return baseMatchesProperty(path, baseClone(srcValue, true)); + return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG)); } /** @@ -16958,7 +17007,7 @@ } }); - realNames[createHybrid(undefined, BIND_KEY_FLAG).name] = [{ + realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': undefined }]; diff --git a/matches.js b/matches.js index 03d4278b5..8b35ed768 100644 --- a/matches.js +++ b/matches.js @@ -1,5 +1,8 @@ define(['./_baseClone', './_baseMatches'], function(baseClone, baseMatches) { + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + /** * Creates a function that performs a partial deep comparison between a given * object and `source`, returning `true` if the given object has equivalent @@ -29,7 +32,7 @@ define(['./_baseClone', './_baseMatches'], function(baseClone, baseMatches) { * // => [{ 'a': 4, 'b': 5, 'c': 6 }] */ function matches(source) { - return baseMatches(baseClone(source, true)); + return baseMatches(baseClone(source, CLONE_DEEP_FLAG)); } return matches; diff --git a/matchesProperty.js b/matchesProperty.js index 8504ef7c5..766c28bd4 100644 --- a/matchesProperty.js +++ b/matchesProperty.js @@ -1,5 +1,8 @@ define(['./_baseClone', './_baseMatchesProperty'], function(baseClone, baseMatchesProperty) { + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1; + /** * Creates a function that performs a partial deep comparison between the * value at `path` of a given object to `srcValue`, returning `true` if the @@ -27,7 +30,7 @@ define(['./_baseClone', './_baseMatchesProperty'], function(baseClone, baseMatch * // => { 'a': 4, 'b': 5, 'c': 6 } */ function matchesProperty(path, srcValue) { - return baseMatchesProperty(path, baseClone(srcValue, true)); + return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG)); } return matchesProperty; diff --git a/omit.js b/omit.js index d4ec42520..8b8d1ad22 100644 --- a/omit.js +++ b/omit.js @@ -1,16 +1,22 @@ -define(['./_arrayMap', './_baseDifference', './_basePick', './_flatRest', './_getAllKeysIn', './_toKey'], function(arrayMap, baseDifference, basePick, flatRest, getAllKeysIn, toKey) { +define(['./_baseClone', './_baseUnset', './_copyObject', './_flatRest', './_getAllKeysIn'], function(baseClone, baseUnset, copyObject, flatRest, getAllKeysIn) { + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; /** * The opposite of `_.pick`; this method creates an object composed of the - * own and inherited enumerable string keyed properties of `object` that are - * not omitted. + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. - * @param {...(string|string[])} [props] The property identifiers to omit. + * @param {...(string|string[])} [paths] The property paths to omit. * @returns {Object} Returns the new object. * @example * @@ -19,12 +25,19 @@ define(['./_arrayMap', './_baseDifference', './_basePick', './_flatRest', './_ge * _.omit(object, ['a', 'c']); * // => { 'b': '2' } */ - var omit = flatRest(function(object, props) { + var omit = flatRest(function(object, paths) { + var result = {}; if (object == null) { - return {}; + return result; } - props = arrayMap(props, toKey); - return basePick(object, baseDifference(getAllKeysIn(object), props)); + copyObject(object, getAllKeysIn(object), result); + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG); + + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; }); return omit; diff --git a/package.json b/package.json index 4a8f4ad01..2172188b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lodash-amd", - "version": "4.16.6", + "version": "4.17.0", "description": "Lodash exported as AMD modules.", "keywords": "amd, modules, stdlib, util", "homepage": "https://lodash.com/custom-builds", diff --git a/partial.js b/partial.js index a1272d5b9..9b24346cf 100644 --- a/partial.js +++ b/partial.js @@ -4,7 +4,7 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], fu var undefined; /** Used to compose bitmasks for function metadata. */ - var PARTIAL_FLAG = 32; + var WRAP_PARTIAL_FLAG = 32; /** * Creates a function that invokes `func` with `partials` prepended to the @@ -41,7 +41,7 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], fu */ var partial = baseRest(function(func, partials) { var holders = replaceHolders(partials, getHolder(partial)); - return createWrap(func, PARTIAL_FLAG, undefined, partials, holders); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); }); // Assign default placeholders. diff --git a/partialRight.js b/partialRight.js index ae851f848..16af735f7 100644 --- a/partialRight.js +++ b/partialRight.js @@ -4,7 +4,7 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], fu var undefined; /** Used to compose bitmasks for function metadata. */ - var PARTIAL_RIGHT_FLAG = 64; + var WRAP_PARTIAL_RIGHT_FLAG = 64; /** * This method is like `_.partial` except that partially applied arguments @@ -40,7 +40,7 @@ define(['./_baseRest', './_createWrap', './_getHolder', './_replaceHolders'], fu */ var partialRight = baseRest(function(func, partials) { var holders = replaceHolders(partials, getHolder(partialRight)); - return createWrap(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); }); // Assign default placeholders. diff --git a/pick.js b/pick.js index f5961cf7d..da9b52494 100644 --- a/pick.js +++ b/pick.js @@ -8,7 +8,7 @@ define(['./_arrayMap', './_basePick', './_flatRest', './_toKey'], function(array * @memberOf _ * @category Object * @param {Object} object The source object. - * @param {...(string|string[])} [props] The property identifiers to pick. + * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new object. * @example * @@ -17,8 +17,8 @@ define(['./_arrayMap', './_basePick', './_flatRest', './_toKey'], function(array * _.pick(object, ['a', 'c']); * // => { 'a': 1, 'c': 3 } */ - var pick = flatRest(function(object, props) { - return object == null ? {} : basePick(object, arrayMap(props, toKey)); + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, arrayMap(paths, toKey)); }); return pick; diff --git a/rearg.js b/rearg.js index 17636cdd2..bbda988ab 100644 --- a/rearg.js +++ b/rearg.js @@ -4,7 +4,7 @@ define(['./_createWrap', './_flatRest'], function(createWrap, flatRest) { var undefined; /** Used to compose bitmasks for function metadata. */ - var REARG_FLAG = 256; + var WRAP_REARG_FLAG = 256; /** * Creates a function that invokes `func` with arguments arranged according @@ -29,7 +29,7 @@ define(['./_createWrap', './_flatRest'], function(createWrap, flatRest) { * // => ['a', 'b', 'c'] */ var rearg = flatRest(function(func, indexes) { - return createWrap(func, REARG_FLAG, undefined, undefined, undefined, indexes); + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); }); return rearg; diff --git a/spread.js b/spread.js index d4e6b8c72..8fce710a8 100644 --- a/spread.js +++ b/spread.js @@ -50,11 +50,15 @@ define(['./_apply', './_arrayPush', './_baseRest', './_castSlice', './toInteger' start = start === undefined ? 0 : nativeMax(toInteger(start), 0); return baseRest(function(args) { var array = args[start], + lastIndex = args.length - 1, otherArgs = castSlice(args, 0, start); if (array) { arrayPush(otherArgs, array); } + if (start != lastIndex) { + arrayPush(otherArgs, castSlice(args, start + 1)); + } return apply(func, this, otherArgs); }); } diff --git a/wrapperAt.js b/wrapperAt.js index 907181c02..e8b1875c5 100644 --- a/wrapperAt.js +++ b/wrapperAt.js @@ -10,7 +10,7 @@ define(['./_LazyWrapper', './_LodashWrapper', './_baseAt', './_flatRest', './_is * @memberOf _ * @since 1.0.0 * @category Seq - * @param {...(string|string[])} [paths] The property paths of elements to pick. + * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new `lodash` wrapper instance. * @example *