@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,82 +1,83 @@
1
1
  'use strict';
2
-
3
2
  const { isObject } = require('../utils/objectUtils');
4
-
5
3
  function parseRelationsIntoModelInstances(model, json, options = {}) {
6
- if (!options.cache) {
7
- options = Object.assign({}, options, {
8
- cache: new Map(),
9
- });
10
- }
11
-
12
- options.cache.set(json, model);
13
-
14
- for (const relationName of model.constructor.getRelationNames()) {
15
- const relationJson = json[relationName];
16
-
17
- if (relationJson !== undefined) {
18
- const relation = model.constructor.getRelation(relationName);
19
- const relationModel = parseRelation(relationJson, relation, options);
20
-
21
- if (relationModel !== relationJson) {
22
- model[relation.name] = relationModel;
23
- }
4
+ const relationNames = model.constructor.getRelationNames();
5
+ if (!options.cache && !hasRelation(json, relationNames)) {
6
+ // Nothing to parse. The cache would only be used for the relations.
7
+ return model;
24
8
  }
25
- }
26
-
27
- return model;
9
+ if (!options.cache) {
10
+ options = Object.assign({}, options, {
11
+ cache: new Map(),
12
+ });
13
+ }
14
+ options.cache.set(json, model);
15
+ for (const relationName of relationNames) {
16
+ const relationJson = json[relationName];
17
+ if (relationJson !== undefined) {
18
+ const relation = model.constructor.getRelation(relationName);
19
+ const relationModel = parseRelation(relationJson, relation, options);
20
+ if (relationModel !== relationJson) {
21
+ model[relation.name] = relationModel;
22
+ }
23
+ }
24
+ }
25
+ return model;
26
+ }
27
+ function hasRelation(json, relationNames) {
28
+ for (let i = 0, l = relationNames.length; i < l; ++i) {
29
+ if (json[relationNames[i]] !== undefined) {
30
+ return true;
31
+ }
32
+ }
33
+ return false;
28
34
  }
29
-
30
35
  function parseRelation(json, relation, options) {
31
- if (Array.isArray(json)) {
32
- return parseRelationArray(json, relation, options);
33
- } else if (json) {
34
- return parseRelationObject(json, relation, options);
35
- } else {
36
- return null;
37
- }
36
+ if (Array.isArray(json)) {
37
+ return parseRelationArray(json, relation, options);
38
+ }
39
+ else if (json) {
40
+ return parseRelationObject(json, relation, options);
41
+ }
42
+ else {
43
+ return null;
44
+ }
38
45
  }
39
-
40
46
  function parseRelationArray(json, relation, options) {
41
- const models = new Array(json.length);
42
- let didChange = false;
43
-
44
- for (let i = 0, l = json.length; i < l; ++i) {
45
- const model = parseRelationObject(json[i], relation, options);
46
-
47
- if (model !== json[i]) {
48
- didChange = true;
47
+ const models = new Array(json.length);
48
+ let didChange = false;
49
+ for (let i = 0, l = json.length; i < l; ++i) {
50
+ const model = parseRelationObject(json[i], relation, options);
51
+ if (model !== json[i]) {
52
+ didChange = true;
53
+ }
54
+ models[i] = model;
55
+ }
56
+ if (didChange) {
57
+ return models;
58
+ }
59
+ else {
60
+ return json;
49
61
  }
50
-
51
- models[i] = model;
52
- }
53
-
54
- if (didChange) {
55
- return models;
56
- } else {
57
- return json;
58
- }
59
62
  }
60
-
61
63
  function parseRelationObject(json, relation, options) {
62
- if (isObject(json)) {
63
- const modelClass = relation.relatedModelClass;
64
- let model = options.cache.get(json);
65
-
66
- if (model === undefined) {
67
- if (json instanceof modelClass) {
68
- model = parseRelationsIntoModelInstances(json, json, options);
69
- } else {
70
- model = modelClass.fromJson(json, options);
71
- }
64
+ if (isObject(json)) {
65
+ const modelClass = relation.relatedModelClass;
66
+ let model = options.cache.get(json);
67
+ if (model === undefined) {
68
+ if (json instanceof modelClass) {
69
+ model = parseRelationsIntoModelInstances(json, json, options);
70
+ }
71
+ else {
72
+ model = modelClass.fromJson(json, options);
73
+ }
74
+ }
75
+ return model;
76
+ }
77
+ else {
78
+ return json;
72
79
  }
73
-
74
- return model;
75
- } else {
76
- return json;
77
- }
78
80
  }
79
-
80
81
  module.exports = {
81
- parseRelationsIntoModelInstances,
82
+ parseRelationsIntoModelInstances,
82
83
  };
@@ -1,147 +1,116 @@
1
1
  'use strict';
2
-
3
2
  const { isObject, isFunction } = require('../utils/objectUtils');
4
3
  const { defineNonEnumerableProperty } = require('./modelUtils');
5
4
  const { isKnexRaw, isKnexQueryBuilder } = require('../utils/knexUtils');
6
-
7
5
  const QUERY_PROPS_PROPERTY = '$$queryProps';
8
-
9
6
  // Removes query properties from `json` and stores them into a hidden property
10
7
  // inside `model` so that they can be later merged back to `json`.
11
8
  function splitQueryProps(model, json) {
12
- const keys = Object.keys(json);
13
-
14
- if (hasQueryProps(json, keys)) {
15
- const queryProps = {};
16
- const modelProps = {};
17
-
18
- for (let i = 0, l = keys.length; i < l; ++i) {
19
- const key = keys[i];
20
- const value = json[key];
21
-
22
- if (isQueryProp(value)) {
23
- queryProps[key] = value;
24
- } else {
25
- modelProps[key] = value;
26
- }
9
+ const keys = Object.keys(json);
10
+ if (hasQueryProps(json, keys)) {
11
+ const queryProps = {};
12
+ const modelProps = {};
13
+ for (let i = 0, l = keys.length; i < l; ++i) {
14
+ const key = keys[i];
15
+ const value = json[key];
16
+ if (isQueryProp(value)) {
17
+ queryProps[key] = value;
18
+ }
19
+ else {
20
+ modelProps[key] = value;
21
+ }
22
+ }
23
+ defineNonEnumerableProperty(model, QUERY_PROPS_PROPERTY, queryProps);
24
+ return modelProps;
25
+ }
26
+ else {
27
+ return json;
27
28
  }
28
-
29
- defineNonEnumerableProperty(model, QUERY_PROPS_PROPERTY, queryProps);
30
-
31
- return modelProps;
32
- } else {
33
- return json;
34
- }
35
29
  }
36
-
37
30
  function hasQueryProps(json, keys) {
38
- for (let i = 0, l = keys.length; i < l; ++i) {
39
- if (isQueryProp(json[keys[i]])) {
40
- return true;
31
+ for (let i = 0, l = keys.length; i < l; ++i) {
32
+ if (isQueryProp(json[keys[i]])) {
33
+ return true;
34
+ }
41
35
  }
42
- }
43
-
44
- return false;
36
+ return false;
45
37
  }
46
-
47
38
  function isQueryProp(value) {
48
- if (!isObject(value)) {
49
- return false;
50
- }
51
-
52
- return (
53
- isKnexQueryBuilder(value) ||
54
- isKnexRaw(value) ||
55
- isKnexRawConvertable(value) ||
56
- value.isObjectionQueryBuilderBase
57
- );
39
+ if (!isObject(value)) {
40
+ return false;
41
+ }
42
+ return (isKnexQueryBuilder(value) ||
43
+ isKnexRaw(value) ||
44
+ isKnexRawConvertable(value) ||
45
+ value.isObjectionQueryBuilderBase);
58
46
  }
59
-
60
47
  // Merges and converts `model`'s query properties into `json`.
61
48
  function mergeQueryProps(model, json, omitProps, builder) {
62
- json = convertExistingQueryProps(json, builder);
63
- json = convertAndMergeHiddenQueryProps(model, json, omitProps, builder);
64
-
65
- return json;
49
+ json = convertExistingQueryProps(json, builder);
50
+ json = convertAndMergeHiddenQueryProps(model, json, omitProps, builder);
51
+ return json;
66
52
  }
67
-
68
53
  // Converts the query properties in `json` to knex raw instances.
69
54
  // `json` may have query properties even though we removed them.
70
55
  // For example they may have been added in lifecycle hooks.
71
56
  function convertExistingQueryProps(json, builder) {
72
- const keys = Object.keys(json);
73
-
74
- for (let i = 0, l = keys.length; i < l; ++i) {
75
- const key = keys[i];
76
- const value = json[key];
77
-
78
- if (isQueryProp(value)) {
79
- json[key] = queryPropToKnexRaw(value, builder);
57
+ const keys = Object.keys(json);
58
+ for (let i = 0, l = keys.length; i < l; ++i) {
59
+ const key = keys[i];
60
+ const value = json[key];
61
+ if (isQueryProp(value)) {
62
+ json[key] = queryPropToKnexRaw(value, builder);
63
+ }
80
64
  }
81
- }
82
-
83
- return json;
65
+ return json;
84
66
  }
85
-
86
67
  // Converts and merges the query props that were split from the model
87
68
  // and stored into QUERY_PROPS_PROPERTY.
88
69
  function convertAndMergeHiddenQueryProps(model, json, omitProps, builder) {
89
- const queryProps = model[QUERY_PROPS_PROPERTY];
90
-
91
- if (!queryProps) {
92
- // The model has no query properties.
93
- return json;
94
- }
95
-
96
- const modelClass = model.constructor;
97
- const keys = Object.keys(queryProps);
98
-
99
- for (let i = 0, l = keys.length; i < l; ++i) {
100
- const key = keys[i];
101
-
102
- if (!omitProps || !omitProps.includes(key)) {
103
- const queryProp = queryPropToKnexRaw(queryProps[key], builder);
104
- json[modelClass.propertyNameToColumnName(key)] = queryProp;
70
+ const queryProps = model[QUERY_PROPS_PROPERTY];
71
+ if (!queryProps) {
72
+ // The model has no query properties.
73
+ return json;
74
+ }
75
+ const modelClass = model.constructor;
76
+ const keys = Object.keys(queryProps);
77
+ for (let i = 0, l = keys.length; i < l; ++i) {
78
+ const key = keys[i];
79
+ if (!omitProps || !omitProps.includes(key)) {
80
+ const queryProp = queryPropToKnexRaw(queryProps[key], builder);
81
+ json[modelClass.propertyNameToColumnName(key)] = queryProp;
82
+ }
105
83
  }
106
- }
107
-
108
- return json;
84
+ return json;
109
85
  }
110
-
111
86
  // Converts a query property into a knex `raw` instance.
112
87
  function queryPropToKnexRaw(queryProp, builder) {
113
- if (!queryProp) {
114
- return queryProp;
115
- }
116
-
117
- if (queryProp.isObjectionQueryBuilderBase) {
118
- return buildObjectionQueryBuilder(queryProp, builder);
119
- } else if (isKnexRawConvertable(queryProp)) {
120
- return buildKnexRawConvertable(queryProp, builder);
121
- } else {
122
- return queryProp;
123
- }
88
+ if (!queryProp) {
89
+ return queryProp;
90
+ }
91
+ if (queryProp.isObjectionQueryBuilderBase) {
92
+ return buildObjectionQueryBuilder(queryProp, builder);
93
+ }
94
+ else if (isKnexRawConvertable(queryProp)) {
95
+ return buildKnexRawConvertable(queryProp, builder);
96
+ }
97
+ else {
98
+ return queryProp;
99
+ }
124
100
  }
125
-
126
101
  function buildObjectionQueryBuilder(builder, parentBuilder) {
127
- return builder.subqueryOf(parentBuilder).toKnexQuery();
102
+ return builder.subqueryOf(parentBuilder).toKnexQuery();
128
103
  }
129
-
130
104
  function buildKnexRawConvertable(convertable, builder) {
131
- if (!builder) {
132
- throw new Error(
133
- 'toDatabaseJson called without a query builder instance for a model with query properties',
134
- );
135
- }
136
-
137
- return convertable.toKnexRaw(builder);
105
+ if (!builder) {
106
+ throw new Error('toDatabaseJson called without a query builder instance for a model with query properties');
107
+ }
108
+ return convertable.toKnexRaw(builder);
138
109
  }
139
-
140
110
  function isKnexRawConvertable(queryProp) {
141
- return isFunction(queryProp.toKnexRaw);
111
+ return isFunction(queryProp.toKnexRaw);
142
112
  }
143
-
144
113
  module.exports = {
145
- splitQueryProps,
146
- mergeQueryProps,
114
+ splitQueryProps,
115
+ mergeQueryProps,
147
116
  };
@@ -1,136 +1,116 @@
1
1
  'use strict';
2
-
3
2
  const { isInternalProp } = require('../utils/internalPropUtils');
4
3
  const { splitQueryProps } = require('./modelQueryProps');
5
4
  const { isFunction, isString, isPlainObject } = require('../utils/objectUtils');
6
5
  const { parseRelationsIntoModelInstances } = require('./modelParseRelations');
7
-
8
6
  function setJson(model, json, options) {
9
- json = json || {};
10
- options = options || {};
11
-
12
- if (Object.prototype.toString.call(json) !== '[object Object]') {
13
- throw new Error(
14
- 'You should only pass objects to $setJson method. ' +
15
- '$setJson method was given an invalid value ' +
16
- json,
17
- );
18
- }
19
-
20
- if (!json.$isObjectionModel) {
21
- // json can contain "query properties" like `raw` instances, query builders etc.
22
- // We take them out of `json` and store them to a hidden property $$queryProps
23
- // in the model instance for later use.
24
- json = splitQueryProps(model, json);
25
- }
26
-
27
- json = model.$parseJson(json, options);
28
- json = model.$validate(json, options);
29
-
30
- model.$set(json);
31
-
32
- if (!options.skipParseRelations) {
33
- parseRelationsIntoModelInstances(model, json, options);
34
- }
35
-
36
- return model;
7
+ json = json || {};
8
+ options = options || {};
9
+ if (Object.prototype.toString.call(json) !== '[object Object]') {
10
+ throw new Error('You should only pass objects to $setJson method. ' +
11
+ '$setJson method was given an invalid value ' +
12
+ json);
13
+ }
14
+ if (!json.$isObjectionModel) {
15
+ // json can contain "query properties" like `raw` instances, query builders etc.
16
+ // We take them out of `json` and store them to a hidden property $$queryProps
17
+ // in the model instance for later use.
18
+ json = splitQueryProps(model, json);
19
+ }
20
+ json = model.$parseJson(json, options);
21
+ json = model.$validate(json, options);
22
+ model.$set(json);
23
+ if (!options.skipParseRelations) {
24
+ parseRelationsIntoModelInstances(model, json, options);
25
+ }
26
+ return model;
37
27
  }
38
-
39
28
  function setDatabaseJson(model, json) {
40
- json = model.$parseDatabaseJson(json);
41
-
42
- if (json) {
43
- const keys = Object.keys(json);
44
-
45
- for (let i = 0, l = keys.length; i < l; ++i) {
46
- const key = keys[i];
47
- model[key] = json[key];
29
+ json = model.$parseDatabaseJson(json);
30
+ if (json) {
31
+ const keys = Object.keys(json);
32
+ for (let i = 0, l = keys.length; i < l; ++i) {
33
+ const key = keys[i];
34
+ model[key] = json[key];
35
+ }
48
36
  }
49
- }
50
-
51
- return model;
37
+ return model;
52
38
  }
53
-
54
39
  function setFast(model, obj) {
55
- if (obj) {
56
- // Don't try to set read-only properties. They can easily get here
57
- // through `fromJson` when parsing an object that was previously
58
- // serialized from a model instance.
59
- const readOnlyAttr = model.constructor.getReadOnlyAttributes();
60
- const keys = Object.keys(obj);
61
-
62
- for (let i = 0, l = keys.length; i < l; ++i) {
63
- const key = keys[i];
64
- const value = obj[key];
65
-
66
- if (
67
- (value !== undefined || isPlainObject(obj)) &&
68
- !isInternalProp(key) &&
69
- !isFunction(value) &&
70
- !readOnlyAttr.includes(key)
71
- ) {
72
- model[key] = value;
73
- }
40
+ if (obj) {
41
+ // Don't try to set read-only properties. They can easily get here
42
+ // through `fromJson` when parsing an object that was previously
43
+ // serialized from a model instance.
44
+ const readOnlyAttr = model.constructor.getReadOnlyAttributes();
45
+ const keys = Object.keys(obj);
46
+ for (let i = 0, l = keys.length; i < l; ++i) {
47
+ const key = keys[i];
48
+ const value = obj[key];
49
+ if ((value !== undefined || isPlainObject(obj)) &&
50
+ !isInternalProp(key) &&
51
+ !isFunction(value) &&
52
+ !readOnlyAttr.includes(key)) {
53
+ model[key] = value;
54
+ }
55
+ }
74
56
  }
75
- }
76
-
77
- return model;
57
+ return model;
78
58
  }
79
-
80
59
  function setRelated(model, relation, models) {
81
- relation = ensureRelation(model, relation);
82
-
83
- if (relation.isOneToOne()) {
84
- if (Array.isArray(models)) {
85
- if (models.length === 0) {
86
- model[relation.name] = null;
87
- } else {
88
- model[relation.name] = models[0] || null;
89
- }
90
- } else {
91
- model[relation.name] = models || null;
60
+ relation = ensureRelation(model, relation);
61
+ if (relation.isOneToOne()) {
62
+ if (Array.isArray(models)) {
63
+ if (models.length === 0) {
64
+ model[relation.name] = null;
65
+ }
66
+ else {
67
+ model[relation.name] = models[0] || null;
68
+ }
69
+ }
70
+ else {
71
+ model[relation.name] = models || null;
72
+ }
92
73
  }
93
- } else {
94
- if (!models) {
95
- model[relation.name] = [];
96
- } else if (Array.isArray(models)) {
97
- model[relation.name] = models;
98
- } else {
99
- model[relation.name] = [models];
74
+ else {
75
+ if (!models) {
76
+ model[relation.name] = [];
77
+ }
78
+ else if (Array.isArray(models)) {
79
+ model[relation.name] = models;
80
+ }
81
+ else {
82
+ model[relation.name] = [models];
83
+ }
100
84
  }
101
- }
102
-
103
- return model;
85
+ return model;
104
86
  }
105
-
106
87
  function appendRelated(model, relation, models) {
107
- relation = ensureRelation(model, relation);
108
-
109
- if (!model[relation.name] || relation.isOneToOne()) {
110
- return model.$setRelated(relation, models);
111
- } else {
112
- if (Array.isArray(models)) {
113
- models.forEach((it) => model[relation.name].push(it));
114
- } else if (models) {
115
- model[relation.name].push(models);
88
+ relation = ensureRelation(model, relation);
89
+ if (!model[relation.name] || relation.isOneToOne()) {
90
+ return model.$setRelated(relation, models);
116
91
  }
117
- }
118
-
119
- return model;
92
+ else {
93
+ if (Array.isArray(models)) {
94
+ models.forEach((it) => model[relation.name].push(it));
95
+ }
96
+ else if (models) {
97
+ model[relation.name].push(models);
98
+ }
99
+ }
100
+ return model;
120
101
  }
121
-
122
102
  function ensureRelation(model, relation) {
123
- if (isString(relation)) {
124
- return model.constructor.getRelation(relation);
125
- } else {
126
- return relation;
127
- }
103
+ if (isString(relation)) {
104
+ return model.constructor.getRelation(relation);
105
+ }
106
+ else {
107
+ return relation;
108
+ }
128
109
  }
129
-
130
110
  module.exports = {
131
- setFast,
132
- setJson,
133
- setDatabaseJson,
134
- setRelated,
135
- appendRelated,
111
+ setFast,
112
+ setJson,
113
+ setDatabaseJson,
114
+ setRelated,
115
+ appendRelated,
136
116
  };