@abedmurrar/objection 0.0.0-stage → 4.0.0-alpha.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 +69 -2
  3. package/lib/.eslintrc.json +8 -0
  4. package/lib/initialize.js +14 -0
  5. package/lib/model/AjvValidator.js +325 -0
  6. package/lib/model/Model.js +942 -0
  7. package/lib/model/ModifierNotFoundError.js +12 -0
  8. package/lib/model/NotFoundError.js +23 -0
  9. package/lib/model/RelationDoesNotExistError.js +14 -0
  10. package/lib/model/ValidationError.js +54 -0
  11. package/lib/model/Validator.js +26 -0
  12. package/lib/model/getModel.js +9 -0
  13. package/lib/model/graph/ModelGraph.js +80 -0
  14. package/lib/model/graph/ModelGraphBuilder.js +241 -0
  15. package/lib/model/graph/ModelGraphEdge.js +52 -0
  16. package/lib/model/graph/ModelGraphNode.js +240 -0
  17. package/lib/model/inheritModel.js +28 -0
  18. package/lib/model/modelBindKnex.js +83 -0
  19. package/lib/model/modelClone.js +121 -0
  20. package/lib/model/modelColPropMap.js +34 -0
  21. package/lib/model/modelId.js +62 -0
  22. package/lib/model/modelJsonAttributes.js +92 -0
  23. package/lib/model/modelParseRelations.js +82 -0
  24. package/lib/model/modelQueryProps.js +147 -0
  25. package/lib/model/modelSet.js +136 -0
  26. package/lib/model/modelTableMetadata.js +83 -0
  27. package/lib/model/modelToJson.js +187 -0
  28. package/lib/model/modelUtils.js +47 -0
  29. package/lib/model/modelValidate.js +48 -0
  30. package/lib/model/modelValues.js +126 -0
  31. package/lib/model/modelVisitor.js +41 -0
  32. package/lib/objection.js +114 -0
  33. package/lib/queryBuilder/FunctionBuilder.js +339 -0
  34. package/lib/queryBuilder/InternalOptions.js +29 -0
  35. package/lib/queryBuilder/JoinBuilder.js +157 -0
  36. package/lib/queryBuilder/QueryBuilder.js +1398 -0
  37. package/lib/queryBuilder/QueryBuilderBase.js +884 -0
  38. package/lib/queryBuilder/QueryBuilderContext.js +27 -0
  39. package/lib/queryBuilder/QueryBuilderContextBase.js +35 -0
  40. package/lib/queryBuilder/QueryBuilderOperationSupport.js +558 -0
  41. package/lib/queryBuilder/QueryBuilderUserContext.js +31 -0
  42. package/lib/queryBuilder/RawBuilder.js +93 -0
  43. package/lib/queryBuilder/ReferenceBuilder.js +284 -0
  44. package/lib/queryBuilder/RelationExpression.js +431 -0
  45. package/lib/queryBuilder/StaticHookArguments.js +134 -0
  46. package/lib/queryBuilder/ValueBuilder.js +127 -0
  47. package/lib/queryBuilder/expressions.js +151 -0
  48. package/lib/queryBuilder/functions/mysql.js +817 -0
  49. package/lib/queryBuilder/graph/GraphAction.js +69 -0
  50. package/lib/queryBuilder/graph/GraphData.js +14 -0
  51. package/lib/queryBuilder/graph/GraphFetcher.js +191 -0
  52. package/lib/queryBuilder/graph/GraphNodeDbExistence.js +184 -0
  53. package/lib/queryBuilder/graph/GraphOperation.js +27 -0
  54. package/lib/queryBuilder/graph/GraphOptions.js +207 -0
  55. package/lib/queryBuilder/graph/GraphUpsert.js +305 -0
  56. package/lib/queryBuilder/graph/delete/GraphDelete.js +20 -0
  57. package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +74 -0
  58. package/lib/queryBuilder/graph/insert/GraphInsert.js +145 -0
  59. package/lib/queryBuilder/graph/insert/GraphInsertAction.js +225 -0
  60. package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +92 -0
  61. package/lib/queryBuilder/graph/patch/GraphPatch.js +20 -0
  62. package/lib/queryBuilder/graph/patch/GraphPatchAction.js +258 -0
  63. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +31 -0
  64. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +126 -0
  65. package/lib/queryBuilder/join/JoinResultColumn.js +23 -0
  66. package/lib/queryBuilder/join/JoinResultParser.js +119 -0
  67. package/lib/queryBuilder/join/RelationJoiner.js +341 -0
  68. package/lib/queryBuilder/join/TableNode.js +163 -0
  69. package/lib/queryBuilder/join/TableTree.js +85 -0
  70. package/lib/queryBuilder/join/utils.js +25 -0
  71. package/lib/queryBuilder/operations/DelegateOperation.js +141 -0
  72. package/lib/queryBuilder/operations/DeleteOperation.js +51 -0
  73. package/lib/queryBuilder/operations/FindByIdOperation.js +37 -0
  74. package/lib/queryBuilder/operations/FindByIdsOperation.js +29 -0
  75. package/lib/queryBuilder/operations/FindOperation.js +164 -0
  76. package/lib/queryBuilder/operations/FirstOperation.js +27 -0
  77. package/lib/queryBuilder/operations/FromOperation.js +110 -0
  78. package/lib/queryBuilder/operations/InsertAndFetchOperation.js +49 -0
  79. package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +45 -0
  80. package/lib/queryBuilder/operations/InsertGraphOperation.js +108 -0
  81. package/lib/queryBuilder/operations/InsertOperation.js +206 -0
  82. package/lib/queryBuilder/operations/InstanceDeleteOperation.js +46 -0
  83. package/lib/queryBuilder/operations/InstanceFindOperation.js +21 -0
  84. package/lib/queryBuilder/operations/InstanceInsertOperation.js +24 -0
  85. package/lib/queryBuilder/operations/InstanceUpdateOperation.js +59 -0
  86. package/lib/queryBuilder/operations/JoinRelatedOperation.js +103 -0
  87. package/lib/queryBuilder/operations/KnexOperation.js +14 -0
  88. package/lib/queryBuilder/operations/MergeOperation.js +56 -0
  89. package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +192 -0
  90. package/lib/queryBuilder/operations/OnBuildKnexOperation.js +29 -0
  91. package/lib/queryBuilder/operations/OnBuildOperation.js +29 -0
  92. package/lib/queryBuilder/operations/OnErrorOperation.js +29 -0
  93. package/lib/queryBuilder/operations/QueryBuilderOperation.js +297 -0
  94. package/lib/queryBuilder/operations/RangeOperation.js +47 -0
  95. package/lib/queryBuilder/operations/RelateOperation.js +27 -0
  96. package/lib/queryBuilder/operations/ReturningOperation.js +30 -0
  97. package/lib/queryBuilder/operations/RunAfterOperation.js +29 -0
  98. package/lib/queryBuilder/operations/RunBeforeOperation.js +29 -0
  99. package/lib/queryBuilder/operations/UnrelateOperation.js +23 -0
  100. package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +80 -0
  101. package/lib/queryBuilder/operations/UpdateOperation.js +155 -0
  102. package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +45 -0
  103. package/lib/queryBuilder/operations/UpsertGraphOperation.js +66 -0
  104. package/lib/queryBuilder/operations/WhereCompositeOperation.js +57 -0
  105. package/lib/queryBuilder/operations/WhereInOperation.js +48 -0
  106. package/lib/queryBuilder/operations/eager/EagerOperation.js +61 -0
  107. package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +51 -0
  108. package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +13 -0
  109. package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +285 -0
  110. package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +36 -0
  111. package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectOperation.js +53 -0
  112. package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +31 -0
  113. package/lib/queryBuilder/operations/jsonApi/WhereJsonOverlapsOperation.js +31 -0
  114. package/lib/queryBuilder/operations/jsonApi/mysqlJsonApi.js +167 -0
  115. package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +164 -0
  116. package/lib/queryBuilder/operations/select/SelectOperation.js +66 -0
  117. package/lib/queryBuilder/operations/select/Selection.js +123 -0
  118. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +117 -0
  119. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +100 -0
  120. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +104 -0
  121. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +886 -0
  122. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.pegjs +97 -0
  123. package/lib/queryBuilder/parsers/relationExpressionParser.js +1042 -0
  124. package/lib/queryBuilder/parsers/relationExpressionParser.pegjs +141 -0
  125. package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +22 -0
  126. package/lib/queryBuilder/transformations/QueryTransformation.js +11 -0
  127. package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +71 -0
  128. package/lib/queryBuilder/transformations/index.js +15 -0
  129. package/lib/queryBuilder/whereScopes.js +227 -0
  130. package/lib/relations/Relation.js +401 -0
  131. package/lib/relations/RelationDeleteOperation.js +29 -0
  132. package/lib/relations/RelationFindOperation.js +149 -0
  133. package/lib/relations/RelationInsertOperation.js +33 -0
  134. package/lib/relations/RelationOwner.js +236 -0
  135. package/lib/relations/RelationProperty.js +247 -0
  136. package/lib/relations/RelationUpdateOperation.js +30 -0
  137. package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +23 -0
  138. package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +44 -0
  139. package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +50 -0
  140. package/lib/relations/belongsToOne/BelongsToOneRelation.js +53 -0
  141. package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +61 -0
  142. package/lib/relations/hasMany/HasManyInsertOperation.js +61 -0
  143. package/lib/relations/hasMany/HasManyRelateOperation.js +64 -0
  144. package/lib/relations/hasMany/HasManyRelation.js +49 -0
  145. package/lib/relations/hasMany/HasManyUnrelateOperation.js +33 -0
  146. package/lib/relations/hasOne/HasOneRelation.js +13 -0
  147. package/lib/relations/hasOneThrough/HasOneThroughRelation.js +13 -0
  148. package/lib/relations/manyToMany/ManyToManyModifyMixin.js +105 -0
  149. package/lib/relations/manyToMany/ManyToManyRelation.js +507 -0
  150. package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +36 -0
  151. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +10 -0
  152. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +26 -0
  153. package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +12 -0
  154. package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +105 -0
  155. package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +52 -0
  156. package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +81 -0
  157. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +14 -0
  158. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +34 -0
  159. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +16 -0
  160. package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +10 -0
  161. package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +82 -0
  162. package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +12 -0
  163. package/lib/transaction.js +96 -0
  164. package/lib/utils/assert.js +25 -0
  165. package/lib/utils/buildUtils.js +21 -0
  166. package/lib/utils/classUtils.js +13 -0
  167. package/lib/utils/clone.js +2329 -0
  168. package/lib/utils/createModifier.js +42 -0
  169. package/lib/utils/deprecate.js +15 -0
  170. package/lib/utils/identifierMapping.js +227 -0
  171. package/lib/utils/internalPropUtils.js +11 -0
  172. package/lib/utils/knexUtils.js +76 -0
  173. package/lib/utils/mixin.js +25 -0
  174. package/lib/utils/mysqlJsonPath.js +55 -0
  175. package/lib/utils/normalizeIds.js +144 -0
  176. package/lib/utils/objectUtils.js +416 -0
  177. package/lib/utils/parseFieldExpression.js +51 -0
  178. package/lib/utils/postgresJsonPath.js +110 -0
  179. package/lib/utils/promiseUtils/after.js +17 -0
  180. package/lib/utils/promiseUtils/afterReturn.js +17 -0
  181. package/lib/utils/promiseUtils/index.js +17 -0
  182. package/lib/utils/promiseUtils/isPromise.js +11 -0
  183. package/lib/utils/promiseUtils/map.js +110 -0
  184. package/lib/utils/promiseUtils/mapAfterAllReturn.js +29 -0
  185. package/lib/utils/promiseUtils/try.js +22 -0
  186. package/lib/utils/resolveModel.js +107 -0
  187. package/lib/utils/tmpColumnUtils.js +16 -0
  188. package/package.json +86 -4
  189. package/typings/objection/index.d.ts +4104 -0
  190. package/typings/objection/relation-expression.d.ts +237 -0
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ const { QueryBuilderContextBase } = require('./QueryBuilderContextBase');
4
+
5
+ class QueryBuilderContext extends QueryBuilderContextBase {
6
+ constructor(builder) {
7
+ super(builder);
8
+
9
+ this.runBefore = [];
10
+ this.runAfter = [];
11
+ this.onBuild = [];
12
+ }
13
+
14
+ clone() {
15
+ const ctx = super.clone();
16
+
17
+ ctx.runBefore = this.runBefore.slice();
18
+ ctx.runAfter = this.runAfter.slice();
19
+ ctx.onBuild = this.onBuild.slice();
20
+
21
+ return ctx;
22
+ }
23
+ }
24
+
25
+ module.exports = {
26
+ QueryBuilderContext,
27
+ };
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ const { InternalOptions } = require('./InternalOptions');
4
+
5
+ class QueryBuilderContextBase {
6
+ constructor(builder) {
7
+ this.userContext = builder ? new builder.constructor.QueryBuilderUserContext(builder) : null;
8
+ this.options = builder ? new this.constructor.InternalOptions() : null;
9
+ this.knex = null;
10
+
11
+ this.aliasMap = null;
12
+ this.tableMap = null;
13
+ }
14
+
15
+ static get InternalOptions() {
16
+ return InternalOptions;
17
+ }
18
+
19
+ clone() {
20
+ const ctx = new this.constructor();
21
+
22
+ ctx.userContext = this.userContext;
23
+ ctx.options = this.options.clone();
24
+ ctx.knex = this.knex;
25
+
26
+ ctx.aliasMap = this.aliasMap;
27
+ ctx.tableMap = this.tableMap;
28
+
29
+ return ctx;
30
+ }
31
+ }
32
+
33
+ module.exports = {
34
+ QueryBuilderContextBase,
35
+ };
@@ -0,0 +1,558 @@
1
+ 'use strict';
2
+
3
+ const { isString, isFunction, isRegExp, mergeMaps, last } = require('../utils/objectUtils');
4
+ const { QueryBuilderContextBase } = require('./QueryBuilderContextBase');
5
+ const { QueryBuilderUserContext } = require('./QueryBuilderUserContext');
6
+ const { deprecate } = require('../utils/deprecate');
7
+ const { effectiveWhereScope, createWhereGrouping } = require('./whereScopes');
8
+
9
+ const AllSelector = () => true;
10
+ const SelectSelector =
11
+ /^(select|columns|column|distinct|count|countDistinct|min|max|sum|sumDistinct|avg|avgDistinct)$/;
12
+ const WhereSelector = /^(where|orWhere|andWhere|find\w+)/;
13
+ const OnSelector = /^(on|orOn|andOn)/;
14
+ const OrderBySelector = /orderBy/;
15
+ const JoinSelector = /(join|joinRaw|joinRelated)$/i;
16
+ const FromSelector = /^(from|fromRaw|into|table)$/;
17
+
18
+ class QueryBuilderOperationSupport {
19
+ constructor(...args) {
20
+ this.constructor.init(this, ...args);
21
+ }
22
+
23
+ static init(self, modelClass) {
24
+ self._modelClass = modelClass;
25
+ self._operations = [];
26
+ self._context = new this.QueryBuilderContext(self);
27
+ self._parentQuery = null;
28
+ self._isPartialQuery = false;
29
+ self._activeOperations = [];
30
+ self._whereScope = null;
31
+ }
32
+
33
+ static forClass(modelClass) {
34
+ return new this(modelClass);
35
+ }
36
+
37
+ static get AllSelector() {
38
+ return AllSelector;
39
+ }
40
+
41
+ static get QueryBuilderContext() {
42
+ return QueryBuilderContextBase;
43
+ }
44
+
45
+ static get QueryBuilderUserContext() {
46
+ return QueryBuilderUserContext;
47
+ }
48
+
49
+ static get SelectSelector() {
50
+ return SelectSelector;
51
+ }
52
+
53
+ static get WhereSelector() {
54
+ return WhereSelector;
55
+ }
56
+
57
+ static get OnSelector() {
58
+ return OnSelector;
59
+ }
60
+
61
+ static get JoinSelector() {
62
+ return JoinSelector;
63
+ }
64
+
65
+ static get FromSelector() {
66
+ return FromSelector;
67
+ }
68
+
69
+ static get OrderBySelector() {
70
+ return OrderBySelector;
71
+ }
72
+
73
+ modelClass() {
74
+ return this._modelClass;
75
+ }
76
+
77
+ context(obj) {
78
+ const ctx = this._context;
79
+
80
+ if (arguments.length === 0) {
81
+ return ctx.userContext;
82
+ } else {
83
+ ctx.userContext = ctx.userContext.newMerge(this, obj);
84
+ return this;
85
+ }
86
+ }
87
+
88
+ clearContext() {
89
+ const ctx = this._context;
90
+ ctx.userContext = new this.constructor.QueryBuilderUserContext(this);
91
+ return this;
92
+ }
93
+
94
+ internalContext(ctx) {
95
+ if (arguments.length === 0) {
96
+ return this._context;
97
+ } else {
98
+ this._context = ctx;
99
+ return this;
100
+ }
101
+ }
102
+
103
+ internalOptions(opt) {
104
+ if (arguments.length === 0) {
105
+ return this._context.options;
106
+ } else {
107
+ const oldOpt = this._context.options;
108
+ this._context.options = Object.assign(oldOpt, opt);
109
+ return this;
110
+ }
111
+ }
112
+
113
+ isPartial(isPartial) {
114
+ if (arguments.length === 0) {
115
+ return this._isPartialQuery;
116
+ } else {
117
+ this._isPartialQuery = isPartial;
118
+ return this;
119
+ }
120
+ }
121
+
122
+ isInternal() {
123
+ return this.internalOptions().isInternalQuery;
124
+ }
125
+
126
+ tableNameFor(modelClassOrTableName, newTableName) {
127
+ const tableName = getTableName(modelClassOrTableName);
128
+ const ctx = this.internalContext();
129
+ const tableMap = ctx.tableMap;
130
+
131
+ if (isString(newTableName)) {
132
+ ctx.tableMap = tableMap || new Map();
133
+ ctx.tableMap.set(tableName, newTableName);
134
+ return this;
135
+ } else {
136
+ return (tableMap && tableMap.get(tableName)) || tableName;
137
+ }
138
+ }
139
+
140
+ aliasFor(modelClassOrTableName, alias) {
141
+ const tableName = getTableName(modelClassOrTableName);
142
+ const ctx = this.internalContext();
143
+ const aliasMap = ctx.aliasMap;
144
+
145
+ if (isString(alias)) {
146
+ ctx.aliasMap = aliasMap || new Map();
147
+ ctx.aliasMap.set(tableName, alias);
148
+ return this;
149
+ } else {
150
+ return (aliasMap && aliasMap.get(tableName)) || null;
151
+ }
152
+ }
153
+
154
+ tableRefFor(modelClassOrTableName) {
155
+ return this.aliasFor(modelClassOrTableName) || this.tableNameFor(modelClassOrTableName);
156
+ }
157
+
158
+ childQueryOf(query, { fork, isInternalQuery } = {}) {
159
+ if (query) {
160
+ let currentCtx = this.context();
161
+ let ctx = query.internalContext();
162
+
163
+ if (fork) {
164
+ ctx = ctx.clone();
165
+ }
166
+
167
+ if (isInternalQuery) {
168
+ ctx.options.isInternalQuery = true;
169
+ }
170
+
171
+ this._parentQuery = query;
172
+ this.internalContext(ctx);
173
+ this.context(currentCtx);
174
+
175
+ // Use the parent's knex if there was no knex in `ctx`.
176
+ if (this.unsafeKnex() === null) {
177
+ this.knex(query.unsafeKnex());
178
+ }
179
+ }
180
+
181
+ return this;
182
+ }
183
+
184
+ subqueryOf(query) {
185
+ if (query) {
186
+ if (this._isPartialQuery) {
187
+ // Merge alias and table name maps for "partial" subqueries.
188
+ const ctx = this.internalContext();
189
+
190
+ ctx.aliasMap = mergeMaps(query.internalContext().aliasMap, ctx.aliasMap);
191
+ ctx.tableMap = mergeMaps(query.internalContext().tableMap, ctx.tableMap);
192
+ }
193
+
194
+ this._parentQuery = query;
195
+
196
+ if (this.unsafeKnex() === null) {
197
+ this.knex(query.unsafeKnex());
198
+ }
199
+ }
200
+
201
+ return this;
202
+ }
203
+
204
+ parentQuery() {
205
+ return this._parentQuery;
206
+ }
207
+
208
+ knex(...args) {
209
+ if (args.length === 0) {
210
+ const knex = this.unsafeKnex();
211
+
212
+ if (!knex) {
213
+ throw new Error(
214
+ `no database connection available for a query. You need to bind the model class or the query to a knex instance.`,
215
+ );
216
+ }
217
+
218
+ return knex;
219
+ } else {
220
+ this._context.knex = args[0];
221
+ return this;
222
+ }
223
+ }
224
+
225
+ unsafeKnex() {
226
+ return this._context.knex || this._modelClass.knex() || null;
227
+ }
228
+
229
+ clear(operationSelector) {
230
+ const operationsToRemove = new Set();
231
+
232
+ this.forEachOperation(operationSelector, (op) => {
233
+ // If an ancestor operation has already been removed,
234
+ // there's no need to remove the children anymore.
235
+ if (!op.isAncestorInSet(operationsToRemove)) {
236
+ operationsToRemove.add(op);
237
+ }
238
+ });
239
+
240
+ for (const op of operationsToRemove) {
241
+ this.removeOperation(op);
242
+ }
243
+
244
+ return this;
245
+ }
246
+
247
+ toFindQuery() {
248
+ const findQuery = this.clone();
249
+ const operationsToReplace = [];
250
+ const operationsToRemove = [];
251
+
252
+ findQuery.forEachOperation(
253
+ (op) => op.hasToFindOperation(),
254
+ (op) => {
255
+ const findOp = op.toFindOperation(findQuery);
256
+
257
+ if (!findOp) {
258
+ operationsToRemove.push(op);
259
+ } else {
260
+ operationsToReplace.push({ op, findOp });
261
+ }
262
+ },
263
+ );
264
+
265
+ for (const op of operationsToRemove) {
266
+ findQuery.removeOperation(op);
267
+ }
268
+
269
+ for (const { op, findOp } of operationsToReplace) {
270
+ findQuery.replaceOperation(op, findOp);
271
+ }
272
+
273
+ return findQuery;
274
+ }
275
+
276
+ clearSelect() {
277
+ return this.clear(SelectSelector);
278
+ }
279
+
280
+ clearWhere() {
281
+ return this.clear(WhereSelector);
282
+ }
283
+
284
+ clearOrder() {
285
+ return this.clear(OrderBySelector);
286
+ }
287
+
288
+ copyFrom(queryBuilder, operationSelector) {
289
+ const operationsToAdd = new Set();
290
+
291
+ queryBuilder.forEachOperation(operationSelector, (op) => {
292
+ // If an ancestor operation has already been added,
293
+ // there is no need to add
294
+ if (!op.isAncestorInSet(operationsToAdd)) {
295
+ operationsToAdd.add(op);
296
+ }
297
+ });
298
+
299
+ for (const op of operationsToAdd) {
300
+ const opClone = op.clone();
301
+
302
+ // The scope may come from a parent operation that is not copied.
303
+ opClone.whereScope = effectiveWhereScope(op);
304
+
305
+ // We may be moving nested operations to the root. Clear
306
+ // any links to the parent operations.
307
+ opClone.parentOperation = null;
308
+ opClone.adderHookName = null;
309
+
310
+ // We don't use `addOperation` here because we don't what to
311
+ // call `onAdd` or add these operations as child operations.
312
+ this._operations.push(opClone);
313
+ }
314
+
315
+ return this;
316
+ }
317
+
318
+ has(operationSelector) {
319
+ return !!this.findOperation(operationSelector);
320
+ }
321
+
322
+ forEachOperation(operationSelector, callback, match = true) {
323
+ const selector = buildFunctionForOperationSelector(operationSelector);
324
+
325
+ for (const op of this._operations) {
326
+ if (selector(op) === match && callback(op) === false) {
327
+ break;
328
+ }
329
+
330
+ const childRes = op.forEachDescendantOperation((op) => {
331
+ if (selector(op) === match && callback(op) === false) {
332
+ return false;
333
+ }
334
+ });
335
+
336
+ if (childRes === false) {
337
+ break;
338
+ }
339
+ }
340
+
341
+ return this;
342
+ }
343
+
344
+ findOperation(operationSelector) {
345
+ let op = null;
346
+
347
+ this.forEachOperation(operationSelector, (it) => {
348
+ op = it;
349
+ return false;
350
+ });
351
+
352
+ return op;
353
+ }
354
+
355
+ findLastOperation(operationSelector) {
356
+ let op = null;
357
+
358
+ this.forEachOperation(operationSelector, (it) => {
359
+ op = it;
360
+ });
361
+
362
+ return op;
363
+ }
364
+
365
+ everyOperation(operationSelector) {
366
+ let every = true;
367
+
368
+ this.forEachOperation(
369
+ operationSelector,
370
+ () => {
371
+ every = false;
372
+ return false;
373
+ },
374
+ false,
375
+ );
376
+
377
+ return every;
378
+ }
379
+
380
+ callOperationMethod(operation, hookName, args) {
381
+ try {
382
+ operation.removeChildOperationsByHookName(hookName);
383
+
384
+ this._activeOperations.push({
385
+ operation,
386
+ hookName,
387
+ });
388
+
389
+ return operation[hookName](...args);
390
+ } finally {
391
+ this._activeOperations.pop();
392
+ }
393
+ }
394
+
395
+ async callAsyncOperationMethod(operation, hookName, args) {
396
+ operation.removeChildOperationsByHookName(hookName);
397
+
398
+ this._activeOperations.push({
399
+ operation,
400
+ hookName,
401
+ });
402
+
403
+ try {
404
+ return await operation[hookName](...args);
405
+ } finally {
406
+ this._activeOperations.pop();
407
+ }
408
+ }
409
+
410
+ addOperation(operation, args) {
411
+ const ret = this.addOperationUsingMethod('push', operation, args);
412
+ return ret;
413
+ }
414
+
415
+ addOperationToFront(operation, args) {
416
+ return this.addOperationUsingMethod('unshift', operation, args);
417
+ }
418
+
419
+ addOperationUsingMethod(arrayMethod, operation, args) {
420
+ const shouldAdd = this.callOperationMethod(operation, 'onAdd', [this, args]);
421
+
422
+ if (shouldAdd) {
423
+ if (this._whereScope !== null && operation.whereScope === null) {
424
+ operation.whereScope = this._whereScope;
425
+ }
426
+
427
+ if (this._activeOperations.length) {
428
+ const { operation: parentOperation, hookName } = last(this._activeOperations);
429
+ parentOperation.addChildOperation(hookName, operation);
430
+ } else {
431
+ this._operations[arrayMethod](operation);
432
+ }
433
+ }
434
+
435
+ return this;
436
+ }
437
+
438
+ removeOperation(operation) {
439
+ if (operation.parentOperation) {
440
+ operation.parentOperation.removeChildOperation(operation);
441
+ } else {
442
+ const index = this._operations.indexOf(operation);
443
+
444
+ if (index !== -1) {
445
+ this._operations.splice(index, 1);
446
+ }
447
+ }
448
+
449
+ return this;
450
+ }
451
+
452
+ replaceOperation(operation, newOperation) {
453
+ if (operation.parentOperation) {
454
+ operation.parentOperation.replaceChildOperation(operation, newOperation);
455
+ } else {
456
+ const index = this._operations.indexOf(operation);
457
+
458
+ if (index !== -1) {
459
+ this._operations[index] = newOperation;
460
+ }
461
+ }
462
+
463
+ return this;
464
+ }
465
+
466
+ clone() {
467
+ return this.baseCloneInto(new this.constructor(this.unsafeKnex()));
468
+ }
469
+
470
+ baseCloneInto(builder) {
471
+ builder._modelClass = this._modelClass;
472
+ builder._operations = this._operations.map((it) => it.clone());
473
+ builder._context = this._context.clone();
474
+ builder._parentQuery = this._parentQuery;
475
+ builder._isPartialQuery = this._isPartialQuery;
476
+
477
+ // Don't copy the active operation stack. We never continue (nor can we)
478
+ // a query from the exact mid-hook-call state.
479
+ builder._activeOperations = [];
480
+
481
+ return builder;
482
+ }
483
+
484
+ toKnexQuery(knexBuilder = this.knex().queryBuilder()) {
485
+ this.executeOnBuild();
486
+ return this.executeOnBuildKnex(knexBuilder);
487
+ }
488
+
489
+ executeOnBuild() {
490
+ this.forEachOperation(true, (op) => {
491
+ if (op.hasOnBuild()) {
492
+ this.callOperationMethod(op, 'onBuild', [this]);
493
+ }
494
+ });
495
+ }
496
+
497
+ executeOnBuildKnex(knexBuilder) {
498
+ const whereGrouping = createWhereGrouping(this);
499
+
500
+ this.forEachOperation(true, (op) => {
501
+ if (whereGrouping !== null && whereGrouping.isGrouped(op)) {
502
+ knexBuilder = whereGrouping.build(op, knexBuilder);
503
+ } else if (op.hasOnBuildKnex()) {
504
+ const newKnexBuilder = this.callOperationMethod(op, 'onBuildKnex', [knexBuilder, this]);
505
+ // Default to the input knex builder for backwards compatibility
506
+ // with QueryBuilder.onBuildKnex hooks.
507
+ knexBuilder = newKnexBuilder || knexBuilder;
508
+ }
509
+ });
510
+
511
+ return knexBuilder;
512
+ }
513
+
514
+ toString() {
515
+ return this.toKnexQuery().toString();
516
+ }
517
+
518
+ toSql() {
519
+ return this.toString();
520
+ }
521
+
522
+ skipUndefined() {
523
+ deprecate('skipUndefined() is deprecated and will be removed in objection 4.0');
524
+ this.internalOptions().skipUndefined = true;
525
+ return this;
526
+ }
527
+ }
528
+
529
+ function buildFunctionForOperationSelector(operationSelector) {
530
+ if (operationSelector === true) {
531
+ return AllSelector;
532
+ } else if (isRegExp(operationSelector)) {
533
+ return (op) => operationSelector.test(op.name);
534
+ } else if (isString(operationSelector)) {
535
+ return (op) => op.name === operationSelector;
536
+ } else if (
537
+ isFunction(operationSelector) &&
538
+ operationSelector.isObjectionQueryBuilderOperationClass
539
+ ) {
540
+ return (op) => op.is(operationSelector);
541
+ } else if (isFunction(operationSelector)) {
542
+ return operationSelector;
543
+ } else {
544
+ return () => false;
545
+ }
546
+ }
547
+
548
+ function getTableName(modelClassOrTableName) {
549
+ if (isString(modelClassOrTableName)) {
550
+ return modelClassOrTableName;
551
+ } else {
552
+ return modelClassOrTableName.getTableName();
553
+ }
554
+ }
555
+
556
+ module.exports = {
557
+ QueryBuilderOperationSupport,
558
+ };
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ const SYMBOL_BUILDER = Symbol();
4
+
5
+ class QueryBuilderUserContext {
6
+ constructor(builder) {
7
+ // This should never ever be accessed outside this class. We only
8
+ // store it so that we can access builder.knex() lazily.
9
+ this[SYMBOL_BUILDER] = builder;
10
+ }
11
+
12
+ get transaction() {
13
+ return this[SYMBOL_BUILDER].knex();
14
+ }
15
+
16
+ newFromObject(builder, obj) {
17
+ const ctx = new this.constructor(builder);
18
+ Object.assign(ctx, obj);
19
+ return ctx;
20
+ }
21
+
22
+ newMerge(builder, obj) {
23
+ const ctx = new this.constructor(builder);
24
+ Object.assign(ctx, this, obj);
25
+ return ctx;
26
+ }
27
+ }
28
+
29
+ module.exports = {
30
+ QueryBuilderUserContext,
31
+ };