scrivito_sdk 0.42.1 → 0.50.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/views/scrivito/ui/index.html.erb +0 -1
- data/config/ca-bundle.crt +1 -1
- data/config/routes.rb +8 -5
- data/lib/assets/javascripts/scrivito_ui.js +406 -286
- data/lib/assets/stylesheets/scrivito_sdk.css +1 -1
- data/lib/assets/stylesheets/scrivito_ui.css +1 -1
- data/lib/generators/scrivito/install/templates/app/models/page.rb +1 -1
- data/lib/generators/scrivito/migration/templates/migration.erb +1 -1
- data/lib/generators/scrivito/page/templates/migration.erb +1 -1
- data/lib/generators/scrivito/widget/templates/migration.erb +1 -1
- data/lib/scrivito/attribute_definition_migrator.rb +110 -0
- data/lib/scrivito/client_config.rb +1 -1
- data/lib/scrivito/configuration.rb +16 -0
- data/lib/scrivito/test_request.rb +10 -5
- data/lib/scrivito/user.rb +37 -5
- data/lib/scrivito/user_definition.rb +50 -16
- data/lib/tasks/migrate_attribute_definitions.rake +6 -0
- metadata +12 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70cfbded7c08170b69bac4f46a7bafd3c37c8539
|
4
|
+
data.tar.gz: 4f684ad24b4cba99c43412e03949e802a4e3c707
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f379ba2c03ff06267648b8d1504e9dba89de52636b714612466a69a48d05618052a2721c7ac1d068d2c6e0f069d7e0ce01f2264584df29c1e386b21f231d45f4
|
7
|
+
data.tar.gz: 0a4f892d6809b97c9fb4cf4d3ca518d44d03950e8ceae94c18025452eef3421f0d53d6c578bd100d00da75ab85318b9024616eeaf64c635503347a1082022ded
|
data/config/ca-bundle.crt
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
##
|
2
2
|
## Bundle of CA Root Certificates
|
3
3
|
##
|
4
|
-
## Certificate data from Mozilla as of:
|
4
|
+
## Certificate data from Mozilla as of: Fri Mar 6 09:58:49 2015
|
5
5
|
##
|
6
6
|
## This is a bundle of X.509 certificates of public Certificate Authorities
|
7
7
|
## (CA). These were automatically extracted from Mozilla's root certificates
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
resources :objs, controller: 'scrivito/objs', path: '__scrivito/objs',
|
3
|
-
only: [:create, :update, :destroy] do
|
3
|
+
only: [:create, :update, :destroy], defaults: {format: :json} do
|
4
4
|
collection do
|
5
5
|
get :page_class_selection
|
6
6
|
get :search
|
@@ -23,14 +23,17 @@ Rails.application.routes.draw do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
resources :tasks, controller: 'scrivito/tasks', path: '__scrivito/tasks', only: [:show]
|
26
|
+
resources :tasks, controller: 'scrivito/tasks', path: '__scrivito/tasks', only: [:show],
|
27
|
+
defaults: {format: :json}
|
27
28
|
|
28
|
-
get '__scrivito/blobs/upload_permission' => 'scrivito/blobs#upload_permission'
|
29
|
+
get '__scrivito/blobs/upload_permission' => 'scrivito/blobs#upload_permission',
|
30
|
+
defaults: {format: :json}
|
29
31
|
|
30
32
|
resources :workspaces,
|
31
33
|
controller: 'scrivito/workspaces',
|
32
34
|
path: '__scrivito/workspaces',
|
33
|
-
only: [:index, :show, :create, :update, :destroy]
|
35
|
+
only: [:index, :show, :create, :update, :destroy],
|
36
|
+
defaults: {format: :json} do
|
34
37
|
member do
|
35
38
|
put :rebase
|
36
39
|
put :publish
|
@@ -38,7 +41,7 @@ Rails.application.routes.draw do
|
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
41
|
-
get '__scrivito/users/suggest' => 'scrivito/users#suggest'
|
44
|
+
get '__scrivito/users/suggest' => 'scrivito/users#suggest', defaults: {format: :json}
|
42
45
|
|
43
46
|
get 'scrivito', to: 'scrivito/ui#index', as: 'scrivito_ui'
|
44
47
|
get 'scrivito/*application_path', to: 'scrivito/ui#index', format: false
|
@@ -15712,9 +15712,9 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15712
15712
|
}
|
15713
15713
|
|
15714
15714
|
;
|
15715
|
-
// Underscore.js 1.
|
15715
|
+
// Underscore.js 1.8.2
|
15716
15716
|
// http://underscorejs.org
|
15717
|
-
// (c) 2009-
|
15717
|
+
// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
15718
15718
|
// Underscore may be freely distributed under the MIT license.
|
15719
15719
|
|
15720
15720
|
(function() {
|
@@ -15735,7 +15735,6 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15735
15735
|
var
|
15736
15736
|
push = ArrayProto.push,
|
15737
15737
|
slice = ArrayProto.slice,
|
15738
|
-
concat = ArrayProto.concat,
|
15739
15738
|
toString = ObjProto.toString,
|
15740
15739
|
hasOwnProperty = ObjProto.hasOwnProperty;
|
15741
15740
|
|
@@ -15744,7 +15743,11 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15744
15743
|
var
|
15745
15744
|
nativeIsArray = Array.isArray,
|
15746
15745
|
nativeKeys = Object.keys,
|
15747
|
-
nativeBind = FuncProto.bind
|
15746
|
+
nativeBind = FuncProto.bind,
|
15747
|
+
nativeCreate = Object.create;
|
15748
|
+
|
15749
|
+
// Naked function reference for surrogate-prototype-swapping.
|
15750
|
+
var Ctor = function(){};
|
15748
15751
|
|
15749
15752
|
// Create a safe reference to the Underscore object for use below.
|
15750
15753
|
var _ = function(obj) {
|
@@ -15766,12 +15769,12 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15766
15769
|
}
|
15767
15770
|
|
15768
15771
|
// Current version.
|
15769
|
-
_.VERSION = '1.
|
15772
|
+
_.VERSION = '1.8.2';
|
15770
15773
|
|
15771
15774
|
// Internal function that returns an efficient (for current engines) version
|
15772
15775
|
// of the passed-in callback, to be repeatedly applied in other Underscore
|
15773
15776
|
// functions.
|
15774
|
-
var
|
15777
|
+
var optimizeCb = function(func, context, argCount) {
|
15775
15778
|
if (context === void 0) return func;
|
15776
15779
|
switch (argCount == null ? 3 : argCount) {
|
15777
15780
|
case 1: return function(value) {
|
@@ -15795,12 +15798,52 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15795
15798
|
// A mostly-internal function to generate callbacks that can be applied
|
15796
15799
|
// to each element in a collection, returning the desired result — either
|
15797
15800
|
// identity, an arbitrary callback, a property matcher, or a property accessor.
|
15798
|
-
|
15801
|
+
var cb = function(value, context, argCount) {
|
15799
15802
|
if (value == null) return _.identity;
|
15800
|
-
if (_.isFunction(value)) return
|
15801
|
-
if (_.isObject(value)) return _.
|
15803
|
+
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
|
15804
|
+
if (_.isObject(value)) return _.matcher(value);
|
15802
15805
|
return _.property(value);
|
15803
15806
|
};
|
15807
|
+
_.iteratee = function(value, context) {
|
15808
|
+
return cb(value, context, Infinity);
|
15809
|
+
};
|
15810
|
+
|
15811
|
+
// An internal function for creating assigner functions.
|
15812
|
+
var createAssigner = function(keysFunc, undefinedOnly) {
|
15813
|
+
return function(obj) {
|
15814
|
+
var length = arguments.length;
|
15815
|
+
if (length < 2 || obj == null) return obj;
|
15816
|
+
for (var index = 1; index < length; index++) {
|
15817
|
+
var source = arguments[index],
|
15818
|
+
keys = keysFunc(source),
|
15819
|
+
l = keys.length;
|
15820
|
+
for (var i = 0; i < l; i++) {
|
15821
|
+
var key = keys[i];
|
15822
|
+
if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
|
15823
|
+
}
|
15824
|
+
}
|
15825
|
+
return obj;
|
15826
|
+
};
|
15827
|
+
};
|
15828
|
+
|
15829
|
+
// An internal function for creating a new object that inherits from another.
|
15830
|
+
var baseCreate = function(prototype) {
|
15831
|
+
if (!_.isObject(prototype)) return {};
|
15832
|
+
if (nativeCreate) return nativeCreate(prototype);
|
15833
|
+
Ctor.prototype = prototype;
|
15834
|
+
var result = new Ctor;
|
15835
|
+
Ctor.prototype = null;
|
15836
|
+
return result;
|
15837
|
+
};
|
15838
|
+
|
15839
|
+
// Helper for collection methods to determine whether a collection
|
15840
|
+
// should be iterated as an array or as an object
|
15841
|
+
// Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
|
15842
|
+
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
|
15843
|
+
var isArrayLike = function(collection) {
|
15844
|
+
var length = collection && collection.length;
|
15845
|
+
return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
|
15846
|
+
};
|
15804
15847
|
|
15805
15848
|
// Collection Functions
|
15806
15849
|
// --------------------
|
@@ -15809,11 +15852,10 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15809
15852
|
// Handles raw objects in addition to array-likes. Treats all
|
15810
15853
|
// sparse array-likes as if they were dense.
|
15811
15854
|
_.each = _.forEach = function(obj, iteratee, context) {
|
15812
|
-
|
15813
|
-
|
15814
|
-
|
15815
|
-
|
15816
|
-
for (i = 0; i < length; i++) {
|
15855
|
+
iteratee = optimizeCb(iteratee, context);
|
15856
|
+
var i, length;
|
15857
|
+
if (isArrayLike(obj)) {
|
15858
|
+
for (i = 0, length = obj.length; i < length; i++) {
|
15817
15859
|
iteratee(obj[i], i, obj);
|
15818
15860
|
}
|
15819
15861
|
} else {
|
@@ -15827,77 +15869,66 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15827
15869
|
|
15828
15870
|
// Return the results of applying the iteratee to each element.
|
15829
15871
|
_.map = _.collect = function(obj, iteratee, context) {
|
15830
|
-
|
15831
|
-
|
15832
|
-
var keys = obj.length !== +obj.length && _.keys(obj),
|
15872
|
+
iteratee = cb(iteratee, context);
|
15873
|
+
var keys = !isArrayLike(obj) && _.keys(obj),
|
15833
15874
|
length = (keys || obj).length,
|
15834
|
-
results = Array(length)
|
15835
|
-
currentKey;
|
15875
|
+
results = Array(length);
|
15836
15876
|
for (var index = 0; index < length; index++) {
|
15837
|
-
currentKey = keys ? keys[index] : index;
|
15877
|
+
var currentKey = keys ? keys[index] : index;
|
15838
15878
|
results[index] = iteratee(obj[currentKey], currentKey, obj);
|
15839
15879
|
}
|
15840
15880
|
return results;
|
15841
15881
|
};
|
15842
15882
|
|
15843
|
-
|
15883
|
+
// Create a reducing function iterating left or right.
|
15884
|
+
function createReduce(dir) {
|
15885
|
+
// Optimized iterator function as using arguments.length
|
15886
|
+
// in the main function will deoptimize the, see #1991.
|
15887
|
+
function iterator(obj, iteratee, memo, keys, index, length) {
|
15888
|
+
for (; index >= 0 && index < length; index += dir) {
|
15889
|
+
var currentKey = keys ? keys[index] : index;
|
15890
|
+
memo = iteratee(memo, obj[currentKey], currentKey, obj);
|
15891
|
+
}
|
15892
|
+
return memo;
|
15893
|
+
}
|
15894
|
+
|
15895
|
+
return function(obj, iteratee, memo, context) {
|
15896
|
+
iteratee = optimizeCb(iteratee, context, 4);
|
15897
|
+
var keys = !isArrayLike(obj) && _.keys(obj),
|
15898
|
+
length = (keys || obj).length,
|
15899
|
+
index = dir > 0 ? 0 : length - 1;
|
15900
|
+
// Determine the initial value if none is provided.
|
15901
|
+
if (arguments.length < 3) {
|
15902
|
+
memo = obj[keys ? keys[index] : index];
|
15903
|
+
index += dir;
|
15904
|
+
}
|
15905
|
+
return iterator(obj, iteratee, memo, keys, index, length);
|
15906
|
+
};
|
15907
|
+
}
|
15844
15908
|
|
15845
15909
|
// **Reduce** builds up a single result from a list of values, aka `inject`,
|
15846
15910
|
// or `foldl`.
|
15847
|
-
_.reduce = _.foldl = _.inject =
|
15848
|
-
if (obj == null) obj = [];
|
15849
|
-
iteratee = createCallback(iteratee, context, 4);
|
15850
|
-
var keys = obj.length !== +obj.length && _.keys(obj),
|
15851
|
-
length = (keys || obj).length,
|
15852
|
-
index = 0, currentKey;
|
15853
|
-
if (arguments.length < 3) {
|
15854
|
-
if (!length) throw new TypeError(reduceError);
|
15855
|
-
memo = obj[keys ? keys[index++] : index++];
|
15856
|
-
}
|
15857
|
-
for (; index < length; index++) {
|
15858
|
-
currentKey = keys ? keys[index] : index;
|
15859
|
-
memo = iteratee(memo, obj[currentKey], currentKey, obj);
|
15860
|
-
}
|
15861
|
-
return memo;
|
15862
|
-
};
|
15911
|
+
_.reduce = _.foldl = _.inject = createReduce(1);
|
15863
15912
|
|
15864
15913
|
// The right-associative version of reduce, also known as `foldr`.
|
15865
|
-
_.reduceRight = _.foldr =
|
15866
|
-
if (obj == null) obj = [];
|
15867
|
-
iteratee = createCallback(iteratee, context, 4);
|
15868
|
-
var keys = obj.length !== + obj.length && _.keys(obj),
|
15869
|
-
index = (keys || obj).length,
|
15870
|
-
currentKey;
|
15871
|
-
if (arguments.length < 3) {
|
15872
|
-
if (!index) throw new TypeError(reduceError);
|
15873
|
-
memo = obj[keys ? keys[--index] : --index];
|
15874
|
-
}
|
15875
|
-
while (index--) {
|
15876
|
-
currentKey = keys ? keys[index] : index;
|
15877
|
-
memo = iteratee(memo, obj[currentKey], currentKey, obj);
|
15878
|
-
}
|
15879
|
-
return memo;
|
15880
|
-
};
|
15914
|
+
_.reduceRight = _.foldr = createReduce(-1);
|
15881
15915
|
|
15882
15916
|
// Return the first value which passes a truth test. Aliased as `detect`.
|
15883
15917
|
_.find = _.detect = function(obj, predicate, context) {
|
15884
|
-
var
|
15885
|
-
|
15886
|
-
|
15887
|
-
|
15888
|
-
|
15889
|
-
|
15890
|
-
|
15891
|
-
});
|
15892
|
-
return result;
|
15918
|
+
var key;
|
15919
|
+
if (isArrayLike(obj)) {
|
15920
|
+
key = _.findIndex(obj, predicate, context);
|
15921
|
+
} else {
|
15922
|
+
key = _.findKey(obj, predicate, context);
|
15923
|
+
}
|
15924
|
+
if (key !== void 0 && key !== -1) return obj[key];
|
15893
15925
|
};
|
15894
15926
|
|
15895
15927
|
// Return all the elements that pass a truth test.
|
15896
15928
|
// Aliased as `select`.
|
15897
15929
|
_.filter = _.select = function(obj, predicate, context) {
|
15898
15930
|
var results = [];
|
15899
|
-
|
15900
|
-
predicate = _.iteratee(predicate, context);
|
15931
|
+
predicate = cb(predicate, context);
|
15901
15932
|
_.each(obj, function(value, index, list) {
|
15902
15933
|
if (predicate(value, index, list)) results.push(value);
|
15903
15934
|
});
|
@@ -15906,19 +15937,17 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15906
15937
|
|
15907
15938
|
// Return all the elements for which a truth test fails.
|
15908
15939
|
_.reject = function(obj, predicate, context) {
|
15909
|
-
return _.filter(obj, _.negate(
|
15940
|
+
return _.filter(obj, _.negate(cb(predicate)), context);
|
15910
15941
|
};
|
15911
15942
|
|
15912
15943
|
// Determine whether all of the elements match a truth test.
|
15913
15944
|
// Aliased as `all`.
|
15914
15945
|
_.every = _.all = function(obj, predicate, context) {
|
15915
|
-
|
15916
|
-
|
15917
|
-
|
15918
|
-
|
15919
|
-
|
15920
|
-
for (index = 0; index < length; index++) {
|
15921
|
-
currentKey = keys ? keys[index] : index;
|
15946
|
+
predicate = cb(predicate, context);
|
15947
|
+
var keys = !isArrayLike(obj) && _.keys(obj),
|
15948
|
+
length = (keys || obj).length;
|
15949
|
+
for (var index = 0; index < length; index++) {
|
15950
|
+
var currentKey = keys ? keys[index] : index;
|
15922
15951
|
if (!predicate(obj[currentKey], currentKey, obj)) return false;
|
15923
15952
|
}
|
15924
15953
|
return true;
|
@@ -15927,24 +15956,21 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15927
15956
|
// Determine if at least one element in the object matches a truth test.
|
15928
15957
|
// Aliased as `any`.
|
15929
15958
|
_.some = _.any = function(obj, predicate, context) {
|
15930
|
-
|
15931
|
-
|
15932
|
-
|
15933
|
-
|
15934
|
-
|
15935
|
-
for (index = 0; index < length; index++) {
|
15936
|
-
currentKey = keys ? keys[index] : index;
|
15959
|
+
predicate = cb(predicate, context);
|
15960
|
+
var keys = !isArrayLike(obj) && _.keys(obj),
|
15961
|
+
length = (keys || obj).length;
|
15962
|
+
for (var index = 0; index < length; index++) {
|
15963
|
+
var currentKey = keys ? keys[index] : index;
|
15937
15964
|
if (predicate(obj[currentKey], currentKey, obj)) return true;
|
15938
15965
|
}
|
15939
15966
|
return false;
|
15940
15967
|
};
|
15941
15968
|
|
15942
15969
|
// Determine if the array or object contains a given value (using `===`).
|
15943
|
-
// Aliased as `include`.
|
15944
|
-
_.contains = _.include = function(obj, target) {
|
15945
|
-
if (obj
|
15946
|
-
|
15947
|
-
return _.indexOf(obj, target) >= 0;
|
15970
|
+
// Aliased as `includes` and `include`.
|
15971
|
+
_.contains = _.includes = _.include = function(obj, target, fromIndex) {
|
15972
|
+
if (!isArrayLike(obj)) obj = _.values(obj);
|
15973
|
+
return _.indexOf(obj, target, typeof fromIndex == 'number' && fromIndex) >= 0;
|
15948
15974
|
};
|
15949
15975
|
|
15950
15976
|
// Invoke a method (with arguments) on every item in a collection.
|
@@ -15952,7 +15978,8 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15952
15978
|
var args = slice.call(arguments, 2);
|
15953
15979
|
var isFunc = _.isFunction(method);
|
15954
15980
|
return _.map(obj, function(value) {
|
15955
|
-
|
15981
|
+
var func = isFunc ? method : value[method];
|
15982
|
+
return func == null ? func : func.apply(value, args);
|
15956
15983
|
});
|
15957
15984
|
};
|
15958
15985
|
|
@@ -15964,13 +15991,13 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15964
15991
|
// Convenience version of a common use case of `filter`: selecting only objects
|
15965
15992
|
// containing specific `key:value` pairs.
|
15966
15993
|
_.where = function(obj, attrs) {
|
15967
|
-
return _.filter(obj, _.
|
15994
|
+
return _.filter(obj, _.matcher(attrs));
|
15968
15995
|
};
|
15969
15996
|
|
15970
15997
|
// Convenience version of a common use case of `find`: getting the first object
|
15971
15998
|
// containing specific `key:value` pairs.
|
15972
15999
|
_.findWhere = function(obj, attrs) {
|
15973
|
-
return _.find(obj, _.
|
16000
|
+
return _.find(obj, _.matcher(attrs));
|
15974
16001
|
};
|
15975
16002
|
|
15976
16003
|
// Return the maximum element (or element-based computation).
|
@@ -15978,7 +16005,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15978
16005
|
var result = -Infinity, lastComputed = -Infinity,
|
15979
16006
|
value, computed;
|
15980
16007
|
if (iteratee == null && obj != null) {
|
15981
|
-
obj = obj
|
16008
|
+
obj = isArrayLike(obj) ? obj : _.values(obj);
|
15982
16009
|
for (var i = 0, length = obj.length; i < length; i++) {
|
15983
16010
|
value = obj[i];
|
15984
16011
|
if (value > result) {
|
@@ -15986,7 +16013,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
15986
16013
|
}
|
15987
16014
|
}
|
15988
16015
|
} else {
|
15989
|
-
iteratee =
|
16016
|
+
iteratee = cb(iteratee, context);
|
15990
16017
|
_.each(obj, function(value, index, list) {
|
15991
16018
|
computed = iteratee(value, index, list);
|
15992
16019
|
if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
|
@@ -16003,7 +16030,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16003
16030
|
var result = Infinity, lastComputed = Infinity,
|
16004
16031
|
value, computed;
|
16005
16032
|
if (iteratee == null && obj != null) {
|
16006
|
-
obj = obj
|
16033
|
+
obj = isArrayLike(obj) ? obj : _.values(obj);
|
16007
16034
|
for (var i = 0, length = obj.length; i < length; i++) {
|
16008
16035
|
value = obj[i];
|
16009
16036
|
if (value < result) {
|
@@ -16011,7 +16038,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16011
16038
|
}
|
16012
16039
|
}
|
16013
16040
|
} else {
|
16014
|
-
iteratee =
|
16041
|
+
iteratee = cb(iteratee, context);
|
16015
16042
|
_.each(obj, function(value, index, list) {
|
16016
16043
|
computed = iteratee(value, index, list);
|
16017
16044
|
if (computed < lastComputed || computed === Infinity && result === Infinity) {
|
@@ -16026,7 +16053,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16026
16053
|
// Shuffle a collection, using the modern version of the
|
16027
16054
|
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
|
16028
16055
|
_.shuffle = function(obj) {
|
16029
|
-
var set = obj
|
16056
|
+
var set = isArrayLike(obj) ? obj : _.values(obj);
|
16030
16057
|
var length = set.length;
|
16031
16058
|
var shuffled = Array(length);
|
16032
16059
|
for (var index = 0, rand; index < length; index++) {
|
@@ -16042,7 +16069,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16042
16069
|
// The internal `guard` argument allows it to work with `map`.
|
16043
16070
|
_.sample = function(obj, n, guard) {
|
16044
16071
|
if (n == null || guard) {
|
16045
|
-
if (obj
|
16072
|
+
if (!isArrayLike(obj)) obj = _.values(obj);
|
16046
16073
|
return obj[_.random(obj.length - 1)];
|
16047
16074
|
}
|
16048
16075
|
return _.shuffle(obj).slice(0, Math.max(0, n));
|
@@ -16050,7 +16077,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16050
16077
|
|
16051
16078
|
// Sort the object's values by a criterion produced by an iteratee.
|
16052
16079
|
_.sortBy = function(obj, iteratee, context) {
|
16053
|
-
iteratee =
|
16080
|
+
iteratee = cb(iteratee, context);
|
16054
16081
|
return _.pluck(_.map(obj, function(value, index, list) {
|
16055
16082
|
return {
|
16056
16083
|
value: value,
|
@@ -16072,7 +16099,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16072
16099
|
var group = function(behavior) {
|
16073
16100
|
return function(obj, iteratee, context) {
|
16074
16101
|
var result = {};
|
16075
|
-
iteratee =
|
16102
|
+
iteratee = cb(iteratee, context);
|
16076
16103
|
_.each(obj, function(value, index) {
|
16077
16104
|
var key = iteratee(value, index, obj);
|
16078
16105
|
behavior(result, value, key);
|
@@ -16100,37 +16127,24 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16100
16127
|
if (_.has(result, key)) result[key]++; else result[key] = 1;
|
16101
16128
|
});
|
16102
16129
|
|
16103
|
-
// Use a comparator function to figure out the smallest index at which
|
16104
|
-
// an object should be inserted so as to maintain order. Uses binary search.
|
16105
|
-
_.sortedIndex = function(array, obj, iteratee, context) {
|
16106
|
-
iteratee = _.iteratee(iteratee, context, 1);
|
16107
|
-
var value = iteratee(obj);
|
16108
|
-
var low = 0, high = array.length;
|
16109
|
-
while (low < high) {
|
16110
|
-
var mid = low + high >>> 1;
|
16111
|
-
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
|
16112
|
-
}
|
16113
|
-
return low;
|
16114
|
-
};
|
16115
|
-
|
16116
16130
|
// Safely create a real, live array from anything iterable.
|
16117
16131
|
_.toArray = function(obj) {
|
16118
16132
|
if (!obj) return [];
|
16119
16133
|
if (_.isArray(obj)) return slice.call(obj);
|
16120
|
-
if (obj
|
16134
|
+
if (isArrayLike(obj)) return _.map(obj, _.identity);
|
16121
16135
|
return _.values(obj);
|
16122
16136
|
};
|
16123
16137
|
|
16124
16138
|
// Return the number of elements in an object.
|
16125
16139
|
_.size = function(obj) {
|
16126
16140
|
if (obj == null) return 0;
|
16127
|
-
return obj
|
16141
|
+
return isArrayLike(obj) ? obj.length : _.keys(obj).length;
|
16128
16142
|
};
|
16129
16143
|
|
16130
16144
|
// Split a collection into two arrays: one whose elements all satisfy the given
|
16131
16145
|
// predicate, and one whose elements all do not satisfy the predicate.
|
16132
16146
|
_.partition = function(obj, predicate, context) {
|
16133
|
-
predicate =
|
16147
|
+
predicate = cb(predicate, context);
|
16134
16148
|
var pass = [], fail = [];
|
16135
16149
|
_.each(obj, function(value, key, obj) {
|
16136
16150
|
(predicate(value, key, obj) ? pass : fail).push(value);
|
@@ -16147,30 +16161,27 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16147
16161
|
_.first = _.head = _.take = function(array, n, guard) {
|
16148
16162
|
if (array == null) return void 0;
|
16149
16163
|
if (n == null || guard) return array[0];
|
16150
|
-
|
16151
|
-
return slice.call(array, 0, n);
|
16164
|
+
return _.initial(array, array.length - n);
|
16152
16165
|
};
|
16153
16166
|
|
16154
16167
|
// Returns everything but the last entry of the array. Especially useful on
|
16155
16168
|
// the arguments object. Passing **n** will return all the values in
|
16156
|
-
// the array, excluding the last N.
|
16157
|
-
// `_.map`.
|
16169
|
+
// the array, excluding the last N.
|
16158
16170
|
_.initial = function(array, n, guard) {
|
16159
16171
|
return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
|
16160
16172
|
};
|
16161
16173
|
|
16162
16174
|
// Get the last element of an array. Passing **n** will return the last N
|
16163
|
-
// values in the array.
|
16175
|
+
// values in the array.
|
16164
16176
|
_.last = function(array, n, guard) {
|
16165
16177
|
if (array == null) return void 0;
|
16166
16178
|
if (n == null || guard) return array[array.length - 1];
|
16167
|
-
return
|
16179
|
+
return _.rest(array, Math.max(0, array.length - n));
|
16168
16180
|
};
|
16169
16181
|
|
16170
16182
|
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
|
16171
16183
|
// Especially useful on the arguments object. Passing an **n** will return
|
16172
|
-
// the rest N values in the array.
|
16173
|
-
// check allows it to work with `_.map`.
|
16184
|
+
// the rest N values in the array.
|
16174
16185
|
_.rest = _.tail = _.drop = function(array, n, guard) {
|
16175
16186
|
return slice.call(array, n == null || guard ? 1 : n);
|
16176
16187
|
};
|
@@ -16181,18 +16192,20 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16181
16192
|
};
|
16182
16193
|
|
16183
16194
|
// Internal implementation of a recursive `flatten` function.
|
16184
|
-
var flatten = function(input, shallow, strict,
|
16185
|
-
|
16186
|
-
|
16187
|
-
}
|
16188
|
-
for (var i = 0, length = input.length; i < length; i++) {
|
16195
|
+
var flatten = function(input, shallow, strict, startIndex) {
|
16196
|
+
var output = [], idx = 0;
|
16197
|
+
for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
|
16189
16198
|
var value = input[i];
|
16190
|
-
if (
|
16191
|
-
|
16192
|
-
|
16193
|
-
|
16194
|
-
|
16195
|
-
|
16199
|
+
if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
|
16200
|
+
//flatten current level of array or arguments object
|
16201
|
+
if (!shallow) value = flatten(value, shallow, strict);
|
16202
|
+
var j = 0, len = value.length;
|
16203
|
+
output.length += len;
|
16204
|
+
while (j < len) {
|
16205
|
+
output[idx++] = value[j++];
|
16206
|
+
}
|
16207
|
+
} else if (!strict) {
|
16208
|
+
output[idx++] = value;
|
16196
16209
|
}
|
16197
16210
|
}
|
16198
16211
|
return output;
|
@@ -16200,7 +16213,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16200
16213
|
|
16201
16214
|
// Flatten out an array, either recursively (by default), or just one level.
|
16202
16215
|
_.flatten = function(array, shallow) {
|
16203
|
-
return flatten(array, shallow, false
|
16216
|
+
return flatten(array, shallow, false);
|
16204
16217
|
};
|
16205
16218
|
|
16206
16219
|
// Return a version of the array that does not contain the specified value(s).
|
@@ -16218,21 +16231,21 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16218
16231
|
iteratee = isSorted;
|
16219
16232
|
isSorted = false;
|
16220
16233
|
}
|
16221
|
-
if (iteratee != null) iteratee =
|
16234
|
+
if (iteratee != null) iteratee = cb(iteratee, context);
|
16222
16235
|
var result = [];
|
16223
16236
|
var seen = [];
|
16224
16237
|
for (var i = 0, length = array.length; i < length; i++) {
|
16225
|
-
var value = array[i]
|
16238
|
+
var value = array[i],
|
16239
|
+
computed = iteratee ? iteratee(value, i, array) : value;
|
16226
16240
|
if (isSorted) {
|
16227
|
-
if (!i || seen !==
|
16228
|
-
seen =
|
16241
|
+
if (!i || seen !== computed) result.push(value);
|
16242
|
+
seen = computed;
|
16229
16243
|
} else if (iteratee) {
|
16230
|
-
|
16231
|
-
if (_.indexOf(seen, computed) < 0) {
|
16244
|
+
if (!_.contains(seen, computed)) {
|
16232
16245
|
seen.push(computed);
|
16233
16246
|
result.push(value);
|
16234
16247
|
}
|
16235
|
-
} else if (_.
|
16248
|
+
} else if (!_.contains(result, value)) {
|
16236
16249
|
result.push(value);
|
16237
16250
|
}
|
16238
16251
|
}
|
@@ -16242,7 +16255,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16242
16255
|
// Produce an array that contains the union: each distinct element from all of
|
16243
16256
|
// the passed-in arrays.
|
16244
16257
|
_.union = function() {
|
16245
|
-
return _.uniq(flatten(arguments, true, true
|
16258
|
+
return _.uniq(flatten(arguments, true, true));
|
16246
16259
|
};
|
16247
16260
|
|
16248
16261
|
// Produce an array that contains every item shared between all the
|
@@ -16265,7 +16278,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16265
16278
|
// Take the difference between one array and a number of other arrays.
|
16266
16279
|
// Only the elements present in just the first array will remain.
|
16267
16280
|
_.difference = function(array) {
|
16268
|
-
var rest = flatten(
|
16281
|
+
var rest = flatten(arguments, true, true, 1);
|
16269
16282
|
return _.filter(array, function(value){
|
16270
16283
|
return !_.contains(rest, value);
|
16271
16284
|
});
|
@@ -16273,23 +16286,28 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16273
16286
|
|
16274
16287
|
// Zip together multiple lists into a single array -- elements that share
|
16275
16288
|
// an index go together.
|
16276
|
-
_.zip = function(
|
16277
|
-
|
16278
|
-
|
16279
|
-
|
16280
|
-
|
16281
|
-
|
16289
|
+
_.zip = function() {
|
16290
|
+
return _.unzip(arguments);
|
16291
|
+
};
|
16292
|
+
|
16293
|
+
// Complement of _.zip. Unzip accepts an array of arrays and groups
|
16294
|
+
// each array's elements on shared indices
|
16295
|
+
_.unzip = function(array) {
|
16296
|
+
var length = array && _.max(array, 'length').length || 0;
|
16297
|
+
var result = Array(length);
|
16298
|
+
|
16299
|
+
for (var index = 0; index < length; index++) {
|
16300
|
+
result[index] = _.pluck(array, index);
|
16282
16301
|
}
|
16283
|
-
return
|
16302
|
+
return result;
|
16284
16303
|
};
|
16285
16304
|
|
16286
16305
|
// Converts lists into objects. Pass either a single array of `[key, value]`
|
16287
16306
|
// pairs, or two parallel arrays of the same length -- one of keys, and one of
|
16288
16307
|
// the corresponding values.
|
16289
16308
|
_.object = function(list, values) {
|
16290
|
-
if (list == null) return {};
|
16291
16309
|
var result = {};
|
16292
|
-
for (var i = 0, length = list.length; i < length; i++) {
|
16310
|
+
for (var i = 0, length = list && list.length; i < length; i++) {
|
16293
16311
|
if (values) {
|
16294
16312
|
result[list[i]] = values[i];
|
16295
16313
|
} else {
|
@@ -16304,30 +16322,63 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16304
16322
|
// If the array is large and already in sort order, pass `true`
|
16305
16323
|
// for **isSorted** to use binary search.
|
16306
16324
|
_.indexOf = function(array, item, isSorted) {
|
16307
|
-
|
16308
|
-
|
16309
|
-
|
16310
|
-
|
16311
|
-
|
16312
|
-
|
16313
|
-
|
16314
|
-
|
16315
|
-
|
16325
|
+
var i = 0, length = array && array.length;
|
16326
|
+
if (typeof isSorted == 'number') {
|
16327
|
+
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
|
16328
|
+
} else if (isSorted && length) {
|
16329
|
+
i = _.sortedIndex(array, item);
|
16330
|
+
return array[i] === item ? i : -1;
|
16331
|
+
}
|
16332
|
+
if (item !== item) {
|
16333
|
+
return _.findIndex(slice.call(array, i), _.isNaN);
|
16316
16334
|
}
|
16317
16335
|
for (; i < length; i++) if (array[i] === item) return i;
|
16318
16336
|
return -1;
|
16319
16337
|
};
|
16320
16338
|
|
16321
16339
|
_.lastIndexOf = function(array, item, from) {
|
16322
|
-
|
16323
|
-
var idx = array.length;
|
16340
|
+
var idx = array ? array.length : 0;
|
16324
16341
|
if (typeof from == 'number') {
|
16325
16342
|
idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
|
16326
16343
|
}
|
16344
|
+
if (item !== item) {
|
16345
|
+
return _.findLastIndex(slice.call(array, 0, idx), _.isNaN);
|
16346
|
+
}
|
16327
16347
|
while (--idx >= 0) if (array[idx] === item) return idx;
|
16328
16348
|
return -1;
|
16329
16349
|
};
|
16330
16350
|
|
16351
|
+
// Generator function to create the findIndex and findLastIndex functions
|
16352
|
+
function createIndexFinder(dir) {
|
16353
|
+
return function(array, predicate, context) {
|
16354
|
+
predicate = cb(predicate, context);
|
16355
|
+
var length = array != null && array.length;
|
16356
|
+
var index = dir > 0 ? 0 : length - 1;
|
16357
|
+
for (; index >= 0 && index < length; index += dir) {
|
16358
|
+
if (predicate(array[index], index, array)) return index;
|
16359
|
+
}
|
16360
|
+
return -1;
|
16361
|
+
};
|
16362
|
+
}
|
16363
|
+
|
16364
|
+
// Returns the first index on an array-like that passes a predicate test
|
16365
|
+
_.findIndex = createIndexFinder(1);
|
16366
|
+
|
16367
|
+
_.findLastIndex = createIndexFinder(-1);
|
16368
|
+
|
16369
|
+
// Use a comparator function to figure out the smallest index at which
|
16370
|
+
// an object should be inserted so as to maintain order. Uses binary search.
|
16371
|
+
_.sortedIndex = function(array, obj, iteratee, context) {
|
16372
|
+
iteratee = cb(iteratee, context, 1);
|
16373
|
+
var value = iteratee(obj);
|
16374
|
+
var low = 0, high = array.length;
|
16375
|
+
while (low < high) {
|
16376
|
+
var mid = Math.floor((low + high) / 2);
|
16377
|
+
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
|
16378
|
+
}
|
16379
|
+
return low;
|
16380
|
+
};
|
16381
|
+
|
16331
16382
|
// Generate an integer Array containing an arithmetic progression. A port of
|
16332
16383
|
// the native Python `range()` function. See
|
16333
16384
|
// [the Python documentation](http://docs.python.org/library/functions.html#range).
|
@@ -16351,25 +16402,25 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16351
16402
|
// Function (ahem) Functions
|
16352
16403
|
// ------------------
|
16353
16404
|
|
16354
|
-
//
|
16355
|
-
|
16405
|
+
// Determines whether to execute a function as a constructor
|
16406
|
+
// or a normal function with the provided arguments
|
16407
|
+
var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
|
16408
|
+
if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
|
16409
|
+
var self = baseCreate(sourceFunc.prototype);
|
16410
|
+
var result = sourceFunc.apply(self, args);
|
16411
|
+
if (_.isObject(result)) return result;
|
16412
|
+
return self;
|
16413
|
+
};
|
16356
16414
|
|
16357
16415
|
// Create a function bound to a given object (assigning `this`, and arguments,
|
16358
16416
|
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
|
16359
16417
|
// available.
|
16360
16418
|
_.bind = function(func, context) {
|
16361
|
-
var args, bound;
|
16362
16419
|
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
|
16363
16420
|
if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
|
16364
|
-
args = slice.call(arguments, 2);
|
16365
|
-
bound = function() {
|
16366
|
-
|
16367
|
-
Ctor.prototype = func.prototype;
|
16368
|
-
var self = new Ctor;
|
16369
|
-
Ctor.prototype = null;
|
16370
|
-
var result = func.apply(self, args.concat(slice.call(arguments)));
|
16371
|
-
if (_.isObject(result)) return result;
|
16372
|
-
return self;
|
16421
|
+
var args = slice.call(arguments, 2);
|
16422
|
+
var bound = function() {
|
16423
|
+
return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
|
16373
16424
|
};
|
16374
16425
|
return bound;
|
16375
16426
|
};
|
@@ -16379,15 +16430,16 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16379
16430
|
// as a placeholder, allowing any combination of arguments to be pre-filled.
|
16380
16431
|
_.partial = function(func) {
|
16381
16432
|
var boundArgs = slice.call(arguments, 1);
|
16382
|
-
|
16383
|
-
var position = 0;
|
16384
|
-
var args =
|
16385
|
-
for (var i = 0
|
16386
|
-
|
16433
|
+
var bound = function() {
|
16434
|
+
var position = 0, length = boundArgs.length;
|
16435
|
+
var args = Array(length);
|
16436
|
+
for (var i = 0; i < length; i++) {
|
16437
|
+
args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
|
16387
16438
|
}
|
16388
16439
|
while (position < arguments.length) args.push(arguments[position++]);
|
16389
|
-
return func
|
16440
|
+
return executeBound(func, bound, this, this, args);
|
16390
16441
|
};
|
16442
|
+
return bound;
|
16391
16443
|
};
|
16392
16444
|
|
16393
16445
|
// Bind a number of an object's methods to that object. Remaining arguments
|
@@ -16407,7 +16459,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16407
16459
|
_.memoize = function(func, hasher) {
|
16408
16460
|
var memoize = function(key) {
|
16409
16461
|
var cache = memoize.cache;
|
16410
|
-
var address = hasher ? hasher.apply(this, arguments) : key;
|
16462
|
+
var address = '' + (hasher ? hasher.apply(this, arguments) : key);
|
16411
16463
|
if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
|
16412
16464
|
return cache[address];
|
16413
16465
|
};
|
@@ -16426,9 +16478,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16426
16478
|
|
16427
16479
|
// Defers a function, scheduling it to run after the current call stack has
|
16428
16480
|
// cleared.
|
16429
|
-
_.defer =
|
16430
|
-
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
|
16431
|
-
};
|
16481
|
+
_.defer = _.partial(_.delay, _, 1);
|
16432
16482
|
|
16433
16483
|
// Returns a function, that, when invoked, will only be triggered at most once
|
16434
16484
|
// during a given window of time. Normally, the throttled function will run
|
@@ -16453,8 +16503,10 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16453
16503
|
context = this;
|
16454
16504
|
args = arguments;
|
16455
16505
|
if (remaining <= 0 || remaining > wait) {
|
16456
|
-
|
16457
|
-
|
16506
|
+
if (timeout) {
|
16507
|
+
clearTimeout(timeout);
|
16508
|
+
timeout = null;
|
16509
|
+
}
|
16458
16510
|
previous = now;
|
16459
16511
|
result = func.apply(context, args);
|
16460
16512
|
if (!timeout) context = args = null;
|
@@ -16475,7 +16527,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16475
16527
|
var later = function() {
|
16476
16528
|
var last = _.now() - timestamp;
|
16477
16529
|
|
16478
|
-
if (last < wait && last
|
16530
|
+
if (last < wait && last >= 0) {
|
16479
16531
|
timeout = setTimeout(later, wait - last);
|
16480
16532
|
} else {
|
16481
16533
|
timeout = null;
|
@@ -16528,7 +16580,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16528
16580
|
};
|
16529
16581
|
};
|
16530
16582
|
|
16531
|
-
// Returns a function that will only be executed after
|
16583
|
+
// Returns a function that will only be executed on and after the Nth call.
|
16532
16584
|
_.after = function(times, func) {
|
16533
16585
|
return function() {
|
16534
16586
|
if (--times < 1) {
|
@@ -16537,15 +16589,14 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16537
16589
|
};
|
16538
16590
|
};
|
16539
16591
|
|
16540
|
-
// Returns a function that will only be executed
|
16592
|
+
// Returns a function that will only be executed up to (but not including) the Nth call.
|
16541
16593
|
_.before = function(times, func) {
|
16542
16594
|
var memo;
|
16543
16595
|
return function() {
|
16544
16596
|
if (--times > 0) {
|
16545
16597
|
memo = func.apply(this, arguments);
|
16546
|
-
} else {
|
16547
|
-
func = null;
|
16548
16598
|
}
|
16599
|
+
if (times <= 1) func = null;
|
16549
16600
|
return memo;
|
16550
16601
|
};
|
16551
16602
|
};
|
@@ -16557,13 +16608,47 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16557
16608
|
// Object Functions
|
16558
16609
|
// ----------------
|
16559
16610
|
|
16560
|
-
//
|
16611
|
+
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
|
16612
|
+
var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
|
16613
|
+
var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
|
16614
|
+
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
|
16615
|
+
|
16616
|
+
function collectNonEnumProps(obj, keys) {
|
16617
|
+
var nonEnumIdx = nonEnumerableProps.length;
|
16618
|
+
var constructor = obj.constructor;
|
16619
|
+
var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
|
16620
|
+
|
16621
|
+
// Constructor is a special case.
|
16622
|
+
var prop = 'constructor';
|
16623
|
+
if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
|
16624
|
+
|
16625
|
+
while (nonEnumIdx--) {
|
16626
|
+
prop = nonEnumerableProps[nonEnumIdx];
|
16627
|
+
if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
|
16628
|
+
keys.push(prop);
|
16629
|
+
}
|
16630
|
+
}
|
16631
|
+
}
|
16632
|
+
|
16633
|
+
// Retrieve the names of an object's own properties.
|
16561
16634
|
// Delegates to **ECMAScript 5**'s native `Object.keys`
|
16562
16635
|
_.keys = function(obj) {
|
16563
16636
|
if (!_.isObject(obj)) return [];
|
16564
16637
|
if (nativeKeys) return nativeKeys(obj);
|
16565
16638
|
var keys = [];
|
16566
16639
|
for (var key in obj) if (_.has(obj, key)) keys.push(key);
|
16640
|
+
// Ahem, IE < 9.
|
16641
|
+
if (hasEnumBug) collectNonEnumProps(obj, keys);
|
16642
|
+
return keys;
|
16643
|
+
};
|
16644
|
+
|
16645
|
+
// Retrieve all the property names of an object.
|
16646
|
+
_.allKeys = function(obj) {
|
16647
|
+
if (!_.isObject(obj)) return [];
|
16648
|
+
var keys = [];
|
16649
|
+
for (var key in obj) keys.push(key);
|
16650
|
+
// Ahem, IE < 9.
|
16651
|
+
if (hasEnumBug) collectNonEnumProps(obj, keys);
|
16567
16652
|
return keys;
|
16568
16653
|
};
|
16569
16654
|
|
@@ -16578,6 +16663,21 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16578
16663
|
return values;
|
16579
16664
|
};
|
16580
16665
|
|
16666
|
+
// Returns the results of applying the iteratee to each element of the object
|
16667
|
+
// In contrast to _.map it returns an object
|
16668
|
+
_.mapObject = function(obj, iteratee, context) {
|
16669
|
+
iteratee = cb(iteratee, context);
|
16670
|
+
var keys = _.keys(obj),
|
16671
|
+
length = keys.length,
|
16672
|
+
results = {},
|
16673
|
+
currentKey;
|
16674
|
+
for (var index = 0; index < length; index++) {
|
16675
|
+
currentKey = keys[index];
|
16676
|
+
results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
|
16677
|
+
}
|
16678
|
+
return results;
|
16679
|
+
};
|
16680
|
+
|
16581
16681
|
// Convert an object into a list of `[key, value]` pairs.
|
16582
16682
|
_.pairs = function(obj) {
|
16583
16683
|
var keys = _.keys(obj);
|
@@ -16610,37 +16710,38 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16610
16710
|
};
|
16611
16711
|
|
16612
16712
|
// Extend a given object with all the properties in passed-in object(s).
|
16613
|
-
_.extend =
|
16614
|
-
|
16615
|
-
|
16616
|
-
|
16617
|
-
|
16618
|
-
|
16619
|
-
|
16620
|
-
|
16621
|
-
|
16622
|
-
|
16713
|
+
_.extend = createAssigner(_.allKeys);
|
16714
|
+
|
16715
|
+
// Assigns a given object with all the own properties in the passed-in object(s)
|
16716
|
+
// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
|
16717
|
+
_.extendOwn = _.assign = createAssigner(_.keys);
|
16718
|
+
|
16719
|
+
// Returns the first key on an object that passes a predicate test
|
16720
|
+
_.findKey = function(obj, predicate, context) {
|
16721
|
+
predicate = cb(predicate, context);
|
16722
|
+
var keys = _.keys(obj), key;
|
16723
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
16724
|
+
key = keys[i];
|
16725
|
+
if (predicate(obj[key], key, obj)) return key;
|
16623
16726
|
}
|
16624
|
-
return obj;
|
16625
16727
|
};
|
16626
16728
|
|
16627
16729
|
// Return a copy of the object only containing the whitelisted properties.
|
16628
|
-
_.pick = function(
|
16629
|
-
var result = {},
|
16730
|
+
_.pick = function(object, oiteratee, context) {
|
16731
|
+
var result = {}, obj = object, iteratee, keys;
|
16630
16732
|
if (obj == null) return result;
|
16631
|
-
if (_.isFunction(
|
16632
|
-
|
16633
|
-
|
16634
|
-
var value = obj[key];
|
16635
|
-
if (iteratee(value, key, obj)) result[key] = value;
|
16636
|
-
}
|
16733
|
+
if (_.isFunction(oiteratee)) {
|
16734
|
+
keys = _.allKeys(obj);
|
16735
|
+
iteratee = optimizeCb(oiteratee, context);
|
16637
16736
|
} else {
|
16638
|
-
|
16639
|
-
|
16640
|
-
|
16641
|
-
|
16642
|
-
|
16643
|
-
|
16737
|
+
keys = flatten(arguments, false, false, 1);
|
16738
|
+
iteratee = function(value, key, obj) { return key in obj; };
|
16739
|
+
obj = Object(obj);
|
16740
|
+
}
|
16741
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
16742
|
+
var key = keys[i];
|
16743
|
+
var value = obj[key];
|
16744
|
+
if (iteratee(value, key, obj)) result[key] = value;
|
16644
16745
|
}
|
16645
16746
|
return result;
|
16646
16747
|
};
|
@@ -16650,7 +16751,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16650
16751
|
if (_.isFunction(iteratee)) {
|
16651
16752
|
iteratee = _.negate(iteratee);
|
16652
16753
|
} else {
|
16653
|
-
var keys = _.map(
|
16754
|
+
var keys = _.map(flatten(arguments, false, false, 1), String);
|
16654
16755
|
iteratee = function(value, key) {
|
16655
16756
|
return !_.contains(keys, key);
|
16656
16757
|
};
|
@@ -16659,16 +16760,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16659
16760
|
};
|
16660
16761
|
|
16661
16762
|
// Fill in a given object with default properties.
|
16662
|
-
_.defaults =
|
16663
|
-
if (!_.isObject(obj)) return obj;
|
16664
|
-
for (var i = 1, length = arguments.length; i < length; i++) {
|
16665
|
-
var source = arguments[i];
|
16666
|
-
for (var prop in source) {
|
16667
|
-
if (obj[prop] === void 0) obj[prop] = source[prop];
|
16668
|
-
}
|
16669
|
-
}
|
16670
|
-
return obj;
|
16671
|
-
};
|
16763
|
+
_.defaults = createAssigner(_.allKeys, true);
|
16672
16764
|
|
16673
16765
|
// Create a (shallow-cloned) duplicate of an object.
|
16674
16766
|
_.clone = function(obj) {
|
@@ -16684,6 +16776,19 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16684
16776
|
return obj;
|
16685
16777
|
};
|
16686
16778
|
|
16779
|
+
// Returns whether an object has a given set of `key:value` pairs.
|
16780
|
+
_.isMatch = function(object, attrs) {
|
16781
|
+
var keys = _.keys(attrs), length = keys.length;
|
16782
|
+
if (object == null) return !length;
|
16783
|
+
var obj = Object(object);
|
16784
|
+
for (var i = 0; i < length; i++) {
|
16785
|
+
var key = keys[i];
|
16786
|
+
if (attrs[key] !== obj[key] || !(key in obj)) return false;
|
16787
|
+
}
|
16788
|
+
return true;
|
16789
|
+
};
|
16790
|
+
|
16791
|
+
|
16687
16792
|
// Internal recursive comparison function for `isEqual`.
|
16688
16793
|
var eq = function(a, b, aStack, bStack) {
|
16689
16794
|
// Identical objects are equal. `0 === -0`, but they aren't identical.
|
@@ -16718,74 +16823,76 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16718
16823
|
// of `NaN` are not equivalent.
|
16719
16824
|
return +a === +b;
|
16720
16825
|
}
|
16721
|
-
|
16826
|
+
|
16827
|
+
var areArrays = className === '[object Array]';
|
16828
|
+
if (!areArrays) {
|
16829
|
+
if (typeof a != 'object' || typeof b != 'object') return false;
|
16830
|
+
|
16831
|
+
// Objects with different constructors are not equivalent, but `Object`s or `Array`s
|
16832
|
+
// from different frames are.
|
16833
|
+
var aCtor = a.constructor, bCtor = b.constructor;
|
16834
|
+
if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
|
16835
|
+
_.isFunction(bCtor) && bCtor instanceof bCtor)
|
16836
|
+
&& ('constructor' in a && 'constructor' in b)) {
|
16837
|
+
return false;
|
16838
|
+
}
|
16839
|
+
}
|
16722
16840
|
// Assume equality for cyclic structures. The algorithm for detecting cyclic
|
16723
16841
|
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
|
16842
|
+
|
16843
|
+
// Initializing stack of traversed objects.
|
16844
|
+
// It's done here since we only need them for objects and arrays comparison.
|
16845
|
+
aStack = aStack || [];
|
16846
|
+
bStack = bStack || [];
|
16724
16847
|
var length = aStack.length;
|
16725
16848
|
while (length--) {
|
16726
16849
|
// Linear search. Performance is inversely proportional to the number of
|
16727
16850
|
// unique nested structures.
|
16728
16851
|
if (aStack[length] === a) return bStack[length] === b;
|
16729
16852
|
}
|
16730
|
-
|
16731
|
-
// from different frames are.
|
16732
|
-
var aCtor = a.constructor, bCtor = b.constructor;
|
16733
|
-
if (
|
16734
|
-
aCtor !== bCtor &&
|
16735
|
-
// Handle Object.create(x) cases
|
16736
|
-
'constructor' in a && 'constructor' in b &&
|
16737
|
-
!(_.isFunction(aCtor) && aCtor instanceof aCtor &&
|
16738
|
-
_.isFunction(bCtor) && bCtor instanceof bCtor)
|
16739
|
-
) {
|
16740
|
-
return false;
|
16741
|
-
}
|
16853
|
+
|
16742
16854
|
// Add the first object to the stack of traversed objects.
|
16743
16855
|
aStack.push(a);
|
16744
16856
|
bStack.push(b);
|
16745
|
-
|
16857
|
+
|
16746
16858
|
// Recursively compare objects and arrays.
|
16747
|
-
if (
|
16859
|
+
if (areArrays) {
|
16748
16860
|
// Compare array lengths to determine if a deep comparison is necessary.
|
16749
|
-
|
16750
|
-
|
16751
|
-
|
16752
|
-
|
16753
|
-
|
16754
|
-
if (!(result = eq(a[size], b[size], aStack, bStack))) break;
|
16755
|
-
}
|
16861
|
+
length = a.length;
|
16862
|
+
if (length !== b.length) return false;
|
16863
|
+
// Deep compare the contents, ignoring non-numeric properties.
|
16864
|
+
while (length--) {
|
16865
|
+
if (!eq(a[length], b[length], aStack, bStack)) return false;
|
16756
16866
|
}
|
16757
16867
|
} else {
|
16758
16868
|
// Deep compare objects.
|
16759
16869
|
var keys = _.keys(a), key;
|
16760
|
-
|
16870
|
+
length = keys.length;
|
16761
16871
|
// Ensure that both objects contain the same number of properties before comparing deep equality.
|
16762
|
-
|
16763
|
-
|
16764
|
-
|
16765
|
-
|
16766
|
-
|
16767
|
-
if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
|
16768
|
-
}
|
16872
|
+
if (_.keys(b).length !== length) return false;
|
16873
|
+
while (length--) {
|
16874
|
+
// Deep compare each member
|
16875
|
+
key = keys[length];
|
16876
|
+
if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
|
16769
16877
|
}
|
16770
16878
|
}
|
16771
16879
|
// Remove the first object from the stack of traversed objects.
|
16772
16880
|
aStack.pop();
|
16773
16881
|
bStack.pop();
|
16774
|
-
return
|
16882
|
+
return true;
|
16775
16883
|
};
|
16776
16884
|
|
16777
16885
|
// Perform a deep comparison to check if two objects are equal.
|
16778
16886
|
_.isEqual = function(a, b) {
|
16779
|
-
return eq(a, b
|
16887
|
+
return eq(a, b);
|
16780
16888
|
};
|
16781
16889
|
|
16782
16890
|
// Is a given array, string, or object empty?
|
16783
16891
|
// An "empty" object has no enumerable own-properties.
|
16784
16892
|
_.isEmpty = function(obj) {
|
16785
16893
|
if (obj == null) return true;
|
16786
|
-
if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
|
16787
|
-
|
16788
|
-
return true;
|
16894
|
+
if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
|
16895
|
+
return _.keys(obj).length === 0;
|
16789
16896
|
};
|
16790
16897
|
|
16791
16898
|
// Is a given value a DOM element?
|
@@ -16805,14 +16912,14 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16805
16912
|
return type === 'function' || type === 'object' && !!obj;
|
16806
16913
|
};
|
16807
16914
|
|
16808
|
-
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
|
16809
|
-
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
|
16915
|
+
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
|
16916
|
+
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
|
16810
16917
|
_['is' + name] = function(obj) {
|
16811
16918
|
return toString.call(obj) === '[object ' + name + ']';
|
16812
16919
|
};
|
16813
16920
|
});
|
16814
16921
|
|
16815
|
-
// Define a fallback version of the method in browsers (ahem, IE), where
|
16922
|
+
// Define a fallback version of the method in browsers (ahem, IE < 9), where
|
16816
16923
|
// there isn't any inspectable "Arguments" type.
|
16817
16924
|
if (!_.isArguments(arguments)) {
|
16818
16925
|
_.isArguments = function(obj) {
|
@@ -16820,8 +16927,9 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16820
16927
|
};
|
16821
16928
|
}
|
16822
16929
|
|
16823
|
-
// Optimize `isFunction` if appropriate. Work around
|
16824
|
-
|
16930
|
+
// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
|
16931
|
+
// IE 11 (#1621), and in Safari 8 (#1929).
|
16932
|
+
if (typeof /./ != 'function' && typeof Int8Array != 'object') {
|
16825
16933
|
_.isFunction = function(obj) {
|
16826
16934
|
return typeof obj == 'function' || false;
|
16827
16935
|
};
|
@@ -16884,28 +16992,30 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16884
16992
|
|
16885
16993
|
_.property = function(key) {
|
16886
16994
|
return function(obj) {
|
16995
|
+
return obj == null ? void 0 : obj[key];
|
16996
|
+
};
|
16997
|
+
};
|
16998
|
+
|
16999
|
+
// Generates a function for a given object that returns a given property.
|
17000
|
+
_.propertyOf = function(obj) {
|
17001
|
+
return obj == null ? function(){} : function(key) {
|
16887
17002
|
return obj[key];
|
16888
17003
|
};
|
16889
17004
|
};
|
16890
17005
|
|
16891
|
-
// Returns a predicate for checking whether an object has a given set of
|
16892
|
-
|
16893
|
-
|
17006
|
+
// Returns a predicate for checking whether an object has a given set of
|
17007
|
+
// `key:value` pairs.
|
17008
|
+
_.matcher = _.matches = function(attrs) {
|
17009
|
+
attrs = _.extendOwn({}, attrs);
|
16894
17010
|
return function(obj) {
|
16895
|
-
|
16896
|
-
obj = new Object(obj);
|
16897
|
-
for (var i = 0; i < length; i++) {
|
16898
|
-
var pair = pairs[i], key = pair[0];
|
16899
|
-
if (pair[1] !== obj[key] || !(key in obj)) return false;
|
16900
|
-
}
|
16901
|
-
return true;
|
17011
|
+
return _.isMatch(obj, attrs);
|
16902
17012
|
};
|
16903
17013
|
};
|
16904
17014
|
|
16905
17015
|
// Run a function **n** times.
|
16906
17016
|
_.times = function(n, iteratee, context) {
|
16907
17017
|
var accum = Array(Math.max(0, n));
|
16908
|
-
iteratee =
|
17018
|
+
iteratee = optimizeCb(iteratee, context, 1);
|
16909
17019
|
for (var i = 0; i < n; i++) accum[i] = iteratee(i);
|
16910
17020
|
return accum;
|
16911
17021
|
};
|
@@ -16954,10 +17064,12 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
16954
17064
|
|
16955
17065
|
// If the value of the named `property` is a function then invoke it with the
|
16956
17066
|
// `object` as context; otherwise, return it.
|
16957
|
-
_.result = function(object, property) {
|
16958
|
-
|
16959
|
-
|
16960
|
-
|
17067
|
+
_.result = function(object, property, fallback) {
|
17068
|
+
var value = object == null ? void 0 : object[property];
|
17069
|
+
if (value === void 0) {
|
17070
|
+
value = fallback;
|
17071
|
+
}
|
17072
|
+
return _.isFunction(value) ? value.call(object) : value;
|
16961
17073
|
};
|
16962
17074
|
|
16963
17075
|
// Generate a unique integer id (unique within the entire client session).
|
@@ -17072,8 +17184,8 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
17072
17184
|
// underscore functions. Wrapped objects may be chained.
|
17073
17185
|
|
17074
17186
|
// Helper function to continue chaining intermediate results.
|
17075
|
-
var result = function(obj) {
|
17076
|
-
return
|
17187
|
+
var result = function(instance, obj) {
|
17188
|
+
return instance._chain ? _(obj).chain() : obj;
|
17077
17189
|
};
|
17078
17190
|
|
17079
17191
|
// Add your own custom functions to the Underscore object.
|
@@ -17083,7 +17195,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
17083
17195
|
_.prototype[name] = function() {
|
17084
17196
|
var args = [this._wrapped];
|
17085
17197
|
push.apply(args, arguments);
|
17086
|
-
return result
|
17198
|
+
return result(this, func.apply(_, args));
|
17087
17199
|
};
|
17088
17200
|
});
|
17089
17201
|
};
|
@@ -17098,7 +17210,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
17098
17210
|
var obj = this._wrapped;
|
17099
17211
|
method.apply(obj, arguments);
|
17100
17212
|
if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
|
17101
|
-
return result
|
17213
|
+
return result(this, obj);
|
17102
17214
|
};
|
17103
17215
|
});
|
17104
17216
|
|
@@ -17106,7 +17218,7 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
17106
17218
|
_.each(['concat', 'join', 'slice'], function(name) {
|
17107
17219
|
var method = ArrayProto[name];
|
17108
17220
|
_.prototype[name] = function() {
|
17109
|
-
return result
|
17221
|
+
return result(this, method.apply(this._wrapped, arguments));
|
17110
17222
|
};
|
17111
17223
|
});
|
17112
17224
|
|
@@ -17115,6 +17227,14 @@ if (typeof module !== 'undefined' && module.exports) {
|
|
17115
17227
|
return this._wrapped;
|
17116
17228
|
};
|
17117
17229
|
|
17230
|
+
// Provide unwrapping proxy for some methods used in engine operations
|
17231
|
+
// such as arithmetic and JSON stringification.
|
17232
|
+
_.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
|
17233
|
+
|
17234
|
+
_.prototype.toString = function() {
|
17235
|
+
return '' + this._wrapped;
|
17236
|
+
};
|
17237
|
+
|
17118
17238
|
// AMD registration happens at the end for compatibility with AMD loaders
|
17119
17239
|
// that may not enforce next-turn semantics on modules. Even though general
|
17120
17240
|
// practice for AMD registration is to be anonymous, underscore registers
|