@abedmurrar/objection 0.0.0-stage → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +105 -2
  3. package/lib/index.mjs +6 -0
  4. package/lib/initialize.js +11 -0
  5. package/lib/model/AjvValidator.js +278 -0
  6. package/lib/model/Model.js +772 -0
  7. package/lib/model/ModifierNotFoundError.js +10 -0
  8. package/lib/model/NotFoundError.js +19 -0
  9. package/lib/model/RelationDoesNotExistError.js +11 -0
  10. package/lib/model/ValidationError.js +46 -0
  11. package/lib/model/Validator.js +20 -0
  12. package/lib/model/getModel.js +7 -0
  13. package/lib/model/graph/ModelGraph.js +60 -0
  14. package/lib/model/graph/ModelGraphBuilder.js +188 -0
  15. package/lib/model/graph/ModelGraphEdge.js +40 -0
  16. package/lib/model/graph/ModelGraphNode.js +201 -0
  17. package/lib/model/inheritModel.js +19 -0
  18. package/lib/model/modelBindKnex.js +69 -0
  19. package/lib/model/modelClone.js +102 -0
  20. package/lib/model/modelColPropMap.js +24 -0
  21. package/lib/model/modelConcurrency.js +24 -0
  22. package/lib/model/modelId.js +57 -0
  23. package/lib/model/modelJsonAttributes.js +72 -0
  24. package/lib/model/modelParseRelations.js +83 -0
  25. package/lib/model/modelQueryProps.js +116 -0
  26. package/lib/model/modelSet.js +116 -0
  27. package/lib/model/modelTableMetadata.js +71 -0
  28. package/lib/model/modelToJson.js +157 -0
  29. package/lib/model/modelUtils.js +40 -0
  30. package/lib/model/modelValidate.js +40 -0
  31. package/lib/model/modelValues.js +113 -0
  32. package/lib/model/modelVisitor.js +34 -0
  33. package/lib/objection.js +89 -0
  34. package/lib/queryBuilder/FunctionBuilder.js +291 -0
  35. package/lib/queryBuilder/InternalOptions.js +24 -0
  36. package/lib/queryBuilder/JoinBuilder.js +124 -0
  37. package/lib/queryBuilder/QueryBuilder.js +1136 -0
  38. package/lib/queryBuilder/QueryBuilderBase.js +666 -0
  39. package/lib/queryBuilder/QueryBuilderContext.js +20 -0
  40. package/lib/queryBuilder/QueryBuilderContextBase.js +26 -0
  41. package/lib/queryBuilder/QueryBuilderOperationSupport.js +484 -0
  42. package/lib/queryBuilder/QueryBuilderUserContext.js +25 -0
  43. package/lib/queryBuilder/RawBuilder.js +78 -0
  44. package/lib/queryBuilder/ReferenceBuilder.js +246 -0
  45. package/lib/queryBuilder/RelationExpression.js +373 -0
  46. package/lib/queryBuilder/StaticHookArguments.js +122 -0
  47. package/lib/queryBuilder/ValueBuilder.js +115 -0
  48. package/lib/queryBuilder/expressions.js +121 -0
  49. package/lib/queryBuilder/functions/mysql.js +762 -0
  50. package/lib/queryBuilder/graph/GraphAction.js +54 -0
  51. package/lib/queryBuilder/graph/GraphData.js +12 -0
  52. package/lib/queryBuilder/graph/GraphFetcher.js +155 -0
  53. package/lib/queryBuilder/graph/GraphNodeDbExistence.js +146 -0
  54. package/lib/queryBuilder/graph/GraphOperation.js +21 -0
  55. package/lib/queryBuilder/graph/GraphOptions.js +165 -0
  56. package/lib/queryBuilder/graph/GraphUpsert.js +231 -0
  57. package/lib/queryBuilder/graph/delete/GraphDelete.js +15 -0
  58. package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +56 -0
  59. package/lib/queryBuilder/graph/insert/GraphInsert.js +116 -0
  60. package/lib/queryBuilder/graph/insert/GraphInsertAction.js +183 -0
  61. package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +70 -0
  62. package/lib/queryBuilder/graph/patch/GraphPatch.js +15 -0
  63. package/lib/queryBuilder/graph/patch/GraphPatchAction.js +205 -0
  64. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +26 -0
  65. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +96 -0
  66. package/lib/queryBuilder/join/JoinResultColumn.js +19 -0
  67. package/lib/queryBuilder/join/JoinResultParser.js +106 -0
  68. package/lib/queryBuilder/join/RelationJoiner.js +258 -0
  69. package/lib/queryBuilder/join/TableNode.js +136 -0
  70. package/lib/queryBuilder/join/TableTree.js +69 -0
  71. package/lib/queryBuilder/join/utils.js +19 -0
  72. package/lib/queryBuilder/operations/DelegateOperation.js +101 -0
  73. package/lib/queryBuilder/operations/DeleteOperation.js +47 -0
  74. package/lib/queryBuilder/operations/FindByIdOperation.js +29 -0
  75. package/lib/queryBuilder/operations/FindByIdsOperation.js +23 -0
  76. package/lib/queryBuilder/operations/FindOperation.js +147 -0
  77. package/lib/queryBuilder/operations/FirstOperation.js +22 -0
  78. package/lib/queryBuilder/operations/FromOperation.js +91 -0
  79. package/lib/queryBuilder/operations/InsertAndFetchOperation.js +38 -0
  80. package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +35 -0
  81. package/lib/queryBuilder/operations/InsertGraphOperation.js +87 -0
  82. package/lib/queryBuilder/operations/InsertOperation.js +173 -0
  83. package/lib/queryBuilder/operations/InstanceDeleteOperation.js +37 -0
  84. package/lib/queryBuilder/operations/InstanceFindOperation.js +17 -0
  85. package/lib/queryBuilder/operations/InstanceInsertOperation.js +20 -0
  86. package/lib/queryBuilder/operations/InstanceUpdateOperation.js +45 -0
  87. package/lib/queryBuilder/operations/JoinRelatedOperation.js +83 -0
  88. package/lib/queryBuilder/operations/KnexOperation.js +11 -0
  89. package/lib/queryBuilder/operations/MergeOperation.js +43 -0
  90. package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +173 -0
  91. package/lib/queryBuilder/operations/OnBuildKnexOperation.js +23 -0
  92. package/lib/queryBuilder/operations/OnBuildOperation.js +23 -0
  93. package/lib/queryBuilder/operations/OnErrorOperation.js +23 -0
  94. package/lib/queryBuilder/operations/QueryBuilderOperation.js +258 -0
  95. package/lib/queryBuilder/operations/RangeOperation.js +37 -0
  96. package/lib/queryBuilder/operations/RelateOperation.js +20 -0
  97. package/lib/queryBuilder/operations/ReturningOperation.js +24 -0
  98. package/lib/queryBuilder/operations/RunAfterOperation.js +23 -0
  99. package/lib/queryBuilder/operations/RunBeforeOperation.js +23 -0
  100. package/lib/queryBuilder/operations/UnrelateOperation.js +18 -0
  101. package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +63 -0
  102. package/lib/queryBuilder/operations/UpdateOperation.js +130 -0
  103. package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +35 -0
  104. package/lib/queryBuilder/operations/UpsertGraphOperation.js +47 -0
  105. package/lib/queryBuilder/operations/WhereCompositeOperation.js +48 -0
  106. package/lib/queryBuilder/operations/WhereInOperation.js +46 -0
  107. package/lib/queryBuilder/operations/eager/EagerOperation.js +46 -0
  108. package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +41 -0
  109. package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +10 -0
  110. package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +227 -0
  111. package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +29 -0
  112. package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectOperation.js +37 -0
  113. package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +30 -0
  114. package/lib/queryBuilder/operations/jsonApi/WhereJsonOverlapsOperation.js +33 -0
  115. package/lib/queryBuilder/operations/jsonApi/mysqlJsonApi.js +155 -0
  116. package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +135 -0
  117. package/lib/queryBuilder/operations/select/SelectOperation.js +50 -0
  118. package/lib/queryBuilder/operations/select/Selection.js +112 -0
  119. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +84 -0
  120. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +90 -0
  121. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +95 -0
  122. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +787 -0
  123. package/lib/queryBuilder/parsers/relationExpressionParser.js +930 -0
  124. package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +17 -0
  125. package/lib/queryBuilder/transformations/QueryTransformation.js +9 -0
  126. package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +57 -0
  127. package/lib/queryBuilder/transformations/index.js +9 -0
  128. package/lib/queryBuilder/whereScopes.js +199 -0
  129. package/lib/relations/Relation.js +317 -0
  130. package/lib/relations/RelationDeleteOperation.js +23 -0
  131. package/lib/relations/RelationFindOperation.js +116 -0
  132. package/lib/relations/RelationInsertOperation.js +25 -0
  133. package/lib/relations/RelationOwner.js +199 -0
  134. package/lib/relations/RelationProperty.js +207 -0
  135. package/lib/relations/RelationUpdateOperation.js +23 -0
  136. package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +18 -0
  137. package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +33 -0
  138. package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +39 -0
  139. package/lib/relations/belongsToOne/BelongsToOneRelation.js +45 -0
  140. package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +46 -0
  141. package/lib/relations/hasMany/HasManyInsertOperation.js +45 -0
  142. package/lib/relations/hasMany/HasManyRelateOperation.js +48 -0
  143. package/lib/relations/hasMany/HasManyRelation.js +41 -0
  144. package/lib/relations/hasMany/HasManyUnrelateOperation.js +26 -0
  145. package/lib/relations/hasOne/HasOneRelation.js +10 -0
  146. package/lib/relations/hasOneThrough/HasOneThroughRelation.js +10 -0
  147. package/lib/relations/manyToMany/ManyToManyModifyMixin.js +82 -0
  148. package/lib/relations/manyToMany/ManyToManyRelation.js +405 -0
  149. package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +29 -0
  150. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +8 -0
  151. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +20 -0
  152. package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +8 -0
  153. package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +82 -0
  154. package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +40 -0
  155. package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +64 -0
  156. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +11 -0
  157. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +27 -0
  158. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +11 -0
  159. package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +8 -0
  160. package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +65 -0
  161. package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +8 -0
  162. package/lib/transaction.js +66 -0
  163. package/lib/utils/assert.js +19 -0
  164. package/lib/utils/buildUtils.js +19 -0
  165. package/lib/utils/classUtils.js +9 -0
  166. package/lib/utils/cloneDeep.js +365 -0
  167. package/lib/utils/createModifier.js +37 -0
  168. package/lib/utils/deprecate.js +11 -0
  169. package/lib/utils/identifierMapping.js +188 -0
  170. package/lib/utils/internalPropUtils.js +7 -0
  171. package/lib/utils/knexUtils.js +81 -0
  172. package/lib/utils/mixin.js +18 -0
  173. package/lib/utils/mysqlJsonPath.js +70 -0
  174. package/lib/utils/normalizeIds.js +127 -0
  175. package/lib/utils/objectUtils.js +314 -0
  176. package/lib/utils/parseFieldExpression.js +73 -0
  177. package/lib/utils/postgresJsonPath.js +96 -0
  178. package/lib/utils/promiseUtils/after.js +14 -0
  179. package/lib/utils/promiseUtils/afterReturn.js +14 -0
  180. package/lib/utils/promiseUtils/index.js +15 -0
  181. package/lib/utils/promiseUtils/isPromise.js +8 -0
  182. package/lib/utils/promiseUtils/map.js +96 -0
  183. package/lib/utils/promiseUtils/mapAfterAllReturn.js +23 -0
  184. package/lib/utils/promiseUtils/try.js +19 -0
  185. package/lib/utils/resolveModel.js +104 -0
  186. package/lib/utils/tmpColumnUtils.js +7 -0
  187. package/package.json +113 -4
  188. package/typings/objection/index.d.mts +362 -0
  189. package/typings/objection/index.d.ts +4131 -0
  190. package/typings/objection/relation-expression.d.ts +237 -0
@@ -0,0 +1,314 @@
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; } });
29
+ const SMALL_ARRAY_SIZE = 10;
30
+ function isEmpty(item) {
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
+ }
40
+ }
41
+ // The `T &` keeps an `any` argument `any`.
42
+ function isObject(value) {
43
+ return value !== null && typeof value === 'object';
44
+ }
45
+ // Quick and dirty check if an object is a plain object and not
46
+ // for example an instance of some class.
47
+ function isPlainObject(value) {
48
+ return (isObject(value) &&
49
+ (!value.constructor || value.constructor === Object) &&
50
+ (!value.toString || value.toString === Object.prototype.toString));
51
+ }
52
+ function isFunction(value) {
53
+ return typeof value === 'function';
54
+ }
55
+ function isRegExp(value) {
56
+ return value instanceof RegExp;
57
+ }
58
+ function isString(value) {
59
+ return typeof value === 'string';
60
+ }
61
+ function isNumber(value) {
62
+ return typeof value === 'number';
63
+ }
64
+ function asArray(value) {
65
+ return Array.isArray(value) ? value : [value];
66
+ }
67
+ function asSingle(value) {
68
+ return Array.isArray(value) ? value[0] : value;
69
+ }
70
+ function uniqBy(items, keyGetter = null) {
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
+ }
79
+ function groupBy(items, keyGetter = null) {
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);
89
+ }
90
+ return groups;
91
+ }
92
+ function omit(obj, keysToOmit) {
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
+ }
101
+ }
102
+ return out;
103
+ }
104
+ function difference(arr1, arr2) {
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
+ }
112
+ }
113
+ return diff;
114
+ }
115
+ function union(arr1, arr2) {
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
+ }
122
+ }
123
+ function unionSmall(arr1, arr2) {
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
+ }
130
+ }
131
+ return all;
132
+ }
133
+ function unionGeneric(arr1, arr2) {
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]);
140
+ }
141
+ return Array.from(all);
142
+ }
143
+ function last(arr) {
144
+ return arr[arr.length - 1];
145
+ }
146
+ function once(func) {
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
+ };
156
+ }
157
+ function flatten(arrays) {
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
+ }
169
+ }
170
+ return out;
171
+ }
172
+ function get(obj, path) {
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];
179
+ }
180
+ return obj;
181
+ }
182
+ function set(obj, path, value) {
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;
205
+ }
206
+ if (path.length > 0 && isObject(current)) {
207
+ const key = path[path.length - 1];
208
+ if (isSafeKey(key)) {
209
+ current[key] = value;
210
+ }
211
+ }
212
+ return inputObj;
213
+ }
214
+ function zipObject(keys, values) {
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
+ }
221
+ }
222
+ return out;
223
+ }
224
+ function chunk(arr, chunkSize) {
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);
232
+ }
233
+ return out;
234
+ }
235
+ function jsonEquals(val1, val2) {
236
+ return jsonEqualsBase(val1, val2, compareStrict);
237
+ }
238
+ function jsonEqualsBase(val1, val2, compare) {
239
+ if (val1 === val2) {
240
+ return true;
241
+ }
242
+ return jsonEqualsSlowPath(val1, val2, compare);
243
+ }
244
+ function jsonEqualsSlowPath(val1, val2, compare) {
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);
267
+ }
268
+ }
269
+ function jsonEqualsArray(arr1, arr2, compare) {
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
+ }
277
+ }
278
+ return true;
279
+ }
280
+ function jsonEqualsObject(obj1, obj2, compare) {
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;
288
+ }
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;
296
+ }
297
+ function equalsDate(date1, date2) {
298
+ return date1.getTime() === date2.getTime();
299
+ }
300
+ function compareStrict(val1, val2) {
301
+ return val1 === val2;
302
+ }
303
+ function isSafeKey(key) {
304
+ return isNumber(key) || (isString(key) && key !== '__proto__');
305
+ }
306
+ function mergeMaps(map1, map2) {
307
+ const map = new Map(map1);
308
+ if (map2) {
309
+ for (const key of map2.keys()) {
310
+ map.set(key, map2.get(key));
311
+ }
312
+ }
313
+ return map;
314
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseFieldExpression = parseFieldExpression;
37
+ const jsonFieldExpressionParser = __importStar(require("../queryBuilder/parsers/jsonFieldExpressionParser"));
38
+ const cache = new Map();
39
+ function parseFieldExpression(expr) {
40
+ let parsedExpr = cache.get(expr);
41
+ if (parsedExpr !== undefined) {
42
+ return parsedExpr;
43
+ }
44
+ else {
45
+ const parserOutput = jsonFieldExpressionParser.parse(expr);
46
+ parsedExpr = preprocessParsedExpression(parserOutput);
47
+ // We don't take a copy of the parsedExpr each time we
48
+ // use if from cache. Instead to make sure it's never
49
+ // mutated we deep-freeze it.
50
+ parsedExpr = freezeParsedExpr(parsedExpr);
51
+ cache.set(expr, parsedExpr);
52
+ return parsedExpr;
53
+ }
54
+ }
55
+ function preprocessParsedExpression(parsedExpr) {
56
+ const columnParts = parsedExpr.columnName.split('.').map((part) => part.trim());
57
+ parsedExpr.column = columnParts[columnParts.length - 1];
58
+ if (columnParts.length >= 2) {
59
+ parsedExpr.table = columnParts.slice(0, columnParts.length - 1).join('.');
60
+ }
61
+ else {
62
+ parsedExpr.table = null;
63
+ }
64
+ return parsedExpr;
65
+ }
66
+ function freezeParsedExpr(parsedExpr) {
67
+ for (const access of parsedExpr.access) {
68
+ Object.freeze(access);
69
+ }
70
+ Object.freeze(parsedExpr.access);
71
+ Object.freeze(parsedExpr);
72
+ return parsedExpr;
73
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPgTextArray = toPgTextArray;
4
+ exports.toPgStringLiteral = toPgStringLiteral;
5
+ exports.toPgJsonPathLiteral = toPgJsonPathLiteral;
6
+ exports.toPgQuotedColumn = toPgQuotedColumn;
7
+ exports.getJsonDialect = getJsonDialect;
8
+ const knexUtils_1 = require("./knexUtils");
9
+ // Characters that force an element of a postgres text array literal to be
10
+ // double quoted: the array syntax characters, whitespace and control chars.
11
+ const ARRAY_ELEMENT_NEEDS_QUOTES = /[{}",\\\s\x00-\x1f\x7f]|^$|^null$/i;
12
+ // Characters that can't appear as-is inside a plain '...' string literal
13
+ // without depending on the `standard_conforming_strings` setting.
14
+ const NEEDS_ESCAPE_STRING = /[\\\x00-\x1f\x7f]/;
15
+ const POSTGRES_DIALECTS = ['postgresql', 'redshift'];
16
+ const MYSQL_DIALECTS = ['mysql', 'mysql2'];
17
+ /**
18
+ * Converts the `access` part of a parsed field expression into a postgres
19
+ * text array literal like `{a,b,1}`. Elements are quoted and escaped so that
20
+ * keys containing array syntax characters can't change the path.
21
+ */
22
+ function toPgTextArray(access) {
23
+ const elements = access.map((it) => {
24
+ if (it.type === 'array' && Number.isInteger(it.ref)) {
25
+ return String(it.ref);
26
+ }
27
+ const ref = String(it.ref);
28
+ if (ARRAY_ELEMENT_NEEDS_QUOTES.test(ref)) {
29
+ return `"${ref.replace(/[\\"]/g, '\\$&')}"`;
30
+ }
31
+ else {
32
+ return ref;
33
+ }
34
+ });
35
+ return `{${elements.join(',')}}`;
36
+ }
37
+ /**
38
+ * Converts a string into a postgres string literal that is safe to embed
39
+ * into a knex raw query. Single quotes are doubled and `?` characters are
40
+ * escaped so that knex doesn't treat them as binding placeholders.
41
+ *
42
+ * If the string contains backslashes or control characters, an escape
43
+ * string literal `E'...'` with octal escapes is used. This way the result
44
+ * is the same regardless of `standard_conforming_strings` and no literal
45
+ * backslash ever ends up next to a `?` (knex would eat it).
46
+ */
47
+ function toPgStringLiteral(str) {
48
+ let sql = str.replace(/'/g, "''");
49
+ if (NEEDS_ESCAPE_STRING.test(sql)) {
50
+ sql = sql.replace(/[\\\x00-\x1f\x7f]/g, (char) => {
51
+ return '\\' + char.charCodeAt(0).toString(8).padStart(3, '0');
52
+ });
53
+ sql = `E'${sql}'`;
54
+ }
55
+ else {
56
+ sql = `'${sql}'`;
57
+ }
58
+ return sql.replace(/\?/g, '\\?');
59
+ }
60
+ /**
61
+ * Converts the `access` part of a parsed field expression into a string
62
+ * literal that can be used as the right hand side of `#>`, `#>>` and as the
63
+ * path argument of `jsonb_set`.
64
+ */
65
+ function toPgJsonPathLiteral(access) {
66
+ return toPgStringLiteral(toPgTextArray(access));
67
+ }
68
+ /**
69
+ * Quotes a (possibly table qualified) column name like `Table.column` as
70
+ * `"Table"."column"` for postgres.
71
+ */
72
+ function toPgQuotedColumn(columnName) {
73
+ return columnName
74
+ .split('.')
75
+ .map((part) => `"${part.replace(/"/g, '""')}"`)
76
+ .join('.')
77
+ .replace(/\?/g, '\\?');
78
+ }
79
+ /**
80
+ * Returns the flavor of JSON SQL to generate for field expressions: `'postgres'`
81
+ * or `'mysql'`. Other databases throw, since postgres SQL is invalid at best and
82
+ * dangerous at worst there (on MySQL `#` starts a comment). `knex` can be null,
83
+ * when the query has no knex instance bound yet, in which case postgres is used.
84
+ */
85
+ function getJsonDialect(knex, expression) {
86
+ const dialect = knex ? (0, knexUtils_1.getDialect)(knex) : null;
87
+ if (dialect === null || POSTGRES_DIALECTS.includes(dialect)) {
88
+ return 'postgres';
89
+ }
90
+ else if (MYSQL_DIALECTS.includes(dialect)) {
91
+ return 'mysql';
92
+ }
93
+ else {
94
+ throw new Error(`JSON field expressions are only supported on postgres and mysql. Tried to use "${expression}" with dialect "${dialect}".`);
95
+ }
96
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.after = after;
4
+ const isPromise_1 = require("./isPromise");
5
+ // Call `func` after `obj` has been resolved. Call `func` synchronously if
6
+ // `obj` is not a promise for performance reasons.
7
+ function after(obj, func) {
8
+ if ((0, isPromise_1.isPromise)(obj)) {
9
+ return obj.then(func);
10
+ }
11
+ else {
12
+ return func(obj);
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.afterReturn = afterReturn;
4
+ const isPromise_1 = require("./isPromise");
5
+ // Return `returnValue` after `obj` has been resolved. Return `returnValue`
6
+ // synchronously if `obj` is not a promise for performance reasons.
7
+ function afterReturn(obj, returnValue) {
8
+ if ((0, isPromise_1.isPromise)(obj)) {
9
+ return obj.then(() => returnValue);
10
+ }
11
+ else {
12
+ return returnValue;
13
+ }
14
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.try = exports.map = exports.mapAfterAllReturn = exports.afterReturn = exports.after = exports.isPromise = void 0;
4
+ const isPromise_1 = require("./isPromise");
5
+ Object.defineProperty(exports, "isPromise", { enumerable: true, get: function () { return isPromise_1.isPromise; } });
6
+ const after_1 = require("./after");
7
+ Object.defineProperty(exports, "after", { enumerable: true, get: function () { return after_1.after; } });
8
+ const afterReturn_1 = require("./afterReturn");
9
+ Object.defineProperty(exports, "afterReturn", { enumerable: true, get: function () { return afterReturn_1.afterReturn; } });
10
+ const mapAfterAllReturn_1 = require("./mapAfterAllReturn");
11
+ Object.defineProperty(exports, "mapAfterAllReturn", { enumerable: true, get: function () { return mapAfterAllReturn_1.mapAfterAllReturn; } });
12
+ const map_1 = require("./map");
13
+ Object.defineProperty(exports, "map", { enumerable: true, get: function () { return map_1.promiseMap; } });
14
+ const try_1 = require("./try");
15
+ Object.defineProperty(exports, "try", { enumerable: true, get: function () { return try_1.promiseTry; } });
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPromise = isPromise;
4
+ const objectUtils_1 = require("../objectUtils");
5
+ // The `T &` keeps an `any` argument `any`.
6
+ function isPromise(obj) {
7
+ return (0, objectUtils_1.isObject)(obj) && (0, objectUtils_1.isFunction)(obj.then);
8
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.promiseMap = promiseMap;
4
+ const isPromise_1 = require("./isPromise");
5
+ // Works like Bluebird.map.
6
+ function promiseMap(items, mapper, opt) {
7
+ switch (items.length) {
8
+ case 0:
9
+ return mapZero();
10
+ case 1:
11
+ return mapOne(items, mapper);
12
+ default:
13
+ return mapMany(items, mapper, opt);
14
+ }
15
+ }
16
+ function mapZero() {
17
+ return Promise.resolve([]);
18
+ }
19
+ function mapOne(items, mapper) {
20
+ try {
21
+ const maybePromise = mapper(items[0], 0);
22
+ if ((0, isPromise_1.isPromise)(maybePromise)) {
23
+ return maybePromise.then(wrapArray);
24
+ }
25
+ else {
26
+ return Promise.resolve(wrapArray(maybePromise));
27
+ }
28
+ }
29
+ catch (err) {
30
+ return Promise.reject(err);
31
+ }
32
+ }
33
+ function wrapArray(item) {
34
+ return [item];
35
+ }
36
+ function mapMany(items, mapper, opt = {}) {
37
+ return new Promise((resolve, reject) => {
38
+ const concurrency = opt.concurrency || Number.MAX_SAFE_INTEGER;
39
+ const ctx = {
40
+ reject,
41
+ resolve,
42
+ rejected: false,
43
+ index: 0,
44
+ numFinished: 0,
45
+ results: new Array(items.length),
46
+ items,
47
+ mapper,
48
+ };
49
+ while (ctx.index < concurrency && ctx.index < items.length && !ctx.rejected) {
50
+ executeNext(ctx);
51
+ }
52
+ });
53
+ }
54
+ function executeNext(ctx) {
55
+ try {
56
+ if (ctx.rejected) {
57
+ return;
58
+ }
59
+ const index = ctx.index++;
60
+ const item = ctx.items[index];
61
+ const maybePromise = ctx.mapper(item, index);
62
+ if ((0, isPromise_1.isPromise)(maybePromise)) {
63
+ // `catch` is called on the result of `then`, so the value is used as a
64
+ // promise. Promises and query builders have both.
65
+ maybePromise
66
+ .then((result) => afterExecute(ctx, result, index))
67
+ .catch((err) => onError(ctx, err));
68
+ }
69
+ else {
70
+ process.nextTick(() => afterExecute(ctx, maybePromise, index));
71
+ }
72
+ return null;
73
+ }
74
+ catch (err) {
75
+ onError(ctx, err);
76
+ return undefined;
77
+ }
78
+ }
79
+ function afterExecute(ctx, result, index) {
80
+ if (ctx.rejected) {
81
+ return null;
82
+ }
83
+ ctx.results[index] = result;
84
+ ctx.numFinished++;
85
+ if (ctx.numFinished === ctx.items.length) {
86
+ ctx.resolve(ctx.results);
87
+ }
88
+ if (ctx.index < ctx.items.length) {
89
+ executeNext(ctx);
90
+ }
91
+ return null;
92
+ }
93
+ function onError(ctx, err) {
94
+ ctx.rejected = true;
95
+ ctx.reject(err);
96
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapAfterAllReturn = mapAfterAllReturn;
4
+ const isPromise_1 = require("./isPromise");
5
+ // Map `arr` with `mapper` and after that return `returnValue`. If none of
6
+ // the mapped values is a promise, return synchronously for performance
7
+ // reasons.
8
+ function mapAfterAllReturn(arr, mapper, returnValue) {
9
+ const results = new Array(arr.length);
10
+ let containsPromise = false;
11
+ for (let i = 0, l = arr.length; i < l; ++i) {
12
+ results[i] = mapper(arr[i]);
13
+ if ((0, isPromise_1.isPromise)(results[i])) {
14
+ containsPromise = true;
15
+ }
16
+ }
17
+ if (containsPromise) {
18
+ return Promise.all(results).then(() => returnValue);
19
+ }
20
+ else {
21
+ return returnValue;
22
+ }
23
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.promiseTry = promiseTry;
4
+ const isPromise_1 = require("./isPromise");
5
+ // Works like Bluebird.try.
6
+ function promiseTry(callback) {
7
+ try {
8
+ const maybePromise = callback();
9
+ if ((0, isPromise_1.isPromise)(maybePromise)) {
10
+ return maybePromise;
11
+ }
12
+ else {
13
+ return Promise.resolve(maybePromise);
14
+ }
15
+ }
16
+ catch (err) {
17
+ return Promise.reject(err);
18
+ }
19
+ }