diff --git a/README.md b/README.md index afa47f7ca..bd1939f99 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# lodash-amd v4.16.2 +# lodash-amd v4.16.3 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.2-amd) for more details. +See the [package source](https://github.com/lodash/lodash/tree/4.16.3-amd) for more details. diff --git a/_assignMergeValue.js b/_assignMergeValue.js index 1c013c0db..6d21fab36 100644 --- a/_assignMergeValue.js +++ b/_assignMergeValue.js @@ -14,7 +14,7 @@ define(['./_baseAssignValue', './eq'], function(baseAssignValue, eq) { */ function assignMergeValue(object, key, value) { if ((value !== undefined && !eq(object[key], value)) || - (typeof key == 'number' && value === undefined && !(key in object))) { + (value === undefined && !(key in object))) { baseAssignValue(object, key, value); } } diff --git a/_baseAssignValue.js b/_baseAssignValue.js index 82e5d8b94..bc1b81dad 100644 --- a/_baseAssignValue.js +++ b/_baseAssignValue.js @@ -1,7 +1,4 @@ -define([], function() { - - /** Built-in value references. */ - var defineProperty = Object.defineProperty; +define(['./_defineProperty'], function(defineProperty) { /** * The base implementation of `assignValue` and `assignMergeValue` without diff --git a/_baseCreate.js b/_baseCreate.js index 872dc5ba3..d4ec90ff9 100644 --- a/_baseCreate.js +++ b/_baseCreate.js @@ -23,7 +23,7 @@ define(['./isObject'], function(isObject) { if (objectCreate) { return objectCreate(proto); } - object.prototype = prototype; + object.prototype = proto; var result = new object; object.prototype = undefined; return result; diff --git a/_baseIsEqualDeep.js b/_baseIsEqualDeep.js index e003d0753..e6ae0bed4 100644 --- a/_baseIsEqualDeep.js +++ b/_baseIsEqualDeep.js @@ -1,4 +1,4 @@ -define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_getTag', './isArray', './isTypedArray'], function(Stack, equalArrays, equalByTag, equalObjects, getTag, isArray, isTypedArray) { +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; @@ -47,6 +47,13 @@ define(['./_Stack', './_equalArrays', './_equalByTag', './_equalObjects', './_ge othIsObj = othTag == objectTag, isSameTag = objTag == othTag; + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) diff --git a/_baseMergeDeep.js b/_baseMergeDeep.js index edcb6db78..4066c9860 100644 --- a/_baseMergeDeep.js +++ b/_baseMergeDeep.js @@ -1,4 +1,4 @@ -define(['./_assignMergeValue', './_baseClone', './_copyArray', './isArguments', './isArray', './isArrayLikeObject', './isFunction', './isObject', './isPlainObject', './isTypedArray', './toPlainObject'], function(assignMergeValue, baseClone, copyArray, isArguments, isArray, isArrayLikeObject, isFunction, isObject, isPlainObject, isTypedArray, toPlainObject) { +define(['./_assignMergeValue', './_cloneTypedArray', './_copyArray', './_initCloneObject', './isArguments', './isArray', './isArrayLikeObject', './isFunction', './isObject', './isPlainObject', './isTypedArray', './toPlainObject'], function(assignMergeValue, cloneTypedArray, copyArray, initCloneObject, isArguments, isArray, isArrayLikeObject, isFunction, isObject, isPlainObject, isTypedArray, toPlainObject) { /** Used as a safe reference for `undefined` in pre-ES5 environments. */ var undefined; @@ -34,29 +34,32 @@ define(['./_assignMergeValue', './_baseClone', './_copyArray', './isArguments', var isCommon = newValue === undefined; if (isCommon) { + var isArr = isArray(srcValue), + isTyped = !isArr && isTypedArray(srcValue); + newValue = srcValue; - if (isArray(srcValue) || isTypedArray(srcValue)) { + if (isArr || isTyped) { if (isArray(objValue)) { newValue = objValue; } else if (isArrayLikeObject(objValue)) { newValue = copyArray(objValue); } - else { + else if (isTyped) { isCommon = false; - newValue = baseClone(srcValue, true); + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; } } else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; if (isArguments(objValue)) { newValue = toPlainObject(objValue); } else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { - isCommon = false; - newValue = baseClone(srcValue, true); - } - else { - newValue = objValue; + newValue = initCloneObject(srcValue); } } else { diff --git a/_baseSetToString.js b/_baseSetToString.js index 7a51c0d21..d47a53bf7 100644 --- a/_baseSetToString.js +++ b/_baseSetToString.js @@ -1,4 +1,4 @@ -define(['./constant', './identity', './_nativeDefineProperty'], function(constant, identity, nativeDefineProperty) { +define(['./constant', './_defineProperty', './identity'], function(constant, defineProperty, identity) { /** * The base implementation of `setToString` without support for hot loop shorting. @@ -8,8 +8,8 @@ define(['./constant', './identity', './_nativeDefineProperty'], function(constan * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ - var baseSetToString = !nativeDefineProperty ? identity : function(func, string) { - return nativeDefineProperty(func, 'toString', { + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { 'configurable': true, 'enumerable': false, 'value': constant(string), diff --git a/_defineProperty.js b/_defineProperty.js new file mode 100644 index 000000000..3a22aa2d6 --- /dev/null +++ b/_defineProperty.js @@ -0,0 +1,12 @@ +define(['./_getNative'], function(getNative) { + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + return defineProperty; +}); diff --git a/_nativeDefineProperty.js b/_nativeDefineProperty.js deleted file mode 100644 index 638fa9853..000000000 --- a/_nativeDefineProperty.js +++ /dev/null @@ -1,7 +0,0 @@ -define(['./_getNative'], function(getNative) { - - /* Built-in method references that are verified to be native. */ - var nativeDefineProperty = getNative(Object, 'defineProperty'); - - return nativeDefineProperty; -}); diff --git a/isFunction.js b/isFunction.js index e88da4b8f..b8aa55d00 100644 --- a/isFunction.js +++ b/isFunction.js @@ -2,7 +2,8 @@ define(['./isObject'], function(isObject) { /** `Object#toString` result references. */ var funcTag = '[object Function]', - genTag = '[object GeneratorFunction]'; + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -35,7 +36,7 @@ define(['./isObject'], function(isObject) { // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 8-9 which returns 'object' for typed array and other constructors. var tag = isObject(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; + return tag == funcTag || tag == genTag || tag == proxyTag; } return isFunction; diff --git a/main.js b/main.js index 592b9f537..86eaaa365 100644 --- a/main.js +++ b/main.js @@ -13,7 +13,7 @@ var undefined; /** Used as the semantic version number. */ - var VERSION = '4.16.2'; + var VERSION = '4.16.3'; /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; @@ -96,6 +96,7 @@ numberTag = '[object Number]', objectTag = '[object Object]', promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', @@ -1470,7 +1471,6 @@ Symbol = context.Symbol, Uint8Array = context.Uint8Array, allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, - defineProperty = Object.defineProperty, getPrototype = overArg(Object.getPrototypeOf, Object), iteratorSymbol = Symbol ? Symbol.iterator : undefined, objectCreate = Object.create, @@ -1478,6 +1478,14 @@ splice = arrayProto.splice, spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + /** Mocked built-ins. */ var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date && Date.now !== root.Date.now && Date.now, @@ -1504,8 +1512,7 @@ Promise = getNative(context, 'Promise'), Set = getNative(context, 'Set'), WeakMap = getNative(context, 'WeakMap'), - nativeCreate = getNative(Object, 'create'), - nativeDefineProperty = getNative(Object, 'defineProperty'); + nativeCreate = getNative(Object, 'create'); /** Used to store function metadata. */ var metaMap = WeakMap && new WeakMap; @@ -1673,7 +1680,7 @@ if (objectCreate) { return objectCreate(proto); } - object.prototype = prototype; + object.prototype = proto; var result = new object; object.prototype = undefined; return result; @@ -2463,7 +2470,7 @@ */ function assignMergeValue(object, key, value) { if ((value !== undefined && !eq(object[key], value)) || - (typeof key == 'number' && value === undefined && !(key in object))) { + (value === undefined && !(key in object))) { baseAssignValue(object, key, value); } } @@ -3272,6 +3279,13 @@ othIsObj = othTag == objectTag, isSameTag = objTag == othTag; + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) @@ -3617,29 +3631,32 @@ var isCommon = newValue === undefined; if (isCommon) { + var isArr = isArray(srcValue), + isTyped = !isArr && isTypedArray(srcValue); + newValue = srcValue; - if (isArray(srcValue) || isTypedArray(srcValue)) { + if (isArr || isTyped) { if (isArray(objValue)) { newValue = objValue; } else if (isArrayLikeObject(objValue)) { newValue = copyArray(objValue); } - else { + else if (isTyped) { isCommon = false; - newValue = baseClone(srcValue, true); + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; } } else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; if (isArguments(objValue)) { newValue = toPlainObject(objValue); } else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { - isCommon = false; - newValue = baseClone(srcValue, true); - } - else { - newValue = objValue; + newValue = initCloneObject(srcValue); } } else { @@ -3985,8 +4002,8 @@ * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ - var baseSetToString = !nativeDefineProperty ? identity : function(func, string) { - return nativeDefineProperty(func, 'toString', { + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { 'configurable': true, 'enumerable': false, 'value': constant(string), @@ -11556,7 +11573,7 @@ // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 8-9 which returns 'object' for typed array and other constructors. var tag = isObject(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; + return tag == funcTag || tag == genTag || tag == proxyTag; } /** diff --git a/package.json b/package.json index 13ef05820..1fcb449ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lodash-amd", - "version": "4.16.2", + "version": "4.16.3", "description": "Lodash exported as AMD modules.", "keywords": "amd, modules, stdlib, util", "homepage": "https://lodash.com/custom-builds",