@abedmurrar/objection 4.0.0-alpha.0 → 4.0.0-beta.1
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.
- package/README.md +103 -67
- package/lib/index.mjs +6 -0
- package/lib/initialize.js +6 -9
- package/lib/model/AjvValidator.js +235 -282
- package/lib/model/Model.js +653 -823
- package/lib/model/ModifierNotFoundError.js +5 -7
- package/lib/model/NotFoundError.js +14 -18
- package/lib/model/RelationDoesNotExistError.js +6 -9
- package/lib/model/ValidationError.js +33 -41
- package/lib/model/Validator.js +15 -21
- package/lib/model/getModel.js +1 -3
- package/lib/model/graph/ModelGraph.js +44 -64
- package/lib/model/graph/ModelGraphBuilder.js +164 -217
- package/lib/model/graph/ModelGraphEdge.js +31 -43
- package/lib/model/graph/ModelGraphNode.js +192 -231
- package/lib/model/inheritModel.js +9 -18
- package/lib/model/modelBindKnex.js +48 -62
- package/lib/model/modelClone.js +79 -98
- package/lib/model/modelColPropMap.js +16 -26
- package/lib/model/modelConcurrency.js +24 -0
- package/lib/model/modelId.js +44 -49
- package/lib/model/modelJsonAttributes.js +56 -76
- package/lib/model/modelParseRelations.js +68 -67
- package/lib/model/modelQueryProps.js +76 -107
- package/lib/model/modelSet.js +92 -112
- package/lib/model/modelTableMetadata.js +60 -72
- package/lib/model/modelToJson.js +120 -150
- package/lib/model/modelUtils.js +30 -37
- package/lib/model/modelValidate.js +34 -42
- package/lib/model/modelValues.js +78 -91
- package/lib/model/modelVisitor.js +22 -29
- package/lib/objection.js +42 -67
- package/lib/queryBuilder/FunctionBuilder.js +231 -279
- package/lib/queryBuilder/InternalOptions.js +19 -24
- package/lib/queryBuilder/JoinBuilder.js +116 -149
- package/lib/queryBuilder/QueryBuilder.js +1009 -1271
- package/lib/queryBuilder/QueryBuilderBase.js +647 -865
- package/lib/queryBuilder/QueryBuilderContext.js +14 -21
- package/lib/queryBuilder/QueryBuilderContextBase.js +20 -29
- package/lib/queryBuilder/QueryBuilderOperationSupport.js +462 -536
- package/lib/queryBuilder/QueryBuilderUserContext.js +19 -25
- package/lib/queryBuilder/RawBuilder.js +58 -73
- package/lib/queryBuilder/ReferenceBuilder.js +232 -270
- package/lib/queryBuilder/RelationExpression.js +322 -380
- package/lib/queryBuilder/StaticHookArguments.js +94 -106
- package/lib/queryBuilder/ValueBuilder.js +100 -112
- package/lib/queryBuilder/expressions.js +86 -116
- package/lib/queryBuilder/functions/mysql.js +642 -697
- package/lib/queryBuilder/graph/GraphAction.js +44 -59
- package/lib/queryBuilder/graph/GraphData.js +7 -9
- package/lib/queryBuilder/graph/GraphFetcher.js +115 -151
- package/lib/queryBuilder/graph/GraphNodeDbExistence.js +114 -152
- package/lib/queryBuilder/graph/GraphOperation.js +16 -22
- package/lib/queryBuilder/graph/GraphOptions.js +143 -185
- package/lib/queryBuilder/graph/GraphUpsert.js +167 -241
- package/lib/queryBuilder/graph/delete/GraphDelete.js +8 -13
- package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +44 -62
- package/lib/queryBuilder/graph/insert/GraphInsert.js +99 -128
- package/lib/queryBuilder/graph/insert/GraphInsertAction.js +151 -193
- package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +57 -79
- package/lib/queryBuilder/graph/patch/GraphPatch.js +8 -13
- package/lib/queryBuilder/graph/patch/GraphPatchAction.js +181 -234
- package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +16 -21
- package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +80 -110
- package/lib/queryBuilder/join/JoinResultColumn.js +14 -18
- package/lib/queryBuilder/join/JoinResultParser.js +88 -101
- package/lib/queryBuilder/join/RelationJoiner.js +205 -288
- package/lib/queryBuilder/join/TableNode.js +117 -144
- package/lib/queryBuilder/join/TableTree.js +60 -76
- package/lib/queryBuilder/join/utils.js +10 -16
- package/lib/queryBuilder/operations/DelegateOperation.js +93 -133
- package/lib/queryBuilder/operations/DeleteOperation.js +33 -37
- package/lib/queryBuilder/operations/FindByIdOperation.js +20 -28
- package/lib/queryBuilder/operations/FindByIdsOperation.js +17 -23
- package/lib/queryBuilder/operations/FindOperation.js +114 -131
- package/lib/queryBuilder/operations/FirstOperation.js +14 -19
- package/lib/queryBuilder/operations/FromOperation.js +69 -88
- package/lib/queryBuilder/operations/InsertAndFetchOperation.js +28 -39
- package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +25 -35
- package/lib/queryBuilder/operations/InsertGraphOperation.js +77 -98
- package/lib/queryBuilder/operations/InsertOperation.js +132 -165
- package/lib/queryBuilder/operations/InstanceDeleteOperation.js +27 -36
- package/lib/queryBuilder/operations/InstanceFindOperation.js +9 -13
- package/lib/queryBuilder/operations/InstanceInsertOperation.js +13 -17
- package/lib/queryBuilder/operations/InstanceUpdateOperation.js +32 -46
- package/lib/queryBuilder/operations/JoinRelatedOperation.js +66 -86
- package/lib/queryBuilder/operations/KnexOperation.js +4 -7
- package/lib/queryBuilder/operations/MergeOperation.js +32 -45
- package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +131 -150
- package/lib/queryBuilder/operations/OnBuildKnexOperation.js +17 -23
- package/lib/queryBuilder/operations/OnBuildOperation.js +17 -23
- package/lib/queryBuilder/operations/OnErrorOperation.js +17 -23
- package/lib/queryBuilder/operations/QueryBuilderOperation.js +231 -270
- package/lib/queryBuilder/operations/RangeOperation.js +30 -40
- package/lib/queryBuilder/operations/RelateOperation.js +14 -21
- package/lib/queryBuilder/operations/ReturningOperation.js +12 -18
- package/lib/queryBuilder/operations/RunAfterOperation.js +17 -23
- package/lib/queryBuilder/operations/RunBeforeOperation.js +17 -23
- package/lib/queryBuilder/operations/UnrelateOperation.js +12 -17
- package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +48 -65
- package/lib/queryBuilder/operations/UpdateOperation.js +104 -129
- package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +25 -35
- package/lib/queryBuilder/operations/UpsertGraphOperation.js +36 -55
- package/lib/queryBuilder/operations/WhereCompositeOperation.js +30 -39
- package/lib/queryBuilder/operations/WhereInOperation.js +34 -36
- package/lib/queryBuilder/operations/eager/EagerOperation.js +37 -52
- package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +34 -44
- package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +4 -7
- package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +193 -251
- package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +18 -25
- package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectOperation.js +25 -41
- package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +19 -20
- package/lib/queryBuilder/operations/jsonApi/WhereJsonOverlapsOperation.js +23 -21
- package/lib/queryBuilder/operations/jsonApi/mysqlJsonApi.js +106 -118
- package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +79 -108
- package/lib/queryBuilder/operations/select/SelectOperation.js +37 -53
- package/lib/queryBuilder/operations/select/Selection.js +94 -105
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +68 -101
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +65 -75
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +75 -84
- package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +760 -859
- package/lib/queryBuilder/parsers/relationExpressionParser.js +840 -952
- package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +10 -15
- package/lib/queryBuilder/transformations/QueryTransformation.js +4 -6
- package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +35 -49
- package/lib/queryBuilder/transformations/index.js +3 -9
- package/lib/queryBuilder/whereScopes.js +158 -186
- package/lib/relations/Relation.js +293 -375
- package/lib/relations/RelationDeleteOperation.js +24 -28
- package/lib/relations/RelationFindOperation.js +108 -138
- package/lib/relations/RelationInsertOperation.js +24 -32
- package/lib/relations/RelationOwner.js +175 -209
- package/lib/relations/RelationProperty.js +186 -223
- package/lib/relations/RelationUpdateOperation.js +23 -29
- package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +16 -21
- package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +30 -41
- package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +36 -47
- package/lib/relations/belongsToOne/BelongsToOneRelation.js +42 -50
- package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +43 -58
- package/lib/relations/hasMany/HasManyInsertOperation.js +40 -56
- package/lib/relations/hasMany/HasManyRelateOperation.js +45 -61
- package/lib/relations/hasMany/HasManyRelation.js +38 -46
- package/lib/relations/hasMany/HasManyUnrelateOperation.js +25 -32
- package/lib/relations/hasOne/HasOneRelation.js +9 -12
- package/lib/relations/hasOneThrough/HasOneThroughRelation.js +9 -12
- package/lib/relations/manyToMany/ManyToManyModifyMixin.js +73 -95
- package/lib/relations/manyToMany/ManyToManyRelation.js +374 -473
- package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +23 -30
- package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +8 -10
- package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +20 -25
- package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +8 -12
- package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +77 -100
- package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +37 -49
- package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +58 -74
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +10 -13
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +26 -33
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +10 -15
- package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +8 -10
- package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +61 -78
- package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +8 -12
- package/lib/transaction.js +53 -83
- package/lib/utils/assert.js +15 -21
- package/lib/utils/buildUtils.js +17 -19
- package/lib/utils/classUtils.js +7 -11
- package/lib/utils/cloneDeep.js +365 -0
- package/lib/utils/createModifier.js +36 -41
- package/lib/utils/deprecate.js +8 -12
- package/lib/utils/identifierMapping.js +153 -192
- package/lib/utils/internalPropUtils.js +4 -8
- package/lib/utils/knexUtils.js +61 -56
- package/lib/utils/mixin.js +16 -23
- package/lib/utils/mysqlJsonPath.js +55 -40
- package/lib/utils/normalizeIds.js +110 -127
- package/lib/utils/objectUtils.js +236 -338
- package/lib/utils/parseFieldExpression.js +66 -44
- package/lib/utils/postgresJsonPath.js +48 -62
- package/lib/utils/promiseUtils/after.js +10 -13
- package/lib/utils/promiseUtils/afterReturn.js +10 -13
- package/lib/utils/promiseUtils/index.js +15 -17
- package/lib/utils/promiseUtils/isPromise.js +6 -9
- package/lib/utils/promiseUtils/map.js +75 -89
- package/lib/utils/promiseUtils/mapAfterAllReturn.js +17 -23
- package/lib/utils/promiseUtils/try.js +15 -18
- package/lib/utils/resolveModel.js +91 -94
- package/lib/utils/tmpColumnUtils.js +4 -13
- package/package.json +50 -23
- package/typings/objection/index.d.mts +362 -0
- package/typings/objection/index.d.ts +36 -9
- package/lib/.eslintrc.json +0 -8
- package/lib/queryBuilder/parsers/jsonFieldExpressionParser.pegjs +0 -97
- package/lib/queryBuilder/parsers/relationExpressionParser.pegjs +0 -141
- package/lib/utils/clone.js +0 -2329
package/lib/utils/objectUtils.js
CHANGED
|
@@ -1,416 +1,314 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cloneDeep = void 0;
|
|
4
|
+
exports.isEmpty = isEmpty;
|
|
5
|
+
exports.isString = isString;
|
|
6
|
+
exports.isRegExp = isRegExp;
|
|
7
|
+
exports.isObject = isObject;
|
|
8
|
+
exports.isNumber = isNumber;
|
|
9
|
+
exports.isFunction = isFunction;
|
|
10
|
+
exports.jsonEquals = jsonEquals;
|
|
11
|
+
exports.isPlainObject = isPlainObject;
|
|
12
|
+
exports.difference = difference;
|
|
13
|
+
exports.zipObject = zipObject;
|
|
14
|
+
exports.mergeMaps = mergeMaps;
|
|
15
|
+
exports.asSingle = asSingle;
|
|
16
|
+
exports.asArray = asArray;
|
|
17
|
+
exports.flatten = flatten;
|
|
18
|
+
exports.groupBy = groupBy;
|
|
19
|
+
exports.uniqBy = uniqBy;
|
|
20
|
+
exports.union = union;
|
|
21
|
+
exports.chunk = chunk;
|
|
22
|
+
exports.omit = omit;
|
|
23
|
+
exports.once = once;
|
|
24
|
+
exports.last = last;
|
|
25
|
+
exports.get = get;
|
|
26
|
+
exports.set = set;
|
|
27
|
+
const cloneDeep_1 = require("./cloneDeep");
|
|
28
|
+
Object.defineProperty(exports, "cloneDeep", { enumerable: true, get: function () { return cloneDeep_1.cloneDeep; } });
|
|
4
29
|
const SMALL_ARRAY_SIZE = 10;
|
|
5
|
-
|
|
6
30
|
function isEmpty(item) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
31
|
+
if (Array.isArray(item) || Buffer.isBuffer(item)) {
|
|
32
|
+
return item.length === 0;
|
|
33
|
+
}
|
|
34
|
+
else if (isObject(item)) {
|
|
35
|
+
return Object.keys(item).length === 0;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
14
40
|
}
|
|
15
|
-
|
|
41
|
+
// The `T &` keeps an `any` argument `any`.
|
|
16
42
|
function isObject(value) {
|
|
17
|
-
|
|
43
|
+
return value !== null && typeof value === 'object';
|
|
18
44
|
}
|
|
19
|
-
|
|
20
45
|
// Quick and dirty check if an object is a plain object and not
|
|
21
46
|
// for example an instance of some class.
|
|
22
47
|
function isPlainObject(value) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
(!value.toString || value.toString === Object.prototype.toString)
|
|
27
|
-
);
|
|
48
|
+
return (isObject(value) &&
|
|
49
|
+
(!value.constructor || value.constructor === Object) &&
|
|
50
|
+
(!value.toString || value.toString === Object.prototype.toString));
|
|
28
51
|
}
|
|
29
|
-
|
|
30
52
|
function isFunction(value) {
|
|
31
|
-
|
|
53
|
+
return typeof value === 'function';
|
|
32
54
|
}
|
|
33
|
-
|
|
34
55
|
function isRegExp(value) {
|
|
35
|
-
|
|
56
|
+
return value instanceof RegExp;
|
|
36
57
|
}
|
|
37
|
-
|
|
38
58
|
function isString(value) {
|
|
39
|
-
|
|
59
|
+
return typeof value === 'string';
|
|
40
60
|
}
|
|
41
|
-
|
|
42
61
|
function isNumber(value) {
|
|
43
|
-
|
|
62
|
+
return typeof value === 'number';
|
|
44
63
|
}
|
|
45
|
-
|
|
46
64
|
function asArray(value) {
|
|
47
|
-
|
|
65
|
+
return Array.isArray(value) ? value : [value];
|
|
48
66
|
}
|
|
49
|
-
|
|
50
67
|
function asSingle(value) {
|
|
51
|
-
|
|
68
|
+
return Array.isArray(value) ? value[0] : value;
|
|
52
69
|
}
|
|
53
|
-
|
|
54
70
|
function uniqBy(items, keyGetter = null) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
map.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return Array.from(map.values());
|
|
65
|
-
}
|
|
66
|
-
|
|
71
|
+
const map = new Map();
|
|
72
|
+
for (let i = 0, l = items.length; i < l; ++i) {
|
|
73
|
+
const item = items[i];
|
|
74
|
+
const key = keyGetter !== null ? keyGetter(item) : item;
|
|
75
|
+
map.set(key, item);
|
|
76
|
+
}
|
|
77
|
+
return Array.from(map.values());
|
|
78
|
+
}
|
|
67
79
|
function groupBy(items, keyGetter = null) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
80
|
+
const groups = new Map();
|
|
81
|
+
for (const item of items) {
|
|
82
|
+
const key = keyGetter !== null ? keyGetter(item) : item;
|
|
83
|
+
let group = groups.get(key);
|
|
84
|
+
if (!group) {
|
|
85
|
+
group = [];
|
|
86
|
+
groups.set(key, group);
|
|
87
|
+
}
|
|
88
|
+
group.push(item);
|
|
77
89
|
}
|
|
78
|
-
|
|
79
|
-
group.push(item);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return groups;
|
|
90
|
+
return groups;
|
|
83
91
|
}
|
|
84
|
-
|
|
85
92
|
function omit(obj, keysToOmit) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (!keysToOmit.includes(key)) {
|
|
95
|
-
out[key] = obj[key];
|
|
93
|
+
const keysToOmitArray = asArray(keysToOmit);
|
|
94
|
+
const keys = Object.keys(obj);
|
|
95
|
+
const out = {};
|
|
96
|
+
for (let i = 0, l = keys.length; i < l; ++i) {
|
|
97
|
+
const key = keys[i];
|
|
98
|
+
if (!keysToOmitArray.includes(key)) {
|
|
99
|
+
out[key] = obj[key];
|
|
100
|
+
}
|
|
96
101
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return out;
|
|
102
|
+
return out;
|
|
100
103
|
}
|
|
101
|
-
|
|
102
104
|
function difference(arr1, arr2) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
diff.push(value);
|
|
105
|
+
const arr2Set = new Set(arr2);
|
|
106
|
+
const diff = [];
|
|
107
|
+
for (let i = 0; i < arr1.length; ++i) {
|
|
108
|
+
const value = arr1[i];
|
|
109
|
+
if (!arr2Set.has(value)) {
|
|
110
|
+
diff.push(value);
|
|
111
|
+
}
|
|
111
112
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return diff;
|
|
113
|
+
return diff;
|
|
115
114
|
}
|
|
116
|
-
|
|
117
115
|
function union(arr1, arr2) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
116
|
+
if (arr1.length < SMALL_ARRAY_SIZE && arr2.length < SMALL_ARRAY_SIZE) {
|
|
117
|
+
return unionSmall(arr1, arr2);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return unionGeneric(arr1, arr2);
|
|
121
|
+
}
|
|
123
122
|
}
|
|
124
|
-
|
|
125
123
|
function unionSmall(arr1, arr2) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
all.push(item);
|
|
124
|
+
const all = arr1.slice();
|
|
125
|
+
for (let i = 0, l = arr2.length; i < l; ++i) {
|
|
126
|
+
const item = arr2[i];
|
|
127
|
+
if (all.indexOf(item) === -1) {
|
|
128
|
+
all.push(item);
|
|
129
|
+
}
|
|
133
130
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return all;
|
|
131
|
+
return all;
|
|
137
132
|
}
|
|
138
|
-
|
|
139
133
|
function unionGeneric(arr1, arr2) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
for (let i = 0; i < arr2.length; ++i) {
|
|
147
|
-
all.add(arr2[i]);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return Array.from(all);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function last(arr) {
|
|
154
|
-
return arr[arr.length - 1];
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function upperFirst(str) {
|
|
158
|
-
return str[0].toUpperCase() + str.substring(1);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
function values(obj) {
|
|
162
|
-
if (isObject(obj)) {
|
|
163
|
-
const keys = Object.keys(obj);
|
|
164
|
-
const values = new Array(keys.length);
|
|
165
|
-
|
|
166
|
-
for (let i = 0, l = keys.length; i < l; ++i) {
|
|
167
|
-
values[i] = obj[keys[i]];
|
|
134
|
+
const all = new Set();
|
|
135
|
+
for (let i = 0; i < arr1.length; ++i) {
|
|
136
|
+
all.add(arr1[i]);
|
|
137
|
+
}
|
|
138
|
+
for (let i = 0; i < arr2.length; ++i) {
|
|
139
|
+
all.add(arr2[i]);
|
|
168
140
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return [];
|
|
173
|
-
}
|
|
141
|
+
return Array.from(all);
|
|
142
|
+
}
|
|
143
|
+
function last(arr) {
|
|
144
|
+
return arr[arr.length - 1];
|
|
174
145
|
}
|
|
175
|
-
|
|
176
146
|
function once(func) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
return value;
|
|
187
|
-
};
|
|
147
|
+
let called = false;
|
|
148
|
+
let value;
|
|
149
|
+
return function (...args) {
|
|
150
|
+
if (called === false) {
|
|
151
|
+
called = true;
|
|
152
|
+
value = func.apply(this, args);
|
|
153
|
+
}
|
|
154
|
+
return value;
|
|
155
|
+
};
|
|
188
156
|
}
|
|
189
|
-
|
|
190
157
|
function flatten(arrays) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
158
|
+
const out = [];
|
|
159
|
+
for (let i = 0, l = arrays.length; i < l; ++i) {
|
|
160
|
+
const value = arrays[i];
|
|
161
|
+
if (Array.isArray(value)) {
|
|
162
|
+
for (let j = 0; j < value.length; ++j) {
|
|
163
|
+
out.push(value[j]);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
out.push(value);
|
|
168
|
+
}
|
|
202
169
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
return out;
|
|
170
|
+
return out;
|
|
206
171
|
}
|
|
207
|
-
|
|
208
172
|
function get(obj, path) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
173
|
+
for (let i = 0, l = path.length; i < l; ++i) {
|
|
174
|
+
const key = path[i];
|
|
175
|
+
if (!isObject(obj)) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
obj = obj[key];
|
|
214
179
|
}
|
|
215
|
-
|
|
216
|
-
obj = obj[key];
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return obj;
|
|
180
|
+
return obj;
|
|
220
181
|
}
|
|
221
|
-
|
|
222
182
|
function set(obj, path, value) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
183
|
+
const inputObj = obj;
|
|
184
|
+
// `obj` walks down the path. It's indexed as is, like the JavaScript code
|
|
185
|
+
// did, so a non-object input throws the same way.
|
|
186
|
+
let current = obj;
|
|
187
|
+
for (let i = 0, l = path.length - 1; i < l; ++i) {
|
|
188
|
+
const key = path[i];
|
|
189
|
+
if (!isSafeKey(key)) {
|
|
190
|
+
return inputObj;
|
|
191
|
+
}
|
|
192
|
+
let child = current[key];
|
|
193
|
+
if (!isObject(child)) {
|
|
194
|
+
const nextKey = path[i + 1];
|
|
195
|
+
// isNaN() converts the key to a number, so '1' is a number and 'a' is not.
|
|
196
|
+
if (isNaN(nextKey)) {
|
|
197
|
+
child = {};
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
child = [];
|
|
201
|
+
}
|
|
202
|
+
current[key] = child;
|
|
203
|
+
}
|
|
204
|
+
current = child;
|
|
244
205
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
const key = path[path.length - 1];
|
|
251
|
-
|
|
252
|
-
if (isSafeKey(key)) {
|
|
253
|
-
obj[key] = value;
|
|
206
|
+
if (path.length > 0 && isObject(current)) {
|
|
207
|
+
const key = path[path.length - 1];
|
|
208
|
+
if (isSafeKey(key)) {
|
|
209
|
+
current[key] = value;
|
|
210
|
+
}
|
|
254
211
|
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
return inputObj;
|
|
212
|
+
return inputObj;
|
|
258
213
|
}
|
|
259
|
-
|
|
260
214
|
function zipObject(keys, values) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
out[key] = values[i];
|
|
215
|
+
const out = {};
|
|
216
|
+
for (let i = 0, l = keys.length; i < l; ++i) {
|
|
217
|
+
const key = keys[i];
|
|
218
|
+
if (isSafeKey(key)) {
|
|
219
|
+
out[key] = values[i];
|
|
220
|
+
}
|
|
268
221
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
return out;
|
|
222
|
+
return out;
|
|
272
223
|
}
|
|
273
|
-
|
|
274
224
|
function chunk(arr, chunkSize) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
225
|
+
const out = [];
|
|
226
|
+
for (let i = 0, l = arr.length; i < l; ++i) {
|
|
227
|
+
const item = arr[i];
|
|
228
|
+
if (out.length === 0 || out[out.length - 1].length === chunkSize) {
|
|
229
|
+
out.push([]);
|
|
230
|
+
}
|
|
231
|
+
out[out.length - 1].push(item);
|
|
282
232
|
}
|
|
283
|
-
|
|
284
|
-
out[out.length - 1].push(item);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
return out;
|
|
233
|
+
return out;
|
|
288
234
|
}
|
|
289
|
-
|
|
290
235
|
function jsonEquals(val1, val2) {
|
|
291
|
-
|
|
236
|
+
return jsonEqualsBase(val1, val2, compareStrict);
|
|
292
237
|
}
|
|
293
|
-
|
|
294
238
|
function jsonEqualsBase(val1, val2, compare) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
return jsonEqualsSlowPath(val1, val2, compare);
|
|
239
|
+
if (val1 === val2) {
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
return jsonEqualsSlowPath(val1, val2, compare);
|
|
300
243
|
}
|
|
301
|
-
|
|
302
244
|
function jsonEqualsSlowPath(val1, val2, compare) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
245
|
+
const type1 = typeof val1;
|
|
246
|
+
const type2 = typeof val2;
|
|
247
|
+
const isNonNullObject1 = type1 === 'object' && !compare(val1, null);
|
|
248
|
+
const isNonNullObject2 = type2 === 'object' && !compare(val2, null);
|
|
249
|
+
if (isNonNullObject1 && isNonNullObject2) {
|
|
250
|
+
const isArray1 = Array.isArray(val1);
|
|
251
|
+
const isArray2 = Array.isArray(val2);
|
|
252
|
+
if (isArray1 && isArray2) {
|
|
253
|
+
return jsonEqualsArray(val1, val2, compare);
|
|
254
|
+
}
|
|
255
|
+
else if (!isArray1 && !isArray2) {
|
|
256
|
+
return jsonEqualsObject(val1, val2, compare);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else if (isNonNullObject1 !== isNonNullObject2) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
return compare(val1, val2);
|
|
319
267
|
}
|
|
320
|
-
} else if (isNonNullObject1 !== isNonNullObject2) {
|
|
321
|
-
return false;
|
|
322
|
-
} else {
|
|
323
|
-
return compare(val1, val2);
|
|
324
|
-
}
|
|
325
268
|
}
|
|
326
|
-
|
|
327
269
|
function jsonEqualsArray(arr1, arr2, compare) {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
270
|
+
if (arr1.length !== arr2.length) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
for (let i = 0, l = arr1.length; i < l; ++i) {
|
|
274
|
+
if (!jsonEqualsBase(arr1[i], arr2[i], compare)) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
335
277
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
return true;
|
|
278
|
+
return true;
|
|
339
279
|
}
|
|
340
|
-
|
|
341
280
|
function jsonEqualsObject(obj1, obj2, compare) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
if (keys1.length !== keys2.length) {
|
|
350
|
-
return false;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
for (let i = 0, l = keys1.length; i < l; ++i) {
|
|
354
|
-
const key = keys1[i];
|
|
355
|
-
|
|
356
|
-
if (!jsonEqualsBase(obj1[key], obj2[key], compare)) {
|
|
357
|
-
return false;
|
|
281
|
+
if (obj1.constructor === Date && obj2.constructor === Date) {
|
|
282
|
+
return equalsDate(obj1, obj2);
|
|
283
|
+
}
|
|
284
|
+
const keys1 = Object.keys(obj1);
|
|
285
|
+
const keys2 = Object.keys(obj2);
|
|
286
|
+
if (keys1.length !== keys2.length) {
|
|
287
|
+
return false;
|
|
358
288
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
289
|
+
for (let i = 0, l = keys1.length; i < l; ++i) {
|
|
290
|
+
const key = keys1[i];
|
|
291
|
+
if (!jsonEqualsBase(obj1[key], obj2[key], compare)) {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return true;
|
|
362
296
|
}
|
|
363
|
-
|
|
364
297
|
function equalsDate(date1, date2) {
|
|
365
|
-
|
|
298
|
+
return date1.getTime() === date2.getTime();
|
|
366
299
|
}
|
|
367
|
-
|
|
368
300
|
function compareStrict(val1, val2) {
|
|
369
|
-
|
|
301
|
+
return val1 === val2;
|
|
370
302
|
}
|
|
371
|
-
|
|
372
303
|
function isSafeKey(key) {
|
|
373
|
-
|
|
304
|
+
return isNumber(key) || (isString(key) && key !== '__proto__');
|
|
374
305
|
}
|
|
375
|
-
|
|
376
306
|
function mergeMaps(map1, map2) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
307
|
+
const map = new Map(map1);
|
|
308
|
+
if (map2) {
|
|
309
|
+
for (const key of map2.keys()) {
|
|
310
|
+
map.set(key, map2.get(key));
|
|
311
|
+
}
|
|
382
312
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
return map;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
module.exports = {
|
|
389
|
-
isEmpty,
|
|
390
|
-
isString,
|
|
391
|
-
isRegExp,
|
|
392
|
-
isObject,
|
|
393
|
-
isNumber,
|
|
394
|
-
isFunction,
|
|
395
|
-
jsonEquals,
|
|
396
|
-
isPlainObject,
|
|
397
|
-
difference,
|
|
398
|
-
upperFirst,
|
|
399
|
-
zipObject,
|
|
400
|
-
mergeMaps,
|
|
401
|
-
cloneDeep,
|
|
402
|
-
asSingle,
|
|
403
|
-
asArray,
|
|
404
|
-
flatten,
|
|
405
|
-
groupBy,
|
|
406
|
-
uniqBy,
|
|
407
|
-
values,
|
|
408
|
-
union,
|
|
409
|
-
chunk,
|
|
410
|
-
clone,
|
|
411
|
-
omit,
|
|
412
|
-
once,
|
|
413
|
-
last,
|
|
414
|
-
get,
|
|
415
|
-
set,
|
|
416
|
-
};
|
|
313
|
+
return map;
|
|
314
|
+
}
|