feat: Passwordless cross-device authentication

- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
This commit is contained in:
Bernt
2026-07-07 07:11:50 +00:00
parent 4aa984ad74
commit 6989a98d75
61843 changed files with 5491611 additions and 872231 deletions
+22
View File
@@ -0,0 +1,22 @@
Copyright (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
+34
View File
@@ -0,0 +1,34 @@
__
/\ \ __
__ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____
/\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\
\ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\
\ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/
\/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/
\ \____/
\/___/
Underscore.js is a utility-belt library for JavaScript that provides
support for the usual functional suspects (each, map, reduce, filter...)
without extending any core JavaScript objects.
For Docs, License, Tests, and pre-packed downloads, see:
https://underscorejs.org
For support and questions, please consult
our [security policy](SECURITY.md),
[the gitter channel](https://gitter.im/jashkenas/underscore)
or [stackoverflow](https://stackoverflow.com/search?q=underscore.js)
Underscore is an open-sourced component of DocumentCloud:
https://github.com/documentcloud
Many thanks to our contributors:
https://github.com/jashkenas/underscore/contributors
You can support the project by donating on
[Patreon](https://patreon.com/juliangonggrijp).
Enterprise coverage is available as part of the
[Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-underscore?utm_source=npm-underscore&utm_medium=referral&utm_campaign=enterprise).
This project adheres to a [code of conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code.
+21
View File
@@ -0,0 +1,21 @@
define(['./isObject', './_setup'], function (isObject, _setup) {
// Create a naked function reference for surrogate-prototype-swapping.
function ctor() {
return function(){};
}
// An internal function for creating a new object that inherits from another.
function baseCreate(prototype) {
if (!isObject(prototype)) return {};
if (_setup.nativeCreate) return _setup.nativeCreate(prototype);
var Ctor = ctor();
Ctor.prototype = prototype;
var result = new Ctor;
Ctor.prototype = null;
return result;
}
return baseCreate;
});
+15
View File
@@ -0,0 +1,15 @@
define(['./identity', './isFunction', './isObject', './isArray', './matcher', './property', './_optimizeCb'], function (identity, isFunction, isObject, isArray, matcher, property, _optimizeCb) {
// An internal function to generate callbacks that can be applied to each
// element in a collection, returning the desired result — either `_.identity`,
// an arbitrary callback, a property matcher, or a property accessor.
function baseIteratee(value, context, argCount) {
if (value == null) return identity;
if (isFunction(value)) return _optimizeCb(value, context, argCount);
if (isObject(value) && !isArray(value)) return matcher(value);
return property(value);
}
return baseIteratee;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./underscore', './_baseIteratee', './iteratee'], function (underscore, _baseIteratee, iteratee) {
// The function we call internally to generate a callback. It invokes
// `_.iteratee` if overridden, otherwise `baseIteratee`.
function cb(value, context, argCount) {
if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context);
return _baseIteratee(value, context, argCount);
}
return cb;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./underscore'], function (underscore) {
// Helper function to continue chaining intermediate results.
function chainResult(instance, obj) {
return instance._chain ? underscore(obj).chain() : obj;
}
return chainResult;
});
+42
View File
@@ -0,0 +1,42 @@
define(['./_setup', './isFunction', './_has'], function (_setup, isFunction, _has) {
// Internal helper to create a simple lookup structure.
// `collectNonEnumProps` used to depend on `_.contains`, but this led to
// circular imports. `emulatedSet` is a one-off solution that only works for
// arrays of strings.
function emulatedSet(keys) {
var hash = {};
for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
return {
contains: function(key) { return hash[key] === true; },
push: function(key) {
hash[key] = true;
return keys.push(key);
}
};
}
// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
// needed.
function collectNonEnumProps(obj, keys) {
keys = emulatedSet(keys);
var nonEnumIdx = _setup.nonEnumerableProps.length;
var constructor = obj.constructor;
var proto = (isFunction(constructor) && constructor.prototype) || _setup.ObjProto;
// Constructor is a special case.
var prop = 'constructor';
if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop);
while (nonEnumIdx--) {
prop = _setup.nonEnumerableProps[nonEnumIdx];
if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
keys.push(prop);
}
}
}
return collectNonEnumProps;
});
+24
View File
@@ -0,0 +1,24 @@
define(function () {
// An internal function for creating assigner functions.
function createAssigner(keysFunc, defaults) {
return function(obj) {
var length = arguments.length;
if (defaults) obj = Object(obj);
if (length < 2 || obj == null) return obj;
for (var index = 1; index < length; index++) {
var source = arguments[index],
keys = keysFunc(source),
l = keys.length;
for (var i = 0; i < l; i++) {
var key = keys[i];
if (!defaults || obj[key] === void 0) obj[key] = source[key];
}
}
return obj;
};
}
return createAssigner;
});
+21
View File
@@ -0,0 +1,21 @@
define(['./keys'], function (keys) {
// Internal helper to generate functions for escaping and unescaping strings
// to/from HTML interpolation.
function createEscaper(map) {
var escaper = function(match) {
return map[match];
};
// Regexes for identifying a key that needs to be escaped.
var source = '(?:' + keys(map).join('|') + ')';
var testRegexp = RegExp(source);
var replaceRegexp = RegExp(source, 'g');
return function(string) {
string = string == null ? '' : '' + string;
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
};
}
return createEscaper;
});
+30
View File
@@ -0,0 +1,30 @@
define(['./_getLength', './_setup', './isNaN'], function (_getLength, _setup, _isNaN) {
// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
function createIndexFinder(dir, predicateFind, sortedIndex) {
return function(array, item, idx) {
var i = 0, length = _getLength(array);
if (typeof idx == 'number') {
if (dir > 0) {
i = idx >= 0 ? idx : Math.max(idx + length, i);
} else {
length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
}
} else if (sortedIndex && idx && length) {
idx = sortedIndex(array, item);
return array[idx] === item ? idx : -1;
}
if (item !== item) {
idx = predicateFind(_setup.slice.call(array, i, length), _isNaN);
return idx >= 0 ? idx + i : -1;
}
for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
if (array[idx] === item) return idx;
}
return -1;
};
}
return createIndexFinder;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./_cb', './_getLength'], function (_cb, _getLength) {
// Internal function to generate `_.findIndex` and `_.findLastIndex`.
function createPredicateIndexFinder(dir) {
return function(array, predicate, context) {
predicate = _cb(predicate, context);
var length = _getLength(array);
var index = dir > 0 ? 0 : length - 1;
for (; index >= 0 && index < length; index += dir) {
if (predicate(array[index], index, array)) return index;
}
return -1;
};
}
return createPredicateIndexFinder;
});
+30
View File
@@ -0,0 +1,30 @@
define(['./_isArrayLike', './keys', './_optimizeCb'], function (_isArrayLike, keys, _optimizeCb) {
// Internal helper to create a reducing function, iterating left or right.
function createReduce(dir) {
// Wrap code that reassigns argument variables in a separate function than
// the one that accesses `arguments.length` to avoid a perf hit. (#1991)
var reducer = function(obj, iteratee, memo, initial) {
var _keys = !_isArrayLike(obj) && keys(obj),
length = (_keys || obj).length,
index = dir > 0 ? 0 : length - 1;
if (!initial) {
memo = obj[_keys ? _keys[index] : index];
index += dir;
}
for (; index >= 0 && index < length; index += dir) {
var currentKey = _keys ? _keys[index] : index;
memo = iteratee(memo, obj[currentKey], currentKey, obj);
}
return memo;
};
return function(obj, iteratee, memo, context) {
var initial = arguments.length >= 3;
return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial);
};
}
return createReduce;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./_setup'], function (_setup) {
// Common internal logic for `isArrayLike` and `isBufferLike`.
function createSizePropertyCheck(getSizeProperty) {
return function(collection) {
var sizeProperty = getSizeProperty(collection);
return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX;
}
}
return createSizePropertyCheck;
});
+15
View File
@@ -0,0 +1,15 @@
define(function () {
// Internal function to obtain a nested property in `obj` along `path`.
function deepGet(obj, path) {
var length = path.length;
for (var i = 0; i < length; i++) {
if (obj == null) return void 0;
obj = obj[path[i]];
}
return length ? obj : void 0;
}
return deepGet;
});
+15
View File
@@ -0,0 +1,15 @@
define(function () {
// Internal list of HTML entities for escaping.
var escapeMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;',
'`': '&#x60;'
};
return escapeMap;
});
+16
View File
@@ -0,0 +1,16 @@
define(['./_baseCreate', './isObject'], function (_baseCreate, isObject) {
// Internal function to execute `sourceFunc` bound to `context` with optional
// `args`. Determines whether to execute a function as a constructor or as a
// normal function.
function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
var self = _baseCreate(sourceFunc.prototype);
var result = sourceFunc.apply(self, args);
if (isObject(result)) return result;
return self;
}
return executeBound;
});
+32
View File
@@ -0,0 +1,32 @@
define(['./_getLength', './_isArrayLike', './isArray', './isArguments'], function (_getLength, _isArrayLike, isArray, isArguments) {
// Internal implementation of a recursive `flatten` function.
function flatten(input, depth, strict, output) {
output = output || [];
if (!depth && depth !== 0) {
depth = Infinity;
} else if (depth <= 0) {
return output.concat(input);
}
var idx = output.length;
for (var i = 0, length = _getLength(input); i < length; i++) {
var value = input[i];
if (_isArrayLike(value) && (isArray(value) || isArguments(value))) {
// Flatten current level of array or arguments object.
if (depth > 1) {
flatten(value, depth - 1, strict, output);
idx = output.length;
} else {
var j = 0, len = value.length;
while (j < len) output[idx++] = value[j++];
}
} else if (!strict) {
output[idx++] = value;
}
}
return output;
}
return flatten;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_shallowProperty'], function (_shallowProperty) {
// Internal helper to obtain the `byteLength` property of an object.
var getByteLength = _shallowProperty('byteLength');
return getByteLength;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_shallowProperty'], function (_shallowProperty) {
// Internal helper to obtain the `length` property of an object.
var getLength = _shallowProperty('length');
return getLength;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./_cb', './each'], function (_cb, each) {
// An internal function used for aggregate "group by" operations.
function group(behavior, partition) {
return function(obj, iteratee, context) {
var result = partition ? [[], []] : {};
iteratee = _cb(iteratee, context);
each(obj, function(value, index) {
var key = iteratee(value, index, obj);
behavior(result, value, key);
});
return result;
};
}
return group;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./_setup'], function (_setup) {
// Internal function to check whether `key` is an own property name of `obj`.
function has(obj, key) {
return obj != null && _setup.hasOwnProperty.call(obj, key);
}
return has;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var hasObjectTag = _tagTester('Object');
return hasObjectTag;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./_createSizePropertyCheck', './_getLength'], function (_createSizePropertyCheck, _getLength) {
// Internal helper for collection methods to determine whether a collection
// should be iterated as an array or as an object.
// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
var isArrayLike = _createSizePropertyCheck(_getLength);
return isArrayLike;
});
+9
View File
@@ -0,0 +1,9 @@
define(['./_createSizePropertyCheck', './_getByteLength'], function (_createSizePropertyCheck, _getByteLength) {
// Internal helper to determine whether we should spend extensive checks against
// `ArrayBuffer` et al.
var isBufferLike = _createSizePropertyCheck(_getByteLength);
return isBufferLike;
});
+11
View File
@@ -0,0 +1,11 @@
define(function () {
// Internal `_.pick` helper function to determine whether `key` is an enumerable
// property name of `obj`.
function keyInObj(value, key, obj) {
return key in obj;
}
return keyInObj;
});
+44
View File
@@ -0,0 +1,44 @@
define(['exports', './_getLength', './isFunction', './allKeys'], function (exports, _getLength, isFunction, allKeys) {
// Since the regular `Object.prototype.toString` type tests don't work for
// some types in IE 11, we use a fingerprinting heuristic instead, based
// on the methods. It's not great, but it's the best we got.
// The fingerprint method lists are defined below.
function ie11fingerprint(methods) {
var length = _getLength(methods);
return function(obj) {
if (obj == null) return false;
// `Map`, `WeakMap` and `Set` have no enumerable keys.
var keys = allKeys(obj);
if (_getLength(keys)) return false;
for (var i = 0; i < length; i++) {
if (!isFunction(obj[methods[i]])) return false;
}
// If we are testing against `WeakMap`, we need to ensure that
// `obj` doesn't have a `forEach` method in order to distinguish
// it from a regular `Map`.
return methods !== weakMapMethods || !isFunction(obj[forEachName]);
};
}
// In the interest of compact minification, we write
// each string in the fingerprints only once.
var forEachName = 'forEach',
hasName = 'has',
commonInit = ['clear', 'delete'],
mapTail = ['get', hasName, 'set'];
// `Map`, `WeakMap` and `Set` each have slightly different
// combinations of the above sublists.
var mapMethods = commonInit.concat(forEachName, mapTail),
weakMapMethods = commonInit.concat(mapTail),
setMethods = ['add'].concat(commonInit, forEachName, hasName);
exports.ie11fingerprint = ie11fingerprint;
exports.mapMethods = mapMethods;
exports.setMethods = setMethods;
exports.weakMapMethods = weakMapMethods;
Object.defineProperty(exports, '__esModule', { value: true });
});
+27
View File
@@ -0,0 +1,27 @@
define(function () {
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
function optimizeCb(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value);
};
// The 2-argument case is omitted because were not using it.
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
}
return optimizeCb;
});
+70
View File
@@ -0,0 +1,70 @@
define(['exports'], function (exports) {
// Current version.
var VERSION = '1.13.8';
// Establish the root object, `window` (`self`) in the browser, `global`
// on the server, or `this` in some virtual machines. We use `self`
// instead of `window` for `WebWorker` support.
var root = (typeof self == 'object' && self.self === self && self) ||
(typeof global == 'object' && global.global === global && global) ||
Function('return this')() ||
{};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype;
var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
// Create quick reference variables for speed access to core prototypes.
var push = ArrayProto.push,
slice = ArrayProto.slice,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// Modern feature detection.
var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
supportsDataView = typeof DataView !== 'undefined';
// All **ECMAScript 5+** native function implementations that we hope to use
// are declared here.
var nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeCreate = Object.create,
nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
// Create references to these builtin functions because we override them.
var _isNaN = isNaN,
_isFinite = isFinite;
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
// The largest integer that can be represented exactly.
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
exports.ArrayProto = ArrayProto;
exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX;
exports.ObjProto = ObjProto;
exports.SymbolProto = SymbolProto;
exports.VERSION = VERSION;
exports._isFinite = _isFinite;
exports._isNaN = _isNaN;
exports.hasEnumBug = hasEnumBug;
exports.hasOwnProperty = hasOwnProperty;
exports.nativeCreate = nativeCreate;
exports.nativeIsArray = nativeIsArray;
exports.nativeIsView = nativeIsView;
exports.nativeKeys = nativeKeys;
exports.nonEnumerableProps = nonEnumerableProps;
exports.push = push;
exports.root = root;
exports.slice = slice;
exports.supportsArrayBuffer = supportsArrayBuffer;
exports.supportsDataView = supportsDataView;
exports.toString = toString;
Object.defineProperty(exports, '__esModule', { value: true });
});
+12
View File
@@ -0,0 +1,12 @@
define(function () {
// Internal helper to generate a function to obtain property `key` from `obj`.
function shallowProperty(key) {
return function(obj) {
return obj == null ? void 0 : obj[key];
};
}
return shallowProperty;
});
+19
View File
@@ -0,0 +1,19 @@
define(['exports', './_setup', './_hasObjectTag'], function (exports, _setup, _hasObjectTag) {
// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
// In IE 11, the most common among them, this problem also applies to
// `Map`, `WeakMap` and `Set`.
// Also, there are cases where an application can override the native
// `DataView` object, in cases like that we can't use the constructor
// safely and should just rely on alternate `DataView` checks
var hasDataViewBug = (
_setup.supportsDataView && (!/\[native code\]/.test(String(DataView)) || _hasObjectTag(new DataView(new ArrayBuffer(8))))
),
isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map));
exports.hasDataViewBug = hasDataViewBug;
exports.isIE11 = isIE11;
Object.defineProperty(exports, '__esModule', { value: true });
});
+13
View File
@@ -0,0 +1,13 @@
define(['./_setup'], function (_setup) {
// Internal function for creating a `toString`-based type tester.
function tagTester(name) {
var tag = '[object ' + name + ']';
return function(obj) {
return _setup.toString.call(obj) === tag;
};
}
return tagTester;
});
+15
View File
@@ -0,0 +1,15 @@
define(['./_getByteLength'], function (_getByteLength) {
// Internal function to wrap or shallow-copy an ArrayBuffer,
// typed array or DataView to a new view, reusing the buffer.
function toBufferView(bufferSource) {
return new Uint8Array(
bufferSource.buffer || bufferSource,
bufferSource.byteOffset || 0,
_getByteLength(bufferSource)
);
}
return toBufferView;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./underscore', './toPath'], function (underscore, toPath$1) {
// Internal wrapper for `_.toPath` to enable minification.
// Similar to `cb` for `_.iteratee`.
function toPath(path) {
return underscore.toPath(path);
}
return toPath;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./invert', './_escapeMap'], function (invert, _escapeMap) {
// Internal list of HTML entities for unescaping.
var unescapeMap = invert(_escapeMap);
return unescapeMap;
});
+14
View File
@@ -0,0 +1,14 @@
define(function () {
// Returns a function that will only be executed on and after the Nth call.
function after(times, func) {
return function() {
if (--times < 1) {
return func.apply(this, arguments);
}
};
}
return after;
});
+15
View File
@@ -0,0 +1,15 @@
define(['./isObject', './_setup', './_collectNonEnumProps'], function (isObject, _setup, _collectNonEnumProps) {
// Retrieve all the enumerable property names of an object.
function allKeys(obj) {
if (!isObject(obj)) return [];
var keys = [];
for (var key in obj) keys.push(key);
// Ahem, IE < 9.
if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
return keys;
}
return allKeys;
});
+18
View File
@@ -0,0 +1,18 @@
define(function () {
// Returns a function that will only be executed up to (but not including) the
// Nth call.
function before(times, func) {
var memo;
return function() {
if (--times > 0) {
memo = func.apply(this, arguments);
}
if (times <= 1) func = null;
return memo;
};
}
return before;
});
+15
View File
@@ -0,0 +1,15 @@
define(['./restArguments', './isFunction', './_executeBound'], function (restArguments, isFunction, _executeBound) {
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally).
var bind = restArguments(function(func, context, args) {
if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
var bound = restArguments(function(callArgs) {
return _executeBound(func, bound, context, this, args.concat(callArgs));
});
return bound;
});
return bind;
});
+19
View File
@@ -0,0 +1,19 @@
define(['./restArguments', './_flatten', './bind'], function (restArguments, _flatten, bind) {
// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
var bindAll = restArguments(function(obj, keys) {
keys = _flatten(keys, false, false);
var index = keys.length;
if (index < 1) throw new Error('bindAll must be passed function names');
while (index--) {
var key = keys[index];
obj[key] = bind(obj[key], obj);
}
return obj;
});
return bindAll;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./underscore'], function (underscore) {
// Start chaining a wrapped Underscore object.
function chain(obj) {
var instance = underscore(obj);
instance._chain = true;
return instance;
}
return chain;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./_setup'], function (_setup) {
// Chunk a single array into multiple arrays, each containing `count` or fewer
// items.
function chunk(array, count) {
if (count == null || count < 1) return [];
var result = [];
var i = 0, length = array.length;
while (i < length) {
result.push(_setup.slice.call(array, i, i += count));
}
return result;
}
return chunk;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./isObject', './isArray', './extend'], function (isObject, isArray, extend) {
// Create a (shallow-cloned) duplicate of an object.
function clone(obj) {
if (!isObject(obj)) return obj;
return isArray(obj) ? obj.slice() : extend({}, obj);
}
return clone;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./filter'], function (filter) {
// Trim out all falsy values from an array.
function compact(array) {
return filter(array, Boolean);
}
return compact;
});
+18
View File
@@ -0,0 +1,18 @@
define(function () {
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
function compose() {
var args = arguments;
var start = args.length - 1;
return function() {
var i = start;
var result = args[start].apply(this, arguments);
while (i--) result = args[i].call(this, result);
return result;
};
}
return compose;
});
+12
View File
@@ -0,0 +1,12 @@
define(function () {
// Predicate-generating function. Often useful outside of Underscore.
function constant(value) {
return function() {
return value;
};
}
return constant;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./_isArrayLike', './values', './indexOf'], function (_isArrayLike, values, indexOf) {
// Determine if the array or object contains a given item (using `===`).
function contains(obj, item, fromIndex, guard) {
if (!_isArrayLike(obj)) obj = values(obj);
if (typeof fromIndex != 'number' || guard) fromIndex = 0;
return indexOf(obj, item, fromIndex) >= 0;
}
return contains;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./_group', './_has'], function (_group, _has) {
// Counts instances of an object that group by a certain criterion. Pass
// either a string attribute to count by, or a function that returns the
// criterion.
var countBy = _group(function(result, value, key) {
if (_has(result, key)) result[key]++; else result[key] = 1;
});
return countBy;
});
+14
View File
@@ -0,0 +1,14 @@
define(['./_baseCreate', './extendOwn'], function (_baseCreate, extendOwn) {
// Creates an object that inherits from the given prototype object.
// If additional properties are provided then they will be added to the
// created object.
function create(prototype, props) {
var result = _baseCreate(prototype);
if (props) extendOwn(result, props);
return result;
}
return create;
});
+43
View File
@@ -0,0 +1,43 @@
define(['./restArguments', './now'], function (restArguments, now) {
// When a sequence of calls of the returned function ends, the argument
// function is triggered. The end of a sequence is defined by the `wait`
// parameter. If `immediate` is passed, the argument function will be
// triggered at the beginning of the sequence instead of at the end.
function debounce(func, wait, immediate) {
var timeout, previous, args, result, context;
var later = function() {
var passed = now() - previous;
if (wait > passed) {
timeout = setTimeout(later, wait - passed);
} else {
timeout = null;
if (!immediate) result = func.apply(context, args);
// This check is needed because `func` can recursively invoke `debounced`.
if (!timeout) args = context = null;
}
};
var debounced = restArguments(function(_args) {
context = this;
args = _args;
previous = now();
if (!timeout) {
timeout = setTimeout(later, wait);
if (immediate) result = func.apply(context, args);
}
return result;
});
debounced.cancel = function() {
clearTimeout(timeout);
timeout = args = context = null;
};
return debounced;
}
return debounce;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) {
// Fill in a given object with default properties.
var defaults = _createAssigner(allKeys, true);
return defaults;
});
+9
View File
@@ -0,0 +1,9 @@
define(['./partial', './delay', './underscore'], function (partial, delay, underscore) {
// Defers a function, scheduling it to run after the current call stack has
// cleared.
var defer = partial(delay, underscore, 1);
return defer;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./restArguments'], function (restArguments) {
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
var delay = restArguments(function(func, wait, args) {
return setTimeout(function() {
return func.apply(null, args);
}, wait);
});
return delay;
});
+14
View File
@@ -0,0 +1,14 @@
define(['./restArguments', './_flatten', './filter', './contains'], function (restArguments, _flatten, filter, contains) {
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
var difference = restArguments(function(array, rest) {
rest = _flatten(rest, true, true);
return filter(array, function(value){
return !contains(rest, value);
});
});
return difference;
});
+25
View File
@@ -0,0 +1,25 @@
define(['./_optimizeCb', './_isArrayLike', './keys'], function (_optimizeCb, _isArrayLike, keys) {
// The cornerstone for collection functions, an `each`
// implementation, aka `forEach`.
// Handles raw objects in addition to array-likes. Treats all
// sparse array-likes as if they were dense.
function each(obj, iteratee, context) {
iteratee = _optimizeCb(iteratee, context);
var i, length;
if (_isArrayLike(obj)) {
for (i = 0, length = obj.length; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
var _keys = keys(obj);
for (i = 0, length = _keys.length; i < length; i++) {
iteratee(obj[_keys[i]], _keys[i], obj);
}
}
return obj;
}
return each;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_createEscaper', './_escapeMap'], function (_createEscaper, _escapeMap) {
// Function for escaping strings to HTML interpolation.
var _escape = _createEscaper(_escapeMap);
return _escape;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) {
// Determine whether all of the elements pass a truth test.
function every(obj, predicate, context) {
predicate = _cb(predicate, context);
var _keys = !_isArrayLike(obj) && keys(obj),
length = (_keys || obj).length;
for (var index = 0; index < length; index++) {
var currentKey = _keys ? _keys[index] : index;
if (!predicate(obj[currentKey], currentKey, obj)) return false;
}
return true;
}
return every;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_createAssigner', './allKeys'], function (_createAssigner, allKeys) {
// Extend a given object with all the properties in passed-in object(s).
var extend = _createAssigner(allKeys);
return extend;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./_createAssigner', './keys'], function (_createAssigner, keys) {
// Assigns a given object with all the own properties in the passed-in
// object(s).
// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
var extendOwn = _createAssigner(keys);
return extendOwn;
});
+15
View File
@@ -0,0 +1,15 @@
define(['./_cb', './each'], function (_cb, each) {
// Return all the elements that pass a truth test.
function filter(obj, predicate, context) {
var results = [];
predicate = _cb(predicate, context);
each(obj, function(value, index, list) {
if (predicate(value, index, list)) results.push(value);
});
return results;
}
return filter;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./_isArrayLike', './findIndex', './findKey'], function (_isArrayLike, findIndex, findKey) {
// Return the first value which passes a truth test.
function find(obj, predicate, context) {
var keyFinder = _isArrayLike(obj) ? findIndex : findKey;
var key = keyFinder(obj, predicate, context);
if (key !== void 0 && key !== -1) return obj[key];
}
return find;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) {
// Returns the first index on an array-like that passes a truth test.
var findIndex = _createPredicateIndexFinder(1);
return findIndex;
});
+15
View File
@@ -0,0 +1,15 @@
define(['./_cb', './keys'], function (_cb, keys) {
// Returns the first key on an object that passes a truth test.
function findKey(obj, predicate, context) {
predicate = _cb(predicate, context);
var _keys = keys(obj), key;
for (var i = 0, length = _keys.length; i < length; i++) {
key = _keys[i];
if (predicate(obj[key], key, obj)) return key;
}
}
return findKey;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_createPredicateIndexFinder'], function (_createPredicateIndexFinder) {
// Returns the last index on an array-like that passes a truth test.
var findLastIndex = _createPredicateIndexFinder(-1);
return findLastIndex;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./find', './matcher'], function (find, matcher) {
// Convenience version of a common use case of `_.find`: getting the first
// object containing specific `key:value` pairs.
function findWhere(obj, attrs) {
return find(obj, matcher(attrs));
}
return findWhere;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./initial'], function (initial) {
// Get the first element of an array. Passing **n** will return the first N
// values in the array. The **guard** check allows it to work with `_.map`.
function first(array, n, guard) {
if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
if (n == null || guard) return array[0];
return initial(array, array.length - n);
}
return first;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./_flatten'], function (_flatten) {
// Flatten out an array, either recursively (by default), or up to `depth`.
// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
function flatten(array, depth) {
return _flatten(array, depth, false);
}
return flatten;
});
+14
View File
@@ -0,0 +1,14 @@
define(['./isFunction'], function (isFunction) {
// Return a sorted list of the function names available on the object.
function functions(obj) {
var names = [];
for (var key in obj) {
if (isFunction(obj[key])) names.push(key);
}
return names.sort();
}
return functions;
});
+14
View File
@@ -0,0 +1,14 @@
define(['./_toPath', './_deepGet', './isUndefined'], function (_toPath, _deepGet, isUndefined) {
// Get the value of the (deep) property on `path` from `object`.
// If any property in `path` does not exist or if the value is
// `undefined`, return `defaultValue` instead.
// The `path` is normalized through `_.toPath`.
function get(object, path, defaultValue) {
var value = _deepGet(object, _toPath(path));
return isUndefined(value) ? defaultValue : value;
}
return get;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./_group', './_has'], function (_group, _has) {
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
var groupBy = _group(function(result, value, key) {
if (_has(result, key)) result[key].push(value); else result[key] = [value];
});
return groupBy;
});
+19
View File
@@ -0,0 +1,19 @@
define(['./_has', './_toPath'], function (_has, _toPath) {
// Shortcut function for checking if an object has a given property directly on
// itself (in other words, not on a prototype). Unlike the internal `has`
// function, this public version can also traverse nested properties.
function has(obj, path) {
path = _toPath(path);
var length = path.length;
for (var i = 0; i < length; i++) {
var key = path[i];
if (!_has(obj, key)) return false;
obj = obj[key];
}
return !!length;
}
return has;
});
+10
View File
@@ -0,0 +1,10 @@
define(function () {
// Keep the identity function around for default iteratees.
function identity(value) {
return value;
}
return identity;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./index', './mixin'], function (index, mixin) {
// Default Export
// Add all of the Underscore functions to the wrapper object.
var _ = mixin(index);
// Legacy Node.js API.
_._ = _;
return _;
});
+154
View File
@@ -0,0 +1,154 @@
define(['exports', './_setup', './restArguments', './isObject', './isNull', './isUndefined', './isBoolean', './isElement', './isString', './isNumber', './isDate', './isRegExp', './isError', './isSymbol', './isArrayBuffer', './isDataView', './isArray', './isFunction', './isArguments', './isFinite', './isNaN', './isTypedArray', './isEmpty', './isMatch', './isEqual', './isMap', './isWeakMap', './isSet', './isWeakSet', './keys', './allKeys', './values', './pairs', './invert', './functions', './extend', './extendOwn', './defaults', './create', './clone', './tap', './get', './has', './mapObject', './identity', './constant', './noop', './toPath', './property', './propertyOf', './matcher', './times', './random', './now', './escape', './unescape', './templateSettings', './template', './result', './uniqueId', './chain', './iteratee', './partial', './bind', './bindAll', './memoize', './delay', './defer', './throttle', './debounce', './wrap', './negate', './compose', './after', './before', './once', './findKey', './findIndex', './findLastIndex', './sortedIndex', './indexOf', './lastIndexOf', './find', './findWhere', './each', './map', './reduce', './reduceRight', './filter', './reject', './every', './some', './contains', './invoke', './pluck', './where', './max', './min', './shuffle', './sample', './sortBy', './groupBy', './indexBy', './countBy', './partition', './toArray', './size', './pick', './omit', './first', './initial', './last', './rest', './compact', './flatten', './without', './uniq', './union', './intersection', './difference', './unzip', './zip', './object', './range', './chunk', './mixin', './underscore-array-methods', './underscore'], function (exports, _setup, restArguments, isObject, isNull, isUndefined, isBoolean, isElement, isString, isNumber, isDate, isRegExp, isError, isSymbol, isArrayBuffer, isDataView, isArray, isFunction, isArguments, _isFinite, _isNaN, isTypedArray, isEmpty, isMatch, isEqual, isMap, isWeakMap, isSet, isWeakSet, keys, allKeys, values, pairs, invert, functions, extend, extendOwn, defaults, create, clone, tap, get, has, mapObject, identity, constant, noop, toPath, property, propertyOf, matcher, times, random, now, _escape, _unescape, templateSettings, template, result, uniqueId, chain, iteratee, partial, bind, bindAll, memoize, delay, defer, throttle, debounce, wrap, negate, compose, after, before, once, findKey, findIndex, findLastIndex, sortedIndex, indexOf, lastIndexOf, find, findWhere, each, map, reduce, reduceRight, filter, reject, every, some, contains, invoke, pluck, where, max, min, shuffle, sample, sortBy, groupBy, indexBy, countBy, partition, toArray, size, pick, omit, first, initial, last, rest, compact, flatten, without, uniq, union, intersection, difference, unzip, zip, object, range, chunk, mixin, underscoreArrayMethods, underscore) {
// Named Exports
exports.VERSION = _setup.VERSION;
exports.restArguments = restArguments;
exports.isObject = isObject;
exports.isNull = isNull;
exports.isUndefined = isUndefined;
exports.isBoolean = isBoolean;
exports.isElement = isElement;
exports.isString = isString;
exports.isNumber = isNumber;
exports.isDate = isDate;
exports.isRegExp = isRegExp;
exports.isError = isError;
exports.isSymbol = isSymbol;
exports.isArrayBuffer = isArrayBuffer;
exports.isDataView = isDataView;
exports.isArray = isArray;
exports.isFunction = isFunction;
exports.isArguments = isArguments;
exports.isFinite = _isFinite;
exports.isNaN = _isNaN;
exports.isTypedArray = isTypedArray;
exports.isEmpty = isEmpty;
exports.isMatch = isMatch;
exports.isEqual = isEqual;
exports.isMap = isMap;
exports.isWeakMap = isWeakMap;
exports.isSet = isSet;
exports.isWeakSet = isWeakSet;
exports.keys = keys;
exports.allKeys = allKeys;
exports.values = values;
exports.pairs = pairs;
exports.invert = invert;
exports.functions = functions;
exports.methods = functions;
exports.extend = extend;
exports.assign = extendOwn;
exports.extendOwn = extendOwn;
exports.defaults = defaults;
exports.create = create;
exports.clone = clone;
exports.tap = tap;
exports.get = get;
exports.has = has;
exports.mapObject = mapObject;
exports.identity = identity;
exports.constant = constant;
exports.noop = noop;
exports.toPath = toPath;
exports.property = property;
exports.propertyOf = propertyOf;
exports.matcher = matcher;
exports.matches = matcher;
exports.times = times;
exports.random = random;
exports.now = now;
exports.escape = _escape;
exports.unescape = _unescape;
exports.templateSettings = templateSettings;
exports.template = template;
exports.result = result;
exports.uniqueId = uniqueId;
exports.chain = chain;
exports.iteratee = iteratee;
exports.partial = partial;
exports.bind = bind;
exports.bindAll = bindAll;
exports.memoize = memoize;
exports.delay = delay;
exports.defer = defer;
exports.throttle = throttle;
exports.debounce = debounce;
exports.wrap = wrap;
exports.negate = negate;
exports.compose = compose;
exports.after = after;
exports.before = before;
exports.once = once;
exports.findKey = findKey;
exports.findIndex = findIndex;
exports.findLastIndex = findLastIndex;
exports.sortedIndex = sortedIndex;
exports.indexOf = indexOf;
exports.lastIndexOf = lastIndexOf;
exports.detect = find;
exports.find = find;
exports.findWhere = findWhere;
exports.each = each;
exports.forEach = each;
exports.collect = map;
exports.map = map;
exports.foldl = reduce;
exports.inject = reduce;
exports.reduce = reduce;
exports.foldr = reduceRight;
exports.reduceRight = reduceRight;
exports.filter = filter;
exports.select = filter;
exports.reject = reject;
exports.all = every;
exports.every = every;
exports.any = some;
exports.some = some;
exports.contains = contains;
exports.include = contains;
exports.includes = contains;
exports.invoke = invoke;
exports.pluck = pluck;
exports.where = where;
exports.max = max;
exports.min = min;
exports.shuffle = shuffle;
exports.sample = sample;
exports.sortBy = sortBy;
exports.groupBy = groupBy;
exports.indexBy = indexBy;
exports.countBy = countBy;
exports.partition = partition;
exports.toArray = toArray;
exports.size = size;
exports.pick = pick;
exports.omit = omit;
exports.first = first;
exports.head = first;
exports.take = first;
exports.initial = initial;
exports.last = last;
exports.drop = rest;
exports.rest = rest;
exports.tail = rest;
exports.compact = compact;
exports.flatten = flatten;
exports.without = without;
exports.uniq = uniq;
exports.unique = uniq;
exports.union = union;
exports.intersection = intersection;
exports.difference = difference;
exports.transpose = unzip;
exports.unzip = unzip;
exports.zip = zip;
exports.object = object;
exports.range = range;
exports.chunk = chunk;
exports.mixin = mixin;
exports.default = underscore;
Object.defineProperty(exports, '__esModule', { value: true });
});
+11
View File
@@ -0,0 +1,11 @@
define(['./_group'], function (_group) {
// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
// when you know that your index values will be unique.
var indexBy = _group(function(result, value, key) {
result[key] = value;
});
return indexBy;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./sortedIndex', './findIndex', './_createIndexFinder'], function (sortedIndex, findIndex, _createIndexFinder) {
// Return the position of the first occurrence of an item in an array,
// or -1 if the item is not included in the array.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
var indexOf = _createIndexFinder(1, findIndex, sortedIndex);
return indexOf;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./_setup'], function (_setup) {
// Returns everything but the last entry of the array. Especially useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N.
function initial(array, n, guard) {
return _setup.slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
}
return initial;
});
+22
View File
@@ -0,0 +1,22 @@
define(['./_getLength', './contains'], function (_getLength, contains) {
// Produce an array that contains every item shared between all the
// passed-in arrays.
function intersection(array) {
var result = [];
var argsLength = arguments.length;
for (var i = 0, length = _getLength(array); i < length; i++) {
var item = array[i];
if (contains(result, item)) continue;
var j;
for (j = 1; j < argsLength; j++) {
if (!contains(arguments[j], item)) break;
}
if (j === argsLength) result.push(item);
}
return result;
}
return intersection;
});
+15
View File
@@ -0,0 +1,15 @@
define(['./keys'], function (keys) {
// Invert the keys and values of an object. The values must be serializable.
function invert(obj) {
var result = {};
var _keys = keys(obj);
for (var i = 0, length = _keys.length; i < length; i++) {
result[obj[_keys[i]]] = _keys[i];
}
return result;
}
return invert;
});
+28
View File
@@ -0,0 +1,28 @@
define(['./restArguments', './isFunction', './map', './_deepGet', './_toPath'], function (restArguments, isFunction, map, _deepGet, _toPath) {
// Invoke a method (with arguments) on every item in a collection.
var invoke = restArguments(function(obj, path, args) {
var contextPath, func;
if (isFunction(path)) {
func = path;
} else {
path = _toPath(path);
contextPath = path.slice(0, -1);
path = path[path.length - 1];
}
return map(obj, function(context) {
var method = func;
if (!method) {
if (contextPath && contextPath.length) {
context = _deepGet(context, contextPath);
}
if (context == null) return void 0;
method = context[path];
}
return method == null ? method : method.apply(context, args);
});
});
return invoke;
});
+19
View File
@@ -0,0 +1,19 @@
define(['./_tagTester', './_has'], function (_tagTester, _has) {
var isArguments = _tagTester('Arguments');
// Define a fallback version of the method in browsers (ahem, IE < 9), where
// there isn't any inspectable "Arguments" type.
(function() {
if (!isArguments(arguments)) {
isArguments = function(obj) {
return _has(obj, 'callee');
};
}
}());
var isArguments$1 = isArguments;
return isArguments$1;
});
+9
View File
@@ -0,0 +1,9 @@
define(['./_setup', './_tagTester'], function (_setup, _tagTester) {
// Is a given value an array?
// Delegates to ECMA5's native `Array.isArray`.
var isArray = _setup.nativeIsArray || _tagTester('Array');
return isArray;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isArrayBuffer = _tagTester('ArrayBuffer');
return isArrayBuffer;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./_setup'], function (_setup) {
// Is a given value a boolean?
function isBoolean(obj) {
return obj === true || obj === false || _setup.toString.call(obj) === '[object Boolean]';
}
return isBoolean;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./_tagTester', './isFunction', './isArrayBuffer', './_stringTagBug'], function (_tagTester, isFunction, isArrayBuffer, _stringTagBug) {
var isDataView = _tagTester('DataView');
// In IE 10 - Edge 13, we need a different heuristic
// to determine whether an object is a `DataView`.
// Also, in cases where the native `DataView` is
// overridden we can't rely on the tag itself.
function alternateIsDataView(obj) {
return obj != null && isFunction(obj.getInt8) && isArrayBuffer(obj.buffer);
}
var isDataView$1 = (_stringTagBug.hasDataViewBug ? alternateIsDataView : isDataView);
return isDataView$1;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isDate = _tagTester('Date');
return isDate;
});
+10
View File
@@ -0,0 +1,10 @@
define(function () {
// Is a given value a DOM element?
function isElement(obj) {
return !!(obj && obj.nodeType === 1);
}
return isElement;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./_getLength', './isArray', './isString', './isArguments', './keys'], function (_getLength, isArray, isString, isArguments, keys) {
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
function isEmpty(obj) {
if (obj == null) return true;
// Skip the more expensive `toString`-based type checks if `obj` has no
// `.length`.
var length = _getLength(obj);
if (typeof length == 'number' && (
isArray(obj) || isString(obj) || isArguments(obj)
)) return length === 0;
return _getLength(keys(obj)) === 0;
}
return isEmpty;
});
+133
View File
@@ -0,0 +1,133 @@
define(['./underscore', './_setup', './_getByteLength', './isTypedArray', './isFunction', './_stringTagBug', './isDataView', './keys', './_has', './_toBufferView'], function (underscore, _setup, _getByteLength, isTypedArray, isFunction, _stringTagBug, isDataView, keys, _has, _toBufferView) {
// We use this string twice, so give it a name for minification.
var tagDataView = '[object DataView]';
// Internal recursive comparison function for `_.isEqual`.
function eq(a, b, aStack, bStack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
if (a === b) return a !== 0 || 1 / a === 1 / b;
// `null` or `undefined` only equal to itself (strict comparison).
if (a == null || b == null) return false;
// `NaN`s are equivalent, but non-reflexive.
if (a !== a) return b !== b;
// Exhaust primitive checks
var type = typeof a;
if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
return deepEq(a, b, aStack, bStack);
}
// Internal recursive comparison function for `_.isEqual`.
function deepEq(a, b, aStack, bStack) {
// Unwrap any wrapped objects.
if (a instanceof underscore) a = a._wrapped;
if (b instanceof underscore) b = b._wrapped;
// Compare `[[Class]]` names.
var className = _setup.toString.call(a);
if (className !== _setup.toString.call(b)) return false;
// Work around a bug in IE 10 - Edge 13.
if (_stringTagBug.hasDataViewBug && className == '[object Object]' && isDataView(a)) {
if (!isDataView(b)) return false;
className = tagDataView;
}
switch (className) {
// These types are compared by value.
case '[object RegExp]':
// RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
return '' + a === '' + b;
case '[object Number]':
// `NaN`s are equivalent, but non-reflexive.
// Object(NaN) is equivalent to NaN.
if (+a !== +a) return +b !== +b;
// An `egal` comparison is performed for other numeric values.
return +a === 0 ? 1 / +a === 1 / b : +a === +b;
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
return +a === +b;
case '[object Symbol]':
return _setup.SymbolProto.valueOf.call(a) === _setup.SymbolProto.valueOf.call(b);
case '[object ArrayBuffer]':
case tagDataView:
// Coerce to typed array so we can fall through.
return deepEq(_toBufferView(a), _toBufferView(b), aStack, bStack);
}
var areArrays = className === '[object Array]';
if (!areArrays && isTypedArray(a)) {
var byteLength = _getByteLength(a);
if (byteLength !== _getByteLength(b)) return false;
if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
areArrays = true;
}
if (!areArrays) {
if (typeof a != 'object' || typeof b != 'object') return false;
// Objects with different constructors are not equivalent, but `Object`s or `Array`s
// from different frames are.
var aCtor = a.constructor, bCtor = b.constructor;
if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
isFunction(bCtor) && bCtor instanceof bCtor)
&& ('constructor' in a && 'constructor' in b)) {
return false;
}
}
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
// Initializing stack of traversed objects.
// It's done here since we only need them for objects and arrays comparison.
aStack = aStack || [];
bStack = bStack || [];
var length = aStack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
if (aStack[length] === a) return bStack[length] === b;
}
// Add the first object to the stack of traversed objects.
aStack.push(a);
bStack.push(b);
// Recursively compare objects and arrays.
if (areArrays) {
// Compare array lengths to determine if a deep comparison is necessary.
length = a.length;
if (length !== b.length) return false;
// Deep compare the contents, ignoring non-numeric properties.
while (length--) {
if (!eq(a[length], b[length], aStack, bStack)) return false;
}
} else {
// Deep compare objects.
var _keys = keys(a), key;
length = _keys.length;
// Ensure that both objects contain the same number of properties before comparing deep equality.
if (keys(b).length !== length) return false;
while (length--) {
// Deep compare each member
key = _keys[length];
if (!(_has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
}
}
// Remove the first object from the stack of traversed objects.
aStack.pop();
bStack.pop();
return true;
}
// Perform a deep comparison to check if two objects are equal.
function isEqual(a, b) {
return eq(a, b);
}
return isEqual;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isError = _tagTester('Error');
return isError;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./_setup', './isSymbol'], function (_setup, isSymbol) {
// Is a given object a finite number?
function isFinite(obj) {
return !isSymbol(obj) && _setup._isFinite(obj) && !isNaN(parseFloat(obj));
}
return isFinite;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./_tagTester', './_setup'], function (_tagTester, _setup) {
var isFunction = _tagTester('Function');
// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
var nodelist = _setup.root.document && _setup.root.document.childNodes;
if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
isFunction = function(obj) {
return typeof obj == 'function' || false;
};
}
var isFunction$1 = isFunction;
return isFunction$1;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) {
var isMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.mapMethods) : _tagTester('Map');
return isMap;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./keys'], function (keys) {
// Returns whether an object has a given set of `key:value` pairs.
function isMatch(object, attrs) {
var _keys = keys(attrs), length = _keys.length;
if (object == null) return !length;
var obj = Object(object);
for (var i = 0; i < length; i++) {
var key = _keys[i];
if (attrs[key] !== obj[key] || !(key in obj)) return false;
}
return true;
}
return isMatch;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./_setup', './isNumber'], function (_setup, isNumber) {
// Is the given value `NaN`?
function isNaN(obj) {
return isNumber(obj) && _setup._isNaN(obj);
}
return isNaN;
});
+10
View File
@@ -0,0 +1,10 @@
define(function () {
// Is a given value equal to null?
function isNull(obj) {
return obj === null;
}
return isNull;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isNumber = _tagTester('Number');
return isNumber;
});
+11
View File
@@ -0,0 +1,11 @@
define(function () {
// Is a given variable an object?
function isObject(obj) {
var type = typeof obj;
return type === 'function' || (type === 'object' && !!obj);
}
return isObject;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isRegExp = _tagTester('RegExp');
return isRegExp;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) {
var isSet = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.setMethods) : _tagTester('Set');
return isSet;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isString = _tagTester('String');
return isString;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isSymbol = _tagTester('Symbol');
return isSymbol;
});
+16
View File
@@ -0,0 +1,16 @@
define(['./_setup', './isDataView', './constant', './_isBufferLike'], function (_setup, isDataView, constant, _isBufferLike) {
// Is a given value a typed array?
var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
function isTypedArray(obj) {
// `ArrayBuffer.isView` is the most future-proof, so use it when available.
// Otherwise, fall back on the above regular expression.
return _setup.nativeIsView ? (_setup.nativeIsView(obj) && !isDataView(obj)) :
_isBufferLike(obj) && typedArrayPattern.test(_setup.toString.call(obj));
}
var isTypedArray$1 = _setup.supportsArrayBuffer ? isTypedArray : constant(false);
return isTypedArray$1;
});
+10
View File
@@ -0,0 +1,10 @@
define(function () {
// Is a given variable undefined?
function isUndefined(obj) {
return obj === void 0;
}
return isUndefined;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester', './_stringTagBug', './_methodFingerprint'], function (_tagTester, _stringTagBug, _methodFingerprint) {
var isWeakMap = _stringTagBug.isIE11 ? _methodFingerprint.ie11fingerprint(_methodFingerprint.weakMapMethods) : _tagTester('WeakMap');
return isWeakMap;
});
+7
View File
@@ -0,0 +1,7 @@
define(['./_tagTester'], function (_tagTester) {
var isWeakSet = _tagTester('WeakSet');
return isWeakSet;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./underscore', './_baseIteratee'], function (underscore, _baseIteratee) {
// External wrapper for our callback generator. Users may customize
// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
// This abstraction hides the internal-only `argCount` argument.
function iteratee(value, context) {
return _baseIteratee(value, context, Infinity);
}
underscore.iteratee = iteratee;
return iteratee;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./isObject', './_setup', './_has', './_collectNonEnumProps'], function (isObject, _setup, _has, _collectNonEnumProps) {
// Retrieve the names of an object's own properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`.
function keys(obj) {
if (!isObject(obj)) return [];
if (_setup.nativeKeys) return _setup.nativeKeys(obj);
var keys = [];
for (var key in obj) if (_has(obj, key)) keys.push(key);
// Ahem, IE < 9.
if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
return keys;
}
return keys;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./rest'], function (rest) {
// Get the last element of an array. Passing **n** will return the last N
// values in the array.
function last(array, n, guard) {
if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
if (n == null || guard) return array[array.length - 1];
return rest(array, Math.max(0, array.length - n));
}
return last;
});
+9
View File
@@ -0,0 +1,9 @@
define(['./findLastIndex', './_createIndexFinder'], function (findLastIndex, _createIndexFinder) {
// Return the position of the last occurrence of an item in an array,
// or -1 if the item is not included in the array.
var lastIndexOf = _createIndexFinder(-1, findLastIndex);
return lastIndexOf;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) {
// Return the results of applying the iteratee to each element.
function map(obj, iteratee, context) {
iteratee = _cb(iteratee, context);
var _keys = !_isArrayLike(obj) && keys(obj),
length = (_keys || obj).length,
results = Array(length);
for (var index = 0; index < length; index++) {
var currentKey = _keys ? _keys[index] : index;
results[index] = iteratee(obj[currentKey], currentKey, obj);
}
return results;
}
return map;
});
+19
View File
@@ -0,0 +1,19 @@
define(['./_cb', './keys'], function (_cb, keys) {
// Returns the results of applying the `iteratee` to each element of `obj`.
// In contrast to `_.map` it returns an object.
function mapObject(obj, iteratee, context) {
iteratee = _cb(iteratee, context);
var _keys = keys(obj),
length = _keys.length,
results = {};
for (var index = 0; index < length; index++) {
var currentKey = _keys[index];
results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
}
return results;
}
return mapObject;
});
+14
View File
@@ -0,0 +1,14 @@
define(['./extendOwn', './isMatch'], function (extendOwn, isMatch) {
// Returns a predicate for checking whether an object has a given set of
// `key:value` pairs.
function matcher(attrs) {
attrs = extendOwn({}, attrs);
return function(obj) {
return isMatch(obj, attrs);
};
}
return matcher;
});
+30
View File
@@ -0,0 +1,30 @@
define(['./_isArrayLike', './values', './_cb', './each'], function (_isArrayLike, values, _cb, each) {
// Return the maximum element (or element-based computation).
function max(obj, iteratee, context) {
var result = -Infinity, lastComputed = -Infinity,
value, computed;
if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
obj = _isArrayLike(obj) ? obj : values(obj);
for (var i = 0, length = obj.length; i < length; i++) {
value = obj[i];
if (value != null && value > result) {
result = value;
}
}
} else {
iteratee = _cb(iteratee, context);
each(obj, function(v, index, list) {
computed = iteratee(v, index, list);
if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {
result = v;
lastComputed = computed;
}
});
}
return result;
}
return max;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./_has'], function (_has) {
// Memoize an expensive function by storing its results.
function memoize(func, hasher) {
var memoize = function(key) {
var cache = memoize.cache;
var address = '' + (hasher ? hasher.apply(this, arguments) : key);
if (!_has(cache, address)) cache[address] = func.apply(this, arguments);
return cache[address];
};
memoize.cache = {};
return memoize;
}
return memoize;
});
+30
View File
@@ -0,0 +1,30 @@
define(['./_isArrayLike', './values', './_cb', './each'], function (_isArrayLike, values, _cb, each) {
// Return the minimum element (or element-based computation).
function min(obj, iteratee, context) {
var result = Infinity, lastComputed = Infinity,
value, computed;
if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
obj = _isArrayLike(obj) ? obj : values(obj);
for (var i = 0, length = obj.length; i < length; i++) {
value = obj[i];
if (value != null && value < result) {
result = value;
}
}
} else {
iteratee = _cb(iteratee, context);
each(obj, function(v, index, list) {
computed = iteratee(v, index, list);
if (computed < lastComputed || (computed === Infinity && result === Infinity)) {
result = v;
lastComputed = computed;
}
});
}
return result;
}
return min;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./underscore', './each', './functions', './_setup', './_chainResult'], function (underscore, each, functions, _setup, _chainResult) {
// Add your own custom functions to the Underscore object.
function mixin(obj) {
each(functions(obj), function(name) {
var func = underscore[name] = obj[name];
underscore.prototype[name] = function() {
var args = [this._wrapped];
_setup.push.apply(args, arguments);
return _chainResult(this, func.apply(underscore, args));
};
});
return underscore;
}
return mixin;
});
+12
View File
@@ -0,0 +1,12 @@
define(function () {
// Returns a negated version of the passed-in predicate.
function negate(predicate) {
return function() {
return !predicate.apply(this, arguments);
};
}
return negate;
});
+8
View File
@@ -0,0 +1,8 @@
define(function () {
// Predicate-generating function. Often useful outside of Underscore.
function noop(){}
return noop;
});
+10
View File
@@ -0,0 +1,10 @@
define(function () {
// A (possibly faster) way to get the current timestamp as an integer.
var now = Date.now || function() {
return new Date().getTime();
};
return now;
});
+20
View File
@@ -0,0 +1,20 @@
define(['./_getLength'], function (_getLength) {
// Converts lists into objects. Pass either a single array of `[key, value]`
// pairs, or two parallel arrays of the same length -- one of keys, and one of
// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
function object(list, values) {
var result = {};
for (var i = 0, length = _getLength(list); i < length; i++) {
if (values) {
result[list[i]] = values[i];
} else {
result[list[i][0]] = list[i][1];
}
}
return result;
}
return object;
});
+20
View File
@@ -0,0 +1,20 @@
define(['./restArguments', './isFunction', './negate', './map', './_flatten', './contains', './pick'], function (restArguments, isFunction, negate, map, _flatten, contains, pick) {
// Return a copy of the object without the disallowed properties.
var omit = restArguments(function(obj, keys) {
var iteratee = keys[0], context;
if (isFunction(iteratee)) {
iteratee = negate(iteratee);
if (keys.length > 1) context = keys[1];
} else {
keys = map(_flatten(keys, false, false), String);
iteratee = function(value, key) {
return !contains(keys, key);
};
}
return pick(obj, iteratee, context);
});
return omit;
});
+9
View File
@@ -0,0 +1,9 @@
define(['./partial', './before'], function (partial, before) {
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
var once = partial(before, 2);
return once;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./keys'], function (keys) {
// Convert an object into a list of `[key, value]` pairs.
// The opposite of `_.object` with one argument.
function pairs(obj) {
var _keys = keys(obj);
var length = _keys.length;
var pairs = Array(length);
for (var i = 0; i < length; i++) {
pairs[i] = [_keys[i], obj[_keys[i]]];
}
return pairs;
}
return pairs;
});
+25
View File
@@ -0,0 +1,25 @@
define(['./restArguments', './_executeBound', './underscore'], function (restArguments, _executeBound, underscore) {
// Partially apply a function by creating a version that has had some of its
// arguments pre-filled, without changing its dynamic `this` context. `_` acts
// as a placeholder by default, allowing any combination of arguments to be
// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
var partial = restArguments(function(func, boundArgs) {
var placeholder = partial.placeholder;
var bound = function() {
var position = 0, length = boundArgs.length;
var args = Array(length);
for (var i = 0; i < length; i++) {
args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
}
while (position < arguments.length) args.push(arguments[position++]);
return _executeBound(func, bound, this, this, args);
};
return bound;
});
partial.placeholder = underscore;
return partial;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./_group'], function (_group) {
// Split a collection into two arrays: one whose elements all pass the given
// truth test, and one whose elements all do not pass the truth test.
var partition = _group(function(result, value, pass) {
result[pass ? 0 : 1].push(value);
}, true);
return partition;
});
+25
View File
@@ -0,0 +1,25 @@
define(['./restArguments', './isFunction', './_optimizeCb', './allKeys', './_keyInObj', './_flatten'], function (restArguments, isFunction, _optimizeCb, allKeys, _keyInObj, _flatten) {
// Return a copy of the object only containing the allowed properties.
var pick = restArguments(function(obj, keys) {
var result = {}, iteratee = keys[0];
if (obj == null) return result;
if (isFunction(iteratee)) {
if (keys.length > 1) iteratee = _optimizeCb(iteratee, keys[1]);
keys = allKeys(obj);
} else {
iteratee = _keyInObj;
keys = _flatten(keys, false, false);
obj = Object(obj);
}
for (var i = 0, length = keys.length; i < length; i++) {
var key = keys[i];
var value = obj[key];
if (iteratee(value, key, obj)) result[key] = value;
}
return result;
});
return pick;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./restArguments', './reduce'], function (restArguments, reduce) {
function nextValue(previous, func) {
return func(previous);
}
var pipe = restArguments(function(value, funcs) {
return reduce(funcs, nextValue, value);
});
return pipe;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./map', './property'], function (map, property) {
// Convenience version of a common use case of `_.map`: fetching a property.
function pluck(obj, key) {
return map(obj, property(key));
}
return pluck;
});
+14
View File
@@ -0,0 +1,14 @@
define(['./_deepGet', './_toPath'], function (_deepGet, _toPath) {
// Creates a function that, when passed an object, will traverse that objects
// properties down the given `path`, specified as an array of keys or indices.
function property(path) {
path = _toPath(path);
return function(obj) {
return _deepGet(obj, path);
};
}
return property;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./noop', './get'], function (noop, get) {
// Generates a function for a given object that returns a given property.
function propertyOf(obj) {
if (obj == null) return noop;
return function(path) {
return get(obj, path);
};
}
return propertyOf;
});
+14
View File
@@ -0,0 +1,14 @@
define(function () {
// Return a random integer between `min` and `max` (inclusive).
function random(min, max) {
if (max == null) {
max = min;
min = 0;
}
return min + Math.floor(Math.random() * (max - min + 1));
}
return random;
});
+27
View File
@@ -0,0 +1,27 @@
define(function () {
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](https://docs.python.org/library/functions.html#range).
function range(start, stop, step) {
if (stop == null) {
stop = start || 0;
start = 0;
}
if (!step) {
step = stop < start ? -1 : 1;
}
var length = Math.max(Math.ceil((stop - start) / step), 0);
var range = Array(length);
for (var idx = 0; idx < length; idx++, start += step) {
range[idx] = start;
}
return range;
}
return range;
});
+9
View File
@@ -0,0 +1,9 @@
define(['./_createReduce'], function (_createReduce) {
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`.
var reduce = _createReduce(1);
return reduce;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_createReduce'], function (_createReduce) {
// The right-associative version of reduce, also known as `foldr`.
var reduceRight = _createReduce(-1);
return reduceRight;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./filter', './negate', './_cb'], function (filter, negate, _cb) {
// Return all the elements for which a truth test fails.
function reject(obj, predicate, context) {
return filter(obj, negate(_cb(predicate)), context);
}
return reject;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./_setup'], function (_setup) {
// Returns everything but the first entry of the `array`. Especially useful on
// the `arguments` object. Passing an **n** will return the rest N values in the
// `array`.
function rest(array, n, guard) {
return _setup.slice.call(array, n == null || guard ? 1 : n);
}
return rest;
});
+33
View File
@@ -0,0 +1,33 @@
define(function () {
// Some functions take a variable number of arguments, or a few expected
// arguments at the beginning and then a variable number of values to operate
// on. This helper accumulates all remaining arguments past the functions
// argument length (or an explicit `startIndex`), into an array that becomes
// the last argument. Similar to ES6s "rest parameter".
function restArguments(func, startIndex) {
startIndex = startIndex == null ? func.length - 1 : +startIndex;
return function() {
var length = Math.max(arguments.length - startIndex, 0),
rest = Array(length),
index = 0;
for (; index < length; index++) {
rest[index] = arguments[index + startIndex];
}
switch (startIndex) {
case 0: return func.call(this, rest);
case 1: return func.call(this, arguments[0], rest);
case 2: return func.call(this, arguments[0], arguments[1], rest);
}
var args = Array(startIndex + 1);
for (index = 0; index < startIndex; index++) {
args[index] = arguments[index];
}
args[startIndex] = rest;
return func.apply(this, args);
};
}
return restArguments;
});
+25
View File
@@ -0,0 +1,25 @@
define(['./isFunction', './_toPath'], function (isFunction, _toPath) {
// Traverses the children of `obj` along `path`. If a child is a function, it
// is invoked with its parent as context. Returns the value of the final
// child, or `fallback` if any child is undefined.
function result(obj, path, fallback) {
path = _toPath(path);
var length = path.length;
if (!length) {
return isFunction(fallback) ? fallback.call(obj) : fallback;
}
for (var i = 0; i < length; i++) {
var prop = obj == null ? void 0 : obj[path[i]];
if (prop === void 0) {
prop = fallback;
i = length; // Ensure we don't continue iterating.
}
obj = isFunction(prop) ? prop.call(obj) : prop;
}
return obj;
}
return result;
});
+27
View File
@@ -0,0 +1,27 @@
define(['./_isArrayLike', './values', './_getLength', './random', './toArray'], function (_isArrayLike, values, _getLength, random, toArray) {
// Sample **n** random values from a collection using the modern version of the
// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/FisherYates_shuffle).
// If **n** is not specified, returns a single random element.
// The internal `guard` argument allows it to work with `_.map`.
function sample(obj, n, guard) {
if (n == null || guard) {
if (!_isArrayLike(obj)) obj = values(obj);
return obj[random(obj.length - 1)];
}
var sample = toArray(obj);
var length = _getLength(sample);
n = Math.max(Math.min(n, length), 0);
var last = length - 1;
for (var index = 0; index < n; index++) {
var rand = random(index, last);
var temp = sample[index];
sample[index] = sample[rand];
sample[rand] = temp;
}
return sample.slice(0, n);
}
return sample;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./sample'], function (sample) {
// Shuffle a collection.
function shuffle(obj) {
return sample(obj, Infinity);
}
return shuffle;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./_isArrayLike', './keys'], function (_isArrayLike, keys) {
// Return the number of elements in a collection.
function size(obj) {
if (obj == null) return 0;
return _isArrayLike(obj) ? obj.length : keys(obj).length;
}
return size;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./_cb', './_isArrayLike', './keys'], function (_cb, _isArrayLike, keys) {
// Determine if at least one element in the object passes a truth test.
function some(obj, predicate, context) {
predicate = _cb(predicate, context);
var _keys = !_isArrayLike(obj) && keys(obj),
length = (_keys || obj).length;
for (var index = 0; index < length; index++) {
var currentKey = _keys ? _keys[index] : index;
if (predicate(obj[currentKey], currentKey, obj)) return true;
}
return false;
}
return some;
});
+26
View File
@@ -0,0 +1,26 @@
define(['./_cb', './pluck', './map'], function (_cb, pluck, map) {
// Sort the object's values by a criterion produced by an iteratee.
function sortBy(obj, iteratee, context) {
var index = 0;
iteratee = _cb(iteratee, context);
return pluck(map(obj, function(value, key, list) {
return {
value: value,
index: index++,
criteria: iteratee(value, key, list)
};
}).sort(function(left, right) {
var a = left.criteria;
var b = right.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index - right.index;
}), 'value');
}
return sortBy;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./_cb', './_getLength'], function (_cb, _getLength) {
// Use a comparator function to figure out the smallest index at which
// an object should be inserted so as to maintain order. Uses binary search.
function sortedIndex(array, obj, iteratee, context) {
iteratee = _cb(iteratee, context, 1);
var value = iteratee(obj);
var low = 0, high = _getLength(array);
while (low < high) {
var mid = Math.floor((low + high) / 2);
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
}
return low;
}
return sortedIndex;
});
+13
View File
@@ -0,0 +1,13 @@
define(function () {
// Invokes `interceptor` with the `obj` and then returns `obj`.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
function tap(obj, interceptor) {
interceptor(obj);
return obj;
}
return tap;
});
+103
View File
@@ -0,0 +1,103 @@
define(['./defaults', './underscore', './templateSettings'], function (defaults, underscore, templateSettings) {
// When customizing `_.templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
function escapeChar(match) {
return '\\' + escapes[match];
}
// In order to prevent third-party code injection through
// `_.templateSettings.variable`, we test it against the following regular
// expression. It is intentionally a bit more liberal than just matching valid
// identifiers, but still prevents possible loopholes through defaults or
// destructuring assignment.
var bareIdentifier = /^\s*(\w|\$)+\s*$/;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
// NB: `oldSettings` only exists for backwards compatibility.
function template(text, settings, oldSettings) {
if (!settings && oldSettings) settings = oldSettings;
settings = defaults({}, settings, underscore.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
index = offset + match.length;
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
} else if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
} else if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
// Adobe VMs need the match returned to produce the correct offset.
return match;
});
source += "';\n";
var argument = settings.variable;
if (argument) {
// Insure against third-party code injection. (CVE-2021-23358)
if (!bareIdentifier.test(argument)) throw new Error(
'variable is not a bare identifier: ' + argument
);
} else {
// If a variable is not specified, place data values in local scope.
source = 'with(obj||{}){\n' + source + '}\n';
argument = 'obj';
}
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + 'return __p;\n';
var render;
try {
render = new Function(argument, '_', source);
} catch (e) {
e.source = source;
throw e;
}
var template = function(data) {
return render.call(this, data, underscore);
};
// Provide the compiled source as a convenience for precompilation.
template.source = 'function(' + argument + '){\n' + source + '}';
return template;
}
return template;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./underscore'], function (underscore) {
// By default, Underscore uses ERB-style template delimiters. Change the
// following template settings to use alternative delimiters.
var templateSettings = underscore.templateSettings = {
evaluate: /<%([\s\S]+?)%>/g,
interpolate: /<%=([\s\S]+?)%>/g,
escape: /<%-([\s\S]+?)%>/g
};
return templateSettings;
});
+51
View File
@@ -0,0 +1,51 @@
define(['./now'], function (now) {
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time. Normally, the throttled function will run
// as much as it can, without ever going more than once per `wait` duration;
// but if you'd like to disable the execution on the leading edge, pass
// `{leading: false}`. To disable execution on the trailing edge, ditto.
function throttle(func, wait, options) {
var timeout, context, args, result;
var previous = 0;
if (!options) options = {};
var later = function() {
previous = options.leading === false ? 0 : now();
timeout = null;
result = func.apply(context, args);
if (!timeout) context = args = null;
};
var throttled = function() {
var _now = now();
if (!previous && options.leading === false) previous = _now;
var remaining = wait - (_now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = _now;
result = func.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
throttled.cancel = function() {
clearTimeout(timeout);
previous = 0;
timeout = context = args = null;
};
return throttled;
}
return throttle;
});
+13
View File
@@ -0,0 +1,13 @@
define(['./_optimizeCb'], function (_optimizeCb) {
// Run a function **n** times.
function times(n, iteratee, context) {
var accum = Array(Math.max(0, n));
iteratee = _optimizeCb(iteratee, context, 1);
for (var i = 0; i < n; i++) accum[i] = iteratee(i);
return accum;
}
return times;
});
+18
View File
@@ -0,0 +1,18 @@
define(['./isArray', './_setup', './isString', './_isArrayLike', './map', './identity', './values'], function (isArray, _setup, isString, _isArrayLike, map, identity, values) {
// Safely create a real, live array from anything iterable.
var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
function toArray(obj) {
if (!obj) return [];
if (isArray(obj)) return _setup.slice.call(obj);
if (isString(obj)) {
// Keep surrogate pair characters together.
return obj.match(reStrSymbol);
}
if (_isArrayLike(obj)) return map(obj, identity);
return values(obj);
}
return toArray;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./underscore', './isArray'], function (underscore, isArray) {
// Normalize a (deep) property `path` to array.
// Like `_.iteratee`, this function can be customized.
function toPath(path) {
return isArray(path) ? path : [path];
}
underscore.toPath = toPath;
return toPath;
});
+30
View File
@@ -0,0 +1,30 @@
define(['./underscore', './each', './_setup', './_chainResult'], function (underscore, each, _setup, _chainResult) {
// Add all mutator `Array` functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = _setup.ArrayProto[name];
underscore.prototype[name] = function() {
var obj = this._wrapped;
if (obj != null) {
method.apply(obj, arguments);
if ((name === 'shift' || name === 'splice') && obj.length === 0) {
delete obj[0];
}
}
return _chainResult(this, obj);
};
});
// Add all accessor `Array` functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = _setup.ArrayProto[name];
underscore.prototype[name] = function() {
var obj = this._wrapped;
if (obj != null) obj = method.apply(obj, arguments);
return _chainResult(this, obj);
};
});
return underscore;
});
+29
View File
@@ -0,0 +1,29 @@
define(['./_setup'], function (_setup) {
// If Underscore is called as a function, it returns a wrapped object that can
// be used OO-style. This wrapper holds altered versions of all functions added
// through `_.mixin`. Wrapped objects may be chained.
function _(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
}
_.VERSION = _setup.VERSION;
// Extracts the result from a wrapped and chained object.
_.prototype.value = function() {
return this._wrapped;
};
// Provide unwrapping proxies for some methods used in engine operations
// such as arithmetic and JSON stringification.
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
_.prototype.toString = function() {
return String(this._wrapped);
};
return _;
});
+8
View File
@@ -0,0 +1,8 @@
define(['./_createEscaper', './_unescapeMap'], function (_createEscaper, _unescapeMap) {
// Function for unescaping strings from HTML interpolation.
var _unescape = _createEscaper(_unescapeMap);
return _unescape;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./restArguments', './uniq', './_flatten'], function (restArguments, uniq, _flatten) {
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
var union = restArguments(function(arrays) {
return uniq(_flatten(arrays, true, true));
});
return union;
});
+37
View File
@@ -0,0 +1,37 @@
define(['./isBoolean', './_cb', './_getLength', './contains'], function (isBoolean, _cb, _getLength, contains) {
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// The faster algorithm will not work with an iteratee if the iteratee
// is not a one-to-one function, so providing an iteratee will disable
// the faster algorithm.
function uniq(array, isSorted, iteratee, context) {
if (!isBoolean(isSorted)) {
context = iteratee;
iteratee = isSorted;
isSorted = false;
}
if (iteratee != null) iteratee = _cb(iteratee, context);
var result = [];
var seen = [];
for (var i = 0, length = _getLength(array); i < length; i++) {
var value = array[i],
computed = iteratee ? iteratee(value, i, array) : value;
if (isSorted && !iteratee) {
if (!i || seen !== computed) result.push(value);
seen = computed;
} else if (iteratee) {
if (!contains(seen, computed)) {
seen.push(computed);
result.push(value);
}
} else if (!contains(result, value)) {
result.push(value);
}
}
return result;
}
return uniq;
});
+13
View File
@@ -0,0 +1,13 @@
define(function () {
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
function uniqueId(prefix) {
var id = ++idCounter + '';
return prefix ? prefix + id : id;
}
return uniqueId;
});
+17
View File
@@ -0,0 +1,17 @@
define(['./max', './_getLength', './pluck'], function (max, _getLength, pluck) {
// Complement of zip. Unzip accepts an array of arrays and groups
// each array's elements on shared indices.
function unzip(array) {
var length = (array && max(array, _getLength).length) || 0;
var result = Array(length);
for (var index = 0; index < length; index++) {
result[index] = pluck(array, index);
}
return result;
}
return unzip;
});
+16
View File
@@ -0,0 +1,16 @@
define(['./keys'], function (keys) {
// Retrieve the values of an object's properties.
function values(obj) {
var _keys = keys(obj);
var length = _keys.length;
var values = Array(length);
for (var i = 0; i < length; i++) {
values[i] = obj[_keys[i]];
}
return values;
}
return values;
});
+11
View File
@@ -0,0 +1,11 @@
define(['./filter', './matcher'], function (filter, matcher) {
// Convenience version of a common use case of `_.filter`: selecting only
// objects containing specific `key:value` pairs.
function where(obj, attrs) {
return filter(obj, matcher(attrs));
}
return where;
});
+10
View File
@@ -0,0 +1,10 @@
define(['./restArguments', './difference'], function (restArguments, difference) {
// Return a version of the array that does not contain the specified value(s).
var without = restArguments(function(array, otherArrays) {
return difference(array, otherArrays);
});
return without;
});
+12
View File
@@ -0,0 +1,12 @@
define(['./partial'], function (partial) {
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
function wrap(func, wrapper) {
return partial(wrapper, func);
}
return wrap;
});
+9
View File
@@ -0,0 +1,9 @@
define(['./restArguments', './unzip'], function (restArguments, unzip) {
// Zip together multiple lists into a single array -- elements that share
// an index go together.
var zip = restArguments(unzip);
return zip;
});
+20
View File
@@ -0,0 +1,20 @@
var isObject = require('./isObject.js');
var _setup = require('./_setup.js');
// Create a naked function reference for surrogate-prototype-swapping.
function ctor() {
return function(){};
}
// An internal function for creating a new object that inherits from another.
function baseCreate(prototype) {
if (!isObject(prototype)) return {};
if (_setup.nativeCreate) return _setup.nativeCreate(prototype);
var Ctor = ctor();
Ctor.prototype = prototype;
var result = new Ctor;
Ctor.prototype = null;
return result;
}
module.exports = baseCreate;
+19
View File
@@ -0,0 +1,19 @@
var identity = require('./identity.js');
var isFunction = require('./isFunction.js');
var isObject = require('./isObject.js');
var isArray = require('./isArray.js');
var matcher = require('./matcher.js');
var property = require('./property.js');
var _optimizeCb = require('./_optimizeCb.js');
// An internal function to generate callbacks that can be applied to each
// element in a collection, returning the desired result — either `_.identity`,
// an arbitrary callback, a property matcher, or a property accessor.
function baseIteratee(value, context, argCount) {
if (value == null) return identity;
if (isFunction(value)) return _optimizeCb(value, context, argCount);
if (isObject(value) && !isArray(value)) return matcher(value);
return property(value);
}
module.exports = baseIteratee;
+12
View File
@@ -0,0 +1,12 @@
var underscore = require('./underscore.js');
var _baseIteratee = require('./_baseIteratee.js');
var iteratee = require('./iteratee.js');
// The function we call internally to generate a callback. It invokes
// `_.iteratee` if overridden, otherwise `baseIteratee`.
function cb(value, context, argCount) {
if (underscore.iteratee !== iteratee) return underscore.iteratee(value, context);
return _baseIteratee(value, context, argCount);
}
module.exports = cb;
+8
View File
@@ -0,0 +1,8 @@
var underscore = require('./underscore.js');
// Helper function to continue chaining intermediate results.
function chainResult(instance, obj) {
return instance._chain ? underscore(obj).chain() : obj;
}
module.exports = chainResult;
+42
View File
@@ -0,0 +1,42 @@
var _setup = require('./_setup.js');
var isFunction = require('./isFunction.js');
var _has = require('./_has.js');
// Internal helper to create a simple lookup structure.
// `collectNonEnumProps` used to depend on `_.contains`, but this led to
// circular imports. `emulatedSet` is a one-off solution that only works for
// arrays of strings.
function emulatedSet(keys) {
var hash = {};
for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
return {
contains: function(key) { return hash[key] === true; },
push: function(key) {
hash[key] = true;
return keys.push(key);
}
};
}
// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
// needed.
function collectNonEnumProps(obj, keys) {
keys = emulatedSet(keys);
var nonEnumIdx = _setup.nonEnumerableProps.length;
var constructor = obj.constructor;
var proto = (isFunction(constructor) && constructor.prototype) || _setup.ObjProto;
// Constructor is a special case.
var prop = 'constructor';
if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop);
while (nonEnumIdx--) {
prop = _setup.nonEnumerableProps[nonEnumIdx];
if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
keys.push(prop);
}
}
}
module.exports = collectNonEnumProps;
+20
View File
@@ -0,0 +1,20 @@
// An internal function for creating assigner functions.
function createAssigner(keysFunc, defaults) {
return function(obj) {
var length = arguments.length;
if (defaults) obj = Object(obj);
if (length < 2 || obj == null) return obj;
for (var index = 1; index < length; index++) {
var source = arguments[index],
keys = keysFunc(source),
l = keys.length;
for (var i = 0; i < l; i++) {
var key = keys[i];
if (!defaults || obj[key] === void 0) obj[key] = source[key];
}
}
return obj;
};
}
module.exports = createAssigner;
+19
View File
@@ -0,0 +1,19 @@
var keys = require('./keys.js');
// Internal helper to generate functions for escaping and unescaping strings
// to/from HTML interpolation.
function createEscaper(map) {
var escaper = function(match) {
return map[match];
};
// Regexes for identifying a key that needs to be escaped.
var source = '(?:' + keys(map).join('|') + ')';
var testRegexp = RegExp(source);
var replaceRegexp = RegExp(source, 'g');
return function(string) {
string = string == null ? '' : '' + string;
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
};
}
module.exports = createEscaper;
+30
View File
@@ -0,0 +1,30 @@
var _getLength = require('./_getLength.js');
var _setup = require('./_setup.js');
var _isNaN = require('./isNaN.js');
// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
function createIndexFinder(dir, predicateFind, sortedIndex) {
return function(array, item, idx) {
var i = 0, length = _getLength(array);
if (typeof idx == 'number') {
if (dir > 0) {
i = idx >= 0 ? idx : Math.max(idx + length, i);
} else {
length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
}
} else if (sortedIndex && idx && length) {
idx = sortedIndex(array, item);
return array[idx] === item ? idx : -1;
}
if (item !== item) {
idx = predicateFind(_setup.slice.call(array, i, length), _isNaN);
return idx >= 0 ? idx + i : -1;
}
for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
if (array[idx] === item) return idx;
}
return -1;
};
}
module.exports = createIndexFinder;
+17
View File
@@ -0,0 +1,17 @@
var _cb = require('./_cb.js');
var _getLength = require('./_getLength.js');
// Internal function to generate `_.findIndex` and `_.findLastIndex`.
function createPredicateIndexFinder(dir) {
return function(array, predicate, context) {
predicate = _cb(predicate, context);
var length = _getLength(array);
var index = dir > 0 ? 0 : length - 1;
for (; index >= 0 && index < length; index += dir) {
if (predicate(array[index], index, array)) return index;
}
return -1;
};
}
module.exports = createPredicateIndexFinder;
+30
View File
@@ -0,0 +1,30 @@
var _isArrayLike = require('./_isArrayLike.js');
var keys = require('./keys.js');
var _optimizeCb = require('./_optimizeCb.js');
// Internal helper to create a reducing function, iterating left or right.
function createReduce(dir) {
// Wrap code that reassigns argument variables in a separate function than
// the one that accesses `arguments.length` to avoid a perf hit. (#1991)
var reducer = function(obj, iteratee, memo, initial) {
var _keys = !_isArrayLike(obj) && keys(obj),
length = (_keys || obj).length,
index = dir > 0 ? 0 : length - 1;
if (!initial) {
memo = obj[_keys ? _keys[index] : index];
index += dir;
}
for (; index >= 0 && index < length; index += dir) {
var currentKey = _keys ? _keys[index] : index;
memo = iteratee(memo, obj[currentKey], currentKey, obj);
}
return memo;
};
return function(obj, iteratee, memo, context) {
var initial = arguments.length >= 3;
return reducer(obj, _optimizeCb(iteratee, context, 4), memo, initial);
};
}
module.exports = createReduce;
+11
View File
@@ -0,0 +1,11 @@
var _setup = require('./_setup.js');
// Common internal logic for `isArrayLike` and `isBufferLike`.
function createSizePropertyCheck(getSizeProperty) {
return function(collection) {
var sizeProperty = getSizeProperty(collection);
return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= _setup.MAX_ARRAY_INDEX;
}
}
module.exports = createSizePropertyCheck;
+11
View File
@@ -0,0 +1,11 @@
// Internal function to obtain a nested property in `obj` along `path`.
function deepGet(obj, path) {
var length = path.length;
for (var i = 0; i < length; i++) {
if (obj == null) return void 0;
obj = obj[path[i]];
}
return length ? obj : void 0;
}
module.exports = deepGet;
+11
View File
@@ -0,0 +1,11 @@
// Internal list of HTML entities for escaping.
var escapeMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;',
'`': '&#x60;'
};
module.exports = escapeMap;
+15
View File
@@ -0,0 +1,15 @@
var _baseCreate = require('./_baseCreate.js');
var isObject = require('./isObject.js');
// Internal function to execute `sourceFunc` bound to `context` with optional
// `args`. Determines whether to execute a function as a constructor or as a
// normal function.
function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
var self = _baseCreate(sourceFunc.prototype);
var result = sourceFunc.apply(self, args);
if (isObject(result)) return result;
return self;
}
module.exports = executeBound;
+33
View File
@@ -0,0 +1,33 @@
var _getLength = require('./_getLength.js');
var _isArrayLike = require('./_isArrayLike.js');
var isArray = require('./isArray.js');
var isArguments = require('./isArguments.js');
// Internal implementation of a recursive `flatten` function.
function flatten(input, depth, strict, output) {
output = output || [];
if (!depth && depth !== 0) {
depth = Infinity;
} else if (depth <= 0) {
return output.concat(input);
}
var idx = output.length;
for (var i = 0, length = _getLength(input); i < length; i++) {
var value = input[i];
if (_isArrayLike(value) && (isArray(value) || isArguments(value))) {
// Flatten current level of array or arguments object.
if (depth > 1) {
flatten(value, depth - 1, strict, output);
idx = output.length;
} else {
var j = 0, len = value.length;
while (j < len) output[idx++] = value[j++];
}
} else if (!strict) {
output[idx++] = value;
}
}
return output;
}
module.exports = flatten;
+6
View File
@@ -0,0 +1,6 @@
var _shallowProperty = require('./_shallowProperty.js');
// Internal helper to obtain the `byteLength` property of an object.
var getByteLength = _shallowProperty('byteLength');
module.exports = getByteLength;
+6
View File
@@ -0,0 +1,6 @@
var _shallowProperty = require('./_shallowProperty.js');
// Internal helper to obtain the `length` property of an object.
var getLength = _shallowProperty('length');
module.exports = getLength;
+17
View File
@@ -0,0 +1,17 @@
var _cb = require('./_cb.js');
var each = require('./each.js');
// An internal function used for aggregate "group by" operations.
function group(behavior, partition) {
return function(obj, iteratee, context) {
var result = partition ? [[], []] : {};
iteratee = _cb(iteratee, context);
each(obj, function(value, index) {
var key = iteratee(value, index, obj);
behavior(result, value, key);
});
return result;
};
}
module.exports = group;
+8
View File
@@ -0,0 +1,8 @@
var _setup = require('./_setup.js');
// Internal function to check whether `key` is an own property name of `obj`.
function has(obj, key) {
return obj != null && _setup.hasOwnProperty.call(obj, key);
}
module.exports = has;
+5
View File
@@ -0,0 +1,5 @@
var _tagTester = require('./_tagTester.js');
var hasObjectTag = _tagTester('Object');
module.exports = hasObjectTag;
+10
View File
@@ -0,0 +1,10 @@
var _createSizePropertyCheck = require('./_createSizePropertyCheck.js');
var _getLength = require('./_getLength.js');
// Internal helper for collection methods to determine whether a collection
// should be iterated as an array or as an object.
// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
var isArrayLike = _createSizePropertyCheck(_getLength);
module.exports = isArrayLike;
+8
View File
@@ -0,0 +1,8 @@
var _createSizePropertyCheck = require('./_createSizePropertyCheck.js');
var _getByteLength = require('./_getByteLength.js');
// Internal helper to determine whether we should spend extensive checks against
// `ArrayBuffer` et al.
var isBufferLike = _createSizePropertyCheck(_getByteLength);
module.exports = isBufferLike;
+7
View File
@@ -0,0 +1,7 @@
// Internal `_.pick` helper function to determine whether `key` is an enumerable
// property name of `obj`.
function keyInObj(value, key, obj) {
return key in obj;
}
module.exports = keyInObj;
+44
View File
@@ -0,0 +1,44 @@
Object.defineProperty(exports, '__esModule', { value: true });
var _getLength = require('./_getLength.js');
var isFunction = require('./isFunction.js');
var allKeys = require('./allKeys.js');
// Since the regular `Object.prototype.toString` type tests don't work for
// some types in IE 11, we use a fingerprinting heuristic instead, based
// on the methods. It's not great, but it's the best we got.
// The fingerprint method lists are defined below.
function ie11fingerprint(methods) {
var length = _getLength(methods);
return function(obj) {
if (obj == null) return false;
// `Map`, `WeakMap` and `Set` have no enumerable keys.
var keys = allKeys(obj);
if (_getLength(keys)) return false;
for (var i = 0; i < length; i++) {
if (!isFunction(obj[methods[i]])) return false;
}
// If we are testing against `WeakMap`, we need to ensure that
// `obj` doesn't have a `forEach` method in order to distinguish
// it from a regular `Map`.
return methods !== weakMapMethods || !isFunction(obj[forEachName]);
};
}
// In the interest of compact minification, we write
// each string in the fingerprints only once.
var forEachName = 'forEach',
hasName = 'has',
commonInit = ['clear', 'delete'],
mapTail = ['get', hasName, 'set'];
// `Map`, `WeakMap` and `Set` each have slightly different
// combinations of the above sublists.
var mapMethods = commonInit.concat(forEachName, mapTail),
weakMapMethods = commonInit.concat(mapTail),
setMethods = ['add'].concat(commonInit, forEachName, hasName);
exports.ie11fingerprint = ie11fingerprint;
exports.mapMethods = mapMethods;
exports.setMethods = setMethods;
exports.weakMapMethods = weakMapMethods;
+23
View File
@@ -0,0 +1,23 @@
// Internal function that returns an efficient (for current engines) version
// of the passed-in callback, to be repeatedly applied in other Underscore
// functions.
function optimizeCb(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value);
};
// The 2-argument case is omitted because were not using it.
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
}
module.exports = optimizeCb;
+66
View File
@@ -0,0 +1,66 @@
Object.defineProperty(exports, '__esModule', { value: true });
// Current version.
var VERSION = '1.13.8';
// Establish the root object, `window` (`self`) in the browser, `global`
// on the server, or `this` in some virtual machines. We use `self`
// instead of `window` for `WebWorker` support.
var root = (typeof self == 'object' && self.self === self && self) ||
(typeof global == 'object' && global.global === global && global) ||
Function('return this')() ||
{};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype;
var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
// Create quick reference variables for speed access to core prototypes.
var push = ArrayProto.push,
slice = ArrayProto.slice,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// Modern feature detection.
var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
supportsDataView = typeof DataView !== 'undefined';
// All **ECMAScript 5+** native function implementations that we hope to use
// are declared here.
var nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeCreate = Object.create,
nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
// Create references to these builtin functions because we override them.
var _isNaN = isNaN,
_isFinite = isFinite;
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
// The largest integer that can be represented exactly.
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
exports.ArrayProto = ArrayProto;
exports.MAX_ARRAY_INDEX = MAX_ARRAY_INDEX;
exports.ObjProto = ObjProto;
exports.SymbolProto = SymbolProto;
exports.VERSION = VERSION;
exports._isFinite = _isFinite;
exports._isNaN = _isNaN;
exports.hasEnumBug = hasEnumBug;
exports.hasOwnProperty = hasOwnProperty;
exports.nativeCreate = nativeCreate;
exports.nativeIsArray = nativeIsArray;
exports.nativeIsView = nativeIsView;
exports.nativeKeys = nativeKeys;
exports.nonEnumerableProps = nonEnumerableProps;
exports.push = push;
exports.root = root;
exports.slice = slice;
exports.supportsArrayBuffer = supportsArrayBuffer;
exports.supportsDataView = supportsDataView;
exports.toString = toString;
+8
View File
@@ -0,0 +1,8 @@
// Internal helper to generate a function to obtain property `key` from `obj`.
function shallowProperty(key) {
return function(obj) {
return obj == null ? void 0 : obj[key];
};
}
module.exports = shallowProperty;
+18
View File
@@ -0,0 +1,18 @@
Object.defineProperty(exports, '__esModule', { value: true });
var _setup = require('./_setup.js');
var _hasObjectTag = require('./_hasObjectTag.js');
// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
// In IE 11, the most common among them, this problem also applies to
// `Map`, `WeakMap` and `Set`.
// Also, there are cases where an application can override the native
// `DataView` object, in cases like that we can't use the constructor
// safely and should just rely on alternate `DataView` checks
var hasDataViewBug = (
_setup.supportsDataView && (!/\[native code\]/.test(String(DataView)) || _hasObjectTag(new DataView(new ArrayBuffer(8))))
),
isIE11 = (typeof Map !== 'undefined' && _hasObjectTag(new Map));
exports.hasDataViewBug = hasDataViewBug;
exports.isIE11 = isIE11;
+11
View File
@@ -0,0 +1,11 @@
var _setup = require('./_setup.js');
// Internal function for creating a `toString`-based type tester.
function tagTester(name) {
var tag = '[object ' + name + ']';
return function(obj) {
return _setup.toString.call(obj) === tag;
};
}
module.exports = tagTester;
+13
View File
@@ -0,0 +1,13 @@
var _getByteLength = require('./_getByteLength.js');
// Internal function to wrap or shallow-copy an ArrayBuffer,
// typed array or DataView to a new view, reusing the buffer.
function toBufferView(bufferSource) {
return new Uint8Array(
bufferSource.buffer || bufferSource,
bufferSource.byteOffset || 0,
_getByteLength(bufferSource)
);
}
module.exports = toBufferView;
+10
View File
@@ -0,0 +1,10 @@
var underscore = require('./underscore.js');
require('./toPath.js');
// Internal wrapper for `_.toPath` to enable minification.
// Similar to `cb` for `_.iteratee`.
function toPath(path) {
return underscore.toPath(path);
}
module.exports = toPath;
+7
View File
@@ -0,0 +1,7 @@
var invert = require('./invert.js');
var _escapeMap = require('./_escapeMap.js');
// Internal list of HTML entities for unescaping.
var unescapeMap = invert(_escapeMap);
module.exports = unescapeMap;
+10
View File
@@ -0,0 +1,10 @@
// Returns a function that will only be executed on and after the Nth call.
function after(times, func) {
return function() {
if (--times < 1) {
return func.apply(this, arguments);
}
};
}
module.exports = after;
+15
View File
@@ -0,0 +1,15 @@
var isObject = require('./isObject.js');
var _setup = require('./_setup.js');
var _collectNonEnumProps = require('./_collectNonEnumProps.js');
// Retrieve all the enumerable property names of an object.
function allKeys(obj) {
if (!isObject(obj)) return [];
var keys = [];
for (var key in obj) keys.push(key);
// Ahem, IE < 9.
if (_setup.hasEnumBug) _collectNonEnumProps(obj, keys);
return keys;
}
module.exports = allKeys;
+14
View File
@@ -0,0 +1,14 @@
// Returns a function that will only be executed up to (but not including) the
// Nth call.
function before(times, func) {
var memo;
return function() {
if (--times > 0) {
memo = func.apply(this, arguments);
}
if (times <= 1) func = null;
return memo;
};
}
module.exports = before;
+15
View File
@@ -0,0 +1,15 @@
var restArguments = require('./restArguments.js');
var isFunction = require('./isFunction.js');
var _executeBound = require('./_executeBound.js');
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally).
var bind = restArguments(function(func, context, args) {
if (!isFunction(func)) throw new TypeError('Bind must be called on a function');
var bound = restArguments(function(callArgs) {
return _executeBound(func, bound, context, this, args.concat(callArgs));
});
return bound;
});
module.exports = bind;
+19
View File
@@ -0,0 +1,19 @@
var restArguments = require('./restArguments.js');
var _flatten = require('./_flatten.js');
var bind = require('./bind.js');
// Bind a number of an object's methods to that object. Remaining arguments
// are the method names to be bound. Useful for ensuring that all callbacks
// defined on an object belong to it.
var bindAll = restArguments(function(obj, keys) {
keys = _flatten(keys, false, false);
var index = keys.length;
if (index < 1) throw new Error('bindAll must be passed function names');
while (index--) {
var key = keys[index];
obj[key] = bind(obj[key], obj);
}
return obj;
});
module.exports = bindAll;

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