Compare commits

...

47 Commits
4.2.1-es ... es

Author SHA1 Message Date
John-David Dalton
abbc90df65 Fix prototype pollution in _.unset and _.omit (#6065)
Prevent prototype pollution on baseUnset function by:
- Blocking "__proto__" if not an own property
- Blocking "constructor.prototype" chains (except when starting at primitive root)
- Skipping non-string keys

See: https://github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg
2025-12-10 07:53:08 -05:00
Benjamin Tan
11eb817cdf Bump to v4.17.21 2021-02-20 23:33:13 +08:00
Benjamin Tan
42e2585e5f Bump to v4.17.20. 2020-12-20 14:19:47 +08:00
John-David Dalton
4d5fdc492f Bump to v4.17.15. 2019-07-17 10:12:50 -07:00
John-David Dalton
15421d13b7 Bump to v4.17.14. 2019-07-10 06:35:20 -07:00
John-David Dalton
078664194c Bump to v4.17.13. 2019-07-09 15:20:44 -07:00
John-David Dalton
51c827ffd9 Bump to v4.17.12. 2019-07-09 13:46:20 -07:00
John-David Dalton
349273409f Bump to v4.17.11. 2018-09-11 22:42:07 -07:00
John-David Dalton
cc483eda91 Bump to v4.17.10. 2018-04-24 15:35:01 -07:00
John-David Dalton
f73db1f02c Bump to v4.17.9. 2018-04-24 10:37:38 -07:00
John-David Dalton
546e924be3 Bump to v4.17.8. 2018-03-27 11:19:36 -07:00
John-David Dalton
b5a07bdc4b Bump to v4.17.7. 2018-03-07 15:13:19 -08:00
John-David Dalton
ae7044c0d3 Bump to v4.17.6. 2018-03-07 13:24:12 -08:00
John-David Dalton
edff3e8d25 Bump to v4.17.5. 2018-02-03 16:38:58 -08:00
John-David Dalton
528e134995 Bump to v4.17.4. 2016-12-31 13:35:01 -06:00
John-David Dalton
f71a7a04b5 Bump to v4.17.3. 2016-12-21 15:53:05 -06:00
John-David Dalton
035ce4f44c Bump to v4.17.2. 2016-11-15 22:22:55 -08:00
John-David Dalton
95f47b6d19 Bump to v4.17.1. 2016-11-14 20:56:46 -08:00
John-David Dalton
b1ff59b3ea Bump to v4.17.0. 2016-11-13 22:50:00 -08:00
John-David Dalton
50aaa95bca Bump to v4.16.6. 2016-10-31 21:08:04 -07:00
John-David Dalton
be1e9a3170 Bump to v4.16.5. 2016-10-30 20:08:19 -07:00
John-David Dalton
6778141728 Bump to v4.16.4. 2016-10-05 19:32:45 -07:00
John-David Dalton
d9fd2bdf9c Bump to v4.16.3. 2016-10-02 21:54:44 -07:00
John-David Dalton
ab95e7dde7 Bump to v4.16.2. 2016-09-25 13:40:14 -07:00
John-David Dalton
5425ef9a59 Bump to v4.16.1. 2016-09-20 09:50:26 -07:00
John-David Dalton
94ac73824f Bump to v4.16.0. 2016-09-17 22:28:43 -07:00
John-David Dalton
28663c1e27 Bump to v4.15.0. 2016-08-11 23:29:12 -07:00
John-David Dalton
cbf5cb1162 Bump to v4.14.2. 2016-08-07 21:23:34 -07:00
John-David Dalton
6d4f76888f Bump to v4.14.1. 2016-07-28 23:40:26 -07:00
John-David Dalton
51ed7e7707 Bump to v4.14.0. 2016-07-24 09:52:22 -07:00
John-David Dalton
6b3e0da93c Bump to v4.13.1. 2016-05-23 12:31:09 -07:00
John-David Dalton
35cdf6513b Bump to v4.13.0. 2016-05-22 19:35:24 -07:00
John-David Dalton
07c844053e Bump to v4.12.0. 2016-05-08 12:23:20 -07:00
John-David Dalton
35805ec250 Bump to v4.11.2. 2016-04-21 07:06:47 -07:00
John-David Dalton
692aabae13 Bump to v4.11.1. 2016-04-13 21:03:52 -07:00
John-David Dalton
764eccfdc0 Bump to v4.11.0. 2016-04-13 10:21:06 -07:00
John-David Dalton
f10bb8b80b Bump to v4.10.0. 2016-04-10 22:55:59 -07:00
John-David Dalton
b7e3b3febd Bump to v4.9.0. 2016-04-08 01:32:35 -07:00
John-David Dalton
e8cff1ef54 Bump to v4.8.2. 2016-04-04 13:55:37 -07:00
John-David Dalton
723c02dbfa Bump to v4.8.0. 2016-04-03 23:03:03 -07:00
John-David Dalton
ce0b51888c Bump to v4.7.0. 2016-03-31 00:36:47 -07:00
John-David Dalton
a83b4ebd53 Bump to v4.6.1. 2016-03-01 22:13:24 -08:00
John-David Dalton
7da4c55415 Bump to v4.6.0. 2016-02-29 23:41:02 -08:00
John-David Dalton
9055c4e483 Bump to v4.5.1. 2016-02-21 20:49:38 -08:00
John-David Dalton
2b1eb3f480 Bump to v4.5.0. 2016-02-16 23:15:59 -08:00
John-David Dalton
94ba2e24e8 Bump to v4.4.0. 2016-02-15 20:25:07 -08:00
John-David Dalton
8bff780a94 Bump to v4.3.0. 2016-02-08 00:50:21 -08:00
664 changed files with 8954 additions and 5497 deletions

29
LICENSE
View File

@@ -1,7 +1,17 @@
Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas,
Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/> DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including "Software"), to deal in the Software without restriction, including
@@ -20,3 +30,18 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.
CC0: http://creativecommons.org/publicdomain/zero/1.0/
====
Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.

View File

@@ -1,10 +1,10 @@
# lodash-es v4.2.1 # lodash-es v4.17.21
The [lodash](https://lodash.com/) library exported as [ES](http://www.ecma-international.org/ecma-262/6.0/) modules. The [Lodash](https://lodash.com/) library exported as [ES](http://www.ecma-international.org/ecma-262/6.0/) modules.
Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli): Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
```bash ```shell
$ lodash modularize exports=es -o ./ $ lodash modularize exports=es -o ./
``` ```
See the [package source](https://github.com/lodash/lodash/tree/4.2.1-es) for more details. See the [package source](https://github.com/lodash/lodash/tree/4.17.21-es) for more details.

7
_DataView.js Normal file
View File

@@ -0,0 +1,7 @@
import getNative from './_getNative.js';
import root from './_root.js';
/* Built-in method references that are verified to be native. */
var DataView = getNative(root, 'DataView');
export default DataView;

View File

@@ -1,17 +1,32 @@
import nativeCreate from './_nativeCreate'; import hashClear from './_hashClear.js';
import hashDelete from './_hashDelete.js';
/** Used for built-in method references. */ import hashGet from './_hashGet.js';
var objectProto = Object.prototype; import hashHas from './_hashHas.js';
import hashSet from './_hashSet.js';
/** /**
* Creates an hash object. * Creates a hash object.
* *
* @private * @private
* @returns {Object} Returns the new hash object. * @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/ */
function Hash() {} function Hash(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
// Avoid inheriting from `Object.prototype` when possible. this.clear();
Hash.prototype = nativeCreate ? nativeCreate(null) : objectProto; while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
export default Hash; export default Hash;

View File

@@ -1,5 +1,5 @@
import baseCreate from './_baseCreate'; import baseCreate from './_baseCreate.js';
import baseLodash from './_baseLodash'; import baseLodash from './_baseLodash.js';
/** Used as references for the maximum length and index of an array. */ /** Used as references for the maximum length and index of an array. */
var MAX_ARRAY_LENGTH = 4294967295; var MAX_ARRAY_LENGTH = 4294967295;
@@ -8,6 +8,7 @@ var MAX_ARRAY_LENGTH = 4294967295;
* Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
* *
* @private * @private
* @constructor
* @param {*} value The value to wrap. * @param {*} value The value to wrap.
*/ */
function LazyWrapper(value) { function LazyWrapper(value) {
@@ -20,6 +21,7 @@ function LazyWrapper(value) {
this.__views__ = []; this.__views__ = [];
} }
// Ensure `LazyWrapper` is an instance of `baseLodash`.
LazyWrapper.prototype = baseCreate(baseLodash.prototype); LazyWrapper.prototype = baseCreate(baseLodash.prototype);
LazyWrapper.prototype.constructor = LazyWrapper; LazyWrapper.prototype.constructor = LazyWrapper;

32
_ListCache.js Normal file
View File

@@ -0,0 +1,32 @@
import listCacheClear from './_listCacheClear.js';
import listCacheDelete from './_listCacheDelete.js';
import listCacheGet from './_listCacheGet.js';
import listCacheHas from './_listCacheHas.js';
import listCacheSet from './_listCacheSet.js';
/**
* Creates an list cache object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function ListCache(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
export default ListCache;

View File

@@ -1,12 +1,12 @@
import baseCreate from './_baseCreate'; import baseCreate from './_baseCreate.js';
import baseLodash from './_baseLodash'; import baseLodash from './_baseLodash.js';
/** /**
* The base constructor for creating `lodash` wrapper objects. * The base constructor for creating `lodash` wrapper objects.
* *
* @private * @private
* @param {*} value The value to wrap. * @param {*} value The value to wrap.
* @param {boolean} [chainAll] Enable chaining for all wrapper methods. * @param {boolean} [chainAll] Enable explicit method chain sequences.
*/ */
function LodashWrapper(value, chainAll) { function LodashWrapper(value, chainAll) {
this.__wrapped__ = value; this.__wrapped__ = value;

View File

@@ -1,5 +1,5 @@
import getNative from './_getNative'; import getNative from './_getNative.js';
import root from './_root'; import root from './_root.js';
/* Built-in method references that are verified to be native. */ /* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map'); var Map = getNative(root, 'Map');

View File

@@ -1,31 +1,32 @@
import mapClear from './_mapClear'; import mapCacheClear from './_mapCacheClear.js';
import mapDelete from './_mapDelete'; import mapCacheDelete from './_mapCacheDelete.js';
import mapGet from './_mapGet'; import mapCacheGet from './_mapCacheGet.js';
import mapHas from './_mapHas'; import mapCacheHas from './_mapCacheHas.js';
import mapSet from './_mapSet'; import mapCacheSet from './_mapCacheSet.js';
/** /**
* Creates a map cache object to store key-value pairs. * Creates a map cache object to store key-value pairs.
* *
* @private * @private
* @param {Array} [values] The values to cache. * @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/ */
function MapCache(values) { function MapCache(entries) {
var index = -1, var index = -1,
length = values ? values.length : 0; length = entries == null ? 0 : entries.length;
this.clear(); this.clear();
while (++index < length) { while (++index < length) {
var entry = values[index]; var entry = entries[index];
this.set(entry[0], entry[1]); this.set(entry[0], entry[1]);
} }
} }
// Add functions to the `MapCache`. // Add methods to `MapCache`.
MapCache.prototype.clear = mapClear; MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapDelete; MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapGet; MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapHas; MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapSet; MapCache.prototype.set = mapCacheSet;
export default MapCache; export default MapCache;

7
_Promise.js Normal file
View File

@@ -0,0 +1,7 @@
import getNative from './_getNative.js';
import root from './_root.js';
/* Built-in method references that are verified to be native. */
var Promise = getNative(root, 'Promise');
export default Promise;

View File

@@ -1,6 +0,0 @@
import root from './_root';
/** Built-in value references. */
var Reflect = root.Reflect;
export default Reflect;

View File

@@ -1,5 +1,5 @@
import getNative from './_getNative'; import getNative from './_getNative.js';
import root from './_root'; import root from './_root.js';
/* Built-in method references that are verified to be native. */ /* Built-in method references that are verified to be native. */
var Set = getNative(root, 'Set'); var Set = getNative(root, 'Set');

View File

@@ -1,24 +1,27 @@
import MapCache from './_MapCache'; import MapCache from './_MapCache.js';
import cachePush from './_cachePush'; import setCacheAdd from './_setCacheAdd.js';
import setCacheHas from './_setCacheHas.js';
/** /**
* *
* Creates a set cache object to store unique values. * Creates an array cache object to store unique values.
* *
* @private * @private
* @constructor
* @param {Array} [values] The values to cache. * @param {Array} [values] The values to cache.
*/ */
function SetCache(values) { function SetCache(values) {
var index = -1, var index = -1,
length = values ? values.length : 0; length = values == null ? 0 : values.length;
this.__data__ = new MapCache; this.__data__ = new MapCache;
while (++index < length) { while (++index < length) {
this.push(values[index]); this.add(values[index]);
} }
} }
// Add functions to the `SetCache`. // Add methods to `SetCache`.
SetCache.prototype.push = cachePush; SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
export default SetCache; export default SetCache;

View File

@@ -1,27 +1,23 @@
import stackClear from './_stackClear'; import ListCache from './_ListCache.js';
import stackDelete from './_stackDelete'; import stackClear from './_stackClear.js';
import stackGet from './_stackGet'; import stackDelete from './_stackDelete.js';
import stackHas from './_stackHas'; import stackGet from './_stackGet.js';
import stackSet from './_stackSet'; import stackHas from './_stackHas.js';
import stackSet from './_stackSet.js';
/** /**
* Creates a stack cache object to store key-value pairs. * Creates a stack cache object to store key-value pairs.
* *
* @private * @private
* @param {Array} [values] The values to cache. * @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/ */
function Stack(values) { function Stack(entries) {
var index = -1, var data = this.__data__ = new ListCache(entries);
length = values ? values.length : 0; this.size = data.size;
this.clear();
while (++index < length) {
var entry = values[index];
this.set(entry[0], entry[1]);
}
} }
// Add functions to the `Stack` cache. // Add methods to `Stack`.
Stack.prototype.clear = stackClear; Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete; Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet; Stack.prototype.get = stackGet;

View File

@@ -1,4 +1,4 @@
import root from './_root'; import root from './_root.js';
/** Built-in value references. */ /** Built-in value references. */
var Symbol = root.Symbol; var Symbol = root.Symbol;

View File

@@ -1,4 +1,4 @@
import root from './_root'; import root from './_root.js';
/** Built-in value references. */ /** Built-in value references. */
var Uint8Array = root.Uint8Array; var Uint8Array = root.Uint8Array;

View File

@@ -1,5 +1,5 @@
import getNative from './_getNative'; import getNative from './_getNative.js';
import root from './_root'; import root from './_root.js';
/* Built-in method references that are verified to be native. */ /* Built-in method references that are verified to be native. */
var WeakMap = getNative(root, 'WeakMap'); var WeakMap = getNative(root, 'WeakMap');

View File

@@ -7,6 +7,7 @@
* @returns {Object} Returns `map`. * @returns {Object} Returns `map`.
*/ */
function addMapEntry(map, pair) { function addMapEntry(map, pair) {
// Don't return `map.set` because it's not chainable in IE 11.
map.set(pair[0], pair[1]); map.set(pair[0], pair[1]);
return map; return map;
} }

View File

@@ -7,6 +7,7 @@
* @returns {Object} Returns `set`. * @returns {Object} Returns `set`.
*/ */
function addSetEntry(set, value) { function addSetEntry(set, value) {
// Don't return `set.add` because it's not chainable in IE 11.
set.add(value); set.add(value);
return set; return set;
} }

View File

@@ -5,12 +5,11 @@
* @private * @private
* @param {Function} func The function to invoke. * @param {Function} func The function to invoke.
* @param {*} thisArg The `this` binding of `func`. * @param {*} thisArg The `this` binding of `func`.
* @param {...*} args The arguments to invoke `func` with. * @param {Array} args The arguments to invoke `func` with.
* @returns {*} Returns the result of `func`. * @returns {*} Returns the result of `func`.
*/ */
function apply(func, thisArg, args) { function apply(func, thisArg, args) {
var length = args.length; switch (args.length) {
switch (length) {
case 0: return func.call(thisArg); case 0: return func.call(thisArg);
case 1: return func.call(thisArg, args[0]); case 1: return func.call(thisArg, args[0]);
case 2: return func.call(thisArg, args[0], args[1]); case 2: return func.call(thisArg, args[0], args[1]);

View File

@@ -2,7 +2,7 @@
* A specialized version of `baseAggregator` for arrays. * A specialized version of `baseAggregator` for arrays.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} setter The function to set `accumulator` values. * @param {Function} setter The function to set `accumulator` values.
* @param {Function} iteratee The iteratee to transform keys. * @param {Function} iteratee The iteratee to transform keys.
* @param {Object} accumulator The initial aggregated object. * @param {Object} accumulator The initial aggregated object.
@@ -10,7 +10,7 @@
*/ */
function arrayAggregator(array, setter, iteratee, accumulator) { function arrayAggregator(array, setter, iteratee, accumulator) {
var index = -1, var index = -1,
length = array.length; length = array == null ? 0 : array.length;
while (++index < length) { while (++index < length) {
var value = array[index]; var value = array[index];

View File

@@ -1,25 +0,0 @@
/**
* Creates a new array concatenating `array` with `other`.
*
* @private
* @param {Array} array The first array to concatenate.
* @param {Array} other The second array to concatenate.
* @returns {Array} Returns the new concatenated array.
*/
function arrayConcat(array, other) {
var index = -1,
length = array.length,
othIndex = -1,
othLength = other.length,
result = Array(length + othLength);
while (++index < length) {
result[index] = array[index];
}
while (++othIndex < othLength) {
result[index++] = other[othIndex];
}
return result;
}
export default arrayConcat;

View File

@@ -3,13 +3,13 @@
* iteratee shorthands. * iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns `array`. * @returns {Array} Returns `array`.
*/ */
function arrayEach(array, iteratee) { function arrayEach(array, iteratee) {
var index = -1, var index = -1,
length = array.length; length = array == null ? 0 : array.length;
while (++index < length) { while (++index < length) {
if (iteratee(array[index], index, array) === false) { if (iteratee(array[index], index, array) === false) {

View File

@@ -3,12 +3,12 @@
* iteratee shorthands. * iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns `array`. * @returns {Array} Returns `array`.
*/ */
function arrayEachRight(array, iteratee) { function arrayEachRight(array, iteratee) {
var length = array.length; var length = array == null ? 0 : array.length;
while (length--) { while (length--) {
if (iteratee(array[length], length, array) === false) { if (iteratee(array[length], length, array) === false) {

View File

@@ -3,13 +3,14 @@
* iteratee shorthands. * iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if all elements pass the predicate check, else `false`. * @returns {boolean} Returns `true` if all elements pass the predicate check,
* else `false`.
*/ */
function arrayEvery(array, predicate) { function arrayEvery(array, predicate) {
var index = -1, var index = -1,
length = array.length; length = array == null ? 0 : array.length;
while (++index < length) { while (++index < length) {
if (!predicate(array[index], index, array)) { if (!predicate(array[index], index, array)) {

View File

@@ -3,20 +3,20 @@
* iteratee shorthands. * iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {Array} Returns the new filtered array. * @returns {Array} Returns the new filtered array.
*/ */
function arrayFilter(array, predicate) { function arrayFilter(array, predicate) {
var index = -1, var index = -1,
length = array.length, length = array == null ? 0 : array.length,
resIndex = -1, resIndex = 0,
result = []; result = [];
while (++index < length) { while (++index < length) {
var value = array[index]; var value = array[index];
if (predicate(value, index, array)) { if (predicate(value, index, array)) {
result[++resIndex] = value; result[resIndex++] = value;
} }
} }
return result; return result;

View File

@@ -1,16 +1,17 @@
import baseIndexOf from './_baseIndexOf'; import baseIndexOf from './_baseIndexOf.js';
/** /**
* A specialized version of `_.includes` for arrays without support for * A specialized version of `_.includes` for arrays without support for
* specifying an index to search from. * specifying an index to search from.
* *
* @private * @private
* @param {Array} array The array to search. * @param {Array} [array] The array to inspect.
* @param {*} target The value to search for. * @param {*} target The value to search for.
* @returns {boolean} Returns `true` if `target` is found, else `false`. * @returns {boolean} Returns `true` if `target` is found, else `false`.
*/ */
function arrayIncludes(array, value) { function arrayIncludes(array, value) {
return !!array.length && baseIndexOf(array, value, 0) > -1; var length = array == null ? 0 : array.length;
return !!length && baseIndexOf(array, value, 0) > -1;
} }
export default arrayIncludes; export default arrayIncludes;

View File

@@ -1,16 +1,15 @@
/** /**
* A specialized version of `_.includesWith` for arrays without support for * This function is like `arrayIncludes` except that it accepts a comparator.
* specifying an index to search from.
* *
* @private * @private
* @param {Array} array The array to search. * @param {Array} [array] The array to inspect.
* @param {*} target The value to search for. * @param {*} target The value to search for.
* @param {Function} comparator The comparator invoked per element. * @param {Function} comparator The comparator invoked per element.
* @returns {boolean} Returns `true` if `target` is found, else `false`. * @returns {boolean} Returns `true` if `target` is found, else `false`.
*/ */
function arrayIncludesWith(array, value, comparator) { function arrayIncludesWith(array, value, comparator) {
var index = -1, var index = -1,
length = array.length; length = array == null ? 0 : array.length;
while (++index < length) { while (++index < length) {
if (comparator(value, array[index])) { if (comparator(value, array[index])) {

49
_arrayLikeKeys.js Normal file
View File

@@ -0,0 +1,49 @@
import baseTimes from './_baseTimes.js';
import isArguments from './isArguments.js';
import isArray from './isArray.js';
import isBuffer from './isBuffer.js';
import isIndex from './_isIndex.js';
import isTypedArray from './isTypedArray.js';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Creates an array of the enumerable property names of the array-like `value`.
*
* @private
* @param {*} value The value to query.
* @param {boolean} inherited Specify returning inherited property names.
* @returns {Array} Returns the array of property names.
*/
function arrayLikeKeys(value, inherited) {
var isArr = isArray(value),
isArg = !isArr && isArguments(value),
isBuff = !isArr && !isArg && isBuffer(value),
isType = !isArr && !isArg && !isBuff && isTypedArray(value),
skipIndexes = isArr || isArg || isBuff || isType,
result = skipIndexes ? baseTimes(value.length, String) : [],
length = result.length;
for (var key in value) {
if ((inherited || hasOwnProperty.call(value, key)) &&
!(skipIndexes && (
// Safari 9 has enumerable `arguments.length` in strict mode.
key == 'length' ||
// Node.js 0.10 has enumerable non-index properties on buffers.
(isBuff && (key == 'offset' || key == 'parent')) ||
// PhantomJS 2 has enumerable non-index properties on typed arrays.
(isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
// Skip index properties.
isIndex(key, length)
))) {
result.push(key);
}
}
return result;
}
export default arrayLikeKeys;

View File

@@ -3,13 +3,13 @@
* shorthands. * shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array. * @returns {Array} Returns the new mapped array.
*/ */
function arrayMap(array, iteratee) { function arrayMap(array, iteratee) {
var index = -1, var index = -1,
length = array.length, length = array == null ? 0 : array.length,
result = Array(length); result = Array(length);
while (++index < length) { while (++index < length) {

View File

@@ -3,15 +3,16 @@
* iteratee shorthands. * iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @param {*} [accumulator] The initial value. * @param {*} [accumulator] The initial value.
* @param {boolean} [initAccum] Specify using the first element of `array` as the initial value. * @param {boolean} [initAccum] Specify using the first element of `array` as
* the initial value.
* @returns {*} Returns the accumulated value. * @returns {*} Returns the accumulated value.
*/ */
function arrayReduce(array, iteratee, accumulator, initAccum) { function arrayReduce(array, iteratee, accumulator, initAccum) {
var index = -1, var index = -1,
length = array.length; length = array == null ? 0 : array.length;
if (initAccum && length) { if (initAccum && length) {
accumulator = array[++index]; accumulator = array[++index];

View File

@@ -3,14 +3,15 @@
* iteratee shorthands. * iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration. * @param {Function} iteratee The function invoked per iteration.
* @param {*} [accumulator] The initial value. * @param {*} [accumulator] The initial value.
* @param {boolean} [initAccum] Specify using the last element of `array` as the initial value. * @param {boolean} [initAccum] Specify using the last element of `array` as
* the initial value.
* @returns {*} Returns the accumulated value. * @returns {*} Returns the accumulated value.
*/ */
function arrayReduceRight(array, iteratee, accumulator, initAccum) { function arrayReduceRight(array, iteratee, accumulator, initAccum) {
var length = array.length; var length = array == null ? 0 : array.length;
if (initAccum && length) { if (initAccum && length) {
accumulator = array[--length]; accumulator = array[--length];
} }

15
_arraySample.js Normal file
View File

@@ -0,0 +1,15 @@
import baseRandom from './_baseRandom.js';
/**
* A specialized version of `_.sample` for arrays.
*
* @private
* @param {Array} array The array to sample.
* @returns {*} Returns the random element.
*/
function arraySample(array) {
var length = array.length;
return length ? array[baseRandom(0, length - 1)] : undefined;
}
export default arraySample;

17
_arraySampleSize.js Normal file
View File

@@ -0,0 +1,17 @@
import baseClamp from './_baseClamp.js';
import copyArray from './_copyArray.js';
import shuffleSelf from './_shuffleSelf.js';
/**
* A specialized version of `_.sampleSize` for arrays.
*
* @private
* @param {Array} array The array to sample.
* @param {number} n The number of elements to sample.
* @returns {Array} Returns the random elements.
*/
function arraySampleSize(array, n) {
return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
}
export default arraySampleSize;

15
_arrayShuffle.js Normal file
View File

@@ -0,0 +1,15 @@
import copyArray from './_copyArray.js';
import shuffleSelf from './_shuffleSelf.js';
/**
* A specialized version of `_.shuffle` for arrays.
*
* @private
* @param {Array} array The array to shuffle.
* @returns {Array} Returns the new shuffled array.
*/
function arrayShuffle(array) {
return shuffleSelf(copyArray(array));
}
export default arrayShuffle;

View File

@@ -3,13 +3,14 @@
* shorthands. * shorthands.
* *
* @private * @private
* @param {Array} array The array to iterate over. * @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if any element passes the predicate check, else `false`. * @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
*/ */
function arraySome(array, predicate) { function arraySome(array, predicate) {
var index = -1, var index = -1,
length = array.length; length = array == null ? 0 : array.length;
while (++index < length) { while (++index < length) {
if (predicate(array[index], index, array)) { if (predicate(array[index], index, array)) {

12
_asciiSize.js Normal file
View File

@@ -0,0 +1,12 @@
import baseProperty from './_baseProperty.js';
/**
* Gets the size of an ASCII `string`.
*
* @private
* @param {string} string The string inspect.
* @returns {number} Returns the string size.
*/
var asciiSize = baseProperty('length');
export default asciiSize;

12
_asciiToArray.js Normal file
View File

@@ -0,0 +1,12 @@
/**
* Converts an ASCII `string` to an array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the converted array.
*/
function asciiToArray(string) {
return string.split('');
}
export default asciiToArray;

15
_asciiWords.js Normal file
View File

@@ -0,0 +1,15 @@
/** Used to match words composed of alphanumeric characters. */
var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
/**
* Splits an ASCII `string` into an array of its words.
*
* @private
* @param {string} The string to inspect.
* @returns {Array} Returns the words of `string`.
*/
function asciiWords(string) {
return string.match(reAsciiWord) || [];
}
export default asciiWords;

View File

@@ -1,7 +1,9 @@
import eq from './eq'; import baseAssignValue from './_baseAssignValue.js';
import eq from './eq.js';
/** /**
* This function is like `assignValue` except that it doesn't assign `undefined` values. * This function is like `assignValue` except that it doesn't assign
* `undefined` values.
* *
* @private * @private
* @param {Object} object The object to modify. * @param {Object} object The object to modify.
@@ -10,8 +12,8 @@ import eq from './eq';
*/ */
function assignMergeValue(object, key, value) { function assignMergeValue(object, key, value) {
if ((value !== undefined && !eq(object[key], value)) || if ((value !== undefined && !eq(object[key], value)) ||
(typeof key == 'number' && value === undefined && !(key in object))) { (value === undefined && !(key in object))) {
object[key] = value; baseAssignValue(object, key, value);
} }
} }

View File

@@ -1,4 +1,5 @@
import eq from './eq'; import baseAssignValue from './_baseAssignValue.js';
import eq from './eq.js';
/** Used for built-in method references. */ /** Used for built-in method references. */
var objectProto = Object.prototype; var objectProto = Object.prototype;
@@ -8,7 +9,7 @@ var hasOwnProperty = objectProto.hasOwnProperty;
/** /**
* Assigns `value` to `key` of `object` if the existing value is not equivalent * Assigns `value` to `key` of `object` if the existing value is not equivalent
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
* for equality comparisons. * for equality comparisons.
* *
* @private * @private
@@ -18,10 +19,9 @@ var hasOwnProperty = objectProto.hasOwnProperty;
*/ */
function assignValue(object, key, value) { function assignValue(object, key, value) {
var objValue = object[key]; var objValue = object[key];
if ((!eq(objValue, value) || if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
(eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||
(value === undefined && !(key in object))) { (value === undefined && !(key in object))) {
object[key] = value; baseAssignValue(object, key, value);
} }
} }

View File

@@ -1,16 +0,0 @@
import assocIndexOf from './_assocIndexOf';
/**
* Gets the associative array value for `key`.
*
* @private
* @param {Array} array The array to query.
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function assocGet(array, key) {
var index = assocIndexOf(array, key);
return index < 0 ? undefined : array[index][1];
}
export default assocGet;

View File

@@ -1,15 +0,0 @@
import assocIndexOf from './_assocIndexOf';
/**
* Checks if an associative array value for `key` exists.
*
* @private
* @param {Array} array The array to query.
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function assocHas(array, key) {
return assocIndexOf(array, key) > -1;
}
export default assocHas;

View File

@@ -1,11 +1,10 @@
import eq from './eq'; import eq from './eq.js';
/** /**
* Gets the index at which the first occurrence of `key` is found in `array` * Gets the index at which the `key` is found in `array` of key-value pairs.
* of key-value pairs.
* *
* @private * @private
* @param {Array} array The array to search. * @param {Array} array The array to inspect.
* @param {*} key The key to search for. * @param {*} key The key to search for.
* @returns {number} Returns the index of the matched value, else `-1`. * @returns {number} Returns the index of the matched value, else `-1`.
*/ */

View File

@@ -1,20 +0,0 @@
import assocIndexOf from './_assocIndexOf';
/**
* Sets the associative array `key` to `value`.
*
* @private
* @param {Array} array The array to modify.
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
*/
function assocSet(array, key, value) {
var index = assocIndexOf(array, key);
if (index < 0) {
array.push([key, value]);
} else {
array[index][1] = value;
}
}
export default assocSet;

View File

@@ -1,4 +1,4 @@
import baseEach from './_baseEach'; import baseEach from './_baseEach.js';
/** /**
* Aggregates elements of `collection` on `accumulator` with keys transformed * Aggregates elements of `collection` on `accumulator` with keys transformed

View File

@@ -1,5 +1,5 @@
import copyObject from './_copyObject'; import copyObject from './_copyObject.js';
import keys from './keys'; import keys from './keys.js';
/** /**
* The base implementation of `_.assign` without support for multiple sources * The base implementation of `_.assign` without support for multiple sources

17
_baseAssignIn.js Normal file
View File

@@ -0,0 +1,17 @@
import copyObject from './_copyObject.js';
import keysIn from './keysIn.js';
/**
* 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);
}
export default baseAssignIn;

25
_baseAssignValue.js Normal file
View File

@@ -0,0 +1,25 @@
import defineProperty from './_defineProperty.js';
/**
* The base implementation of `assignValue` and `assignMergeValue` without
* value checks.
*
* @private
* @param {Object} object The object to modify.
* @param {string} key The key of the property to assign.
* @param {*} value The value to assign.
*/
function baseAssignValue(object, key, value) {
if (key == '__proto__' && defineProperty) {
defineProperty(object, key, {
'configurable': true,
'enumerable': true,
'value': value,
'writable': true
});
} else {
object[key] = value;
}
}
export default baseAssignValue;

View File

@@ -1,21 +1,21 @@
import get from './get'; import get from './get.js';
/** /**
* The base implementation of `_.at` without support for individual paths. * The base implementation of `_.at` without support for individual paths.
* *
* @private * @private
* @param {Object} object The object to iterate over. * @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 new array of picked elements. * @returns {Array} Returns the picked elements.
*/ */
function baseAt(object, paths) { function baseAt(object, paths) {
var index = -1, var index = -1,
isNil = object == null,
length = paths.length, length = paths.length,
result = Array(length); result = Array(length),
skip = object == null;
while (++index < length) { while (++index < length) {
result[index] = isNil ? undefined : get(object, paths[index]); result[index] = skip ? undefined : get(object, paths[index]);
} }
return result; return result;
} }

View File

@@ -1,5 +1,5 @@
/** /**
* The base implementation of `_.clamp` which doesn't coerce arguments to numbers. * The base implementation of `_.clamp` which doesn't coerce arguments.
* *
* @private * @private
* @param {number} number The number to clamp. * @param {number} number The number to clamp.

View File

@@ -1,17 +1,30 @@
import Stack from './_Stack'; import Stack from './_Stack.js';
import arrayEach from './_arrayEach'; import arrayEach from './_arrayEach.js';
import assignValue from './_assignValue'; import assignValue from './_assignValue.js';
import baseAssign from './_baseAssign'; import baseAssign from './_baseAssign.js';
import baseForOwn from './_baseForOwn'; import baseAssignIn from './_baseAssignIn.js';
import copyArray from './_copyArray'; import cloneBuffer from './_cloneBuffer.js';
import copySymbols from './_copySymbols'; import copyArray from './_copyArray.js';
import getTag from './_getTag'; import copySymbols from './_copySymbols.js';
import initCloneArray from './_initCloneArray'; import copySymbolsIn from './_copySymbolsIn.js';
import initCloneByTag from './_initCloneByTag'; import getAllKeys from './_getAllKeys.js';
import initCloneObject from './_initCloneObject'; import getAllKeysIn from './_getAllKeysIn.js';
import isArray from './isArray'; import getTag from './_getTag.js';
import isHostObject from './_isHostObject'; import initCloneArray from './_initCloneArray.js';
import isObject from './isObject'; import initCloneByTag from './_initCloneByTag.js';
import initCloneObject from './_initCloneObject.js';
import isArray from './isArray.js';
import isBuffer from './isBuffer.js';
import isMap from './isMap.js';
import isObject from './isObject.js';
import isSet from './isSet.js';
import keys from './keys.js';
import keysIn from './keysIn.js';
/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1,
CLONE_FLAT_FLAG = 2,
CLONE_SYMBOLS_FLAG = 4;
/** `Object#toString` result references. */ /** `Object#toString` result references. */
var argsTag = '[object Arguments]', var argsTag = '[object Arguments]',
@@ -31,6 +44,7 @@ var argsTag = '[object Arguments]',
weakMapTag = '[object WeakMap]'; weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]', var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]', float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]', float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]', int8Tag = '[object Int8Array]',
@@ -44,16 +58,16 @@ var arrayBufferTag = '[object ArrayBuffer]',
/** Used to identify `toStringTag` values supported by `_.clone`. */ /** Used to identify `toStringTag` values supported by `_.clone`. */
var cloneableTags = {}; var cloneableTags = {};
cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[argsTag] = cloneableTags[arrayTag] =
cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[boolTag] = cloneableTags[dateTag] =
cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] =
cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] =
cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[int32Tag] = cloneableTags[mapTag] =
cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[numberTag] = cloneableTags[objectTag] =
cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[regexpTag] = cloneableTags[setTag] =
cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[stringTag] = cloneableTags[symbolTag] =
cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
cloneableTags[uint32Tag] = true; cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[errorTag] = cloneableTags[funcTag] =
cloneableTags[weakMapTag] = false; cloneableTags[weakMapTag] = false;
@@ -63,15 +77,22 @@ cloneableTags[weakMapTag] = false;
* *
* @private * @private
* @param {*} value The value to clone. * @param {*} value The value to clone.
* @param {boolean} [isDeep] Specify a deep clone. * @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 {Function} [customizer] The function to customize cloning.
* @param {string} [key] The key of `value`. * @param {string} [key] The key of `value`.
* @param {Object} [object] The parent object of `value`. * @param {Object} [object] The parent object of `value`.
* @param {Object} [stack] Tracks traversed objects and their clone counterparts. * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
* @returns {*} Returns the cloned value. * @returns {*} Returns the cloned value.
*/ */
function baseClone(value, isDeep, customizer, key, object, stack) { function baseClone(value, bitmask, customizer, key, object, stack) {
var result; var result,
isDeep = bitmask & CLONE_DEEP_FLAG,
isFlat = bitmask & CLONE_FLAT_FLAG,
isFull = bitmask & CLONE_SYMBOLS_FLAG;
if (customizer) { if (customizer) {
result = object ? customizer(value, key, object, stack) : customizer(value); result = object ? customizer(value, key, object, stack) : customizer(value);
} }
@@ -91,18 +112,21 @@ function baseClone(value, isDeep, customizer, key, object, stack) {
var tag = getTag(value), var tag = getTag(value),
isFunc = tag == funcTag || tag == genTag; isFunc = tag == funcTag || tag == genTag;
if (isBuffer(value)) {
return cloneBuffer(value, isDeep);
}
if (tag == objectTag || tag == argsTag || (isFunc && !object)) { if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
if (isHostObject(value)) { result = (isFlat || isFunc) ? {} : initCloneObject(value);
return object ? value : {};
}
result = initCloneObject(isFunc ? {} : value);
if (!isDeep) { if (!isDeep) {
return copySymbols(value, baseAssign(result, value)); return isFlat
? copySymbolsIn(value, baseAssignIn(result, value))
: copySymbols(value, baseAssign(result, value));
} }
} else { } else {
return cloneableTags[tag] if (!cloneableTags[tag]) {
? initCloneByTag(value, tag, isDeep) return object ? value : {};
: (object ? value : {}); }
result = initCloneByTag(value, tag, isDeep);
} }
} }
// Check for circular references and return its corresponding clone. // Check for circular references and return its corresponding clone.
@@ -113,11 +137,30 @@ function baseClone(value, isDeep, customizer, key, object, stack) {
} }
stack.set(value, result); stack.set(value, result);
// Recursively populate clone (susceptible to call stack limits). if (isSet(value)) {
(isArr ? arrayEach : baseForOwn)(value, function(subValue, key) { value.forEach(function(subValue) {
assignValue(result, key, baseClone(subValue, isDeep, customizer, key, value, stack)); result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
});
} else if (isMap(value)) {
value.forEach(function(subValue, key) {
result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
});
}
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, bitmask, customizer, key, value, stack));
}); });
return isArr ? result : copySymbols(value, result); return result;
} }
export default baseClone; export default baseClone;

View File

@@ -1,31 +1,17 @@
import keys from './keys'; import baseConformsTo from './_baseConformsTo.js';
import keys from './keys.js';
/** /**
* The base implementation of `_.conforms` which doesn't clone `source`. * The base implementation of `_.conforms` which doesn't clone `source`.
* *
* @private * @private
* @param {Object} source The object of property predicates to conform to. * @param {Object} source The object of property predicates to conform to.
* @returns {Function} Returns the new function. * @returns {Function} Returns the new spec function.
*/ */
function baseConforms(source) { function baseConforms(source) {
var props = keys(source), var props = keys(source);
length = props.length;
return function(object) { return function(object) {
if (object == null) { return baseConformsTo(object, source, props);
return !length;
}
var index = length;
while (index--) {
var key = props[index],
predicate = source[key],
value = object[key];
if ((value === undefined && !(key in Object(object))) || !predicate(value)) {
return false;
}
}
return true;
}; };
} }

27
_baseConformsTo.js Normal file
View File

@@ -0,0 +1,27 @@
/**
* The base implementation of `_.conformsTo` which accepts `props` to check.
*
* @private
* @param {Object} object The object to inspect.
* @param {Object} source The object of property predicates to conform to.
* @returns {boolean} Returns `true` if `object` conforms, else `false`.
*/
function baseConformsTo(object, source, props) {
var length = props.length;
if (object == null) {
return !length;
}
object = Object(object);
while (length--) {
var key = props[length],
predicate = source[key],
value = object[key];
if ((value === undefined && !(key in object)) || !predicate(value)) {
return false;
}
}
return true;
}
export default baseConformsTo;

View File

@@ -1,22 +1,29 @@
import isObject from './isObject'; import isObject from './isObject.js';
/** Built-in value references. */
var objectCreate = Object.create;
/** /**
* The base implementation of `_.create` without support for assigning * The base implementation of `_.create` without support for assigning
* properties to the created object. * properties to the created object.
* *
* @private * @private
* @param {Object} prototype The object to inherit from. * @param {Object} proto The object to inherit from.
* @returns {Object} Returns the new object. * @returns {Object} Returns the new object.
*/ */
var baseCreate = (function() { var baseCreate = (function() {
function object() {} function object() {}
return function(prototype) { return function(proto) {
if (isObject(prototype)) { if (!isObject(proto)) {
object.prototype = prototype; return {};
var result = new object;
object.prototype = undefined;
} }
return result || {}; if (objectCreate) {
return objectCreate(proto);
}
object.prototype = proto;
var result = new object;
object.prototype = undefined;
return result;
}; };
}()); }());

View File

@@ -1,15 +1,15 @@
/** Used as the `TypeError` message for "Functions" methods. */ /** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function'; var FUNC_ERROR_TEXT = 'Expected a function';
/** /**
* The base implementation of `_.delay` and `_.defer` which accepts an array * The base implementation of `_.delay` and `_.defer` which accepts `args`
* of `func` arguments. * to provide to `func`.
* *
* @private * @private
* @param {Function} func The function to delay. * @param {Function} func The function to delay.
* @param {number} wait The number of milliseconds to delay invocation. * @param {number} wait The number of milliseconds to delay invocation.
* @param {Object} args The arguments provide to `func`. * @param {Array} args The arguments to provide to `func`.
* @returns {number} Returns the timer id. * @returns {number|Object} Returns the timer id or timeout object.
*/ */
function baseDelay(func, wait, args) { function baseDelay(func, wait, args) {
if (typeof func != 'function') { if (typeof func != 'function') {

View File

@@ -1,16 +1,16 @@
import SetCache from './_SetCache'; import SetCache from './_SetCache.js';
import arrayIncludes from './_arrayIncludes'; import arrayIncludes from './_arrayIncludes.js';
import arrayIncludesWith from './_arrayIncludesWith'; import arrayIncludesWith from './_arrayIncludesWith.js';
import arrayMap from './_arrayMap'; import arrayMap from './_arrayMap.js';
import baseUnary from './_baseUnary'; import baseUnary from './_baseUnary.js';
import cacheHas from './_cacheHas'; import cacheHas from './_cacheHas.js';
/** Used as the size to enable large array optimizations. */ /** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200; var LARGE_ARRAY_SIZE = 200;
/** /**
* The base implementation of methods like `_.difference` without support for * The base implementation of methods like `_.difference` without support
* excluding multiple arrays or iteratee shorthands. * for excluding multiple arrays or iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to inspect. * @param {Array} array The array to inspect.
@@ -45,8 +45,9 @@ function baseDifference(array, values, iteratee, comparator) {
outer: outer:
while (++index < length) { while (++index < length) {
var value = array[index], var value = array[index],
computed = iteratee ? iteratee(value) : value; computed = iteratee == null ? value : iteratee(value);
value = (comparator || value !== 0) ? value : 0;
if (isCommon && computed === computed) { if (isCommon && computed === computed) {
var valuesIndex = valuesLength; var valuesIndex = valuesLength;
while (valuesIndex--) { while (valuesIndex--) {

View File

@@ -1,5 +1,5 @@
import baseForOwn from './_baseForOwn'; import baseForOwn from './_baseForOwn.js';
import createBaseEach from './_createBaseEach'; import createBaseEach from './_createBaseEach.js';
/** /**
* The base implementation of `_.forEach` without support for iteratee shorthands. * The base implementation of `_.forEach` without support for iteratee shorthands.

View File

@@ -1,5 +1,5 @@
import baseForOwnRight from './_baseForOwnRight'; import baseForOwnRight from './_baseForOwnRight.js';
import createBaseEach from './_createBaseEach'; import createBaseEach from './_createBaseEach.js';
/** /**
* The base implementation of `_.forEachRight` without support for iteratee shorthands. * The base implementation of `_.forEachRight` without support for iteratee shorthands.

View File

@@ -1,4 +1,4 @@
import baseEach from './_baseEach'; import baseEach from './_baseEach.js';
/** /**
* The base implementation of `_.every` without support for iteratee shorthands. * The base implementation of `_.every` without support for iteratee shorthands.
@@ -6,7 +6,8 @@ import baseEach from './_baseEach';
* @private * @private
* @param {Array|Object} collection The collection to iterate over. * @param {Array|Object} collection The collection to iterate over.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if all elements pass the predicate check, else `false` * @returns {boolean} Returns `true` if all elements pass the predicate check,
* else `false`
*/ */
function baseEvery(collection, predicate) { function baseEvery(collection, predicate) {
var result = true; var result = true;

View File

@@ -1,3 +1,5 @@
import isSymbol from './isSymbol.js';
/** /**
* The base implementation of methods like `_.max` and `_.min` which accepts a * The base implementation of methods like `_.max` and `_.min` which accepts a
* `comparator` to determine the extremum value. * `comparator` to determine the extremum value.
@@ -17,7 +19,7 @@ function baseExtremum(array, iteratee, comparator) {
current = iteratee(value); current = iteratee(value);
if (current != null && (computed === undefined if (current != null && (computed === undefined
? current === current ? (current === current && !isSymbol(current))
: comparator(current, computed) : comparator(current, computed)
)) { )) {
var computed = current, var computed = current,

View File

@@ -1,5 +1,5 @@
import toInteger from './toInteger'; import toInteger from './toInteger.js';
import toLength from './toLength'; import toLength from './toLength.js';
/** /**
* The base implementation of `_.fill` without an iteratee call guard. * The base implementation of `_.fill` without an iteratee call guard.

View File

@@ -1,4 +1,4 @@
import baseEach from './_baseEach'; import baseEach from './_baseEach.js';
/** /**
* The base implementation of `_.filter` without support for iteratee shorthands. * The base implementation of `_.filter` without support for iteratee shorthands.

View File

@@ -1,24 +0,0 @@
/**
* The base implementation of methods like `_.find` and `_.findKey`, without
* support for iteratee shorthands, which iterates over `collection` using
* `eachFunc`.
*
* @private
* @param {Array|Object} collection The collection to search.
* @param {Function} predicate The function invoked per iteration.
* @param {Function} eachFunc The function to iterate over `collection`.
* @param {boolean} [retKey] Specify returning the key of the found element instead of the element itself.
* @returns {*} Returns the found element or its key, else `undefined`.
*/
function baseFind(collection, predicate, eachFunc, retKey) {
var result;
eachFunc(collection, function(value, key, collection) {
if (predicate(value, key, collection)) {
result = retKey ? key : value;
return false;
}
});
return result;
}
export default baseFind;

View File

@@ -3,14 +3,15 @@
* support for iteratee shorthands. * support for iteratee shorthands.
* *
* @private * @private
* @param {Array} array The array to search. * @param {Array} array The array to inspect.
* @param {Function} predicate The function invoked per iteration. * @param {Function} predicate The function invoked per iteration.
* @param {number} fromIndex The index to search from.
* @param {boolean} [fromRight] Specify iterating from right to left. * @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {number} Returns the index of the matched value, else `-1`. * @returns {number} Returns the index of the matched value, else `-1`.
*/ */
function baseFindIndex(array, predicate, fromRight) { function baseFindIndex(array, predicate, fromIndex, fromRight) {
var length = array.length, var length = array.length,
index = fromRight ? length : -1; index = fromIndex + (fromRight ? 1 : -1);
while ((fromRight ? index-- : ++index < length)) { while ((fromRight ? index-- : ++index < length)) {
if (predicate(array[index], index, array)) { if (predicate(array[index], index, array)) {

23
_baseFindKey.js Normal file
View File

@@ -0,0 +1,23 @@
/**
* The base implementation of methods like `_.findKey` and `_.findLastKey`,
* without support for iteratee shorthands, which iterates over `collection`
* using `eachFunc`.
*
* @private
* @param {Array|Object} collection The collection to inspect.
* @param {Function} predicate The function invoked per iteration.
* @param {Function} eachFunc The function to iterate over `collection`.
* @returns {*} Returns the found element or its key, else `undefined`.
*/
function baseFindKey(collection, predicate, eachFunc) {
var result;
eachFunc(collection, function(value, key, collection) {
if (predicate(value, key, collection)) {
result = key;
return false;
}
});
return result;
}
export default baseFindKey;

View File

@@ -1,31 +1,30 @@
import arrayPush from './_arrayPush'; import arrayPush from './_arrayPush.js';
import isArguments from './isArguments'; import isFlattenable from './_isFlattenable.js';
import isArray from './isArray';
import isArrayLikeObject from './isArrayLikeObject';
/** /**
* The base implementation of `_.flatten` with support for restricting flattening. * The base implementation of `_.flatten` with support for restricting flattening.
* *
* @private * @private
* @param {Array} array The array to flatten. * @param {Array} array The array to flatten.
* @param {boolean} [isDeep] Specify a deep flatten. * @param {number} depth The maximum recursion depth.
* @param {boolean} [isStrict] Restrict flattening to arrays-like objects. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
* @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
* @param {Array} [result=[]] The initial result value. * @param {Array} [result=[]] The initial result value.
* @returns {Array} Returns the new flattened array. * @returns {Array} Returns the new flattened array.
*/ */
function baseFlatten(array, isDeep, isStrict, result) { function baseFlatten(array, depth, predicate, isStrict, result) {
result || (result = []);
var index = -1, var index = -1,
length = array.length; length = array.length;
predicate || (predicate = isFlattenable);
result || (result = []);
while (++index < length) { while (++index < length) {
var value = array[index]; var value = array[index];
if (isArrayLikeObject(value) && if (depth > 0 && predicate(value)) {
(isStrict || isArray(value) || isArguments(value))) { if (depth > 1) {
if (isDeep) {
// Recursively flatten arrays (susceptible to call stack limits). // Recursively flatten arrays (susceptible to call stack limits).
baseFlatten(value, isDeep, isStrict, result); baseFlatten(value, depth - 1, predicate, isStrict, result);
} else { } else {
arrayPush(result, value); arrayPush(result, value);
} }

View File

@@ -1,10 +1,9 @@
import createBaseFor from './_createBaseFor'; import createBaseFor from './_createBaseFor.js';
/** /**
* The base implementation of `baseForIn` and `baseForOwn` which iterates * The base implementation of `baseForOwn` which iterates over `object`
* over `object` properties returned by `keysFunc` invoking `iteratee` for * properties returned by `keysFunc` and invokes `iteratee` for each property.
* each property. Iteratee functions may exit iteration early by explicitly * Iteratee functions may exit iteration early by explicitly returning `false`.
* returning `false`.
* *
* @private * @private
* @param {Object} object The object to iterate over. * @param {Object} object The object to iterate over.

View File

@@ -1,16 +0,0 @@
import baseFor from './_baseFor';
import keysIn from './keysIn';
/**
* The base implementation of `_.forIn` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns `object`.
*/
function baseForIn(object, iteratee) {
return object == null ? object : baseFor(object, iteratee, keysIn);
}
export default baseForIn;

View File

@@ -1,5 +1,5 @@
import baseFor from './_baseFor'; import baseFor from './_baseFor.js';
import keys from './keys'; import keys from './keys.js';
/** /**
* The base implementation of `_.forOwn` without support for iteratee shorthands. * The base implementation of `_.forOwn` without support for iteratee shorthands.

View File

@@ -1,5 +1,5 @@
import baseForRight from './_baseForRight'; import baseForRight from './_baseForRight.js';
import keys from './keys'; import keys from './keys.js';
/** /**
* The base implementation of `_.forOwnRight` without support for iteratee shorthands. * The base implementation of `_.forOwnRight` without support for iteratee shorthands.

View File

@@ -1,4 +1,4 @@
import createBaseFor from './_createBaseFor'; import createBaseFor from './_createBaseFor.js';
/** /**
* This function is like `baseFor` except that it iterates over properties * This function is like `baseFor` except that it iterates over properties

View File

@@ -1,14 +1,14 @@
import arrayFilter from './_arrayFilter'; import arrayFilter from './_arrayFilter.js';
import isFunction from './isFunction'; import isFunction from './isFunction.js';
/** /**
* The base implementation of `_.functions` which creates an array of * The base implementation of `_.functions` which creates an array of
* `object` function property names filtered from those provided. * `object` function property names filtered from `props`.
* *
* @private * @private
* @param {Object} object The object to inspect. * @param {Object} object The object to inspect.
* @param {Array} props The property names to filter. * @param {Array} props The property names to filter.
* @returns {Array} Returns the new array of filtered property names. * @returns {Array} Returns the function names.
*/ */
function baseFunctions(object, props) { function baseFunctions(object, props) {
return arrayFilter(props, function(key) { return arrayFilter(props, function(key) {

View File

@@ -1,5 +1,5 @@
import baseToPath from './_baseToPath'; import castPath from './_castPath.js';
import isKey from './_isKey'; import toKey from './_toKey.js';
/** /**
* The base implementation of `_.get` without support for default values. * The base implementation of `_.get` without support for default values.
@@ -10,13 +10,13 @@ import isKey from './_isKey';
* @returns {*} Returns the resolved value. * @returns {*} Returns the resolved value.
*/ */
function baseGet(object, path) { function baseGet(object, path) {
path = isKey(path, object) ? [path + ''] : baseToPath(path); path = castPath(path, object);
var index = 0, var index = 0,
length = path.length; length = path.length;
while (object != null && index < length) { while (object != null && index < length) {
object = object[path[index++]]; object = object[toKey(path[index++])];
} }
return (index && index == length) ? object : undefined; return (index && index == length) ? object : undefined;
} }

20
_baseGetAllKeys.js Normal file
View File

@@ -0,0 +1,20 @@
import arrayPush from './_arrayPush.js';
import isArray from './isArray.js';
/**
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
* symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Function} keysFunc The function to get the keys of `object`.
* @param {Function} symbolsFunc The function to get the symbols of `object`.
* @returns {Array} Returns the array of property names and symbols.
*/
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result = keysFunc(object);
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
}
export default baseGetAllKeys;

28
_baseGetTag.js Normal file
View File

@@ -0,0 +1,28 @@
import Symbol from './_Symbol.js';
import getRawTag from './_getRawTag.js';
import objectToString from './_objectToString.js';
/** `Object#toString` result references. */
var nullTag = '[object Null]',
undefinedTag = '[object Undefined]';
/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
/**
* The base implementation of `getTag` without fallbacks for buggy environments.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
function baseGetTag(value) {
if (value == null) {
return value === undefined ? undefinedTag : nullTag;
}
return (symToStringTag && symToStringTag in Object(value))
? getRawTag(value)
: objectToString(value);
}
export default baseGetTag;

14
_baseGt.js Normal file
View File

@@ -0,0 +1,14 @@
/**
* The base implementation of `_.gt` which doesn't coerce arguments.
*
* @private
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {boolean} Returns `true` if `value` is greater than `other`,
* else `false`.
*/
function baseGt(value, other) {
return value > other;
}
export default baseGt;

View File

@@ -4,23 +4,16 @@ var objectProto = Object.prototype;
/** Used to check objects for own properties. */ /** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty; var hasOwnProperty = objectProto.hasOwnProperty;
/** Built-in value references. */
var getPrototypeOf = Object.getPrototypeOf;
/** /**
* The base implementation of `_.has` without support for deep paths. * The base implementation of `_.has` without support for deep paths.
* *
* @private * @private
* @param {Object} object The object to query. * @param {Object} [object] The object to query.
* @param {Array|string} key The key to check. * @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`. * @returns {boolean} Returns `true` if `key` exists, else `false`.
*/ */
function baseHas(object, key) { function baseHas(object, key) {
// Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`, return object != null && hasOwnProperty.call(object, key);
// that are composed entirely of index properties, return `false` for
// `hasOwnProperty` checks of them.
return hasOwnProperty.call(object, key) ||
(typeof object == 'object' && key in object && getPrototypeOf(object) === null);
} }
export default baseHas; export default baseHas;

View File

@@ -2,12 +2,12 @@
* The base implementation of `_.hasIn` without support for deep paths. * The base implementation of `_.hasIn` without support for deep paths.
* *
* @private * @private
* @param {Object} object The object to query. * @param {Object} [object] The object to query.
* @param {Array|string} key The key to check. * @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`. * @returns {boolean} Returns `true` if `key` exists, else `false`.
*/ */
function baseHasIn(object, key) { function baseHasIn(object, key) {
return key in Object(object); return object != null && key in Object(object);
} }
export default baseHasIn; export default baseHasIn;

View File

@@ -3,7 +3,7 @@ var nativeMax = Math.max,
nativeMin = Math.min; nativeMin = Math.min;
/** /**
* The base implementation of `_.inRange` which doesn't coerce arguments to numbers. * The base implementation of `_.inRange` which doesn't coerce arguments.
* *
* @private * @private
* @param {number} number The number to check. * @param {number} number The number to check.

View File

@@ -1,27 +1,20 @@
import indexOfNaN from './_indexOfNaN'; import baseFindIndex from './_baseFindIndex.js';
import baseIsNaN from './_baseIsNaN.js';
import strictIndexOf from './_strictIndexOf.js';
/** /**
* The base implementation of `_.indexOf` without `fromIndex` bounds checks. * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
* *
* @private * @private
* @param {Array} array The array to search. * @param {Array} array The array to inspect.
* @param {*} value The value to search for. * @param {*} value The value to search for.
* @param {number} fromIndex The index to search from. * @param {number} fromIndex The index to search from.
* @returns {number} Returns the index of the matched value, else `-1`. * @returns {number} Returns the index of the matched value, else `-1`.
*/ */
function baseIndexOf(array, value, fromIndex) { function baseIndexOf(array, value, fromIndex) {
if (value !== value) { return value === value
return indexOfNaN(array, fromIndex); ? strictIndexOf(array, value, fromIndex)
} : baseFindIndex(array, baseIsNaN, fromIndex);
var index = fromIndex - 1,
length = array.length;
while (++index < length) {
if (array[index] === value) {
return index;
}
}
return -1;
} }
export default baseIndexOf; export default baseIndexOf;

23
_baseIndexOfWith.js Normal file
View File

@@ -0,0 +1,23 @@
/**
* This function is like `baseIndexOf` except that it accepts a comparator.
*
* @private
* @param {Array} array The array to inspect.
* @param {*} value The value to search for.
* @param {number} fromIndex The index to search from.
* @param {Function} comparator The comparator invoked per element.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function baseIndexOfWith(array, value, fromIndex, comparator) {
var index = fromIndex - 1,
length = array.length;
while (++index < length) {
if (comparator(array[index], value)) {
return index;
}
}
return -1;
}
export default baseIndexOfWith;

View File

@@ -1,9 +1,12 @@
import SetCache from './_SetCache'; import SetCache from './_SetCache.js';
import arrayIncludes from './_arrayIncludes'; import arrayIncludes from './_arrayIncludes.js';
import arrayIncludesWith from './_arrayIncludesWith'; import arrayIncludesWith from './_arrayIncludesWith.js';
import arrayMap from './_arrayMap'; import arrayMap from './_arrayMap.js';
import baseUnary from './_baseUnary'; import baseUnary from './_baseUnary.js';
import cacheHas from './_cacheHas'; import cacheHas from './_cacheHas.js';
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;
/** /**
* The base implementation of methods like `_.intersection`, without support * The base implementation of methods like `_.intersection`, without support
@@ -17,9 +20,11 @@ import cacheHas from './_cacheHas';
*/ */
function baseIntersection(arrays, iteratee, comparator) { function baseIntersection(arrays, iteratee, comparator) {
var includes = comparator ? arrayIncludesWith : arrayIncludes, var includes = comparator ? arrayIncludesWith : arrayIncludes,
length = arrays[0].length,
othLength = arrays.length, othLength = arrays.length,
othIndex = othLength, othIndex = othLength,
caches = Array(othLength), caches = Array(othLength),
maxLength = Infinity,
result = []; result = [];
while (othIndex--) { while (othIndex--) {
@@ -27,26 +32,33 @@ function baseIntersection(arrays, iteratee, comparator) {
if (othIndex && iteratee) { if (othIndex && iteratee) {
array = arrayMap(array, baseUnary(iteratee)); array = arrayMap(array, baseUnary(iteratee));
} }
caches[othIndex] = !comparator && (iteratee || array.length >= 120) maxLength = nativeMin(array.length, maxLength);
caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
? new SetCache(othIndex && array) ? new SetCache(othIndex && array)
: undefined; : undefined;
} }
array = arrays[0]; array = arrays[0];
var index = -1, var index = -1,
length = array.length,
seen = caches[0]; seen = caches[0];
outer: outer:
while (++index < length) { while (++index < length && result.length < maxLength) {
var value = array[index], var value = array[index],
computed = iteratee ? iteratee(value) : value; computed = iteratee ? iteratee(value) : value;
if (!(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) { value = (comparator || value !== 0) ? value : 0;
var othIndex = othLength; if (!(seen
? cacheHas(seen, computed)
: includes(result, computed, comparator)
)) {
othIndex = othLength;
while (--othIndex) { while (--othIndex) {
var cache = caches[othIndex]; var cache = caches[othIndex];
if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) { if (!(cache
? cacheHas(cache, computed)
: includes(arrays[othIndex], computed, comparator))
) {
continue outer; continue outer;
} }
} }

View File

@@ -1,4 +1,4 @@
import baseForOwn from './_baseForOwn'; import baseForOwn from './_baseForOwn.js';
/** /**
* The base implementation of `_.invert` and `_.invertBy` which inverts * The base implementation of `_.invert` and `_.invertBy` which inverts

View File

@@ -1,8 +1,8 @@
import apply from './_apply'; import apply from './_apply.js';
import baseToPath from './_baseToPath'; import castPath from './_castPath.js';
import isKey from './_isKey'; import last from './last.js';
import last from './last'; import parent from './_parent.js';
import parent from './_parent'; import toKey from './_toKey.js';
/** /**
* The base implementation of `_.invoke` without support for individual * The base implementation of `_.invoke` without support for individual
@@ -15,12 +15,9 @@ import parent from './_parent';
* @returns {*} Returns the result of the invoked method. * @returns {*} Returns the result of the invoked method.
*/ */
function baseInvoke(object, path, args) { function baseInvoke(object, path, args) {
if (!isKey(path, object)) { path = castPath(path, object);
path = baseToPath(path); object = parent(object, path);
object = parent(object, path); var func = object == null ? object : object[toKey(last(path))];
path = last(path);
}
var func = object == null ? object : object[path];
return func == null ? undefined : apply(func, object, args); return func == null ? undefined : apply(func, object, args);
} }

18
_baseIsArguments.js Normal file
View File

@@ -0,0 +1,18 @@
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
/** `Object#toString` result references. */
var argsTag = '[object Arguments]';
/**
* The base implementation of `_.isArguments`.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
*/
function baseIsArguments(value) {
return isObjectLike(value) && baseGetTag(value) == argsTag;
}
export default baseIsArguments;

17
_baseIsArrayBuffer.js Normal file
View File

@@ -0,0 +1,17 @@
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
var arrayBufferTag = '[object ArrayBuffer]';
/**
* The base implementation of `_.isArrayBuffer` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
*/
function baseIsArrayBuffer(value) {
return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
}
export default baseIsArrayBuffer;

18
_baseIsDate.js Normal file
View File

@@ -0,0 +1,18 @@
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
/** `Object#toString` result references. */
var dateTag = '[object Date]';
/**
* The base implementation of `_.isDate` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a date object, else `false`.
*/
function baseIsDate(value) {
return isObjectLike(value) && baseGetTag(value) == dateTag;
}
export default baseIsDate;

View File

@@ -1,6 +1,5 @@
import baseIsEqualDeep from './_baseIsEqualDeep'; import baseIsEqualDeep from './_baseIsEqualDeep.js';
import isObject from './isObject'; import isObjectLike from './isObjectLike.js';
import isObjectLike from './isObjectLike';
/** /**
* The base implementation of `_.isEqual` which supports partial comparisons * The base implementation of `_.isEqual` which supports partial comparisons
@@ -9,22 +8,21 @@ import isObjectLike from './isObjectLike';
* @private * @private
* @param {*} value The value to compare. * @param {*} value The value to compare.
* @param {*} other The other 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 {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. * @param {Object} [stack] Tracks traversed `value` and `other` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @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) { if (value === other) {
return true; return true;
} }
if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
return value !== value && other !== other; return value !== value && other !== other;
} }
return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
} }
export default baseIsEqual; export default baseIsEqual;

View File

@@ -1,14 +1,14 @@
import Stack from './_Stack'; import Stack from './_Stack.js';
import equalArrays from './_equalArrays'; import equalArrays from './_equalArrays.js';
import equalByTag from './_equalByTag'; import equalByTag from './_equalByTag.js';
import equalObjects from './_equalObjects'; import equalObjects from './_equalObjects.js';
import getTag from './_getTag'; import getTag from './_getTag.js';
import isArray from './isArray'; import isArray from './isArray.js';
import isHostObject from './_isHostObject'; import isBuffer from './isBuffer.js';
import isTypedArray from './isTypedArray'; import isTypedArray from './isTypedArray.js';
/** Used to compose bitmasks for comparison styles. */ /** Used to compose bitmasks for value comparisons. */
var PARTIAL_COMPARE_FLAG = 2; var COMPARE_PARTIAL_FLAG = 1;
/** `Object#toString` result references. */ /** `Object#toString` result references. */
var argsTag = '[object Arguments]', var argsTag = '[object Arguments]',
@@ -29,55 +29,55 @@ var hasOwnProperty = objectProto.hasOwnProperty;
* @private * @private
* @param {Object} object The object to compare. * @param {Object} object The object to compare.
* @param {Object} other The other 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} 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. * @param {Object} [stack] Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. * @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), var objIsArr = isArray(object),
othIsArr = isArray(other), othIsArr = isArray(other),
objTag = arrayTag, objTag = objIsArr ? arrayTag : getTag(object),
othTag = arrayTag; othTag = othIsArr ? arrayTag : getTag(other);
if (!objIsArr) { objTag = objTag == argsTag ? objectTag : objTag;
objTag = getTag(object); othTag = othTag == argsTag ? objectTag : othTag;
if (objTag == argsTag) {
objTag = objectTag; var objIsObj = objTag == objectTag,
} else if (objTag != objectTag) { othIsObj = othTag == objectTag,
objIsArr = isTypedArray(object);
}
}
if (!othIsArr) {
othTag = getTag(other);
if (othTag == argsTag) {
othTag = objectTag;
} else if (othTag != objectTag) {
othIsArr = isTypedArray(other);
}
}
var objIsObj = objTag == objectTag && !isHostObject(object),
othIsObj = othTag == objectTag && !isHostObject(other),
isSameTag = objTag == othTag; isSameTag = objTag == othTag;
if (isSameTag && !(objIsArr || objIsObj)) { if (isSameTag && isBuffer(object)) {
return equalByTag(object, other, objTag, equalFunc, customizer, bitmask); if (!isBuffer(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
} }
var isPartial = bitmask & PARTIAL_COMPARE_FLAG; if (isSameTag && !objIsObj) {
if (!isPartial) { stack || (stack = new Stack);
return (objIsArr || isTypedArray(object))
? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
: equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
if (objIsWrapped || othIsWrapped) { if (objIsWrapped || othIsWrapped) {
return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, bitmask, stack); var objUnwrapped = objIsWrapped ? object.value() : object,
othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack);
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
} }
} }
if (!isSameTag) { if (!isSameTag) {
return false; return false;
} }
stack || (stack = new Stack); stack || (stack = new Stack);
return (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, bitmask, stack); return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
} }
export default baseIsEqualDeep; export default baseIsEqualDeep;

18
_baseIsMap.js Normal file
View File

@@ -0,0 +1,18 @@
import getTag from './_getTag.js';
import isObjectLike from './isObjectLike.js';
/** `Object#toString` result references. */
var mapTag = '[object Map]';
/**
* The base implementation of `_.isMap` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a map, else `false`.
*/
function baseIsMap(value) {
return isObjectLike(value) && getTag(value) == mapTag;
}
export default baseIsMap;

View File

@@ -1,9 +1,9 @@
import Stack from './_Stack'; import Stack from './_Stack.js';
import baseIsEqual from './_baseIsEqual'; import baseIsEqual from './_baseIsEqual.js';
/** Used to compose bitmasks for comparison styles. */ /** Used to compose bitmasks for value comparisons. */
var UNORDERED_COMPARE_FLAG = 1, var COMPARE_PARTIAL_FLAG = 1,
PARTIAL_COMPARE_FLAG = 2; COMPARE_UNORDERED_FLAG = 2;
/** /**
* The base implementation of `_.isMatch` without support for iteratee shorthands. * The base implementation of `_.isMatch` without support for iteratee shorthands.
@@ -44,11 +44,12 @@ function baseIsMatch(object, source, matchData, customizer) {
return false; return false;
} }
} else { } else {
var stack = new Stack, var stack = new Stack;
result = customizer ? customizer(objValue, srcValue, key, object, source, stack) : undefined; if (customizer) {
var result = customizer(objValue, srcValue, key, object, source, stack);
}
if (!(result === undefined 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 : result
)) { )) {
return false; return false;

12
_baseIsNaN.js Normal file
View File

@@ -0,0 +1,12 @@
/**
* The base implementation of `_.isNaN` without support for number objects.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
*/
function baseIsNaN(value) {
return value !== value;
}
export default baseIsNaN;

47
_baseIsNative.js Normal file
View File

@@ -0,0 +1,47 @@
import isFunction from './isFunction.js';
import isMasked from './_isMasked.js';
import isObject from './isObject.js';
import toSource from './_toSource.js';
/**
* Used to match `RegExp`
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
*/
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Used for built-in method references. */
var funcProto = Function.prototype,
objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/**
* The base implementation of `_.isNative` without bad shim checks.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function,
* else `false`.
*/
function baseIsNative(value) {
if (!isObject(value) || isMasked(value)) {
return false;
}
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
export default baseIsNative;

18
_baseIsRegExp.js Normal file
View File

@@ -0,0 +1,18 @@
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
/** `Object#toString` result references. */
var regexpTag = '[object RegExp]';
/**
* The base implementation of `_.isRegExp` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
*/
function baseIsRegExp(value) {
return isObjectLike(value) && baseGetTag(value) == regexpTag;
}
export default baseIsRegExp;

18
_baseIsSet.js Normal file
View File

@@ -0,0 +1,18 @@
import getTag from './_getTag.js';
import isObjectLike from './isObjectLike.js';
/** `Object#toString` result references. */
var setTag = '[object Set]';
/**
* The base implementation of `_.isSet` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a set, else `false`.
*/
function baseIsSet(value) {
return isObjectLike(value) && getTag(value) == setTag;
}
export default baseIsSet;

60
_baseIsTypedArray.js Normal file
View File

@@ -0,0 +1,60 @@
import baseGetTag from './_baseGetTag.js';
import isLength from './isLength.js';
import isObjectLike from './isObjectLike.js';
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
typedArrayTags[setTag] = typedArrayTags[stringTag] =
typedArrayTags[weakMapTag] = false;
/**
* The base implementation of `_.isTypedArray` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
*/
function baseIsTypedArray(value) {
return isObjectLike(value) &&
isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
export default baseIsTypedArray;

View File

@@ -1,8 +1,8 @@
import baseMatches from './_baseMatches'; import baseMatches from './_baseMatches.js';
import baseMatchesProperty from './_baseMatchesProperty'; import baseMatchesProperty from './_baseMatchesProperty.js';
import identity from './identity'; import identity from './identity.js';
import isArray from './isArray'; import isArray from './isArray.js';
import property from './property'; import property from './property.js';
/** /**
* The base implementation of `_.iteratee`. * The base implementation of `_.iteratee`.
@@ -12,14 +12,15 @@ import property from './property';
* @returns {Function} Returns the iteratee. * @returns {Function} Returns the iteratee.
*/ */
function baseIteratee(value) { function baseIteratee(value) {
var type = typeof value; // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
if (type == 'function') { // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
if (typeof value == 'function') {
return value; return value;
} }
if (value == null) { if (value == null) {
return identity; return identity;
} }
if (type == 'object') { if (typeof value == 'object') {
return isArray(value) return isArray(value)
? baseMatchesProperty(value[0], value[1]) ? baseMatchesProperty(value[0], value[1])
: baseMatches(value); : baseMatches(value);

View File

@@ -1,17 +1,30 @@
/* Built-in method references for those with the same name as other `lodash` methods. */ import isPrototype from './_isPrototype.js';
var nativeKeys = Object.keys; import nativeKeys from './_nativeKeys.js';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** /**
* The base implementation of `_.keys` which doesn't skip the constructor * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
* property of prototypes or treat sparse arrays as dense.
* *
* @private * @private
* @type Function
* @param {Object} object The object to query. * @param {Object} object The object to query.
* @returns {Array} Returns the array of property names. * @returns {Array} Returns the array of property names.
*/ */
function baseKeys(object) { function baseKeys(object) {
return nativeKeys(Object(object)); if (!isPrototype(object)) {
return nativeKeys(object);
}
var result = [];
for (var key in Object(object)) {
if (hasOwnProperty.call(object, key) && key != 'constructor') {
result.push(key);
}
}
return result;
} }
export default baseKeys; export default baseKeys;

View File

@@ -1,36 +1,33 @@
import Reflect from './_Reflect'; import isObject from './isObject.js';
import iteratorToArray from './_iteratorToArray'; import isPrototype from './_isPrototype.js';
import nativeKeysIn from './_nativeKeysIn.js';
/** Used for built-in method references. */ /** Used for built-in method references. */
var objectProto = Object.prototype; var objectProto = Object.prototype;
/** Built-in value references. */ /** Used to check objects for own properties. */
var enumerate = Reflect ? Reflect.enumerate : undefined, var hasOwnProperty = objectProto.hasOwnProperty;
propertyIsEnumerable = objectProto.propertyIsEnumerable;
/** /**
* The base implementation of `_.keysIn` which doesn't skip the constructor * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
* property of prototypes or treat sparse arrays as dense.
* *
* @private * @private
* @param {Object} object The object to query. * @param {Object} object The object to query.
* @returns {Array} Returns the array of property names. * @returns {Array} Returns the array of property names.
*/ */
function baseKeysIn(object) { function baseKeysIn(object) {
object = object == null ? object : Object(object); if (!isObject(object)) {
return nativeKeysIn(object);
}
var isProto = isPrototype(object),
result = [];
var result = [];
for (var key in object) { for (var key in object) {
result.push(key); if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
result.push(key);
}
} }
return result; return result;
} }
// Fallback for IE < 9 with es6-shim.
if (enumerate && !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf')) {
baseKeysIn = function(object) {
return iteratorToArray(enumerate(object));
};
}
export default baseKeysIn; export default baseKeysIn;

Some files were not shown because too many files have changed in this diff Show More