From 65e5d998b3f281e0fca86e294ce73e08c9a87f40 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Sun, 21 Feb 2016 20:40:07 -0800 Subject: [PATCH] Bump to v4.5.1. --- README.md | 4 +- _assignValue.js | 3 +- _composeArgs.js | 19 ++-- _composeArgsRight.js | 19 ++-- _countHolders.js | 24 +++++ _createCurryWrapper.js | 17 ++-- _createHybridWrapper.js | 36 +++---- _createRecurryWrapper.js | 6 +- _getPlaceholder.js | 16 +++ _initCloneObject.js | 12 +-- _isPrototype.js | 4 +- _mergeData.js | 8 +- _replaceHolders.js | 3 +- bind.js | 6 +- bindKey.js | 6 +- isError.js | 3 +- isPlainObject.js | 5 +- main.js | 213 +++++++++++++++++++++++---------------- mapKeys.js | 3 +- mapValues.js | 2 +- omitBy.js | 9 +- package.json | 2 +- partial.js | 6 +- partialRight.js | 6 +- pickBy.js | 2 +- pull.js | 3 +- remove.js | 7 +- times.js | 4 +- transform.js | 6 +- 29 files changed, 266 insertions(+), 188 deletions(-) create mode 100644 _countHolders.js create mode 100644 _getPlaceholder.js diff --git a/README.md b/README.md index e5bf2d5b1..f76f7fbd1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# lodash-amd v4.5.0 +# lodash-amd v4.5.1 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.5.0-amd) for more details. +See the [package source](https://github.com/lodash/lodash/tree/4.5.1-amd) for more details. diff --git a/_assignValue.js b/_assignValue.js index 96177477d..c93e69b4b 100644 --- a/_assignValue.js +++ b/_assignValue.js @@ -21,8 +21,7 @@ define(['./eq'], function(eq) { */ function assignValue(object, key, value) { var objValue = object[key]; - if ((!eq(objValue, value) || - (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) || + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || (value === undefined && !(key in object))) { object[key] = value; } diff --git a/_composeArgs.js b/_composeArgs.js index 235cb8b16..4674a784c 100644 --- a/_composeArgs.js +++ b/_composeArgs.js @@ -11,23 +11,28 @@ define([], function() { * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to prepend to those provided. * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. * @returns {Array} Returns the new array of composed arguments. */ - function composeArgs(args, partials, holders) { - var holdersLength = holders.length, - argsIndex = -1, - argsLength = nativeMax(args.length - holdersLength, 0), + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, - result = Array(leftLength + argsLength); + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; while (++leftIndex < leftLength) { result[leftIndex] = partials[leftIndex]; } while (++argsIndex < holdersLength) { - result[holders[argsIndex]] = args[argsIndex]; + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } } - while (argsLength--) { + while (rangeLength--) { result[leftIndex++] = args[argsIndex++]; } return result; diff --git a/_composeArgsRight.js b/_composeArgsRight.js index be4623131..6c592268f 100644 --- a/_composeArgsRight.js +++ b/_composeArgsRight.js @@ -11,18 +11,21 @@ define([], function() { * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to append to those provided. * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. * @returns {Array} Returns the new array of composed arguments. */ - function composeArgsRight(args, partials, holders) { - var holdersIndex = -1, + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, holdersLength = holders.length, - argsIndex = -1, - argsLength = nativeMax(args.length - holdersLength, 0), rightIndex = -1, rightLength = partials.length, - result = Array(argsLength + rightLength); + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; - while (++argsIndex < argsLength) { + while (++argsIndex < rangeLength) { result[argsIndex] = args[argsIndex]; } var offset = argsIndex; @@ -30,7 +33,9 @@ define([], function() { result[offset + rightIndex] = partials[rightIndex]; } while (++holdersIndex < holdersLength) { - result[offset + holders[holdersIndex]] = args[argsIndex++]; + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } } return result; } diff --git a/_countHolders.js b/_countHolders.js new file mode 100644 index 000000000..9905d0ca6 --- /dev/null +++ b/_countHolders.js @@ -0,0 +1,24 @@ +define([], function() { + + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + result++; + } + } + return result; + } + + return countHolders; +}); diff --git a/_createCurryWrapper.js b/_createCurryWrapper.js index c1f9c1ab8..dea871ef6 100644 --- a/_createCurryWrapper.js +++ b/_createCurryWrapper.js @@ -1,4 +1,4 @@ -define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_createRecurryWrapper', './_replaceHolders', './_root'], function(apply, createCtorWrapper, createHybridWrapper, createRecurryWrapper, replaceHolders, root) { +define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_createRecurryWrapper', './_getPlaceholder', './_replaceHolders', './_root'], function(apply, createCtorWrapper, createHybridWrapper, createRecurryWrapper, getPlaceholder, replaceHolders, root) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; @@ -17,10 +17,9 @@ define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_create function wrapper() { var length = arguments.length, - index = length, args = Array(length), - fn = (this && this !== root && this instanceof wrapper) ? Ctor : func, - placeholder = wrapper.placeholder; + index = length, + placeholder = getPlaceholder(wrapper); while (index--) { args[index] = arguments[index]; @@ -30,9 +29,13 @@ define(['./_apply', './_createCtorWrapper', './_createHybridWrapper', './_create : replaceHolders(args, placeholder); length -= holders.length; - return length < arity - ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length) - : apply(fn, this, args); + if (length < arity) { + return createRecurryWrapper( + func, bitmask, createHybridWrapper, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); } return wrapper; } diff --git a/_createHybridWrapper.js b/_createHybridWrapper.js index 42e8025d0..84b01f340 100644 --- a/_createHybridWrapper.js +++ b/_createHybridWrapper.js @@ -1,4 +1,4 @@ -define(['./_composeArgs', './_composeArgsRight', './_createCtorWrapper', './_createRecurryWrapper', './_reorder', './_replaceHolders', './_root'], function(composeArgs, composeArgsRight, createCtorWrapper, createRecurryWrapper, reorder, replaceHolders, root) { +define(['./_composeArgs', './_composeArgsRight', './_countHolders', './_createCtorWrapper', './_createRecurryWrapper', './_getPlaceholder', './_reorder', './_replaceHolders', './_root'], function(composeArgs, composeArgsRight, countHolders, createCtorWrapper, createRecurryWrapper, getPlaceholder, reorder, replaceHolders, root) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; @@ -32,8 +32,7 @@ define(['./_composeArgs', './_composeArgsRight', './_createCtorWrapper', './_cre var isAry = bitmask & ARY_FLAG, isBind = bitmask & BIND_FLAG, isBindKey = bitmask & BIND_KEY_FLAG, - isCurry = bitmask & CURRY_FLAG, - isCurryRight = bitmask & CURRY_RIGHT_FLAG, + isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG), isFlip = bitmask & FLIP_FLAG, Ctor = isBindKey ? undefined : createCtorWrapper(func); @@ -45,33 +44,34 @@ define(['./_composeArgs', './_composeArgsRight', './_createCtorWrapper', './_cre while (index--) { args[index] = arguments[index]; } + if (isCurried) { + var placeholder = getPlaceholder(wrapper), + holdersCount = countHolders(args, placeholder); + } if (partials) { - args = composeArgs(args, partials, holders); + args = composeArgs(args, partials, holders, isCurried); } if (partialsRight) { - args = composeArgsRight(args, partialsRight, holdersRight); + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); } - if (isCurry || isCurryRight) { - var placeholder = wrapper.placeholder, - argsHolders = replaceHolders(args, placeholder); - - length -= argsHolders.length; - if (length < arity) { - return createRecurryWrapper( - func, bitmask, createHybridWrapper, placeholder, thisArg, args, - argsHolders, argPos, ary, arity - length - ); - } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurryWrapper( + func, bitmask, createHybridWrapper, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); } var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func; + length = args.length; if (argPos) { args = reorder(args, argPos); - } else if (isFlip && args.length > 1) { + } else if (isFlip && length > 1) { args.reverse(); } - if (isAry && ary < args.length) { + if (isAry && ary < length) { args.length = ary; } if (this && this !== root && this instanceof wrapper) { diff --git a/_createRecurryWrapper.js b/_createRecurryWrapper.js index d1fc1e6a9..b6bc26a86 100644 --- a/_createRecurryWrapper.js +++ b/_createRecurryWrapper.js @@ -18,7 +18,7 @@ define(['./_copyArray', './_isLaziable', './_setData'], function(copyArray, isLa * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {Function} wrapFunc The function to create the `func` wrapper. - * @param {*} placeholder The placeholder to replace. + * @param {*} placeholder The placeholder value. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [holders] The `partials` placeholder indexes. @@ -30,7 +30,7 @@ define(['./_copyArray', './_isLaziable', './_setData'], function(copyArray, isLa function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { var isCurry = bitmask & CURRY_FLAG, newArgPos = argPos ? copyArray(argPos) : undefined, - newsHolders = isCurry ? holders : undefined, + newHolders = isCurry ? holders : undefined, newHoldersRight = isCurry ? undefined : holders, newPartials = isCurry ? partials : undefined, newPartialsRight = isCurry ? undefined : partials; @@ -42,7 +42,7 @@ define(['./_copyArray', './_isLaziable', './_setData'], function(copyArray, isLa bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); } var newData = [ - func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, newArgPos, ary, arity ]; diff --git a/_getPlaceholder.js b/_getPlaceholder.js new file mode 100644 index 000000000..b04652899 --- /dev/null +++ b/_getPlaceholder.js @@ -0,0 +1,16 @@ +define([], function() { + + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getPlaceholder(func) { + var object = func; + return object.placeholder; + } + + return getPlaceholder; +}); diff --git a/_initCloneObject.js b/_initCloneObject.js index cf4085533..ca7c94b21 100644 --- a/_initCloneObject.js +++ b/_initCloneObject.js @@ -1,7 +1,7 @@ define(['./_baseCreate', './isFunction', './_isPrototype'], function(baseCreate, isFunction, isPrototype) { - /** Used as a safe reference for `undefined` in pre-ES5 environments. */ - var undefined; + /** Built-in value references. */ + var getPrototypeOf = Object.getPrototypeOf; /** * Initializes an object clone. @@ -11,11 +11,9 @@ define(['./_baseCreate', './isFunction', './_isPrototype'], function(baseCreate, * @returns {Object} Returns the initialized clone. */ function initCloneObject(object) { - if (isPrototype(object)) { - return {}; - } - var Ctor = object.constructor; - return baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined); + return (isFunction(object.constructor) && !isPrototype(object)) + ? baseCreate(getPrototypeOf(object)) + : {}; } return initCloneObject; diff --git a/_isPrototype.js b/_isPrototype.js index d57affdb9..ad0469e4a 100644 --- a/_isPrototype.js +++ b/_isPrototype.js @@ -1,4 +1,4 @@ -define([], function() { +define(['./isFunction'], function(isFunction) { /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -12,7 +12,7 @@ define([], function() { */ function isPrototype(value) { var Ctor = value && value.constructor, - proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + proto = (isFunction(Ctor) && Ctor.prototype) || objectProto; return value === proto; } diff --git a/_mergeData.js b/_mergeData.js index 269d2fb23..dcd00d74f 100644 --- a/_mergeData.js +++ b/_mergeData.js @@ -36,9 +36,9 @@ define(['./_composeArgs', './_composeArgsRight', './_copyArray', './_replaceHold isCommon = newBitmask < (BIND_FLAG | BIND_KEY_FLAG | 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 == 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)); // Exit early if metadata can't be merged. if (!(isCommon || isCombo)) { @@ -48,7 +48,7 @@ define(['./_composeArgs', './_composeArgsRight', './_copyArray', './_replaceHold if (srcBitmask & BIND_FLAG) { data[2] = source[2]; // Set when currying a bound function. - newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG; + newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG; } // Compose partial arguments. var value = source[3]; diff --git a/_replaceHolders.js b/_replaceHolders.js index 0d6d9f55c..3cfcb4141 100644 --- a/_replaceHolders.js +++ b/_replaceHolders.js @@ -19,7 +19,8 @@ define([], function() { result = []; while (++index < length) { - if (array[index] === placeholder) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { array[index] = PLACEHOLDER; result[++resIndex] = index; } diff --git a/bind.js b/bind.js index ab8096d1c..0f5eecdbb 100644 --- a/bind.js +++ b/bind.js @@ -1,4 +1,4 @@ -define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) { +define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) { /** Used to compose bitmasks for wrapper metadata. */ var BIND_FLAG = 1, @@ -42,9 +42,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp var bind = rest(function(func, thisArg, partials) { var bitmask = BIND_FLAG; if (partials.length) { - var placeholder = bind.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(bind)); bitmask |= PARTIAL_FLAG; } return createWrapper(func, bitmask, thisArg, partials, holders); diff --git a/bindKey.js b/bindKey.js index ae9be8963..d65175cb8 100644 --- a/bindKey.js +++ b/bindKey.js @@ -1,4 +1,4 @@ -define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) { +define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) { /** Used to compose bitmasks for wrapper metadata. */ var BIND_FLAG = 1, @@ -52,9 +52,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp var bindKey = rest(function(object, key, partials) { var bitmask = BIND_FLAG | BIND_KEY_FLAG; if (partials.length) { - var placeholder = bindKey.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(bindKey)); bitmask |= PARTIAL_FLAG; } return createWrapper(key, bitmask, object, partials, holders); diff --git a/isError.js b/isError.js index 0ef064984..cb7e9d779 100644 --- a/isError.js +++ b/isError.js @@ -33,9 +33,8 @@ define(['./isObjectLike'], function(isObjectLike) { if (!isObjectLike(value)) { return false; } - var Ctor = value.constructor; return (objectToString.call(value) == errorTag) || - (typeof Ctor == 'function' && objectToString.call(Ctor.prototype) == errorTag); + (typeof value.message == 'string' && typeof value.name == 'string'); } return isError; diff --git a/isPlainObject.js b/isPlainObject.js index e677fb177..0491de540 100644 --- a/isPlainObject.js +++ b/isPlainObject.js @@ -53,10 +53,7 @@ define(['./_isHostObject', './isObjectLike'], function(isHostObject, isObjectLik objectToString.call(value) != objectTag || isHostObject(value)) { return false; } - var proto = objectProto; - if (typeof value.constructor == 'function') { - proto = getPrototypeOf(value); - } + var proto = getPrototypeOf(value); if (proto === null) { return true; } diff --git a/main.js b/main.js index 93244a823..f42bf99bb 100644 --- a/main.js +++ b/main.js @@ -1,6 +1,6 @@ /** * @license - * lodash 4.5.0 (Custom Build) + * lodash 4.5.1 (Custom Build) * Build: `lodash exports="amd" -d -o ./main.js` * Copyright 2012-2016 The Dojo Foundation * Based on Underscore.js 1.8.3 @@ -13,7 +13,7 @@ var undefined; /** Used as the semantic version number. */ - var VERSION = '4.5.0'; + var VERSION = '4.5.1'; /** Used to compose bitmasks for wrapper metadata. */ var BIND_FLAG = 1, @@ -1033,6 +1033,26 @@ return object.index - other.index; } + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + result++; + } + } + return result; + } + /** * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters. * @@ -1171,7 +1191,8 @@ result = []; while (++index < length) { - if (array[index] === placeholder) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { array[index] = PLACEHOLDER; result[++resIndex] = index; } @@ -2161,8 +2182,7 @@ */ function assignValue(object, key, value) { var objValue = object[key]; - if ((!eq(objValue, value) || - (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) || + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || (value === undefined && !(key in object))) { object[key] = value; } @@ -3872,23 +3892,28 @@ * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to prepend to those provided. * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. * @returns {Array} Returns the new array of composed arguments. */ - function composeArgs(args, partials, holders) { - var holdersLength = holders.length, - argsIndex = -1, - argsLength = nativeMax(args.length - holdersLength, 0), + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, - result = Array(leftLength + argsLength); + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; while (++leftIndex < leftLength) { result[leftIndex] = partials[leftIndex]; } while (++argsIndex < holdersLength) { - result[holders[argsIndex]] = args[argsIndex]; + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } } - while (argsLength--) { + while (rangeLength--) { result[leftIndex++] = args[argsIndex++]; } return result; @@ -3902,18 +3927,21 @@ * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to append to those provided. * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. * @returns {Array} Returns the new array of composed arguments. */ - function composeArgsRight(args, partials, holders) { - var holdersIndex = -1, + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, holdersLength = holders.length, - argsIndex = -1, - argsLength = nativeMax(args.length - holdersLength, 0), rightIndex = -1, rightLength = partials.length, - result = Array(argsLength + rightLength); + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; - while (++argsIndex < argsLength) { + while (++argsIndex < rangeLength) { result[argsIndex] = args[argsIndex]; } var offset = argsIndex; @@ -3921,7 +3949,9 @@ result[offset + rightIndex] = partials[rightIndex]; } while (++holdersIndex < holdersLength) { - result[offset + holders[holdersIndex]] = args[argsIndex++]; + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } } return result; } @@ -4205,10 +4235,9 @@ function wrapper() { var length = arguments.length, - index = length, args = Array(length), - fn = (this && this !== root && this instanceof wrapper) ? Ctor : func, - placeholder = lodash.placeholder || wrapper.placeholder; + index = length, + placeholder = getPlaceholder(wrapper); while (index--) { args[index] = arguments[index]; @@ -4218,9 +4247,13 @@ : replaceHolders(args, placeholder); length -= holders.length; - return length < arity - ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length) - : apply(fn, this, args); + if (length < arity) { + return createRecurryWrapper( + func, bitmask, createHybridWrapper, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); } return wrapper; } @@ -4308,8 +4341,7 @@ var isAry = bitmask & ARY_FLAG, isBind = bitmask & BIND_FLAG, isBindKey = bitmask & BIND_KEY_FLAG, - isCurry = bitmask & CURRY_FLAG, - isCurryRight = bitmask & CURRY_RIGHT_FLAG, + isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG), isFlip = bitmask & FLIP_FLAG, Ctor = isBindKey ? undefined : createCtorWrapper(func); @@ -4321,33 +4353,34 @@ while (index--) { args[index] = arguments[index]; } + if (isCurried) { + var placeholder = getPlaceholder(wrapper), + holdersCount = countHolders(args, placeholder); + } if (partials) { - args = composeArgs(args, partials, holders); + args = composeArgs(args, partials, holders, isCurried); } if (partialsRight) { - args = composeArgsRight(args, partialsRight, holdersRight); + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); } - if (isCurry || isCurryRight) { - var placeholder = lodash.placeholder || wrapper.placeholder, - argsHolders = replaceHolders(args, placeholder); - - length -= argsHolders.length; - if (length < arity) { - return createRecurryWrapper( - func, bitmask, createHybridWrapper, placeholder, thisArg, args, - argsHolders, argPos, ary, arity - length - ); - } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurryWrapper( + func, bitmask, createHybridWrapper, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); } var thisBinding = isBind ? thisArg : this, fn = isBindKey ? thisBinding[func] : func; + length = args.length; if (argPos) { args = reorder(args, argPos); - } else if (isFlip && args.length > 1) { + } else if (isFlip && length > 1) { args.reverse(); } - if (isAry && ary < args.length) { + if (isAry && ary < length) { args.length = ary; } if (this && this !== root && this instanceof wrapper) { @@ -4485,7 +4518,7 @@ * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {Function} wrapFunc The function to create the `func` wrapper. - * @param {*} placeholder The placeholder to replace. + * @param {*} placeholder The placeholder value. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [holders] The `partials` placeholder indexes. @@ -4497,7 +4530,7 @@ function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { var isCurry = bitmask & CURRY_FLAG, newArgPos = argPos ? copyArray(argPos) : undefined, - newsHolders = isCurry ? holders : undefined, + newHolders = isCurry ? holders : undefined, newHoldersRight = isCurry ? undefined : holders, newPartials = isCurry ? partials : undefined, newPartialsRight = isCurry ? undefined : partials; @@ -4509,7 +4542,7 @@ bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG); } var newData = [ - func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, newHoldersRight, newArgPos, ary, arity ]; @@ -4930,6 +4963,18 @@ return isNative(value) ? value : undefined; } + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getPlaceholder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + /** * Creates an array of the own symbol properties of `object`. * @@ -5056,11 +5101,9 @@ * @returns {Object} Returns the initialized clone. */ function initCloneObject(object) { - if (isPrototype(object)) { - return {}; - } - var Ctor = object.constructor; - return baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined); + return (isFunction(object.constructor) && !isPrototype(object)) + ? baseCreate(getPrototypeOf(object)) + : {}; } /** @@ -5207,7 +5250,7 @@ */ function isPrototype(value) { var Ctor = value && value.constructor, - proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + proto = (isFunction(Ctor) && Ctor.prototype) || objectProto; return value === proto; } @@ -5246,9 +5289,9 @@ isCommon = newBitmask < (BIND_FLAG | BIND_KEY_FLAG | 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 == 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)); // Exit early if metadata can't be merged. if (!(isCommon || isCombo)) { @@ -5258,7 +5301,7 @@ if (srcBitmask & BIND_FLAG) { data[2] = source[2]; // Set when currying a bound function. - newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG; + newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG; } // Compose partial arguments. var value = source[3]; @@ -6190,7 +6233,8 @@ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * for equality comparisons. * - * **Note:** Unlike `_.without`, this method mutates `array`. + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. * * @static * @memberOf _ @@ -6295,10 +6339,11 @@ /** * Removes all elements from `array` that `predicate` returns truthy for - * and returns an array of the removed elements. The predicate is invoked with - * three arguments: (value, index, array). + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). * - * **Note:** Unlike `_.filter`, this method mutates `array`. + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. * * @static * @memberOf _ @@ -8461,9 +8506,7 @@ var bind = rest(function(func, thisArg, partials) { var bitmask = BIND_FLAG; if (partials.length) { - var placeholder = lodash.placeholder || bind.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(bind)); bitmask |= PARTIAL_FLAG; } return createWrapper(func, bitmask, thisArg, partials, holders); @@ -8516,9 +8559,7 @@ var bindKey = rest(function(object, key, partials) { var bitmask = BIND_FLAG | BIND_KEY_FLAG; if (partials.length) { - var placeholder = lodash.placeholder || bindKey.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(bindKey)); bitmask |= PARTIAL_FLAG; } return createWrapper(key, bitmask, object, partials, holders); @@ -8567,7 +8608,7 @@ function curry(func, arity, guard) { arity = guard ? undefined : arity; var result = createWrapper(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); - result.placeholder = lodash.placeholder || curry.placeholder; + result.placeholder = curry.placeholder; return result; } @@ -8611,7 +8652,7 @@ function curryRight(func, arity, guard) { arity = guard ? undefined : arity; var result = createWrapper(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); - result.placeholder = lodash.placeholder || curryRight.placeholder; + result.placeholder = curryRight.placeholder; return result; } @@ -9035,9 +9076,7 @@ * // => 'hi fred' */ var partial = rest(function(func, partials) { - var placeholder = lodash.placeholder || partial.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(partial)); return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders); }); @@ -9073,9 +9112,7 @@ * // => 'hello fred' */ var partialRight = rest(function(func, partials) { - var placeholder = lodash.placeholder || partialRight.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(partialRight)); return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders); }); @@ -9874,9 +9911,8 @@ if (!isObjectLike(value)) { return false; } - var Ctor = value.constructor; return (objectToString.call(value) == errorTag) || - (typeof Ctor == 'function' && objectToString.call(Ctor.prototype) == errorTag); + (typeof value.message == 'string' && typeof value.name == 'string'); } /** @@ -10289,10 +10325,7 @@ objectToString.call(value) != objectTag || isHostObject(value)) { return false; } - var proto = objectProto; - if (typeof value.constructor == 'function') { - proto = getPrototypeOf(value); - } + var proto = getPrototypeOf(value); if (proto === null) { return true; } @@ -11506,7 +11539,8 @@ /** * The opposite of `_.mapValues`; this method creates an object with the * same values as `object` and keys generated by running each own enumerable - * property of `object` through `iteratee`. + * property of `object` through `iteratee`. The iteratee is invoked with + * three arguments: (value, key, object). * * @static * @memberOf _ @@ -11534,7 +11568,7 @@ /** * Creates an object with the same keys as `object` and values generated by * running each own enumerable property of `object` through `iteratee`. The - * iteratee function is invoked with three arguments: (value, key, object). + * iteratee is invoked with three arguments: (value, key, object). * * @static * @memberOf _ @@ -11667,9 +11701,10 @@ }); /** - * The opposite of `_.pickBy`; this method creates an object composed of the - * own and inherited enumerable properties of `object` that `predicate` - * doesn't return truthy for. + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable properties of `object` that `predicate` + * doesn't return truthy for. The predicate is invoked with two arguments: + * (value, key). * * @static * @memberOf _ @@ -11685,7 +11720,7 @@ * // => { 'b': '2' } */ function omitBy(object, predicate) { - predicate = getIteratee(predicate, 2); + predicate = getIteratee(predicate); return basePickBy(object, function(value, key) { return !predicate(value, key); }); @@ -11730,7 +11765,7 @@ * // => { 'a': 1, 'c': 3 } */ function pickBy(object, predicate) { - return object == null ? {} : basePickBy(object, getIteratee(predicate, 2)); + return object == null ? {} : basePickBy(object, getIteratee(predicate)); } /** @@ -11920,7 +11955,7 @@ if (isArr) { accumulator = isArray(object) ? new Ctor : []; } else { - accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined); + accumulator = isFunction(Ctor) ? baseCreate(getPrototypeOf(object)) : {}; } } else { accumulator = {}; @@ -13916,8 +13951,8 @@ var rangeRight = createRange(true); /** - * Invokes the iteratee function `n` times, returning an array of the results - * of each invocation. The iteratee is invoked with one argument; (index). + * Invokes the iteratee `n` times, returning an array of the results of + * each invocation. The iteratee is invoked with one argument; (index). * * @static * @memberOf _ diff --git a/mapKeys.js b/mapKeys.js index 3b8c589c8..6d2e4d2c8 100644 --- a/mapKeys.js +++ b/mapKeys.js @@ -3,7 +3,8 @@ define(['./_baseForOwn', './_baseIteratee'], function(baseForOwn, baseIteratee) /** * The opposite of `_.mapValues`; this method creates an object with the * same values as `object` and keys generated by running each own enumerable - * property of `object` through `iteratee`. + * property of `object` through `iteratee`. The iteratee is invoked with + * three arguments: (value, key, object). * * @static * @memberOf _ diff --git a/mapValues.js b/mapValues.js index 5587f14f6..97c699776 100644 --- a/mapValues.js +++ b/mapValues.js @@ -3,7 +3,7 @@ define(['./_baseForOwn', './_baseIteratee'], function(baseForOwn, baseIteratee) /** * Creates an object with the same keys as `object` and values generated by * running each own enumerable property of `object` through `iteratee`. The - * iteratee function is invoked with three arguments: (value, key, object). + * iteratee is invoked with three arguments: (value, key, object). * * @static * @memberOf _ diff --git a/omitBy.js b/omitBy.js index 9261d5e04..2c72b1f76 100644 --- a/omitBy.js +++ b/omitBy.js @@ -1,9 +1,10 @@ define(['./_baseIteratee', './_basePickBy'], function(baseIteratee, basePickBy) { /** - * The opposite of `_.pickBy`; this method creates an object composed of the - * own and inherited enumerable properties of `object` that `predicate` - * doesn't return truthy for. + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable properties of `object` that `predicate` + * doesn't return truthy for. The predicate is invoked with two arguments: + * (value, key). * * @static * @memberOf _ @@ -19,7 +20,7 @@ define(['./_baseIteratee', './_basePickBy'], function(baseIteratee, basePickBy) * // => { 'b': '2' } */ function omitBy(object, predicate) { - predicate = baseIteratee(predicate, 2); + predicate = baseIteratee(predicate); return basePickBy(object, function(value, key) { return !predicate(value, key); }); diff --git a/package.json b/package.json index 2dae80f82..9b78992d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lodash-amd", - "version": "4.5.0", + "version": "4.5.1", "description": "Lodash exported as AMD modules.", "homepage": "https://lodash.com/custom-builds", "license": "MIT", diff --git a/partial.js b/partial.js index 3c7a3ce33..6c592224a 100644 --- a/partial.js +++ b/partial.js @@ -1,4 +1,4 @@ -define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) { +define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; @@ -39,9 +39,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp * // => 'hi fred' */ var partial = rest(function(func, partials) { - var placeholder = partial.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(partial)); return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders); }); diff --git a/partialRight.js b/partialRight.js index 0ccf3eee2..bc8169ce9 100644 --- a/partialRight.js +++ b/partialRight.js @@ -1,4 +1,4 @@ -define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapper, replaceHolders, rest) { +define(['./_createWrapper', './_getPlaceholder', './_replaceHolders', './rest'], function(createWrapper, getPlaceholder, replaceHolders, rest) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; @@ -38,9 +38,7 @@ define(['./_createWrapper', './_replaceHolders', './rest'], function(createWrapp * // => 'hello fred' */ var partialRight = rest(function(func, partials) { - var placeholder = partialRight.placeholder, - holders = replaceHolders(partials, placeholder); - + var holders = replaceHolders(partials, getPlaceholder(partialRight)); return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders); }); diff --git a/pickBy.js b/pickBy.js index d42c043be..65f6c6c0d 100644 --- a/pickBy.js +++ b/pickBy.js @@ -18,7 +18,7 @@ define(['./_baseIteratee', './_basePickBy'], function(baseIteratee, basePickBy) * // => { 'a': 1, 'c': 3 } */ function pickBy(object, predicate) { - return object == null ? {} : basePickBy(object, baseIteratee(predicate, 2)); + return object == null ? {} : basePickBy(object, baseIteratee(predicate)); } return pickBy; diff --git a/pull.js b/pull.js index 45b6f89a1..764d0327f 100644 --- a/pull.js +++ b/pull.js @@ -5,7 +5,8 @@ define(['./pullAll', './rest'], function(pullAll, rest) { * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * for equality comparisons. * - * **Note:** Unlike `_.without`, this method mutates `array`. + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. * * @static * @memberOf _ diff --git a/remove.js b/remove.js index cc6eebee1..21413ac04 100644 --- a/remove.js +++ b/remove.js @@ -2,10 +2,11 @@ define(['./_baseIteratee', './_basePullAt'], function(baseIteratee, basePullAt) /** * Removes all elements from `array` that `predicate` returns truthy for - * and returns an array of the removed elements. The predicate is invoked with - * three arguments: (value, index, array). + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). * - * **Note:** Unlike `_.filter`, this method mutates `array`. + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. * * @static * @memberOf _ diff --git a/times.js b/times.js index de69c70af..d5a0368c4 100644 --- a/times.js +++ b/times.js @@ -10,8 +10,8 @@ define(['./_baseCastFunction', './_baseTimes', './toInteger'], function(baseCast var nativeMin = Math.min; /** - * Invokes the iteratee function `n` times, returning an array of the results - * of each invocation. The iteratee is invoked with one argument; (index). + * Invokes the iteratee `n` times, returning an array of the results of + * each invocation. The iteratee is invoked with one argument; (index). * * @static * @memberOf _ diff --git a/transform.js b/transform.js index 28e6c506e..a7ff744dc 100644 --- a/transform.js +++ b/transform.js @@ -1,7 +1,7 @@ define(['./_arrayEach', './_baseCreate', './_baseForOwn', './_baseIteratee', './isArray', './isFunction', './isObject', './isTypedArray'], function(arrayEach, baseCreate, baseForOwn, baseIteratee, isArray, isFunction, isObject, isTypedArray) { - /** Used as a safe reference for `undefined` in pre-ES5 environments. */ - var undefined; + /** Built-in value references. */ + var getPrototypeOf = Object.getPrototypeOf; /** * An alternative to `_.reduce`; this method transforms `object` to a new @@ -41,7 +41,7 @@ define(['./_arrayEach', './_baseCreate', './_baseForOwn', './_baseIteratee', './ if (isArr) { accumulator = isArray(object) ? new Ctor : []; } else { - accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined); + accumulator = isFunction(Ctor) ? baseCreate(getPrototypeOf(object)) : {}; } } else { accumulator = {};