@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,507 +1,408 @@
1
- 'use strict';
2
-
3
- const { withWhereScope } = require('../../queryBuilder/whereScopes');
4
- const { getModel } = require('../../model/getModel');
5
- const { Relation } = require('../Relation');
6
- const { RelationProperty } = require('../RelationProperty');
7
-
8
- const { isSqlite } = require('../../utils/knexUtils');
9
- const { inheritModel } = require('../../model/inheritModel');
10
- const { resolveModel } = require('../../utils/resolveModel');
11
- const { mapAfterAllReturn } = require('../../utils/promiseUtils');
12
- const { isFunction, isObject, isString } = require('../../utils/objectUtils');
13
- const { createModifier } = require('../../utils/createModifier');
14
-
15
- const { ManyToManyFindOperation } = require('./find/ManyToManyFindOperation');
16
- const { ManyToManyInsertOperation } = require('./insert/ManyToManyInsertOperation');
17
- const { ManyToManyRelateOperation } = require('./relate/ManyToManyRelateOperation');
18
-
19
- const { ManyToManyUnrelateOperation } = require('./unrelate/ManyToManyUnrelateOperation');
20
- const {
21
- ManyToManyUnrelateSqliteOperation,
22
- } = require('./unrelate/ManyToManyUnrelateSqliteOperation');
23
-
24
- const { ManyToManyUpdateOperation } = require('./update/ManyToManyUpdateOperation');
25
- const { ManyToManyUpdateSqliteOperation } = require('./update/ManyToManyUpdateSqliteOperation');
26
-
27
- const { ManyToManyDeleteOperation } = require('./delete/ManyToManyDeleteOperation');
28
- const { ManyToManyDeleteSqliteOperation } = require('./delete/ManyToManyDeleteSqliteOperation');
29
-
30
- class ManyToManyRelation extends Relation {
31
- setMapping(mapping) {
32
- const retVal = super.setMapping(mapping);
33
-
34
- let ctx = {
35
- mapping,
36
- ownerModelClass: this.ownerModelClass,
37
- relatedModelClass: this.relatedModelClass,
38
- ownerProp: this.ownerProp,
39
- relatedProp: this.relatedProp,
40
-
41
- joinTableModelClass: null,
42
- joinTableOwnerProp: null,
43
- joinTableRelatedProp: null,
44
- joinTableBeforeInsert: null,
45
- joinTableExtras: [],
46
-
47
- createError: (msg) => this.createError(msg),
48
- };
49
-
50
- ctx = checkThroughObject(ctx);
51
- ctx = resolveJoinModelClassIfDefined(ctx);
52
- ctx = createJoinProperties(ctx);
53
- ctx = parseExtras(ctx);
54
- ctx = parseModify(ctx);
55
- ctx = parseBeforeInsert(ctx);
56
- ctx = finalizeJoinModelClass(ctx);
57
-
58
- this.joinTableExtras = ctx.joinTableExtras;
59
- this.joinTableModify = ctx.joinTableModify;
60
- this.joinTableModelClass = ctx.joinTableModelClass;
61
- this.joinTableOwnerProp = ctx.joinTableOwnerProp;
62
- this.joinTableRelatedProp = ctx.joinTableRelatedProp;
63
- this.joinTableBeforeInsert = ctx.joinTableBeforeInsert;
64
-
65
- return retVal;
66
- }
67
-
68
- get forbiddenMappingProperties() {
69
- return [];
70
- }
71
-
72
- findQuery(builder, owner) {
73
- const joinTableOwnerRefs = this.joinTableOwnerProp.refs(builder);
74
- const joinTable = builder.tableNameFor(this.joinTable);
75
- const joinTableAlias = builder.tableRefFor(this.joinTable);
76
-
77
- let joinTableSelect = this.joinTableModelClass
78
- .query()
79
- .childQueryOf(builder)
80
- .modify(this.joinTableModify)
81
- .as(joinTableAlias);
82
- if (joinTableSelect.isSelectAll()) {
83
- joinTableSelect = aliasedTableName(joinTable, joinTableAlias);
84
- }
85
-
86
- builder.join(joinTableSelect, (join) => {
87
- this.relatedProp.forEach((i) => {
88
- const relatedRef = this.relatedProp.ref(builder, i);
89
- const joinTableRelatedRef = this.joinTableRelatedProp.ref(builder, i);
90
-
91
- join.on(relatedRef, joinTableRelatedRef);
92
- });
93
- });
94
-
95
- withWhereScope(builder, () => {
96
- owner.buildFindQuery(builder, this, joinTableOwnerRefs);
97
- });
98
-
99
- return this.applyModify(builder);
100
- }
101
-
102
- join(
103
- builder,
104
- {
105
- joinOperation = defaultJoinOperation(this, builder),
106
- relatedTableAlias = defaultRelatedTableAlias(this, builder),
107
- relatedJoinSelectQuery = defaultRelatedJoinSelectQuery(this, builder),
108
- relatedTable = defaultRelatedTable(this, builder),
109
- ownerTable = defaultOwnerTable(this, builder),
110
- joinTableAlias = defaultJoinTableAlias(this, relatedTableAlias, builder),
111
- } = {},
112
- ) {
113
- let relatedJoinSelect = this.applyModify(relatedJoinSelectQuery).as(relatedTableAlias);
114
-
115
- if (relatedJoinSelect.isSelectAll()) {
116
- // No need to join a subquery if the query is `select * from "RelatedTable"`.
117
- relatedJoinSelect = aliasedTableName(relatedTable, relatedTableAlias);
118
- }
119
-
120
- let joinTableSelect = this.joinTableModelClass
121
- .query()
122
- .childQueryOf(builder)
123
- .modify(this.joinTableModify)
124
- .as(joinTableAlias);
125
- if (joinTableSelect.isSelectAll()) {
126
- joinTableSelect = aliasedTableName(this.joinTable, joinTableAlias);
127
- }
128
-
129
- return builder[joinOperation](joinTableSelect, (join) => {
130
- const ownerProp = this.ownerProp;
131
- const joinTableOwnerProp = this.joinTableOwnerProp;
132
-
133
- ownerProp.forEach((i) => {
134
- const joinTableOwnerRef = joinTableOwnerProp.ref(builder, i).table(joinTableAlias);
135
- const ownerRef = ownerProp.ref(builder, i).table(ownerTable);
136
-
137
- join.on(joinTableOwnerRef, ownerRef);
138
- });
139
- })[joinOperation](relatedJoinSelect, (join) => {
140
- const relatedProp = this.relatedProp;
141
- const joinTableRelatedProp = this.joinTableRelatedProp;
142
-
143
- relatedProp.forEach((i) => {
144
- const joinTableRelatedRef = joinTableRelatedProp.ref(builder, i).table(joinTableAlias);
145
- const relatedRef = relatedProp.ref(builder, i).table(relatedTableAlias);
146
-
147
- join.on(joinTableRelatedRef, relatedRef);
148
- });
149
- });
150
- }
151
-
152
- find(_, owner) {
153
- return new ManyToManyFindOperation('find', {
154
- relation: this,
155
- owner,
156
- });
157
- }
158
-
159
- insert(_, owner) {
160
- return new ManyToManyInsertOperation('insert', {
161
- relation: this,
162
- owner,
163
- });
164
- }
165
-
166
- update(builder, owner) {
167
- if (isSqlite(builder.knex())) {
168
- return new ManyToManyUpdateSqliteOperation('update', {
169
- relation: this,
170
- owner,
171
- });
172
- } else {
173
- return new ManyToManyUpdateOperation('update', {
174
- relation: this,
175
- owner,
176
- });
177
- }
178
- }
179
-
180
- patch(builder, owner) {
181
- if (isSqlite(builder.knex())) {
182
- return new ManyToManyUpdateSqliteOperation('patch', {
183
- modelOptions: { patch: true },
184
- relation: this,
185
- owner,
186
- });
187
- } else {
188
- return new ManyToManyUpdateOperation('patch', {
189
- modelOptions: { patch: true },
190
- relation: this,
191
- owner,
192
- });
193
- }
194
- }
195
-
196
- delete(builder, owner) {
197
- if (isSqlite(builder.knex())) {
198
- return new ManyToManyDeleteSqliteOperation('delete', {
199
- relation: this,
200
- owner,
201
- });
202
- } else {
203
- return new ManyToManyDeleteOperation('delete', {
204
- relation: this,
205
- owner,
206
- });
207
- }
208
- }
209
-
210
- relate(builder, owner) {
211
- return new ManyToManyRelateOperation('relate', {
212
- relation: this,
213
- owner,
214
- });
215
- }
216
-
217
- unrelate(builder, owner) {
218
- if (isSqlite(builder.knex())) {
219
- return new ManyToManyUnrelateSqliteOperation('unrelate', {
220
- relation: this,
221
- owner,
222
- });
223
- } else {
224
- return new ManyToManyUnrelateOperation('unrelate', {
225
- relation: this,
226
- owner,
227
- });
228
- }
229
- }
230
-
231
- createJoinModels(ownerId, related) {
232
- return related.map((related) => this.createJoinModel(ownerId, related));
233
- }
234
-
235
- createJoinModel(ownerId, rel) {
236
- let joinModel = {};
237
-
238
- for (let j = 0, lp = this.joinTableOwnerProp.size; j < lp; ++j) {
239
- this.joinTableOwnerProp.setProp(joinModel, j, ownerId[j]);
240
- }
241
-
242
- for (let j = 0, lp = this.joinTableRelatedProp.size; j < lp; ++j) {
243
- const value = this.relatedProp.getProp(rel, j);
244
-
245
- if (value !== undefined) {
246
- this.joinTableRelatedProp.setProp(joinModel, j, value);
247
- }
248
- }
249
-
250
- for (const extra of this.joinTableExtras) {
251
- let extraValue = rel[extra.aliasProp];
252
-
253
- if (extraValue === undefined && rel.$$queryProps) {
254
- extraValue = rel.$$queryProps[extra.aliasProp];
255
- }
256
-
257
- if (extraValue !== undefined) {
258
- joinModel[extra.joinTableProp] = extraValue;
259
- }
260
- }
261
-
262
- return joinModel;
263
- }
264
-
265
- omitExtraProps(models) {
266
- if (this.joinTableExtras && this.joinTableExtras.length) {
267
- const props = this.joinTableExtras.map((extra) => extra.aliasProp);
268
-
269
- for (const model of models) {
270
- // Omit extra properties instead of deleting them from the models so that they can
271
- // be used in the `$before` and `$after` hooks.
272
- model.$omitFromDatabaseJson(props);
273
- }
274
- }
275
- }
276
-
277
- executeJoinTableBeforeInsert(models, queryContext, result) {
278
- return mapAfterAllReturn(
279
- models,
280
- (model) => this.joinTableBeforeInsert(model, queryContext),
281
- result,
282
- );
283
- }
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ManyToManyRelation = void 0;
4
+ const whereScopes_1 = require("../../queryBuilder/whereScopes");
5
+ const getModel_1 = require("../../model/getModel");
6
+ const Relation_1 = require("../Relation");
7
+ const RelationProperty_1 = require("../RelationProperty");
8
+ const knexUtils_1 = require("../../utils/knexUtils");
9
+ const inheritModel_1 = require("../../model/inheritModel");
10
+ const resolveModel_1 = require("../../utils/resolveModel");
11
+ const promiseUtils_1 = require("../../utils/promiseUtils");
12
+ const objectUtils_1 = require("../../utils/objectUtils");
13
+ const createModifier_1 = require("../../utils/createModifier");
14
+ const ManyToManyFindOperation_1 = require("./find/ManyToManyFindOperation");
15
+ const ManyToManyInsertOperation_1 = require("./insert/ManyToManyInsertOperation");
16
+ const ManyToManyRelateOperation_1 = require("./relate/ManyToManyRelateOperation");
17
+ const ManyToManyUnrelateOperation_1 = require("./unrelate/ManyToManyUnrelateOperation");
18
+ const ManyToManyUnrelateSqliteOperation_1 = require("./unrelate/ManyToManyUnrelateSqliteOperation");
19
+ const ManyToManyUpdateOperation_1 = require("./update/ManyToManyUpdateOperation");
20
+ const ManyToManyUpdateSqliteOperation_1 = require("./update/ManyToManyUpdateSqliteOperation");
21
+ const ManyToManyDeleteOperation_1 = require("./delete/ManyToManyDeleteOperation");
22
+ const ManyToManyDeleteSqliteOperation_1 = require("./delete/ManyToManyDeleteSqliteOperation");
23
+ class ManyToManyRelation extends Relation_1.Relation {
24
+ setMapping(mapping) {
25
+ const retVal = super.setMapping(mapping);
26
+ let ctx = {
27
+ mapping,
28
+ ownerModelClass: this.ownerModelClass,
29
+ relatedModelClass: this.relatedModelClass,
30
+ ownerProp: this.ownerProp,
31
+ relatedProp: this.relatedProp,
32
+ joinTableModelClass: null,
33
+ joinTableOwnerProp: null,
34
+ joinTableRelatedProp: null,
35
+ joinTableBeforeInsert: null,
36
+ joinTableExtras: [],
37
+ createError: (msg) => this.createError(msg),
38
+ };
39
+ ctx = checkThroughObject(ctx);
40
+ ctx = resolveJoinModelClassIfDefined(ctx);
41
+ ctx = createJoinProperties(ctx);
42
+ ctx = parseExtras(ctx);
43
+ ctx = parseModify(ctx);
44
+ ctx = parseBeforeInsert(ctx);
45
+ ctx = finalizeJoinModelClass(ctx);
46
+ this.joinTableExtras = ctx.joinTableExtras;
47
+ this.joinTableModify = ctx.joinTableModify;
48
+ this.joinTableModelClass = ctx.joinTableModelClass;
49
+ this.joinTableOwnerProp = ctx.joinTableOwnerProp;
50
+ this.joinTableRelatedProp = ctx.joinTableRelatedProp;
51
+ this.joinTableBeforeInsert = ctx.joinTableBeforeInsert;
52
+ return retVal;
53
+ }
54
+ get forbiddenMappingProperties() {
55
+ return [];
56
+ }
57
+ findQuery(builder, owner) {
58
+ const joinTableOwnerRefs = this.joinTableOwnerProp.refs(builder);
59
+ const joinTable = builder.tableNameFor(this.joinTable);
60
+ const joinTableAlias = builder.tableRefFor(this.joinTable);
61
+ let joinTableSelect = this.joinTableModelClass
62
+ .query()
63
+ .childQueryOf(builder)
64
+ .modify(this.joinTableModify)
65
+ .as(joinTableAlias);
66
+ if (joinTableSelect.isSelectAll()) {
67
+ joinTableSelect = aliasedTableName(joinTable, joinTableAlias);
68
+ }
69
+ builder.join(joinTableSelect, (join) => {
70
+ this.relatedProp.forEach((i) => {
71
+ const relatedRef = this.relatedProp.ref(builder, i);
72
+ const joinTableRelatedRef = this.joinTableRelatedProp.ref(builder, i);
73
+ join.on(relatedRef, joinTableRelatedRef);
74
+ });
75
+ });
76
+ (0, whereScopes_1.withWhereScope)(builder, () => {
77
+ owner.buildFindQuery(builder, this, joinTableOwnerRefs);
78
+ });
79
+ return this.applyModify(builder);
80
+ }
81
+ join(builder, { joinOperation = defaultJoinOperation(this, builder), relatedTableAlias = defaultRelatedTableAlias(this, builder), relatedJoinSelectQuery = defaultRelatedJoinSelectQuery(this, builder), relatedTable = defaultRelatedTable(this, builder), ownerTable = defaultOwnerTable(this, builder), joinTableAlias = defaultJoinTableAlias(this, relatedTableAlias, builder), } = {}) {
82
+ let relatedJoinSelect = this.applyModify(relatedJoinSelectQuery).as(relatedTableAlias);
83
+ if (relatedJoinSelect.isSelectAll()) {
84
+ // No need to join a subquery if the query is `select * from "RelatedTable"`.
85
+ relatedJoinSelect = aliasedTableName(relatedTable, relatedTableAlias);
86
+ }
87
+ let joinTableSelect = this.joinTableModelClass
88
+ .query()
89
+ .childQueryOf(builder)
90
+ .modify(this.joinTableModify)
91
+ .as(joinTableAlias);
92
+ if (joinTableSelect.isSelectAll()) {
93
+ joinTableSelect = aliasedTableName(this.joinTable, joinTableAlias);
94
+ }
95
+ return builder[joinOperation](joinTableSelect, (join) => {
96
+ const ownerProp = this.ownerProp;
97
+ const joinTableOwnerProp = this.joinTableOwnerProp;
98
+ ownerProp.forEach((i) => {
99
+ const joinTableOwnerRef = joinTableOwnerProp.ref(builder, i).table(joinTableAlias);
100
+ const ownerRef = ownerProp.ref(builder, i).table(ownerTable);
101
+ join.on(joinTableOwnerRef, ownerRef);
102
+ });
103
+ })[joinOperation](relatedJoinSelect, (join) => {
104
+ const relatedProp = this.relatedProp;
105
+ const joinTableRelatedProp = this.joinTableRelatedProp;
106
+ relatedProp.forEach((i) => {
107
+ const joinTableRelatedRef = joinTableRelatedProp.ref(builder, i).table(joinTableAlias);
108
+ const relatedRef = relatedProp.ref(builder, i).table(relatedTableAlias);
109
+ join.on(joinTableRelatedRef, relatedRef);
110
+ });
111
+ });
112
+ }
113
+ find(_, owner) {
114
+ return new ManyToManyFindOperation_1.ManyToManyFindOperation('find', {
115
+ relation: this,
116
+ owner,
117
+ });
118
+ }
119
+ insert(_, owner) {
120
+ return new ManyToManyInsertOperation_1.ManyToManyInsertOperation('insert', {
121
+ relation: this,
122
+ owner,
123
+ });
124
+ }
125
+ update(builder, owner) {
126
+ if ((0, knexUtils_1.isSqlite)(builder.knex())) {
127
+ return new ManyToManyUpdateSqliteOperation_1.ManyToManyUpdateSqliteOperation('update', {
128
+ relation: this,
129
+ owner,
130
+ });
131
+ }
132
+ else {
133
+ return new ManyToManyUpdateOperation_1.ManyToManyUpdateOperation('update', {
134
+ relation: this,
135
+ owner,
136
+ });
137
+ }
138
+ }
139
+ patch(builder, owner) {
140
+ if ((0, knexUtils_1.isSqlite)(builder.knex())) {
141
+ return new ManyToManyUpdateSqliteOperation_1.ManyToManyUpdateSqliteOperation('patch', {
142
+ modelOptions: { patch: true },
143
+ relation: this,
144
+ owner,
145
+ });
146
+ }
147
+ else {
148
+ return new ManyToManyUpdateOperation_1.ManyToManyUpdateOperation('patch', {
149
+ modelOptions: { patch: true },
150
+ relation: this,
151
+ owner,
152
+ });
153
+ }
154
+ }
155
+ delete(builder, owner) {
156
+ if ((0, knexUtils_1.isSqlite)(builder.knex())) {
157
+ return new ManyToManyDeleteSqliteOperation_1.ManyToManyDeleteSqliteOperation('delete', {
158
+ relation: this,
159
+ owner,
160
+ });
161
+ }
162
+ else {
163
+ return new ManyToManyDeleteOperation_1.ManyToManyDeleteOperation('delete', {
164
+ relation: this,
165
+ owner,
166
+ });
167
+ }
168
+ }
169
+ relate(builder, owner) {
170
+ return new ManyToManyRelateOperation_1.ManyToManyRelateOperation('relate', {
171
+ relation: this,
172
+ owner,
173
+ });
174
+ }
175
+ unrelate(builder, owner) {
176
+ if ((0, knexUtils_1.isSqlite)(builder.knex())) {
177
+ return new ManyToManyUnrelateSqliteOperation_1.ManyToManyUnrelateSqliteOperation('unrelate', {
178
+ relation: this,
179
+ owner,
180
+ });
181
+ }
182
+ else {
183
+ return new ManyToManyUnrelateOperation_1.ManyToManyUnrelateOperation('unrelate', {
184
+ relation: this,
185
+ owner,
186
+ });
187
+ }
188
+ }
189
+ createJoinModels(ownerId, related) {
190
+ return related.map((related) => this.createJoinModel(ownerId, related));
191
+ }
192
+ // `rel` is a related model, or an id object (see ManyToManyRelateOperation).
193
+ createJoinModel(ownerId, rel) {
194
+ const joinModel = {};
195
+ for (let j = 0, lp = this.joinTableOwnerProp.size; j < lp; ++j) {
196
+ this.joinTableOwnerProp.setProp(joinModel, j, ownerId[j]);
197
+ }
198
+ for (let j = 0, lp = this.joinTableRelatedProp.size; j < lp; ++j) {
199
+ const value = this.relatedProp.getProp(rel, j);
200
+ if (value !== undefined) {
201
+ this.joinTableRelatedProp.setProp(joinModel, j, value);
202
+ }
203
+ }
204
+ for (const extra of this.joinTableExtras) {
205
+ let extraValue = rel[extra.aliasProp];
206
+ if (extraValue === undefined && rel.$$queryProps) {
207
+ extraValue = rel.$$queryProps[extra.aliasProp];
208
+ }
209
+ if (extraValue !== undefined) {
210
+ joinModel[extra.joinTableProp] = extraValue;
211
+ }
212
+ }
213
+ return joinModel;
214
+ }
215
+ omitExtraProps(models) {
216
+ if (this.joinTableExtras && this.joinTableExtras.length) {
217
+ const props = this.joinTableExtras.map((extra) => extra.aliasProp);
218
+ for (const model of models) {
219
+ // Omit extra properties instead of deleting them from the models so that they can
220
+ // be used in the `$before` and `$after` hooks.
221
+ model.$omitFromDatabaseJson(props);
222
+ }
223
+ }
224
+ }
225
+ executeJoinTableBeforeInsert(models, queryContext, result) {
226
+ return (0, promiseUtils_1.mapAfterAllReturn)(models, (model) => this.joinTableBeforeInsert(model, queryContext), result);
227
+ }
284
228
  }
285
-
229
+ exports.ManyToManyRelation = ManyToManyRelation;
286
230
  Object.defineProperties(ManyToManyRelation.prototype, {
287
- isObjectionManyToManyRelation: {
288
- enumerable: false,
289
- writable: false,
290
- value: true,
291
- },
231
+ isObjectionManyToManyRelation: {
232
+ enumerable: false,
233
+ writable: false,
234
+ value: true,
235
+ },
292
236
  });
293
-
294
237
  function defaultJoinOperation() {
295
- return 'join';
238
+ return 'join';
296
239
  }
297
-
298
240
  function defaultRelatedTableAlias(relation, builder) {
299
- return builder.tableRefFor(relation.relatedModelClass);
241
+ return builder.tableRefFor(relation.relatedModelClass);
300
242
  }
301
-
302
243
  function defaultRelatedJoinSelectQuery(relation, builder) {
303
- return relation.relatedModelClass.query().childQueryOf(builder);
244
+ return relation.relatedModelClass.query().childQueryOf(builder);
304
245
  }
305
-
306
246
  function defaultRelatedTable(relation, builder) {
307
- return builder.tableNameFor(relation.relatedModelClass);
247
+ return builder.tableNameFor(relation.relatedModelClass);
308
248
  }
309
-
310
249
  function defaultOwnerTable(relation, builder) {
311
- return builder.tableRefFor(relation.ownerModelClass);
250
+ return builder.tableRefFor(relation.ownerModelClass);
312
251
  }
313
-
314
252
  function defaultJoinTableAlias(relation, relatedTableAlias, builder) {
315
- const alias = builder.tableRefFor(relation.joinTable);
316
-
317
- if (alias === relation.joinTable) {
318
- return relation.ownerModelClass.joinTableAlias(relatedTableAlias);
319
- } else {
320
- return alias;
321
- }
253
+ const alias = builder.tableRefFor(relation.joinTable);
254
+ if (alias === relation.joinTable) {
255
+ return relation.ownerModelClass.joinTableAlias(relatedTableAlias);
256
+ }
257
+ else {
258
+ return alias;
259
+ }
322
260
  }
323
-
324
261
  function aliasedTableName(tableName, alias) {
325
- if (tableName === alias) {
326
- return tableName;
327
- } else {
328
- return `${tableName} as ${alias}`;
329
- }
262
+ if (tableName === alias) {
263
+ return tableName;
264
+ }
265
+ else {
266
+ return `${tableName} as ${alias}`;
267
+ }
330
268
  }
331
-
332
269
  function checkThroughObject(ctx) {
333
- const mapping = ctx.mapping;
334
-
335
- if (!isObject(mapping.join.through)) {
336
- throw ctx.createError('join must have a `through` object that describes the join table.');
337
- }
338
-
339
- if (!mapping.join.through.from || !mapping.join.through.to) {
340
- throw ctx.createError(
341
- 'join.through must be an object that describes the join table. For example: {from: "JoinTable.someId", to: "JoinTable.someOtherId"}',
342
- );
343
- }
344
-
345
- return ctx;
270
+ const mapping = ctx.mapping;
271
+ if (!(0, objectUtils_1.isObject)(mapping.join.through)) {
272
+ throw ctx.createError('join must have a `through` object that describes the join table.');
273
+ }
274
+ if (!mapping.join.through.from || !mapping.join.through.to) {
275
+ throw ctx.createError('join.through must be an object that describes the join table. For example: {from: "JoinTable.someId", to: "JoinTable.someOtherId"}');
276
+ }
277
+ return ctx;
346
278
  }
347
-
348
279
  function resolveJoinModelClassIfDefined(ctx) {
349
- let joinTableModelClass = null;
350
-
351
- if (ctx.mapping.join.through.modelClass) {
352
- try {
353
- joinTableModelClass = resolveModel(
354
- ctx.mapping.join.through.modelClass,
355
- ctx.ownerModelClass.modelPaths,
356
- 'join.through.modelClass',
357
- );
358
- } catch (err) {
359
- throw ctx.createError(err.message);
360
- }
361
- }
362
-
363
- return Object.assign(ctx, { joinTableModelClass });
280
+ let joinTableModelClass = null;
281
+ if (ctx.mapping.join.through.modelClass) {
282
+ try {
283
+ // undefined only for a relative path without `modelPaths`, which then
284
+ // fails further on, as it did in the JavaScript code.
285
+ joinTableModelClass = (0, resolveModel_1.resolveModel)(ctx.mapping.join.through.modelClass, ctx.ownerModelClass.modelPaths, 'join.through.modelClass');
286
+ }
287
+ catch (err) {
288
+ throw ctx.createError(err.message);
289
+ }
290
+ }
291
+ return Object.assign(ctx, { joinTableModelClass });
364
292
  }
365
-
366
293
  function createJoinProperties(ctx) {
367
- let ret;
368
-
369
- let fromProp;
370
- let toProp;
371
-
372
- let relatedProp;
373
- let ownerProp;
374
-
375
- ret = createRelationProperty(ctx, ctx.mapping.join.through.from, 'join.through.from');
376
- fromProp = ret.prop;
377
- ctx = ret.ctx;
378
-
379
- ret = createRelationProperty(ctx, ctx.mapping.join.through.to, 'join.through.to');
380
- toProp = ret.prop;
381
- ctx = ret.ctx;
382
-
383
- if (fromProp.modelClass.getTableName() !== toProp.modelClass.getTableName()) {
384
- throw ctx.createError('join.through `from` and `to` must point to the same join table.');
385
- }
386
-
387
- if (ctx.relatedProp.modelClass.getTableName() === fromProp.modelClass.getTableName()) {
388
- relatedProp = fromProp;
389
- ownerProp = toProp;
390
- } else {
391
- relatedProp = toProp;
392
- ownerProp = fromProp;
393
- }
394
-
395
- return Object.assign(ctx, {
396
- joinTableOwnerProp: ownerProp,
397
- joinTableRelatedProp: relatedProp,
398
- });
294
+ let ret;
295
+ let fromProp;
296
+ let toProp;
297
+ let relatedProp;
298
+ let ownerProp;
299
+ ret = createRelationProperty(ctx, ctx.mapping.join.through.from, 'join.through.from');
300
+ fromProp = ret.prop;
301
+ ctx = ret.ctx;
302
+ ret = createRelationProperty(ctx, ctx.mapping.join.through.to, 'join.through.to');
303
+ toProp = ret.prop;
304
+ ctx = ret.ctx;
305
+ if (fromProp.modelClass.getTableName() !== toProp.modelClass.getTableName()) {
306
+ throw ctx.createError('join.through `from` and `to` must point to the same join table.');
307
+ }
308
+ if (ctx.relatedProp.modelClass.getTableName() === fromProp.modelClass.getTableName()) {
309
+ relatedProp = fromProp;
310
+ ownerProp = toProp;
311
+ }
312
+ else {
313
+ relatedProp = toProp;
314
+ ownerProp = fromProp;
315
+ }
316
+ return Object.assign(ctx, {
317
+ joinTableOwnerProp: ownerProp,
318
+ joinTableRelatedProp: relatedProp,
319
+ });
399
320
  }
400
-
401
321
  function createRelationProperty(ctx, refString, messagePrefix) {
402
- let prop = null;
403
- let joinTableModelClass = ctx.joinTableModelClass;
404
-
405
- const resolveModelClass = (table) => {
406
- if (joinTableModelClass === null) {
407
- joinTableModelClass = inheritModel(getModel());
408
- joinTableModelClass.tableName = table;
409
- joinTableModelClass.idColumn = null;
410
- joinTableModelClass.concurrency = ctx.ownerModelClass.concurrency;
411
- }
412
-
413
- if (joinTableModelClass.getTableName() === table) {
414
- return joinTableModelClass;
415
- } else {
416
- return null;
417
- }
418
- };
419
-
420
- try {
421
- prop = new RelationProperty(refString, resolveModelClass);
422
- } catch (err) {
423
- if (err instanceof RelationProperty.ModelNotFoundError) {
424
- throw ctx.createError('join.through `from` and `to` must point to the same join table.');
425
- } else {
426
- throw ctx.createError(
427
- `${messagePrefix} must have format JoinTable.columnName. For example "JoinTable.someId" or in case of composite key ["JoinTable.a", "JoinTable.b"].`,
428
- );
429
- }
430
- }
431
-
432
- return {
433
- ctx: Object.assign(ctx, { joinTableModelClass }),
434
- prop,
435
- };
436
- }
437
-
438
- function parseExtras(ctx) {
439
- let extraDef = ctx.mapping.join.through.extra;
440
-
441
- if (!extraDef) {
442
- return ctx;
443
- }
444
-
445
- if (isString(extraDef)) {
446
- extraDef = {
447
- [extraDef]: extraDef,
322
+ let prop = null;
323
+ let joinTableModelClass = ctx.joinTableModelClass;
324
+ const resolveModelClass = (table) => {
325
+ if (joinTableModelClass === null) {
326
+ joinTableModelClass = (0, inheritModel_1.inheritModel)((0, getModel_1.getModel)());
327
+ joinTableModelClass.tableName = table;
328
+ joinTableModelClass.idColumn = null;
329
+ joinTableModelClass.concurrency = ctx.ownerModelClass.concurrency;
330
+ }
331
+ if (joinTableModelClass.getTableName() === table) {
332
+ return joinTableModelClass;
333
+ }
334
+ else {
335
+ return null;
336
+ }
448
337
  };
449
- } else if (Array.isArray(extraDef)) {
450
- extraDef = extraDef.reduce((extraDef, col) => {
451
- extraDef[col] = col;
452
- return extraDef;
453
- }, {});
454
- }
455
-
456
- const joinTableExtras = Object.keys(extraDef).map((key) => {
457
- const val = extraDef[key];
458
-
338
+ try {
339
+ prop = new RelationProperty_1.RelationProperty(refString, resolveModelClass);
340
+ }
341
+ catch (err) {
342
+ if (err instanceof RelationProperty_1.RelationProperty.ModelNotFoundError) {
343
+ throw ctx.createError('join.through `from` and `to` must point to the same join table.');
344
+ }
345
+ else {
346
+ throw ctx.createError(`${messagePrefix} must have format JoinTable.columnName. For example "JoinTable.someId" or in case of composite key ["JoinTable.a", "JoinTable.b"].`);
347
+ }
348
+ }
459
349
  return {
460
- joinTableCol: val,
461
- joinTableProp: ctx.joinTableModelClass.columnNameToPropertyName(val),
462
- aliasCol: key,
463
- aliasProp: ctx.joinTableModelClass.columnNameToPropertyName(key),
350
+ ctx: Object.assign(ctx, { joinTableModelClass }),
351
+ prop,
464
352
  };
465
- });
466
-
467
- return Object.assign(ctx, { joinTableExtras });
468
353
  }
469
-
470
- function parseModify(ctx) {
471
- const mapping = ctx.mapping.join.through;
472
- const modifier = mapping.modify || mapping.filter;
473
- const joinTableModify =
474
- modifier &&
475
- createModifier({
476
- modifier,
477
- modelClass: ctx.relatedModelClass,
354
+ function parseExtras(ctx) {
355
+ let extraDef = ctx.mapping.join.through.extra;
356
+ if (!extraDef) {
357
+ return ctx;
358
+ }
359
+ if ((0, objectUtils_1.isString)(extraDef)) {
360
+ extraDef = {
361
+ [extraDef]: extraDef,
362
+ };
363
+ }
364
+ else if (Array.isArray(extraDef)) {
365
+ extraDef = extraDef.reduce((extraDef, col) => {
366
+ extraDef[col] = col;
367
+ return extraDef;
368
+ }, {});
369
+ }
370
+ const joinTableExtras = Object.keys(extraDef).map((key) => {
371
+ const val = extraDef[key];
372
+ return {
373
+ joinTableCol: val,
374
+ joinTableProp: ctx.joinTableModelClass.columnNameToPropertyName(val),
375
+ aliasCol: key,
376
+ aliasProp: ctx.joinTableModelClass.columnNameToPropertyName(key),
377
+ };
478
378
  });
479
-
480
- return Object.assign(ctx, { joinTableModify });
379
+ return Object.assign(ctx, { joinTableExtras });
380
+ }
381
+ function parseModify(ctx) {
382
+ const mapping = ctx.mapping.join.through;
383
+ const modifier = mapping.modify || mapping.filter;
384
+ const joinTableModify = modifier &&
385
+ (0, createModifier_1.createModifier)({
386
+ modifier,
387
+ modelClass: ctx.relatedModelClass,
388
+ });
389
+ return Object.assign(ctx, { joinTableModify });
481
390
  }
482
-
483
391
  function parseBeforeInsert(ctx) {
484
- let joinTableBeforeInsert;
485
-
486
- if (isFunction(ctx.mapping.join.through.beforeInsert)) {
487
- joinTableBeforeInsert = ctx.mapping.join.through.beforeInsert;
488
- } else {
489
- joinTableBeforeInsert = (model) => model;
490
- }
491
-
492
- return Object.assign(ctx, { joinTableBeforeInsert });
392
+ let joinTableBeforeInsert;
393
+ if ((0, objectUtils_1.isFunction)(ctx.mapping.join.through.beforeInsert)) {
394
+ joinTableBeforeInsert = ctx.mapping.join.through.beforeInsert;
395
+ }
396
+ else {
397
+ joinTableBeforeInsert = (model) => model;
398
+ }
399
+ return Object.assign(ctx, { joinTableBeforeInsert });
493
400
  }
494
-
495
401
  function finalizeJoinModelClass(ctx) {
496
- if (ctx.joinTableModelClass.getIdColumn() === null) {
497
- // We cannot know if the join table has a primary key. Therefore we set some
498
- // known column as the idColumn so that inserts will work.
499
- ctx.joinTableModelClass.idColumn = ctx.joinTableRelatedProp.cols;
500
- }
501
-
502
- return ctx;
402
+ if (ctx.joinTableModelClass.getIdColumn() === null) {
403
+ // We cannot know if the join table has a primary key. Therefore we set some
404
+ // known column as the idColumn so that inserts will work.
405
+ ctx.joinTableModelClass.idColumn = ctx.joinTableRelatedProp.cols;
406
+ }
407
+ return ctx;
503
408
  }
504
-
505
- module.exports = {
506
- ManyToManyRelation,
507
- };