@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.
Files changed (192) hide show
  1. package/README.md +103 -67
  2. package/lib/index.mjs +6 -0
  3. package/lib/initialize.js +6 -9
  4. package/lib/model/AjvValidator.js +235 -282
  5. package/lib/model/Model.js +653 -823
  6. package/lib/model/ModifierNotFoundError.js +5 -7
  7. package/lib/model/NotFoundError.js +14 -18
  8. package/lib/model/RelationDoesNotExistError.js +6 -9
  9. package/lib/model/ValidationError.js +33 -41
  10. package/lib/model/Validator.js +15 -21
  11. package/lib/model/getModel.js +1 -3
  12. package/lib/model/graph/ModelGraph.js +44 -64
  13. package/lib/model/graph/ModelGraphBuilder.js +164 -217
  14. package/lib/model/graph/ModelGraphEdge.js +31 -43
  15. package/lib/model/graph/ModelGraphNode.js +192 -231
  16. package/lib/model/inheritModel.js +9 -18
  17. package/lib/model/modelBindKnex.js +48 -62
  18. package/lib/model/modelClone.js +79 -98
  19. package/lib/model/modelColPropMap.js +16 -26
  20. package/lib/model/modelConcurrency.js +24 -0
  21. package/lib/model/modelId.js +44 -49
  22. package/lib/model/modelJsonAttributes.js +56 -76
  23. package/lib/model/modelParseRelations.js +68 -67
  24. package/lib/model/modelQueryProps.js +76 -107
  25. package/lib/model/modelSet.js +92 -112
  26. package/lib/model/modelTableMetadata.js +60 -72
  27. package/lib/model/modelToJson.js +120 -150
  28. package/lib/model/modelUtils.js +30 -37
  29. package/lib/model/modelValidate.js +34 -42
  30. package/lib/model/modelValues.js +78 -91
  31. package/lib/model/modelVisitor.js +22 -29
  32. package/lib/objection.js +42 -67
  33. package/lib/queryBuilder/FunctionBuilder.js +231 -279
  34. package/lib/queryBuilder/InternalOptions.js +19 -24
  35. package/lib/queryBuilder/JoinBuilder.js +116 -149
  36. package/lib/queryBuilder/QueryBuilder.js +1009 -1271
  37. package/lib/queryBuilder/QueryBuilderBase.js +647 -865
  38. package/lib/queryBuilder/QueryBuilderContext.js +14 -21
  39. package/lib/queryBuilder/QueryBuilderContextBase.js +20 -29
  40. package/lib/queryBuilder/QueryBuilderOperationSupport.js +462 -536
  41. package/lib/queryBuilder/QueryBuilderUserContext.js +19 -25
  42. package/lib/queryBuilder/RawBuilder.js +58 -73
  43. package/lib/queryBuilder/ReferenceBuilder.js +232 -270
  44. package/lib/queryBuilder/RelationExpression.js +322 -380
  45. package/lib/queryBuilder/StaticHookArguments.js +94 -106
  46. package/lib/queryBuilder/ValueBuilder.js +100 -112
  47. package/lib/queryBuilder/expressions.js +86 -116
  48. package/lib/queryBuilder/functions/mysql.js +642 -697
  49. package/lib/queryBuilder/graph/GraphAction.js +44 -59
  50. package/lib/queryBuilder/graph/GraphData.js +7 -9
  51. package/lib/queryBuilder/graph/GraphFetcher.js +115 -151
  52. package/lib/queryBuilder/graph/GraphNodeDbExistence.js +114 -152
  53. package/lib/queryBuilder/graph/GraphOperation.js +16 -22
  54. package/lib/queryBuilder/graph/GraphOptions.js +143 -185
  55. package/lib/queryBuilder/graph/GraphUpsert.js +167 -241
  56. package/lib/queryBuilder/graph/delete/GraphDelete.js +8 -13
  57. package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +44 -62
  58. package/lib/queryBuilder/graph/insert/GraphInsert.js +99 -128
  59. package/lib/queryBuilder/graph/insert/GraphInsertAction.js +151 -193
  60. package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +57 -79
  61. package/lib/queryBuilder/graph/patch/GraphPatch.js +8 -13
  62. package/lib/queryBuilder/graph/patch/GraphPatchAction.js +181 -234
  63. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +16 -21
  64. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +80 -110
  65. package/lib/queryBuilder/join/JoinResultColumn.js +14 -18
  66. package/lib/queryBuilder/join/JoinResultParser.js +88 -101
  67. package/lib/queryBuilder/join/RelationJoiner.js +205 -288
  68. package/lib/queryBuilder/join/TableNode.js +117 -144
  69. package/lib/queryBuilder/join/TableTree.js +60 -76
  70. package/lib/queryBuilder/join/utils.js +10 -16
  71. package/lib/queryBuilder/operations/DelegateOperation.js +93 -133
  72. package/lib/queryBuilder/operations/DeleteOperation.js +33 -37
  73. package/lib/queryBuilder/operations/FindByIdOperation.js +20 -28
  74. package/lib/queryBuilder/operations/FindByIdsOperation.js +17 -23
  75. package/lib/queryBuilder/operations/FindOperation.js +114 -131
  76. package/lib/queryBuilder/operations/FirstOperation.js +14 -19
  77. package/lib/queryBuilder/operations/FromOperation.js +69 -88
  78. package/lib/queryBuilder/operations/InsertAndFetchOperation.js +28 -39
  79. package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +25 -35
  80. package/lib/queryBuilder/operations/InsertGraphOperation.js +77 -98
  81. package/lib/queryBuilder/operations/InsertOperation.js +132 -165
  82. package/lib/queryBuilder/operations/InstanceDeleteOperation.js +27 -36
  83. package/lib/queryBuilder/operations/InstanceFindOperation.js +9 -13
  84. package/lib/queryBuilder/operations/InstanceInsertOperation.js +13 -17
  85. package/lib/queryBuilder/operations/InstanceUpdateOperation.js +32 -46
  86. package/lib/queryBuilder/operations/JoinRelatedOperation.js +66 -86
  87. package/lib/queryBuilder/operations/KnexOperation.js +4 -7
  88. package/lib/queryBuilder/operations/MergeOperation.js +32 -45
  89. package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +131 -150
  90. package/lib/queryBuilder/operations/OnBuildKnexOperation.js +17 -23
  91. package/lib/queryBuilder/operations/OnBuildOperation.js +17 -23
  92. package/lib/queryBuilder/operations/OnErrorOperation.js +17 -23
  93. package/lib/queryBuilder/operations/QueryBuilderOperation.js +231 -270
  94. package/lib/queryBuilder/operations/RangeOperation.js +30 -40
  95. package/lib/queryBuilder/operations/RelateOperation.js +14 -21
  96. package/lib/queryBuilder/operations/ReturningOperation.js +12 -18
  97. package/lib/queryBuilder/operations/RunAfterOperation.js +17 -23
  98. package/lib/queryBuilder/operations/RunBeforeOperation.js +17 -23
  99. package/lib/queryBuilder/operations/UnrelateOperation.js +12 -17
  100. package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +48 -65
  101. package/lib/queryBuilder/operations/UpdateOperation.js +104 -129
  102. package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +25 -35
  103. package/lib/queryBuilder/operations/UpsertGraphOperation.js +36 -55
  104. package/lib/queryBuilder/operations/WhereCompositeOperation.js +30 -39
  105. package/lib/queryBuilder/operations/WhereInOperation.js +34 -36
  106. package/lib/queryBuilder/operations/eager/EagerOperation.js +37 -52
  107. package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +34 -44
  108. package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +4 -7
  109. package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +193 -251
  110. package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +18 -25
  111. package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectOperation.js +25 -41
  112. package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +19 -20
  113. package/lib/queryBuilder/operations/jsonApi/WhereJsonOverlapsOperation.js +23 -21
  114. package/lib/queryBuilder/operations/jsonApi/mysqlJsonApi.js +106 -118
  115. package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +79 -108
  116. package/lib/queryBuilder/operations/select/SelectOperation.js +37 -53
  117. package/lib/queryBuilder/operations/select/Selection.js +94 -105
  118. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +68 -101
  119. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +65 -75
  120. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +75 -84
  121. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +760 -859
  122. package/lib/queryBuilder/parsers/relationExpressionParser.js +840 -952
  123. package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +10 -15
  124. package/lib/queryBuilder/transformations/QueryTransformation.js +4 -6
  125. package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +35 -49
  126. package/lib/queryBuilder/transformations/index.js +3 -9
  127. package/lib/queryBuilder/whereScopes.js +158 -186
  128. package/lib/relations/Relation.js +293 -375
  129. package/lib/relations/RelationDeleteOperation.js +24 -28
  130. package/lib/relations/RelationFindOperation.js +108 -138
  131. package/lib/relations/RelationInsertOperation.js +24 -32
  132. package/lib/relations/RelationOwner.js +175 -209
  133. package/lib/relations/RelationProperty.js +186 -223
  134. package/lib/relations/RelationUpdateOperation.js +23 -29
  135. package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +16 -21
  136. package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +30 -41
  137. package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +36 -47
  138. package/lib/relations/belongsToOne/BelongsToOneRelation.js +42 -50
  139. package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +43 -58
  140. package/lib/relations/hasMany/HasManyInsertOperation.js +40 -56
  141. package/lib/relations/hasMany/HasManyRelateOperation.js +45 -61
  142. package/lib/relations/hasMany/HasManyRelation.js +38 -46
  143. package/lib/relations/hasMany/HasManyUnrelateOperation.js +25 -32
  144. package/lib/relations/hasOne/HasOneRelation.js +9 -12
  145. package/lib/relations/hasOneThrough/HasOneThroughRelation.js +9 -12
  146. package/lib/relations/manyToMany/ManyToManyModifyMixin.js +73 -95
  147. package/lib/relations/manyToMany/ManyToManyRelation.js +374 -473
  148. package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +23 -30
  149. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +8 -10
  150. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +20 -25
  151. package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +8 -12
  152. package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +77 -100
  153. package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +37 -49
  154. package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +58 -74
  155. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +10 -13
  156. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +26 -33
  157. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +10 -15
  158. package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +8 -10
  159. package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +61 -78
  160. package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +8 -12
  161. package/lib/transaction.js +53 -83
  162. package/lib/utils/assert.js +15 -21
  163. package/lib/utils/buildUtils.js +17 -19
  164. package/lib/utils/classUtils.js +7 -11
  165. package/lib/utils/cloneDeep.js +365 -0
  166. package/lib/utils/createModifier.js +36 -41
  167. package/lib/utils/deprecate.js +8 -12
  168. package/lib/utils/identifierMapping.js +153 -192
  169. package/lib/utils/internalPropUtils.js +4 -8
  170. package/lib/utils/knexUtils.js +61 -56
  171. package/lib/utils/mixin.js +16 -23
  172. package/lib/utils/mysqlJsonPath.js +55 -40
  173. package/lib/utils/normalizeIds.js +110 -127
  174. package/lib/utils/objectUtils.js +236 -338
  175. package/lib/utils/parseFieldExpression.js +66 -44
  176. package/lib/utils/postgresJsonPath.js +48 -62
  177. package/lib/utils/promiseUtils/after.js +10 -13
  178. package/lib/utils/promiseUtils/afterReturn.js +10 -13
  179. package/lib/utils/promiseUtils/index.js +15 -17
  180. package/lib/utils/promiseUtils/isPromise.js +6 -9
  181. package/lib/utils/promiseUtils/map.js +75 -89
  182. package/lib/utils/promiseUtils/mapAfterAllReturn.js +17 -23
  183. package/lib/utils/promiseUtils/try.js +15 -18
  184. package/lib/utils/resolveModel.js +91 -94
  185. package/lib/utils/tmpColumnUtils.js +4 -13
  186. package/package.json +50 -23
  187. package/typings/objection/index.d.mts +362 -0
  188. package/typings/objection/index.d.ts +36 -9
  189. package/lib/.eslintrc.json +0 -8
  190. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.pegjs +0 -97
  191. package/lib/queryBuilder/parsers/relationExpressionParser.pegjs +0 -141
  192. package/lib/utils/clone.js +0 -2329
@@ -1,416 +1,314 @@
1
- 'use strict';
2
-
3
- const { clone, cloneDeep } = require('./clone');
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
- if (Array.isArray(item) || Buffer.isBuffer(item)) {
8
- return item.length === 0;
9
- } else if (isObject(item)) {
10
- return Object.keys(item).length === 0;
11
- } else {
12
- return true;
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
- return value !== null && typeof value === 'object';
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
- return (
24
- isObject(value) &&
25
- (!value.constructor || value.constructor === Object) &&
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
- return typeof value === 'function';
53
+ return typeof value === 'function';
32
54
  }
33
-
34
55
  function isRegExp(value) {
35
- return value instanceof RegExp;
56
+ return value instanceof RegExp;
36
57
  }
37
-
38
58
  function isString(value) {
39
- return typeof value === 'string';
59
+ return typeof value === 'string';
40
60
  }
41
-
42
61
  function isNumber(value) {
43
- return typeof value === 'number';
62
+ return typeof value === 'number';
44
63
  }
45
-
46
64
  function asArray(value) {
47
- return Array.isArray(value) ? value : [value];
65
+ return Array.isArray(value) ? value : [value];
48
66
  }
49
-
50
67
  function asSingle(value) {
51
- return Array.isArray(value) ? value[0] : value;
68
+ return Array.isArray(value) ? value[0] : value;
52
69
  }
53
-
54
70
  function uniqBy(items, keyGetter = null) {
55
- const map = new Map();
56
-
57
- for (let i = 0, l = items.length; i < l; ++i) {
58
- const item = items[i];
59
- const key = keyGetter !== null ? keyGetter(item) : item;
60
-
61
- map.set(key, item);
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
- const groups = new Map();
69
-
70
- for (const item of items) {
71
- const key = keyGetter !== null ? keyGetter(item) : item;
72
- let group = groups.get(key);
73
-
74
- if (!group) {
75
- group = [];
76
- groups.set(key, group);
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
- keysToOmit = asArray(keysToOmit);
87
-
88
- const keys = Object.keys(obj);
89
- const out = {};
90
-
91
- for (let i = 0, l = keys.length; i < l; ++i) {
92
- const key = keys[i];
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
- const arr2Set = new Set(arr2);
104
- const diff = [];
105
-
106
- for (let i = 0; i < arr1.length; ++i) {
107
- const value = arr1[i];
108
-
109
- if (!arr2Set.has(value)) {
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
- if (arr1.length < SMALL_ARRAY_SIZE && arr2.length < SMALL_ARRAY_SIZE) {
119
- return unionSmall(arr1, arr2);
120
- } else {
121
- return unionGeneric(arr1, arr2);
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
- const all = arr1.slice();
127
-
128
- for (let i = 0, l = arr2.length; i < l; ++i) {
129
- const item = arr2[i];
130
-
131
- if (all.indexOf(item) === -1) {
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
- const all = new Set();
141
-
142
- for (let i = 0; i < arr1.length; ++i) {
143
- all.add(arr1[i]);
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
- return values;
171
- } else {
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
- let called = false;
178
- let value = undefined;
179
-
180
- return function () {
181
- if (called === false) {
182
- called = true;
183
- value = func.apply(this, arguments);
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
- const out = [];
192
-
193
- for (let i = 0, l = arrays.length; i < l; ++i) {
194
- const value = arrays[i];
195
-
196
- if (Array.isArray(value)) {
197
- for (let j = 0; j < value.length; ++j) {
198
- out.push(value[j]);
199
- }
200
- } else {
201
- out.push(value);
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
- for (let i = 0, l = path.length; i < l; ++i) {
210
- const key = path[i];
211
-
212
- if (!isObject(obj)) {
213
- return undefined;
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
- const inputObj = obj;
224
-
225
- for (let i = 0, l = path.length - 1; i < l; ++i) {
226
- const key = path[i];
227
-
228
- if (!isSafeKey(key)) {
229
- return inputObj;
230
- }
231
-
232
- let child = obj[key];
233
-
234
- if (!isObject(child)) {
235
- const nextKey = path[i + 1];
236
-
237
- if (isNaN(nextKey)) {
238
- child = {};
239
- } else {
240
- child = [];
241
- }
242
-
243
- obj[key] = child;
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
- obj = child;
247
- }
248
-
249
- if (path.length > 0 && isObject(obj)) {
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
- const out = {};
262
-
263
- for (let i = 0, l = keys.length; i < l; ++i) {
264
- const key = keys[i];
265
-
266
- if (isSafeKey(key)) {
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
- const out = [];
276
-
277
- for (let i = 0, l = arr.length; i < l; ++i) {
278
- const item = arr[i];
279
-
280
- if (out.length === 0 || out[out.length - 1].length === chunkSize) {
281
- out.push([]);
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
- return jsonEqualsBase(val1, val2, compareStrict);
236
+ return jsonEqualsBase(val1, val2, compareStrict);
292
237
  }
293
-
294
238
  function jsonEqualsBase(val1, val2, compare) {
295
- if (val1 === val2) {
296
- return true;
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
- const type1 = typeof val1;
304
- const type2 = typeof val2;
305
-
306
- const isNonNullObject1 = type1 === 'object' && !compare(val1, null);
307
- const isNonNullObject2 = type2 === 'object' && !compare(val2, null);
308
-
309
- if (isNonNullObject1 && isNonNullObject2) {
310
- const isArray1 = Array.isArray(val1);
311
- const isArray2 = Array.isArray(val2);
312
-
313
- if (isArray1 && isArray2) {
314
- return jsonEqualsArray(val1, val2, compare);
315
- } else if (!isArray1 && !isArray2) {
316
- return jsonEqualsObject(val1, val2, compare);
317
- } else {
318
- return false;
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
- if (arr1.length !== arr2.length) {
329
- return false;
330
- }
331
-
332
- for (let i = 0, l = arr1.length; i < l; ++i) {
333
- if (!jsonEqualsBase(arr1[i], arr2[i], compare)) {
334
- return false;
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
- if (obj1.constructor === Date && obj2.constructor === Date) {
343
- return equalsDate(obj1, obj2);
344
- }
345
-
346
- const keys1 = Object.keys(obj1);
347
- const keys2 = Object.keys(obj2);
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
- return true;
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
- return date1.getTime() === date2.getTime();
298
+ return date1.getTime() === date2.getTime();
366
299
  }
367
-
368
300
  function compareStrict(val1, val2) {
369
- return val1 === val2;
301
+ return val1 === val2;
370
302
  }
371
-
372
303
  function isSafeKey(key) {
373
- return isNumber(key) || (isString(key) && key !== '__proto__');
304
+ return isNumber(key) || (isString(key) && key !== '__proto__');
374
305
  }
375
-
376
306
  function mergeMaps(map1, map2) {
377
- const map = new Map(map1);
378
-
379
- if (map2) {
380
- for (const key of map2.keys()) {
381
- map.set(key, map2.get(key));
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
+ }