lodash-rails 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 609a957fdd98e57cda8ec71991b828b347e1f72b
4
- data.tar.gz: ee91615b8dab7e1a09736c0bc29bbf2d39537fd5
3
+ metadata.gz: 0d865feba128fce2fa4242fef5509c1151d1f7c2
4
+ data.tar.gz: d75387730262868c079d3d736d06dc50866378a1
5
5
  SHA512:
6
- metadata.gz: 58cf03aa0a3a6e6fcd79d1184f739e10fd146ab805e01619d2e0e9191962ff5b84d380c4def7dfeb29516df8309d61411c416a448859fb52a232f6736d15b635
7
- data.tar.gz: bfadb809b748b42dda8766341b9979f0cbbed08776b399ec55c31ecc3570d17ac4eab3105f407b67c3e714488b566143981255d4407326fc64bd6626dc4ab6ac
6
+ metadata.gz: bdbf9635e91438de1a4a380c1e9ea1be90560d37b69759fd567c7b0042be8cc4fad3b5b5650e41f44646d859781be160734028893ed9beeeb3d790709c71b35e
7
+ data.tar.gz: a7ead375e03ba6bbd1e2e19c03ce295cb86ed5619eacb905dc7537c644ffac56e4c1af891611599098ad9c827733c77f46132f9ec91d7f9d8b1f753bdc748e10
data/README.md CHANGED
@@ -18,7 +18,7 @@ Add the necessary library to `app/assets/javascripts/application.js`:
18
18
 
19
19
  ## What's included?
20
20
 
21
- Lo-Dash 2.3.0:
21
+ Lo-Dash 2.4.0:
22
22
 
23
23
  * lodash.js
24
24
  * lodash.min.js
@@ -1,5 +1,5 @@
1
1
  module LoDash
2
2
  module Rails
3
- VERSION = "2.3.0"
3
+ VERSION = "2.4.0"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * Lo-Dash 2.3.0 (Custom Build) <http://lodash.com/>
3
+ * Lo-Dash 2.4.0 (Custom Build) <http://lodash.com/>
4
4
  * Build: `lodash -o ./dist/lodash.compat.js`
5
5
  * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
6
6
  * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
@@ -50,7 +50,7 @@
50
50
 
51
51
  /**
52
52
  * Used to match ES6 template delimiters
53
- * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-7.8.6
53
+ * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals
54
54
  */
55
55
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
56
56
 
@@ -79,7 +79,7 @@
79
79
  var contextProps = [
80
80
  'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object',
81
81
  'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',
82
- 'parseInt', 'setImmediate', 'setTimeout'
82
+ 'parseInt', 'setTimeout'
83
83
  ];
84
84
 
85
85
  /** Used to fix the JScript [[DontEnum]] bug */
@@ -281,22 +281,29 @@
281
281
  */
282
282
  function compareAscending(a, b) {
283
283
  var ac = a.criteria,
284
- bc = b.criteria;
284
+ bc = b.criteria,
285
+ index = -1,
286
+ length = ac.length;
285
287
 
286
- // ensure a stable sort in V8 and other engines
287
- // http://code.google.com/p/v8/issues/detail?id=90
288
- if (ac !== bc) {
289
- if (ac > bc || typeof ac == 'undefined') {
290
- return 1;
291
- }
292
- if (ac < bc || typeof bc == 'undefined') {
293
- return -1;
288
+ while (++index < length) {
289
+ var value = ac[index],
290
+ other = bc[index];
291
+
292
+ if (value !== other) {
293
+ if (value > other || typeof value == 'undefined') {
294
+ return 1;
295
+ }
296
+ if (value < other || typeof other == 'undefined') {
297
+ return -1;
298
+ }
294
299
  }
295
300
  }
296
- // The JS engine embedded in Adobe applications like InDesign has a buggy
297
- // `Array#sort` implementation that causes it, under certain circumstances,
298
- // to return the same value for `a` and `b`.
299
- // See https://github.com/jashkenas/underscore/pull/1247
301
+ // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
302
+ // that causes it, under certain circumstances, to return the same value for
303
+ // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247
304
+ //
305
+ // This also ensures a stable sort in V8 and other engines.
306
+ // See http://code.google.com/p/v8/issues/detail?id=90
300
307
  return a.index - b.index;
301
308
  }
302
309
 
@@ -513,16 +520,11 @@
513
520
  fnToString = Function.prototype.toString,
514
521
  getPrototypeOf = reNative.test(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
515
522
  hasOwnProperty = objectProto.hasOwnProperty,
516
- now = reNative.test(now = Date.now) && now || function() { return +new Date; },
517
523
  push = arrayRef.push,
518
524
  propertyIsEnumerable = objectProto.propertyIsEnumerable,
519
525
  setTimeout = context.setTimeout,
520
526
  splice = arrayRef.splice;
521
527
 
522
- /** Used to detect `setImmediate` in Node.js */
523
- var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&
524
- !reNative.test(setImmediate) && setImmediate;
525
-
526
528
  /** Used to set meta data on functions */
527
529
  var defineProperty = (function() {
528
530
  // IE 8 only accepts DOM elements
@@ -2477,22 +2479,22 @@
2477
2479
  }
2478
2480
 
2479
2481
  /**
2480
- * Checks if the specified object `property` exists and is a direct property,
2482
+ * Checks if the specified property name exists as a direct property of `object`,
2481
2483
  * instead of an inherited property.
2482
2484
  *
2483
2485
  * @static
2484
2486
  * @memberOf _
2485
2487
  * @category Objects
2486
- * @param {Object} object The object to check.
2487
- * @param {string} property The property to check for.
2488
+ * @param {Object} object The object to inspect.
2489
+ * @param {string} key The name of the property to check.
2488
2490
  * @returns {boolean} Returns `true` if key is a direct property, else `false`.
2489
2491
  * @example
2490
2492
  *
2491
2493
  * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
2492
2494
  * // => true
2493
2495
  */
2494
- function has(object, property) {
2495
- return object ? hasOwnProperty.call(object, property) : false;
2496
+ function has(object, key) {
2497
+ return object ? hasOwnProperty.call(object, key) : false;
2496
2498
  }
2497
2499
 
2498
2500
  /**
@@ -2505,7 +2507,7 @@
2505
2507
  * @returns {Object} Returns the created inverted object.
2506
2508
  * @example
2507
2509
  *
2508
- * _.invert({ 'first': 'fred', 'second': 'barney' });
2510
+ * _.invert({ 'first': 'fred', 'second': 'barney' });
2509
2511
  * // => { 'fred': 'first', 'barney': 'second' }
2510
2512
  */
2511
2513
  function invert(object) {
@@ -2897,6 +2899,52 @@
2897
2899
  return typeof value == 'undefined';
2898
2900
  }
2899
2901
 
2902
+ /**
2903
+ * Creates an object with the same keys as `object` and values generated by
2904
+ * running each own enumerable property of `object` through the callback.
2905
+ * The callback is bound to `thisArg` and invoked with three arguments;
2906
+ * (value, key, object).
2907
+ *
2908
+ * If a property name is provided for `callback` the created "_.pluck" style
2909
+ * callback will return the property value of the given element.
2910
+ *
2911
+ * If an object is provided for `callback` the created "_.where" style callback
2912
+ * will return `true` for elements that have the properties of the given object,
2913
+ * else `false`.
2914
+ *
2915
+ * @static
2916
+ * @memberOf _
2917
+ * @category Objects
2918
+ * @param {Object} object The object to iterate over.
2919
+ * @param {Function|Object|string} [callback=identity] The function called
2920
+ * per iteration. If a property name or object is provided it will be used
2921
+ * to create a "_.pluck" or "_.where" style callback, respectively.
2922
+ * @param {*} [thisArg] The `this` binding of `callback`.
2923
+ * @returns {Array} Returns a new object with values of the results of each `callback` execution.
2924
+ * @example
2925
+ *
2926
+ * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });
2927
+ * // => { 'a': 3, 'b': 6, 'c': 9 }
2928
+ *
2929
+ * var characters = {
2930
+ * 'fred': { 'name': 'fred', 'age': 40 },
2931
+ * 'pebbles': { 'name': 'pebbles', 'age': 1 }
2932
+ * };
2933
+ *
2934
+ * // using "_.pluck" callback shorthand
2935
+ * _.mapValues(characters, 'age');
2936
+ * // => { 'fred': 40, 'pebbles': 1 }
2937
+ */
2938
+ function mapValues(object, callback, thisArg) {
2939
+ var result = {};
2940
+ callback = lodash.createCallback(callback, thisArg, 3);
2941
+
2942
+ forOwn(object, function(value, key, object) {
2943
+ result[key] = callback(value, key, object);
2944
+ });
2945
+ return result;
2946
+ }
2947
+
2900
2948
  /**
2901
2949
  * Recursively merges own enumerable properties of the source object(s), that
2902
2950
  * don't resolve to `undefined` into the destination object. Subsequent sources
@@ -2955,7 +3003,6 @@
2955
3003
  if (!isObject(object)) {
2956
3004
  return object;
2957
3005
  }
2958
-
2959
3006
  // allows working with `_.reduce` and `_.reduceRight` without using
2960
3007
  // their `index` and `collection` arguments
2961
3008
  if (typeof args[2] != 'number') {
@@ -3112,11 +3159,11 @@
3112
3159
 
3113
3160
  /**
3114
3161
  * An alternative to `_.reduce` this method transforms `object` to a new
3115
- * `accumulator` object which is the result of running each of its elements
3116
- * through a callback, with each callback execution potentially mutating
3117
- * the `accumulator` object. The callback is bound to `thisArg` and invoked
3118
- * with four arguments; (accumulator, value, key, object). Callbacks may exit
3119
- * iteration early by explicitly returning `false`.
3162
+ * `accumulator` object which is the result of running each of its own
3163
+ * enumerable properties through a callback, with each callback execution
3164
+ * potentially mutating the `accumulator` object. The callback is bound to
3165
+ * `thisArg` and invoked with four arguments; (accumulator, value, key, object).
3166
+ * Callbacks may exit iteration early by explicitly returning `false`.
3120
3167
  *
3121
3168
  * @static
3122
3169
  * @memberOf _
@@ -3955,7 +4002,7 @@
3955
4002
  * @type Function
3956
4003
  * @category Collections
3957
4004
  * @param {Array|Object|string} collection The collection to iterate over.
3958
- * @param {string} property The property to pluck.
4005
+ * @param {string} property The name of the property to pluck.
3959
4006
  * @returns {Array} Returns a new array of property values.
3960
4007
  * @example
3961
4008
  *
@@ -4176,7 +4223,7 @@
4176
4223
  * // => 3
4177
4224
  *
4178
4225
  * _.size('pebbles');
4179
- * // => 5
4226
+ * // => 7
4180
4227
  */
4181
4228
  function size(collection) {
4182
4229
  var length = collection ? collection.length : 0;
@@ -4256,6 +4303,9 @@
4256
4303
  * If a property name is provided for `callback` the created "_.pluck" style
4257
4304
  * callback will return the property value of the given element.
4258
4305
  *
4306
+ * If an array of property names is provided for `callback` the collection
4307
+ * will be sorted by each property value.
4308
+ *
4259
4309
  * If an object is provided for `callback` the created "_.where" style callback
4260
4310
  * will return `true` for elements that have the properties of the given object,
4261
4311
  * else `false`.
@@ -4264,7 +4314,7 @@
4264
4314
  * @memberOf _
4265
4315
  * @category Collections
4266
4316
  * @param {Array|Object|string} collection The collection to iterate over.
4267
- * @param {Function|Object|string} [callback=identity] The function called
4317
+ * @param {Array|Function|Object|string} [callback=identity] The function called
4268
4318
  * per iteration. If a property name or object is provided it will be used
4269
4319
  * to create a "_.pluck" or "_.where" style callback, respectively.
4270
4320
  * @param {*} [thisArg] The `this` binding of `callback`.
@@ -4277,19 +4327,37 @@
4277
4327
  * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
4278
4328
  * // => [3, 1, 2]
4279
4329
  *
4330
+ * var characters = [
4331
+ * { 'name': 'barney', 'age': 36 },
4332
+ * { 'name': 'fred', 'age': 40 },
4333
+ * { 'name': 'barney', 'age': 26 },
4334
+ * { 'name': 'fred', 'age': 30 }
4335
+ * ];
4336
+ *
4280
4337
  * // using "_.pluck" callback shorthand
4281
- * _.sortBy(['banana', 'strawberry', 'apple'], 'length');
4282
- * // => ['apple', 'banana', 'strawberry']
4338
+ * _.map(_.sortBy(characters, 'age'), _.values);
4339
+ * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]
4340
+ *
4341
+ * // sorting by multiple properties
4342
+ * _.map(_.sortBy(characters, ['name', 'age']), _.values);
4343
+ * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
4283
4344
  */
4284
4345
  function sortBy(collection, callback, thisArg) {
4285
4346
  var index = -1,
4347
+ isArr = isArray(callback),
4286
4348
  length = collection ? collection.length : 0,
4287
4349
  result = Array(typeof length == 'number' ? length : 0);
4288
4350
 
4289
- callback = lodash.createCallback(callback, thisArg, 3);
4351
+ if (!isArr) {
4352
+ callback = lodash.createCallback(callback, thisArg, 3);
4353
+ }
4290
4354
  forEach(collection, function(value, key, collection) {
4291
4355
  var object = result[++index] = getObject();
4292
- object.criteria = callback(value, key, collection);
4356
+ if (isArr) {
4357
+ object.criteria = map(callback, function(key) { return value[key]; });
4358
+ } else {
4359
+ (object.criteria = getArray())[0] = callback(value, key, collection);
4360
+ }
4293
4361
  object.index = index;
4294
4362
  object.value = value;
4295
4363
  });
@@ -4299,6 +4367,9 @@
4299
4367
  while (length--) {
4300
4368
  var object = result[length];
4301
4369
  result[length] = object.value;
4370
+ if (!isArr) {
4371
+ releaseArray(object.criteria);
4372
+ }
4302
4373
  releaseObject(object);
4303
4374
  }
4304
4375
  return result;
@@ -4336,7 +4407,7 @@
4336
4407
  * @type Function
4337
4408
  * @category Collections
4338
4409
  * @param {Array|Object|string} collection The collection to iterate over.
4339
- * @param {Object} properties The object of property values to filter by.
4410
+ * @param {Object} props The object of property values to filter by.
4340
4411
  * @returns {Array} Returns a new array of elements that have the given properties.
4341
4412
  * @example
4342
4413
  *
@@ -4741,29 +4812,34 @@
4741
4812
  * @memberOf _
4742
4813
  * @category Arrays
4743
4814
  * @param {...Array} [array] The arrays to inspect.
4744
- * @returns {Array} Returns an array of composite values.
4815
+ * @returns {Array} Returns an array of shared values.
4745
4816
  * @example
4746
4817
  *
4747
- * _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
4818
+ * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
4748
4819
  * // => [1, 2]
4749
4820
  */
4750
- function intersection(array) {
4751
- var args = arguments,
4752
- argsLength = args.length,
4821
+ function intersection() {
4822
+ var args = [],
4753
4823
  argsIndex = -1,
4824
+ argsLength = arguments.length,
4754
4825
  caches = getArray(),
4755
- index = -1,
4756
4826
  indexOf = getIndexOf(),
4757
- length = array ? array.length : 0,
4758
- result = [],
4827
+ trustIndexOf = indexOf === baseIndexOf,
4759
4828
  seen = getArray();
4760
4829
 
4761
4830
  while (++argsIndex < argsLength) {
4762
- var value = args[argsIndex];
4763
- caches[argsIndex] = indexOf === baseIndexOf &&
4764
- (value ? value.length : 0) >= largeArraySize &&
4765
- createCache(argsIndex ? args[argsIndex] : seen);
4831
+ var value = arguments[argsIndex];
4832
+ if (isArray(value) || isArguments(value)) {
4833
+ args.push(value);
4834
+ caches.push(trustIndexOf && value.length >= largeArraySize &&
4835
+ createCache(argsIndex ? args[argsIndex] : seen));
4836
+ }
4766
4837
  }
4838
+ var array = args[0],
4839
+ index = -1,
4840
+ length = array ? array.length : 0,
4841
+ result = [];
4842
+
4767
4843
  outer:
4768
4844
  while (++index < length) {
4769
4845
  var cache = caches[0];
@@ -5180,13 +5256,13 @@
5180
5256
  * @memberOf _
5181
5257
  * @category Arrays
5182
5258
  * @param {...Array} [array] The arrays to inspect.
5183
- * @returns {Array} Returns an array of composite values.
5259
+ * @returns {Array} Returns an array of combined values.
5184
5260
  * @example
5185
5261
  *
5186
- * _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
5187
- * // => [1, 2, 3, 101, 10]
5262
+ * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);
5263
+ * // => [1, 2, 3, 5, 4]
5188
5264
  */
5189
- function union(array) {
5265
+ function union() {
5190
5266
  return baseUniq(baseFlatten(arguments, true, true));
5191
5267
  }
5192
5268
 
@@ -5266,6 +5342,38 @@
5266
5342
  return baseDifference(array, slice(arguments, 1));
5267
5343
  }
5268
5344
 
5345
+ /**
5346
+ * Creates an array that is the smymetric difference of the provided arrays.
5347
+ * See http://en.wikipedia.org/wiki/Symmetric_difference.
5348
+ *
5349
+ * @static
5350
+ * @memberOf _
5351
+ * @category Arrays
5352
+ * @param {...Array} [array] The arrays to inspect.
5353
+ * @returns {Array} Returns an array of values.
5354
+ * @example
5355
+ *
5356
+ * _.xor([1, 2, 3], [5, 2, 1, 4]);
5357
+ * // => [3, 5, 4]
5358
+ *
5359
+ * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);
5360
+ * // => [1, 4, 5]
5361
+ */
5362
+ function xor() {
5363
+ var index = -1,
5364
+ length = arguments.length;
5365
+
5366
+ while (++index < length) {
5367
+ var array = arguments[index];
5368
+ if (isArray(array) || isArguments(array)) {
5369
+ var result = result
5370
+ ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))
5371
+ : array;
5372
+ }
5373
+ }
5374
+ return result || [];
5375
+ }
5376
+
5269
5377
  /**
5270
5378
  * Creates an array of grouped elements, the first of which contains the first
5271
5379
  * elements of the given arrays, the second of which contains the second
@@ -5317,6 +5425,9 @@
5317
5425
  length = keys ? keys.length : 0,
5318
5426
  result = {};
5319
5427
 
5428
+ if (!values && length && !isArray(keys[0])) {
5429
+ values = [];
5430
+ }
5320
5431
  while (++index < length) {
5321
5432
  var key = keys[index];
5322
5433
  if (values) {
@@ -5409,8 +5520,8 @@
5409
5520
  * @example
5410
5521
  *
5411
5522
  * var view = {
5412
- * 'label': 'docs',
5413
- * 'onClick': function() { console.log('clicked ' + this.label); }
5523
+ * 'label': 'docs',
5524
+ * 'onClick': function() { console.log('clicked ' + this.label); }
5414
5525
  * };
5415
5526
  *
5416
5527
  * _.bindAll(view);
@@ -5519,74 +5630,6 @@
5519
5630
  };
5520
5631
  }
5521
5632
 
5522
- /**
5523
- * Produces a callback bound to an optional `thisArg`. If `func` is a property
5524
- * name the created callback will return the property value for a given element.
5525
- * If `func` is an object the created callback will return `true` for elements
5526
- * that contain the equivalent object properties, otherwise it will return `false`.
5527
- *
5528
- * @static
5529
- * @memberOf _
5530
- * @category Functions
5531
- * @param {*} [func=identity] The value to convert to a callback.
5532
- * @param {*} [thisArg] The `this` binding of the created callback.
5533
- * @param {number} [argCount] The number of arguments the callback accepts.
5534
- * @returns {Function} Returns a callback function.
5535
- * @example
5536
- *
5537
- * var characters = [
5538
- * { 'name': 'barney', 'age': 36 },
5539
- * { 'name': 'fred', 'age': 40 }
5540
- * ];
5541
- *
5542
- * // wrap to create custom callback shorthands
5543
- * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
5544
- * var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
5545
- * return !match ? func(callback, thisArg) : function(object) {
5546
- * return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];
5547
- * };
5548
- * });
5549
- *
5550
- * _.filter(characters, 'age__gt38');
5551
- * // => [{ 'name': 'fred', 'age': 40 }]
5552
- */
5553
- function createCallback(func, thisArg, argCount) {
5554
- var type = typeof func;
5555
- if (func == null || type == 'function') {
5556
- return baseCreateCallback(func, thisArg, argCount);
5557
- }
5558
- // handle "_.pluck" style callback shorthands
5559
- if (type != 'object') {
5560
- return function(object) {
5561
- return object[func];
5562
- };
5563
- }
5564
- var props = keys(func),
5565
- key = props[0],
5566
- a = func[key];
5567
-
5568
- // handle "_.where" style callback shorthands
5569
- if (props.length == 1 && a === a && !isObject(a)) {
5570
- // fast path the common case of providing an object with a single
5571
- // property containing a primitive value
5572
- return function(object) {
5573
- var b = object[key];
5574
- return a === b && (a !== 0 || (1 / a == 1 / b));
5575
- };
5576
- }
5577
- return function(object) {
5578
- var length = props.length,
5579
- result = false;
5580
-
5581
- while (length--) {
5582
- if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
5583
- break;
5584
- }
5585
- }
5586
- return result;
5587
- };
5588
- }
5589
-
5590
5633
  /**
5591
5634
  * Creates a function which accepts one or more arguments of `func` that when
5592
5635
  * invoked either executes `func` returning its result, if all `func` arguments
@@ -5772,8 +5815,8 @@
5772
5815
  * @returns {number} Returns the timer id.
5773
5816
  * @example
5774
5817
  *
5775
- * _.defer(function() { console.log('deferred'); });
5776
- * // returns from the function before 'deferred' is logged
5818
+ * _.defer(function(text) { console.log(text); }, 'deferred');
5819
+ * // logs 'deferred' after one or more milliseconds
5777
5820
  */
5778
5821
  function defer(func) {
5779
5822
  if (!isFunction(func)) {
@@ -5782,15 +5825,6 @@
5782
5825
  var args = slice(arguments, 1);
5783
5826
  return setTimeout(function() { func.apply(undefined, args); }, 1);
5784
5827
  }
5785
- // use `setImmediate` if available in Node.js
5786
- if (setImmediate) {
5787
- defer = function(func) {
5788
- if (!isFunction(func)) {
5789
- throw new TypeError;
5790
- }
5791
- return setImmediate.apply(context, arguments);
5792
- };
5793
- }
5794
5828
 
5795
5829
  /**
5796
5830
  * Executes the `func` function after `wait` milliseconds. Additional arguments
@@ -5805,9 +5839,8 @@
5805
5839
  * @returns {number} Returns the timer id.
5806
5840
  * @example
5807
5841
  *
5808
- * var log = _.bind(console.log, console);
5809
- * _.delay(log, 1000, 'logged later');
5810
- * // => 'logged later' (Appears after one second.)
5842
+ * _.delay(function(text) { console.log(text); }, 1000, 'later');
5843
+ * // => logs 'later' after one second
5811
5844
  */
5812
5845
  function delay(func, wait) {
5813
5846
  if (!isFunction(func)) {
@@ -6038,6 +6071,93 @@
6038
6071
 
6039
6072
  /*--------------------------------------------------------------------------*/
6040
6073
 
6074
+ /**
6075
+ * Creates a function that returns `value`.
6076
+ *
6077
+ * @static
6078
+ * @memberOf _
6079
+ * @category Utilities
6080
+ * @param {*} value The value to return from the new function.
6081
+ * @returns {Function} Returns the new function.
6082
+ * @example
6083
+ *
6084
+ * var object = { 'name': 'fred' };
6085
+ * var getter = _.constant(object);
6086
+ * getter() === object;
6087
+ * // => true
6088
+ */
6089
+ function constant(value) {
6090
+ return function() {
6091
+ return value;
6092
+ };
6093
+ }
6094
+
6095
+ /**
6096
+ * Produces a callback bound to an optional `thisArg`. If `func` is a property
6097
+ * name the created callback will return the property value for a given element.
6098
+ * If `func` is an object the created callback will return `true` for elements
6099
+ * that contain the equivalent object properties, otherwise it will return `false`.
6100
+ *
6101
+ * @static
6102
+ * @memberOf _
6103
+ * @category Utilities
6104
+ * @param {*} [func=identity] The value to convert to a callback.
6105
+ * @param {*} [thisArg] The `this` binding of the created callback.
6106
+ * @param {number} [argCount] The number of arguments the callback accepts.
6107
+ * @returns {Function} Returns a callback function.
6108
+ * @example
6109
+ *
6110
+ * var characters = [
6111
+ * { 'name': 'barney', 'age': 36 },
6112
+ * { 'name': 'fred', 'age': 40 }
6113
+ * ];
6114
+ *
6115
+ * // wrap to create custom callback shorthands
6116
+ * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
6117
+ * var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
6118
+ * return !match ? func(callback, thisArg) : function(object) {
6119
+ * return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];
6120
+ * };
6121
+ * });
6122
+ *
6123
+ * _.filter(characters, 'age__gt38');
6124
+ * // => [{ 'name': 'fred', 'age': 40 }]
6125
+ */
6126
+ function createCallback(func, thisArg, argCount) {
6127
+ var type = typeof func;
6128
+ if (func == null || type == 'function') {
6129
+ return baseCreateCallback(func, thisArg, argCount);
6130
+ }
6131
+ // handle "_.pluck" style callback shorthands
6132
+ if (type != 'object') {
6133
+ return property(func);
6134
+ }
6135
+ var props = keys(func),
6136
+ key = props[0],
6137
+ a = func[key];
6138
+
6139
+ // handle "_.where" style callback shorthands
6140
+ if (props.length == 1 && a === a && !isObject(a)) {
6141
+ // fast path the common case of providing an object with a single
6142
+ // property containing a primitive value
6143
+ return function(object) {
6144
+ var b = object[key];
6145
+ return a === b && (a !== 0 || (1 / a == 1 / b));
6146
+ };
6147
+ }
6148
+ return function(object) {
6149
+ var length = props.length,
6150
+ result = false;
6151
+
6152
+ while (length--) {
6153
+ if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
6154
+ break;
6155
+ }
6156
+ }
6157
+ return result;
6158
+ };
6159
+ }
6160
+
6041
6161
  /**
6042
6162
  * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
6043
6163
  * corresponding HTML entities.
@@ -6075,51 +6195,71 @@
6075
6195
  }
6076
6196
 
6077
6197
  /**
6078
- * Adds function properties of a source object to the `lodash` function and
6079
- * chainable wrapper.
6198
+ * Adds function properties of a source object to the destination object.
6199
+ * If `object` is a function methods will be added to its prototype as well.
6080
6200
  *
6081
6201
  * @static
6082
6202
  * @memberOf _
6083
6203
  * @category Utilities
6084
- * @param {Object} object The object of function properties to add to `lodash`.
6085
- * @param {Object} object The object of function properties to add to `lodash`.
6204
+ * @param {Function|Object} [object=lodash] object The destination object.
6205
+ * @param {Object} source The object of functions to add.
6206
+ * @param {Object} [options] The options object.
6207
+ * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.
6086
6208
  * @example
6087
6209
  *
6088
- * _.mixin({
6089
- * 'capitalize': function(string) {
6090
- * return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
6091
- * }
6092
- * });
6210
+ * function capitalize(string) {
6211
+ * return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
6212
+ * }
6093
6213
  *
6214
+ * _.mixin({ 'capitalize': capitalize });
6094
6215
  * _.capitalize('fred');
6095
6216
  * // => 'Fred'
6096
6217
  *
6218
+ * _('fred').capitalize().value();
6219
+ * // => 'Fred'
6220
+ *
6221
+ * _.mixin({ 'capitalize': capitalize }, { 'chain': false });
6097
6222
  * _('fred').capitalize();
6098
6223
  * // => 'Fred'
6099
6224
  */
6100
- function mixin(object, source) {
6101
- var ctor = object,
6102
- isFunc = !source || isFunction(ctor);
6225
+ function mixin(object, source, options) {
6226
+ var chain = true,
6227
+ methodNames = source && functions(source);
6103
6228
 
6104
- if (!source) {
6229
+ if (!source || (!options && !methodNames.length)) {
6230
+ if (options == null) {
6231
+ options = source;
6232
+ }
6105
6233
  ctor = lodashWrapper;
6106
6234
  source = object;
6107
6235
  object = lodash;
6236
+ methodNames = functions(source);
6108
6237
  }
6109
- forEach(functions(source), function(methodName) {
6238
+ if (options === false) {
6239
+ chain = false;
6240
+ } else if (isObject(options) && 'chain' in options) {
6241
+ chain = options.chain;
6242
+ }
6243
+ var ctor = object,
6244
+ isFunc = isFunction(ctor);
6245
+
6246
+ forEach(methodNames, function(methodName) {
6110
6247
  var func = object[methodName] = source[methodName];
6111
6248
  if (isFunc) {
6112
6249
  ctor.prototype[methodName] = function() {
6113
- var value = this.__wrapped__,
6250
+ var chainAll = this.__chain__,
6251
+ value = this.__wrapped__,
6114
6252
  args = [value];
6115
6253
 
6116
6254
  push.apply(args, arguments);
6117
6255
  var result = func.apply(object, args);
6118
- if (value && typeof value == 'object' && value === result) {
6119
- return this;
6256
+ if (chain || chainAll) {
6257
+ if (value === result && isObject(result)) {
6258
+ return this;
6259
+ }
6260
+ result = new ctor(result);
6261
+ result.__chain__ = chainAll;
6120
6262
  }
6121
- result = new ctor(result);
6122
- result.__chain__ = this.__chain__;
6123
6263
  return result;
6124
6264
  };
6125
6265
  }
@@ -6159,6 +6299,23 @@
6159
6299
  // no operation performed
6160
6300
  }
6161
6301
 
6302
+ /**
6303
+ * Gets the number of milliseconds that have elapsed since the Unix epoch
6304
+ * (1 January 1970 00:00:00 UTC).
6305
+ *
6306
+ * @static
6307
+ * @memberOf _
6308
+ * @category Utilities
6309
+ * @example
6310
+ *
6311
+ * var stamp = _.now();
6312
+ * _.defer(function() { console.log(_.now() - stamp); });
6313
+ * // => logs the number of milliseconds it took for the deferred function to be called
6314
+ */
6315
+ var now = reNative.test(now = Date.now) && now || function() {
6316
+ return new Date().getTime();
6317
+ };
6318
+
6162
6319
  /**
6163
6320
  * Converts the given value into an integer of the specified radix.
6164
6321
  * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the
@@ -6183,6 +6340,36 @@
6183
6340
  return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
6184
6341
  };
6185
6342
 
6343
+ /**
6344
+ * Creates a "_.pluck" style function, which returns the `key` value of a
6345
+ * given object.
6346
+ *
6347
+ * @static
6348
+ * @memberOf _
6349
+ * @category Utilities
6350
+ * @param {string} key The name of the property to retrieve.
6351
+ * @returns {Function} Returns the new function.
6352
+ * @example
6353
+ *
6354
+ * var characters = [
6355
+ * { 'name': 'fred', 'age': 40 },
6356
+ * { 'name': 'barney', 'age': 36 }
6357
+ * ];
6358
+ *
6359
+ * var getName = _.property('name');
6360
+ *
6361
+ * _.map(characters, getName);
6362
+ * // => ['barney', 'fred']
6363
+ *
6364
+ * _.sortBy(characters, getName);
6365
+ * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }]
6366
+ */
6367
+ function property(key) {
6368
+ return function(object) {
6369
+ return object[key];
6370
+ };
6371
+ }
6372
+
6186
6373
  /**
6187
6374
  * Produces a random number between `min` and `max` (inclusive). If only one
6188
6375
  * argument is provided a number between `0` and the given number will be
@@ -6242,7 +6429,7 @@
6242
6429
  }
6243
6430
 
6244
6431
  /**
6245
- * Resolves the value of `property` on `object`. If `property` is a function
6432
+ * Resolves the value of property `key` on `object`. If `key` is a function
6246
6433
  * it will be invoked with the `this` binding of `object` and its result returned,
6247
6434
  * else the property value is returned. If `object` is falsey then `undefined`
6248
6435
  * is returned.
@@ -6251,7 +6438,7 @@
6251
6438
  * @memberOf _
6252
6439
  * @category Utilities
6253
6440
  * @param {Object} object The object to inspect.
6254
- * @param {string} property The property to get the value of.
6441
+ * @param {string} key The name of the property to resolve.
6255
6442
  * @returns {*} Returns the resolved value.
6256
6443
  * @example
6257
6444
  *
@@ -6268,10 +6455,10 @@
6268
6455
  * _.result(object, 'stuff');
6269
6456
  * // => 'nonsense'
6270
6457
  */
6271
- function result(object, property) {
6458
+ function result(object, key) {
6272
6459
  if (object) {
6273
- var value = object[property];
6274
- return isFunction(value) ? object[property]() : value;
6460
+ var value = object[key];
6461
+ return isFunction(value) ? object[key]() : value;
6275
6462
  }
6276
6463
  }
6277
6464
 
@@ -6335,8 +6522,8 @@
6335
6522
  * // => 'hello mustache!'
6336
6523
  *
6337
6524
  * // using the `imports` option to import jQuery
6338
- * var list = '<% $.each(people, function(name) { %><li><%- name %></li><% }); %>';
6339
- * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { '$': jQuery } });
6525
+ * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';
6526
+ * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });
6340
6527
  * // => '<li>fred</li><li>barney</li>'
6341
6528
  *
6342
6529
  * // using the `sourceURL` option to specify a custom sourceURL for the template
@@ -6615,7 +6802,7 @@
6615
6802
  * _(characters).chain()
6616
6803
  * .first()
6617
6804
  * .pick('age')
6618
- * .value()
6805
+ * .value();
6619
6806
  * // => { 'age': 36 }
6620
6807
  */
6621
6808
  function wrapperChain() {
@@ -6668,6 +6855,7 @@
6668
6855
  lodash.chain = chain;
6669
6856
  lodash.compact = compact;
6670
6857
  lodash.compose = compose;
6858
+ lodash.constant = constant;
6671
6859
  lodash.countBy = countBy;
6672
6860
  lodash.create = create;
6673
6861
  lodash.createCallback = createCallback;
@@ -6694,6 +6882,7 @@
6694
6882
  lodash.invoke = invoke;
6695
6883
  lodash.keys = keys;
6696
6884
  lodash.map = map;
6885
+ lodash.mapValues = mapValues;
6697
6886
  lodash.max = max;
6698
6887
  lodash.memoize = memoize;
6699
6888
  lodash.merge = merge;
@@ -6705,6 +6894,7 @@
6705
6894
  lodash.partialRight = partialRight;
6706
6895
  lodash.pick = pick;
6707
6896
  lodash.pluck = pluck;
6897
+ lodash.property = property;
6708
6898
  lodash.pull = pull;
6709
6899
  lodash.range = range;
6710
6900
  lodash.reject = reject;
@@ -6723,6 +6913,7 @@
6723
6913
  lodash.where = where;
6724
6914
  lodash.without = without;
6725
6915
  lodash.wrap = wrap;
6916
+ lodash.xor = xor;
6726
6917
  lodash.zip = zip;
6727
6918
  lodash.zipObject = zipObject;
6728
6919
 
@@ -6780,6 +6971,7 @@
6780
6971
  lodash.mixin = mixin;
6781
6972
  lodash.noConflict = noConflict;
6782
6973
  lodash.noop = noop;
6974
+ lodash.now = now;
6783
6975
  lodash.parseInt = parseInt;
6784
6976
  lodash.random = random;
6785
6977
  lodash.reduce = reduce;
@@ -6803,20 +6995,15 @@
6803
6995
  lodash.include = contains;
6804
6996
  lodash.inject = reduce;
6805
6997
 
6806
- forOwn(lodash, function(func, methodName) {
6807
- if (!lodash.prototype[methodName]) {
6808
- lodash.prototype[methodName] = function() {
6809
- var args = [this.__wrapped__],
6810
- chainAll = this.__chain__;
6811
-
6812
- push.apply(args, arguments);
6813
- var result = func.apply(lodash, args);
6814
- return chainAll
6815
- ? new lodashWrapper(result, chainAll)
6816
- : result;
6817
- };
6818
- }
6819
- });
6998
+ mixin(function() {
6999
+ var source = {}
7000
+ forOwn(lodash, function(func, methodName) {
7001
+ if (!lodash.prototype[methodName]) {
7002
+ source[methodName] = func;
7003
+ }
7004
+ });
7005
+ return source;
7006
+ }(), false);
6820
7007
 
6821
7008
  /*--------------------------------------------------------------------------*/
6822
7009
 
@@ -6852,7 +7039,7 @@
6852
7039
  * @memberOf _
6853
7040
  * @type string
6854
7041
  */
6855
- lodash.VERSION = '2.3.0';
7042
+ lodash.VERSION = '2.4.0';
6856
7043
 
6857
7044
  // add "Chaining" functions to the wrapper
6858
7045
  lodash.prototype.chain = wrapperChain;
@@ -6873,7 +7060,7 @@
6873
7060
  };
6874
7061
  });
6875
7062
 
6876
- // add `Array` functions that return the wrapped value
7063
+ // add `Array` functions that return the existing wrapped value
6877
7064
  baseEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
6878
7065
  var func = arrayRef[methodName];
6879
7066
  lodash.prototype[methodName] = function() {
@@ -6923,9 +7110,8 @@
6923
7110
  // some AMD build optimizers like r.js check for condition patterns like the following:
6924
7111
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
6925
7112
  // Expose Lo-Dash to the global object even when an AMD loader is present in
6926
- // case Lo-Dash was injected by a third-party script and not intended to be
6927
- // loaded as a module. The global assignment can be reverted in the Lo-Dash
6928
- // module by its `noConflict()` method.
7113
+ // case Lo-Dash is loaded with a RequireJS shim config.
7114
+ // See http://requirejs.org/docs/api.html#config-shim
6929
7115
  root._ = _;
6930
7116
 
6931
7117
  // define as an anonymous module so, through path mapping, it can be