@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,164 +1,147 @@
1
1
  'use strict';
2
-
3
2
  const { QueryBuilderOperation } = require('./QueryBuilderOperation');
4
- const { StaticHookArguments } = require('../StaticHookArguments');
3
+ const { StaticHookArguments, hasStaticHook } = require('../StaticHookArguments');
5
4
  const { isPromise, after, afterReturn } = require('../../utils/promiseUtils');
6
5
  const { isObject } = require('../../utils/objectUtils');
7
-
8
6
  class FindOperation extends QueryBuilderOperation {
9
- onBefore2(builder, result) {
10
- return afterReturn(callStaticBeforeFind(builder), result);
11
- }
12
-
13
- onAfter3(builder, results) {
14
- const opt = builder.findOptions();
15
-
16
- if (opt.dontCallFindHooks) {
17
- return results;
18
- } else {
19
- return callAfterFind(builder, results);
7
+ onBefore2(builder, result) {
8
+ return afterReturn(callStaticBeforeFind(builder), result);
9
+ }
10
+ onAfter3(builder, results) {
11
+ const opt = builder.findOptions();
12
+ if (opt.dontCallFindHooks) {
13
+ return results;
14
+ }
15
+ else {
16
+ return callAfterFind(builder, results);
17
+ }
20
18
  }
21
- }
22
19
  }
23
-
24
20
  function callStaticBeforeFind(builder) {
25
- const args = StaticHookArguments.create({ builder });
26
- return builder.modelClass().beforeFind(args);
21
+ if (!hasStaticHook(builder.modelClass(), 'beforeFind')) {
22
+ return undefined;
23
+ }
24
+ const args = StaticHookArguments.create({ builder });
25
+ return builder.modelClass().beforeFind(args);
27
26
  }
28
-
29
27
  function callAfterFind(builder, result) {
30
- const opt = builder.findOptions();
31
- const maybePromise = callInstanceAfterFind(builder.context(), result, opt.callAfterFindDeeply);
32
-
33
- return after(maybePromise, () => callStaticAfterFind(builder, result));
28
+ const opt = builder.findOptions();
29
+ const maybePromise = callInstanceAfterFind(builder.context(), result, opt.callAfterFindDeeply);
30
+ return after(maybePromise, () => callStaticAfterFind(builder, result));
34
31
  }
35
-
36
32
  function callStaticAfterFind(builder, result) {
37
- const args = StaticHookArguments.create({ builder, result });
38
- const maybePromise = builder.modelClass().afterFind(args);
39
-
40
- return after(maybePromise, (maybeResult) => {
41
- if (maybeResult === undefined) {
42
- return result;
43
- } else {
44
- return maybeResult;
45
- }
46
- });
33
+ if (!hasStaticHook(builder.modelClass(), 'afterFind')) {
34
+ return result;
35
+ }
36
+ const args = StaticHookArguments.create({ builder, result });
37
+ const maybePromise = builder.modelClass().afterFind(args);
38
+ return after(maybePromise, (maybeResult) => {
39
+ if (maybeResult === undefined) {
40
+ return result;
41
+ }
42
+ else {
43
+ return maybeResult;
44
+ }
45
+ });
47
46
  }
48
-
49
47
  function callInstanceAfterFind(ctx, results, deep) {
50
- if (Array.isArray(results)) {
51
- if (results.length === 1) {
52
- return callAfterFindForOne(ctx, results[0], results, deep);
53
- } else {
54
- return callAfterFindArray(ctx, results, deep);
55
- }
56
- } else {
57
- return callAfterFindForOne(ctx, results, results, deep);
58
- }
48
+ if (Array.isArray(results)) {
49
+ if (results.length === 1) {
50
+ return callAfterFindForOne(ctx, results[0], results, deep);
51
+ }
52
+ else {
53
+ return callAfterFindArray(ctx, results, deep);
54
+ }
55
+ }
56
+ else {
57
+ return callAfterFindForOne(ctx, results, results, deep);
58
+ }
59
59
  }
60
-
61
60
  function callAfterFindArray(ctx, results, deep) {
62
- if (results.length === 0 || !isObject(results[0])) {
63
- return results;
64
- }
65
-
66
- const mapped = new Array(results.length);
67
- let containsPromise = false;
68
-
69
- for (let i = 0, l = results.length; i < l; ++i) {
70
- mapped[i] = callAfterFindForOne(ctx, results[i], results[i], deep);
71
-
72
- if (isPromise(mapped[i])) {
73
- containsPromise = true;
74
- }
75
- }
76
-
77
- if (containsPromise) {
78
- return Promise.all(mapped);
79
- } else {
80
- return mapped;
81
- }
61
+ if (results.length === 0 || !isObject(results[0])) {
62
+ return results;
63
+ }
64
+ const mapped = new Array(results.length);
65
+ let containsPromise = false;
66
+ for (let i = 0, l = results.length; i < l; ++i) {
67
+ mapped[i] = callAfterFindForOne(ctx, results[i], results[i], deep);
68
+ if (isPromise(mapped[i])) {
69
+ containsPromise = true;
70
+ }
71
+ }
72
+ if (containsPromise) {
73
+ return Promise.all(mapped);
74
+ }
75
+ else {
76
+ return mapped;
77
+ }
82
78
  }
83
-
84
79
  function callAfterFindForOne(ctx, model, result, deep) {
85
- if (!isObject(model) || !model.$isObjectionModel) {
86
- return result;
87
- }
88
-
89
- if (deep) {
90
- const results = [];
91
- const containsPromise = callAfterFindForRelations(ctx, model, results);
92
-
93
- if (containsPromise) {
94
- return Promise.all(results).then(() => {
80
+ if (!isObject(model) || !model.$isObjectionModel) {
81
+ return result;
82
+ }
83
+ if (deep) {
84
+ const results = [];
85
+ const containsPromise = callAfterFindForRelations(ctx, model, results);
86
+ if (containsPromise) {
87
+ return Promise.all(results).then(() => {
88
+ return doCallAfterFind(ctx, model, result);
89
+ });
90
+ }
91
+ else {
92
+ return doCallAfterFind(ctx, model, result);
93
+ }
94
+ }
95
+ else {
95
96
  return doCallAfterFind(ctx, model, result);
96
- });
97
- } else {
98
- return doCallAfterFind(ctx, model, result);
99
97
  }
100
- } else {
101
- return doCallAfterFind(ctx, model, result);
102
- }
103
98
  }
104
-
105
99
  function callAfterFindForRelations(ctx, model, results) {
106
- const keys = Object.keys(model);
107
- let containsPromise = false;
108
-
109
- for (let i = 0, l = keys.length; i < l; ++i) {
110
- const key = keys[i];
111
- const value = model[key];
112
-
113
- if (isRelation(value)) {
114
- const maybePromise = callInstanceAfterFind(ctx, value, true);
115
-
116
- if (isPromise(maybePromise)) {
117
- containsPromise = true;
118
- }
119
-
120
- results.push(maybePromise);
121
- }
122
- }
123
-
124
- return containsPromise;
100
+ const keys = Object.keys(model);
101
+ let containsPromise = false;
102
+ for (let i = 0, l = keys.length; i < l; ++i) {
103
+ const key = keys[i];
104
+ const value = model[key];
105
+ if (isRelation(value)) {
106
+ const maybePromise = callInstanceAfterFind(ctx, value, true);
107
+ if (isPromise(maybePromise)) {
108
+ containsPromise = true;
109
+ }
110
+ results.push(maybePromise);
111
+ }
112
+ }
113
+ return containsPromise;
125
114
  }
126
-
127
115
  function isRelation(value) {
128
- return (
129
- (isObject(value) && value.$isObjectionModel) ||
130
- (isNonEmptyObjectArray(value) && value[0].$isObjectionModel)
131
- );
116
+ return ((isObject(value) && value.$isObjectionModel) ||
117
+ (isNonEmptyObjectArray(value) && value[0].$isObjectionModel));
132
118
  }
133
-
134
119
  function isNonEmptyObjectArray(value) {
135
- return Array.isArray(value) && value.length > 0 && isObject(value[0]);
120
+ return Array.isArray(value) && value.length > 0 && isObject(value[0]);
136
121
  }
137
-
138
122
  function doCallAfterFind(ctx, model, result) {
139
- const afterFind = getAfterFindHook(model);
140
-
141
- if (afterFind !== null) {
142
- const maybePromise = afterFind.call(model, ctx);
143
-
144
- if (isPromise(maybePromise)) {
145
- return maybePromise.then(() => result);
146
- } else {
147
- return result;
148
- }
149
- } else {
150
- return result;
151
- }
123
+ const afterFind = getAfterFindHook(model);
124
+ if (afterFind !== null) {
125
+ const maybePromise = afterFind.call(model, ctx);
126
+ if (isPromise(maybePromise)) {
127
+ return maybePromise.then(() => result);
128
+ }
129
+ else {
130
+ return result;
131
+ }
132
+ }
133
+ else {
134
+ return result;
135
+ }
152
136
  }
153
-
154
137
  function getAfterFindHook(model) {
155
- if (model.$afterFind !== model.$objectionModelClass.prototype.$afterFind) {
156
- return model.$afterFind;
157
- } else {
158
- return null;
159
- }
138
+ if (model.$afterFind !== model.$objectionModelClass.prototype.$afterFind) {
139
+ return model.$afterFind;
140
+ }
141
+ else {
142
+ return null;
143
+ }
160
144
  }
161
-
162
145
  module.exports = {
163
- FindOperation,
146
+ FindOperation,
164
147
  };
@@ -1,27 +1,22 @@
1
1
  'use strict';
2
-
3
2
  const { QueryBuilderOperation } = require('./QueryBuilderOperation');
4
-
5
3
  class FirstOperation extends QueryBuilderOperation {
6
- onBuildKnex(knexBuilder, builder) {
7
- const modelClass = builder.modelClass();
8
-
9
- if (builder.isFind() && modelClass.useLimitInFirst) {
10
- knexBuilder = knexBuilder.limit(1);
4
+ onBuildKnex(knexBuilder, builder) {
5
+ const modelClass = builder.modelClass();
6
+ if (builder.isFind() && modelClass.useLimitInFirst) {
7
+ knexBuilder = knexBuilder.limit(1);
8
+ }
9
+ return knexBuilder;
11
10
  }
12
-
13
- return knexBuilder;
14
- }
15
-
16
- onAfter3(_, result) {
17
- if (Array.isArray(result)) {
18
- return result[0];
19
- } else {
20
- return result;
11
+ onAfter3(_, result) {
12
+ if (Array.isArray(result)) {
13
+ return result[0];
14
+ }
15
+ else {
16
+ return result;
17
+ }
21
18
  }
22
- }
23
19
  }
24
-
25
20
  module.exports = {
26
- FirstOperation,
21
+ FirstOperation,
27
22
  };
@@ -1,110 +1,91 @@
1
1
  'use strict';
2
-
3
2
  const { ObjectionToKnexConvertingOperation } = require('./ObjectionToKnexConvertingOperation');
4
3
  const { isPlainObject, isString } = require('../../utils/objectUtils');
5
4
  const { isModelClass } = require('../../utils/resolveModel');
6
-
7
5
  const ALIAS_REGEX = /\s+as\s+/i;
8
-
9
6
  // FromOperation corresponds to a `.from(args)` call. The call is delegated to
10
7
  // knex, but we first try to parse the arguments so that we can determine which
11
8
  // tables have been mentioned in a query's from clause. We only parse string
12
9
  // references and not `raw` or `ref` etc. references at this point thouhg.
13
10
  class FromOperation extends ObjectionToKnexConvertingOperation {
14
- constructor(name, opt) {
15
- super(name, opt);
16
-
17
- this.table = null;
18
- this.alias = null;
19
- }
20
-
21
- onAdd(builder, args) {
22
- const ret = super.onAdd(builder, args);
23
- const parsed = parseTableAndAlias(this.args[0], builder);
24
-
25
- if (parsed.table) {
26
- builder.tableName(parsed.table);
27
- this.table = parsed.table;
11
+ constructor(name, opt) {
12
+ super(name, opt);
13
+ this.table = null;
14
+ this.alias = null;
28
15
  }
29
-
30
- if (parsed.alias) {
31
- builder.aliasFor(builder.modelClass().getTableName(), parsed.alias);
32
- this.alias = parsed.alias;
16
+ onAdd(builder, args) {
17
+ const ret = super.onAdd(builder, args);
18
+ const parsed = parseTableAndAlias(this.args[0], builder);
19
+ if (parsed.table) {
20
+ builder.tableName(parsed.table);
21
+ this.table = parsed.table;
22
+ }
23
+ if (parsed.alias) {
24
+ builder.aliasFor(builder.modelClass().getTableName(), parsed.alias);
25
+ this.alias = parsed.alias;
26
+ }
27
+ return ret;
28
+ }
29
+ onBuildKnex(knexBuilder, builder) {
30
+ // Simply call knex's from method with the converted arguments.
31
+ return knexBuilder.from.apply(knexBuilder, this.getKnexArgs(builder));
32
+ }
33
+ clone() {
34
+ const clone = super.clone();
35
+ clone.table = this.table;
36
+ clone.alias = this.alias;
37
+ return clone;
33
38
  }
34
-
35
- return ret;
36
- }
37
-
38
- onBuildKnex(knexBuilder, builder) {
39
- // Simply call knex's from method with the converted arguments.
40
- return knexBuilder.from.apply(knexBuilder, this.getKnexArgs(builder));
41
- }
42
-
43
- clone() {
44
- const clone = super.clone();
45
-
46
- clone.table = this.table;
47
- clone.alias = this.alias;
48
-
49
- return clone;
50
- }
51
39
  }
52
-
53
40
  function parseTableAndAlias(arg, builder) {
54
- if (isModelClass(arg)) {
55
- return parseTableAndAliasFromString(arg.getTableName());
56
- } else if (isString(arg)) {
57
- return parseTableAndAliasFromString(arg);
58
- } else if (isPlainObject(arg)) {
59
- return parseTableAndAliasFromObject(arg, builder);
60
- } else {
61
- // Could not parse table and alias from the arguments.
62
- return {
63
- table: null,
64
- alias: null,
65
- };
66
- }
41
+ if (isModelClass(arg)) {
42
+ return parseTableAndAliasFromString(arg.getTableName());
43
+ }
44
+ else if (isString(arg)) {
45
+ return parseTableAndAliasFromString(arg);
46
+ }
47
+ else if (isPlainObject(arg)) {
48
+ return parseTableAndAliasFromObject(arg, builder);
49
+ }
50
+ else {
51
+ // Could not parse table and alias from the arguments.
52
+ return {
53
+ table: null,
54
+ alias: null,
55
+ };
56
+ }
67
57
  }
68
-
69
58
  function parseTableAndAliasFromString(arg) {
70
- if (ALIAS_REGEX.test(arg)) {
71
- const parts = arg.split(ALIAS_REGEX);
72
-
73
- return {
74
- table: parts[0].trim(),
75
- alias: parts[1].trim(),
76
- };
77
- } else {
78
- return {
79
- table: arg.trim(),
80
- alias: null,
81
- };
82
- }
59
+ if (ALIAS_REGEX.test(arg)) {
60
+ const parts = arg.split(ALIAS_REGEX);
61
+ return {
62
+ table: parts[0].trim(),
63
+ alias: parts[1].trim(),
64
+ };
65
+ }
66
+ else {
67
+ return {
68
+ table: arg.trim(),
69
+ alias: null,
70
+ };
71
+ }
83
72
  }
84
-
85
73
  function parseTableAndAliasFromObject(arg, builder) {
86
- for (const alias of Object.keys(arg)) {
87
- const value = isModelClass(arg[alias]) ? arg[alias].getTableName() : arg[alias];
88
-
89
- if (!isString(value)) {
90
- continue;
91
- }
92
-
93
- const table = value.trim();
94
-
95
- if (table === builder.modelClass().getTableName()) {
96
- return {
97
- alias,
98
- table,
99
- };
74
+ for (const alias of Object.keys(arg)) {
75
+ const value = isModelClass(arg[alias]) ? arg[alias].getTableName() : arg[alias];
76
+ if (!isString(value)) {
77
+ continue;
78
+ }
79
+ const table = value.trim();
80
+ if (table === builder.modelClass().getTableName()) {
81
+ return {
82
+ alias,
83
+ table,
84
+ };
85
+ }
100
86
  }
101
- }
102
-
103
- throw new Error(
104
- `one of the tables in ${JSON.stringify(arg)} must be the query's model class's table.`,
105
- );
87
+ throw new Error(`one of the tables in ${JSON.stringify(arg)} must be the query's model class's table.`);
106
88
  }
107
-
108
89
  module.exports = {
109
- FromOperation,
90
+ FromOperation,
110
91
  };
@@ -1,49 +1,38 @@
1
1
  'use strict';
2
-
3
2
  const { InsertOperation } = require('./InsertOperation');
4
3
  const { DelegateOperation } = require('./DelegateOperation');
5
4
  const { keyByProps } = require('../../model/modelUtils');
6
5
  const { asArray } = require('../../utils/objectUtils');
7
-
8
6
  class InsertAndFetchOperation extends DelegateOperation {
9
- constructor(name, opt) {
10
- super(name, opt);
11
-
12
- if (!this.delegate.is(InsertOperation)) {
13
- throw new Error('Invalid delegate');
7
+ constructor(name, opt) {
8
+ super(name, opt);
9
+ if (!this.delegate.is(InsertOperation)) {
10
+ throw new Error('Invalid delegate');
11
+ }
12
+ }
13
+ get models() {
14
+ return this.delegate.models;
15
+ }
16
+ async onAfter2(builder, inserted) {
17
+ const modelClass = builder.modelClass();
18
+ const insertedModels = await super.onAfter2(builder, inserted);
19
+ const insertedModelArray = asArray(insertedModels);
20
+ const idProps = modelClass.getIdPropertyArray();
21
+ const ids = insertedModelArray.map((model) => model.$id());
22
+ const fetchedModels = await modelClass
23
+ .query()
24
+ .childQueryOf(builder)
25
+ .findByIds(ids)
26
+ .castTo(builder.resultModelClass());
27
+ const modelsById = keyByProps(fetchedModels, idProps);
28
+ // Instead of returning the freshly fetched models, update the input
29
+ // models with the fresh values.
30
+ insertedModelArray.forEach((insertedModel) => {
31
+ insertedModel.$set(modelsById.get(insertedModel.$propKey(idProps)));
32
+ });
33
+ return insertedModels;
14
34
  }
15
- }
16
-
17
- get models() {
18
- return this.delegate.models;
19
- }
20
-
21
- async onAfter2(builder, inserted) {
22
- const modelClass = builder.modelClass();
23
- const insertedModels = await super.onAfter2(builder, inserted);
24
-
25
- const insertedModelArray = asArray(insertedModels);
26
- const idProps = modelClass.getIdPropertyArray();
27
- const ids = insertedModelArray.map((model) => model.$id());
28
-
29
- const fetchedModels = await modelClass
30
- .query()
31
- .childQueryOf(builder)
32
- .findByIds(ids)
33
- .castTo(builder.resultModelClass());
34
-
35
- const modelsById = keyByProps(fetchedModels, idProps);
36
-
37
- // Instead of returning the freshly fetched models, update the input
38
- // models with the fresh values.
39
- insertedModelArray.forEach((insertedModel) => {
40
- insertedModel.$set(modelsById.get(insertedModel.$propKey(idProps)));
41
- });
42
-
43
- return insertedModels;
44
- }
45
35
  }
46
-
47
36
  module.exports = {
48
- InsertAndFetchOperation,
37
+ InsertAndFetchOperation,
49
38
  };
@@ -1,45 +1,35 @@
1
1
  'use strict';
2
-
3
2
  const { DelegateOperation } = require('./DelegateOperation');
4
3
  const { InsertGraphOperation } = require('./InsertGraphOperation');
5
4
  const { RelationExpression } = require('../RelationExpression');
6
-
7
5
  class InsertGraphAndFetchOperation extends DelegateOperation {
8
- constructor(name, opt) {
9
- super(name, opt);
10
-
11
- if (!this.delegate.is(InsertGraphOperation)) {
12
- throw new Error('Invalid delegate');
6
+ constructor(name, opt) {
7
+ super(name, opt);
8
+ if (!this.delegate.is(InsertGraphOperation)) {
9
+ throw new Error('Invalid delegate');
10
+ }
13
11
  }
14
- }
15
-
16
- get models() {
17
- return this.delegate.models;
18
- }
19
-
20
- get isArray() {
21
- return this.delegate.isArray;
22
- }
23
-
24
- async onAfter2(builder) {
25
- if (this.models.length === 0) {
26
- return this.isArray ? [] : null;
12
+ get models() {
13
+ return this.delegate.models;
14
+ }
15
+ get isArray() {
16
+ return this.delegate.isArray;
17
+ }
18
+ async onAfter2(builder) {
19
+ if (this.models.length === 0) {
20
+ return this.isArray ? [] : null;
21
+ }
22
+ const eager = RelationExpression.fromModelGraph(this.models);
23
+ const modelClass = this.models[0].constructor;
24
+ const ids = this.models.map((model) => model.$id());
25
+ const models = await modelClass
26
+ .query()
27
+ .childQueryOf(builder)
28
+ .findByIds(ids)
29
+ .withGraphFetched(eager);
30
+ return this.isArray ? models : models[0] || null;
27
31
  }
28
-
29
- const eager = RelationExpression.fromModelGraph(this.models);
30
- const modelClass = this.models[0].constructor;
31
- const ids = this.models.map((model) => model.$id());
32
-
33
- const models = await modelClass
34
- .query()
35
- .childQueryOf(builder)
36
- .findByIds(ids)
37
- .withGraphFetched(eager);
38
-
39
- return this.isArray ? models : models[0] || null;
40
- }
41
32
  }
42
-
43
33
  module.exports = {
44
- InsertGraphAndFetchOperation,
34
+ InsertGraphAndFetchOperation,
45
35
  };