@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,103 @@
1
+ 'use strict';
2
+
3
+ const { QueryBuilderOperation } = require('./QueryBuilderOperation');
4
+ const { RelationExpression } = require('../RelationExpression');
5
+ const { RelationJoiner } = require('../join/RelationJoiner');
6
+ const { isString } = require('../../utils/objectUtils');
7
+
8
+ class JoinRelatedOperation extends QueryBuilderOperation {
9
+ constructor(name, opt) {
10
+ super(name, opt);
11
+ this.calls = [];
12
+ }
13
+
14
+ get joinOperation() {
15
+ return this.opt.joinOperation;
16
+ }
17
+
18
+ addCall(call) {
19
+ this.calls.push(call);
20
+ }
21
+
22
+ onBuild(builder) {
23
+ const modelClass = builder.modelClass();
24
+ const joinOperation = this.joinOperation;
25
+ let mergedExpr = RelationExpression.create();
26
+
27
+ for (const call of this.calls) {
28
+ const expr = RelationExpression.create(call.expression).toPojo();
29
+ const childNames = expr.$childNames;
30
+ const options = call.options || {};
31
+
32
+ if (childNames.length === 1) {
33
+ applyAlias(expr, modelClass, builder, options);
34
+ }
35
+
36
+ if (options.aliases) {
37
+ applyAliases(expr, modelClass, options);
38
+ }
39
+
40
+ mergedExpr = mergedExpr.merge(expr);
41
+ }
42
+
43
+ const joiner = new RelationJoiner({
44
+ modelClass,
45
+ });
46
+
47
+ joiner.setOptions({ joinOperation });
48
+ joiner.setExpression(mergedExpr);
49
+ joiner.setModifiers(builder.modifiers());
50
+ joiner.build(builder, false);
51
+ }
52
+
53
+ clone() {
54
+ const clone = super.clone();
55
+ clone.calls = this.calls.slice();
56
+ return clone;
57
+ }
58
+ }
59
+
60
+ function applyAlias(expr, modelClass, builder, options) {
61
+ const childNames = expr.$childNames;
62
+ const childName = childNames[0];
63
+ const childExpr = expr[childName];
64
+ const relation = modelClass.getRelation(childExpr.$relation);
65
+
66
+ let alias = childName;
67
+
68
+ if (options.alias === false) {
69
+ alias = builder.tableRefFor(relation.relatedModelClass);
70
+ } else if (isString(options.alias)) {
71
+ alias = options.alias;
72
+ }
73
+
74
+ if (childName !== alias) {
75
+ renameRelationExpressionNode(expr, childName, alias);
76
+ }
77
+ }
78
+
79
+ function applyAliases(expr, modelClass, options) {
80
+ for (const childName of expr.$childNames) {
81
+ const childExpr = expr[childName];
82
+ const relation = modelClass.getRelation(childExpr.$relation);
83
+ const alias = options.aliases[childExpr.$relation];
84
+
85
+ if (alias && alias !== childName) {
86
+ renameRelationExpressionNode(expr, childName, alias);
87
+ }
88
+
89
+ applyAliases(childExpr, relation.relatedModelClass, options);
90
+ }
91
+ }
92
+
93
+ function renameRelationExpressionNode(expr, oldName, newName) {
94
+ const childExpr = expr[oldName];
95
+ delete expr[oldName];
96
+ expr[newName] = childExpr;
97
+ childExpr.$name = newName;
98
+ expr.$childNames = expr.$childNames.map((it) => (it === oldName ? newName : it));
99
+ }
100
+
101
+ module.exports = {
102
+ JoinRelatedOperation,
103
+ };
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ const { ObjectionToKnexConvertingOperation } = require('./ObjectionToKnexConvertingOperation');
4
+
5
+ // An operation that simply calls the equivalent knex method.
6
+ class KnexOperation extends ObjectionToKnexConvertingOperation {
7
+ onBuildKnex(knexBuilder, builder) {
8
+ return knexBuilder[this.name].apply(knexBuilder, this.getKnexArgs(builder));
9
+ }
10
+ }
11
+
12
+ module.exports = {
13
+ KnexOperation,
14
+ };
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+
3
+ const { isFunction, isEmpty, isObject } = require('../../utils/objectUtils');
4
+ const { QueryBuilderOperation } = require('./QueryBuilderOperation');
5
+ const { convertFieldExpressionsToRaw } = require('./UpdateOperation');
6
+
7
+ class MergeOperation extends QueryBuilderOperation {
8
+ constructor(name, opt) {
9
+ super(name, opt);
10
+ this.model = null;
11
+ this.args = null;
12
+ }
13
+
14
+ onAdd(builder, args) {
15
+ this.args = args;
16
+
17
+ if (!isEmpty(args) && isObject(args[0]) && !Array.isArray(args[0])) {
18
+ const json = args[0];
19
+ const modelClass = builder.modelClass();
20
+
21
+ this.model = modelClass.ensureModel(json, { patch: true });
22
+ }
23
+
24
+ return true;
25
+ }
26
+
27
+ onBuildKnex(knexBuilder, builder) {
28
+ if (!isFunction(knexBuilder.merge)) {
29
+ throw new Error('merge method can only be chained right after onConflict method');
30
+ }
31
+
32
+ if (this.model) {
33
+ const json = this.model.$toDatabaseJson(builder);
34
+ const convertedJson = convertFieldExpressionsToRaw(builder, this.model, json);
35
+
36
+ return knexBuilder.merge(convertedJson);
37
+ }
38
+
39
+ return knexBuilder.merge(...this.args);
40
+ }
41
+
42
+ toFindOperation() {
43
+ return null;
44
+ }
45
+
46
+ clone() {
47
+ const clone = super.clone();
48
+ clone.model = this.model;
49
+ clone.args = this.args;
50
+ return clone;
51
+ }
52
+ }
53
+
54
+ module.exports = {
55
+ MergeOperation,
56
+ };
@@ -0,0 +1,192 @@
1
+ 'use strict';
2
+
3
+ const { QueryBuilderOperation } = require('./QueryBuilderOperation');
4
+ const { isPlainObject, isObject, isFunction, once } = require('../../utils/objectUtils');
5
+ const { isKnexQueryBuilder, isKnexJoinBuilder } = require('../../utils/knexUtils');
6
+ const { transformation } = require('../transformations');
7
+ const { isModelClass } = require('../../utils/resolveModel');
8
+ const getJoinBuilder = once(() => require('../JoinBuilder').JoinBuilder);
9
+
10
+ // An abstract operation base class that converts all arguments from objection types
11
+ // to knex types. For example objection query builders are converted into knex query
12
+ // builders and objection RawBuilder instances are converted into knex Raw instances.
13
+ class ObjectionToKnexConvertingOperation extends QueryBuilderOperation {
14
+ constructor(name, opt) {
15
+ super(name, opt);
16
+ this.args = null;
17
+ }
18
+
19
+ getKnexArgs(builder) {
20
+ return convertArgs(this.name, builder, this.args);
21
+ }
22
+
23
+ onAdd(builder, args) {
24
+ this.args = Array.from(args);
25
+ return shouldBeAdded(this.name, builder, this.args);
26
+ }
27
+
28
+ clone() {
29
+ const clone = super.clone();
30
+ clone.args = this.args;
31
+ return clone;
32
+ }
33
+ }
34
+
35
+ function shouldBeAdded(opName, builder, args) {
36
+ const skipUndefined = builder.internalOptions().skipUndefined;
37
+
38
+ for (let i = 0, l = args.length; i < l; ++i) {
39
+ const arg = args[i];
40
+
41
+ if (isUndefined(arg)) {
42
+ if (skipUndefined) {
43
+ return false;
44
+ } else {
45
+ throw new Error(
46
+ `undefined passed as argument #${i} for '${opName}' operation. Call skipUndefined() method to ignore the undefined values.`,
47
+ );
48
+ }
49
+ }
50
+ }
51
+
52
+ return true;
53
+ }
54
+
55
+ function convertArgs(opName, builder, args) {
56
+ const skipUndefined = builder.internalOptions().skipUndefined;
57
+
58
+ return args.map((arg, i) => {
59
+ if (hasToKnexRawMethod(arg)) {
60
+ return convertToKnexRaw(arg, builder);
61
+ } else if (isObjectionQueryBuilderBase(arg)) {
62
+ return convertQueryBuilderBase(arg, builder);
63
+ } else if (isArray(arg)) {
64
+ return convertArray(arg, builder, i, opName, skipUndefined);
65
+ } else if (isModelClass(arg)) {
66
+ // Model classes can be used in place of their table names, for example
67
+ // `join(Pet, ...)`. They are functions, so this check must come first.
68
+ return arg.getTableName();
69
+ } else if (isFunction(arg)) {
70
+ return convertFunction(arg, builder);
71
+ } else if (isModel(arg)) {
72
+ return convertModel(arg);
73
+ } else if (isPlainObject(arg)) {
74
+ return convertPlainObject(arg, builder, i, opName, skipUndefined);
75
+ } else {
76
+ return arg;
77
+ }
78
+ });
79
+ }
80
+
81
+ function isUndefined(item) {
82
+ return item === undefined;
83
+ }
84
+
85
+ function hasToKnexRawMethod(item) {
86
+ return isObject(item) && isFunction(item.toKnexRaw);
87
+ }
88
+
89
+ function convertToKnexRaw(item, builder) {
90
+ return item.toKnexRaw(builder);
91
+ }
92
+
93
+ function isObjectionQueryBuilderBase(item) {
94
+ return isObject(item) && item.isObjectionQueryBuilderBase === true;
95
+ }
96
+
97
+ function convertQueryBuilderBase(item, builder) {
98
+ item = transformation.onConvertQueryBuilderBase(item, builder);
99
+ return item.subqueryOf(builder).toKnexQuery();
100
+ }
101
+
102
+ function isArray(item) {
103
+ return Array.isArray(item);
104
+ }
105
+
106
+ function convertArray(arr, builder, i, opName, skipUndefined) {
107
+ return arr.map((item) => {
108
+ if (item === undefined) {
109
+ if (!skipUndefined) {
110
+ throw new Error(
111
+ `undefined passed as an item in argument #${i} for '${opName}' operation. Call skipUndefined() method to ignore the undefined values.`,
112
+ );
113
+ }
114
+ } else if (hasToKnexRawMethod(item)) {
115
+ return convertToKnexRaw(item, builder);
116
+ } else if (isObjectionQueryBuilderBase(item)) {
117
+ return convertQueryBuilderBase(item, builder);
118
+ } else if (isModelClass(item)) {
119
+ return item.getTableName();
120
+ } else {
121
+ return item;
122
+ }
123
+ });
124
+ }
125
+
126
+ function convertFunction(func, builder) {
127
+ return function convertedKnexArgumentFunction(...args) {
128
+ if (isKnexQueryBuilder(this)) {
129
+ convertQueryBuilderFunction(this, func, builder);
130
+ } else if (isKnexJoinBuilder(this)) {
131
+ convertJoinBuilderFunction(this, func, builder);
132
+ } else {
133
+ return func.apply(this, args);
134
+ }
135
+ };
136
+ }
137
+
138
+ function convertQueryBuilderFunction(knexQueryBuilder, func, builder) {
139
+ const convertedQueryBuilder = builder.constructor.forClass(builder.modelClass());
140
+
141
+ convertedQueryBuilder.isPartial(true).subqueryOf(builder);
142
+ func.call(convertedQueryBuilder, convertedQueryBuilder);
143
+
144
+ convertedQueryBuilder.toKnexQuery(knexQueryBuilder);
145
+ }
146
+
147
+ function convertJoinBuilderFunction(knexJoinBuilder, func, builder) {
148
+ const JoinBuilder = getJoinBuilder();
149
+ const joinClauseBuilder = JoinBuilder.forClass(builder.modelClass());
150
+
151
+ joinClauseBuilder.isPartial(true).subqueryOf(builder);
152
+ func.call(joinClauseBuilder, joinClauseBuilder);
153
+
154
+ joinClauseBuilder.toKnexQuery(knexJoinBuilder);
155
+ }
156
+
157
+ function isModel(item) {
158
+ return isObject(item) && item.$isObjectionModel;
159
+ }
160
+
161
+ function convertModel(model) {
162
+ return model.$toDatabaseJson();
163
+ }
164
+
165
+ function convertPlainObject(obj, builder, i, opName, skipUndefined) {
166
+ return Object.keys(obj).reduce((out, key) => {
167
+ const item = obj[key];
168
+
169
+ if (item === undefined) {
170
+ if (!skipUndefined) {
171
+ throw new Error(
172
+ `undefined passed as a property in argument #${i} for '${opName}' operation. Call skipUndefined() method to ignore the undefined values.`,
173
+ );
174
+ }
175
+ } else if (hasToKnexRawMethod(item)) {
176
+ out[key] = convertToKnexRaw(item, builder);
177
+ } else if (isObjectionQueryBuilderBase(item)) {
178
+ out[key] = convertQueryBuilderBase(item, builder);
179
+ } else if (isModelClass(item)) {
180
+ // `{ alias: ModelClass }`.
181
+ out[key] = item.getTableName();
182
+ } else {
183
+ out[key] = item;
184
+ }
185
+
186
+ return out;
187
+ }, {});
188
+ }
189
+
190
+ module.exports = {
191
+ ObjectionToKnexConvertingOperation,
192
+ };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ const { QueryBuilderOperation } = require('./QueryBuilderOperation');
4
+
5
+ class OnBuildKnexOperation extends QueryBuilderOperation {
6
+ constructor(name, opt) {
7
+ super(name, opt);
8
+ this.func = null;
9
+ }
10
+
11
+ onAdd(_, args) {
12
+ this.func = args[0];
13
+ return true;
14
+ }
15
+
16
+ onBuildKnex(knexBuilder, builder) {
17
+ return this.func.call(knexBuilder, knexBuilder, builder);
18
+ }
19
+
20
+ clone() {
21
+ const clone = super.clone();
22
+ clone.func = this.func;
23
+ return clone;
24
+ }
25
+ }
26
+
27
+ module.exports = {
28
+ OnBuildKnexOperation,
29
+ };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ const { QueryBuilderOperation } = require('./QueryBuilderOperation');
4
+
5
+ class OnBuildOperation extends QueryBuilderOperation {
6
+ constructor(name, opt) {
7
+ super(name, opt);
8
+ this.func = null;
9
+ }
10
+
11
+ onAdd(_, args) {
12
+ this.func = args[0];
13
+ return true;
14
+ }
15
+
16
+ onBuild(builder) {
17
+ return this.func.call(builder, builder);
18
+ }
19
+
20
+ clone() {
21
+ const clone = super.clone();
22
+ clone.func = this.func;
23
+ return clone;
24
+ }
25
+ }
26
+
27
+ module.exports = {
28
+ OnBuildOperation,
29
+ };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ const { QueryBuilderOperation } = require('./QueryBuilderOperation');
4
+
5
+ class OnErrorOperation extends QueryBuilderOperation {
6
+ constructor(name, opt) {
7
+ super(name, opt);
8
+ this.func = null;
9
+ }
10
+
11
+ onAdd(_, args) {
12
+ this.func = args[0];
13
+ return true;
14
+ }
15
+
16
+ onError(builder, error) {
17
+ return this.func.call(builder, error, builder);
18
+ }
19
+
20
+ clone() {
21
+ const clone = super.clone();
22
+ clone.func = this.func;
23
+ return clone;
24
+ }
25
+ }
26
+
27
+ module.exports = {
28
+ OnErrorOperation,
29
+ };