@abedmurrar/objection 0.0.0-stage → 4.0.0-beta.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 +105 -2
  3. package/lib/index.mjs +6 -0
  4. package/lib/initialize.js +11 -0
  5. package/lib/model/AjvValidator.js +278 -0
  6. package/lib/model/Model.js +772 -0
  7. package/lib/model/ModifierNotFoundError.js +10 -0
  8. package/lib/model/NotFoundError.js +19 -0
  9. package/lib/model/RelationDoesNotExistError.js +11 -0
  10. package/lib/model/ValidationError.js +46 -0
  11. package/lib/model/Validator.js +20 -0
  12. package/lib/model/getModel.js +7 -0
  13. package/lib/model/graph/ModelGraph.js +60 -0
  14. package/lib/model/graph/ModelGraphBuilder.js +188 -0
  15. package/lib/model/graph/ModelGraphEdge.js +40 -0
  16. package/lib/model/graph/ModelGraphNode.js +201 -0
  17. package/lib/model/inheritModel.js +19 -0
  18. package/lib/model/modelBindKnex.js +69 -0
  19. package/lib/model/modelClone.js +102 -0
  20. package/lib/model/modelColPropMap.js +24 -0
  21. package/lib/model/modelConcurrency.js +24 -0
  22. package/lib/model/modelId.js +57 -0
  23. package/lib/model/modelJsonAttributes.js +72 -0
  24. package/lib/model/modelParseRelations.js +83 -0
  25. package/lib/model/modelQueryProps.js +116 -0
  26. package/lib/model/modelSet.js +116 -0
  27. package/lib/model/modelTableMetadata.js +71 -0
  28. package/lib/model/modelToJson.js +157 -0
  29. package/lib/model/modelUtils.js +40 -0
  30. package/lib/model/modelValidate.js +40 -0
  31. package/lib/model/modelValues.js +113 -0
  32. package/lib/model/modelVisitor.js +34 -0
  33. package/lib/objection.js +89 -0
  34. package/lib/queryBuilder/FunctionBuilder.js +291 -0
  35. package/lib/queryBuilder/InternalOptions.js +24 -0
  36. package/lib/queryBuilder/JoinBuilder.js +124 -0
  37. package/lib/queryBuilder/QueryBuilder.js +1136 -0
  38. package/lib/queryBuilder/QueryBuilderBase.js +666 -0
  39. package/lib/queryBuilder/QueryBuilderContext.js +20 -0
  40. package/lib/queryBuilder/QueryBuilderContextBase.js +26 -0
  41. package/lib/queryBuilder/QueryBuilderOperationSupport.js +484 -0
  42. package/lib/queryBuilder/QueryBuilderUserContext.js +25 -0
  43. package/lib/queryBuilder/RawBuilder.js +78 -0
  44. package/lib/queryBuilder/ReferenceBuilder.js +246 -0
  45. package/lib/queryBuilder/RelationExpression.js +373 -0
  46. package/lib/queryBuilder/StaticHookArguments.js +122 -0
  47. package/lib/queryBuilder/ValueBuilder.js +115 -0
  48. package/lib/queryBuilder/expressions.js +121 -0
  49. package/lib/queryBuilder/functions/mysql.js +762 -0
  50. package/lib/queryBuilder/graph/GraphAction.js +54 -0
  51. package/lib/queryBuilder/graph/GraphData.js +12 -0
  52. package/lib/queryBuilder/graph/GraphFetcher.js +155 -0
  53. package/lib/queryBuilder/graph/GraphNodeDbExistence.js +146 -0
  54. package/lib/queryBuilder/graph/GraphOperation.js +21 -0
  55. package/lib/queryBuilder/graph/GraphOptions.js +165 -0
  56. package/lib/queryBuilder/graph/GraphUpsert.js +231 -0
  57. package/lib/queryBuilder/graph/delete/GraphDelete.js +15 -0
  58. package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +56 -0
  59. package/lib/queryBuilder/graph/insert/GraphInsert.js +116 -0
  60. package/lib/queryBuilder/graph/insert/GraphInsertAction.js +183 -0
  61. package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +70 -0
  62. package/lib/queryBuilder/graph/patch/GraphPatch.js +15 -0
  63. package/lib/queryBuilder/graph/patch/GraphPatchAction.js +205 -0
  64. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +26 -0
  65. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +96 -0
  66. package/lib/queryBuilder/join/JoinResultColumn.js +19 -0
  67. package/lib/queryBuilder/join/JoinResultParser.js +106 -0
  68. package/lib/queryBuilder/join/RelationJoiner.js +258 -0
  69. package/lib/queryBuilder/join/TableNode.js +136 -0
  70. package/lib/queryBuilder/join/TableTree.js +69 -0
  71. package/lib/queryBuilder/join/utils.js +19 -0
  72. package/lib/queryBuilder/operations/DelegateOperation.js +101 -0
  73. package/lib/queryBuilder/operations/DeleteOperation.js +47 -0
  74. package/lib/queryBuilder/operations/FindByIdOperation.js +29 -0
  75. package/lib/queryBuilder/operations/FindByIdsOperation.js +23 -0
  76. package/lib/queryBuilder/operations/FindOperation.js +147 -0
  77. package/lib/queryBuilder/operations/FirstOperation.js +22 -0
  78. package/lib/queryBuilder/operations/FromOperation.js +91 -0
  79. package/lib/queryBuilder/operations/InsertAndFetchOperation.js +38 -0
  80. package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +35 -0
  81. package/lib/queryBuilder/operations/InsertGraphOperation.js +87 -0
  82. package/lib/queryBuilder/operations/InsertOperation.js +173 -0
  83. package/lib/queryBuilder/operations/InstanceDeleteOperation.js +37 -0
  84. package/lib/queryBuilder/operations/InstanceFindOperation.js +17 -0
  85. package/lib/queryBuilder/operations/InstanceInsertOperation.js +20 -0
  86. package/lib/queryBuilder/operations/InstanceUpdateOperation.js +45 -0
  87. package/lib/queryBuilder/operations/JoinRelatedOperation.js +83 -0
  88. package/lib/queryBuilder/operations/KnexOperation.js +11 -0
  89. package/lib/queryBuilder/operations/MergeOperation.js +43 -0
  90. package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +173 -0
  91. package/lib/queryBuilder/operations/OnBuildKnexOperation.js +23 -0
  92. package/lib/queryBuilder/operations/OnBuildOperation.js +23 -0
  93. package/lib/queryBuilder/operations/OnErrorOperation.js +23 -0
  94. package/lib/queryBuilder/operations/QueryBuilderOperation.js +258 -0
  95. package/lib/queryBuilder/operations/RangeOperation.js +37 -0
  96. package/lib/queryBuilder/operations/RelateOperation.js +20 -0
  97. package/lib/queryBuilder/operations/ReturningOperation.js +24 -0
  98. package/lib/queryBuilder/operations/RunAfterOperation.js +23 -0
  99. package/lib/queryBuilder/operations/RunBeforeOperation.js +23 -0
  100. package/lib/queryBuilder/operations/UnrelateOperation.js +18 -0
  101. package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +63 -0
  102. package/lib/queryBuilder/operations/UpdateOperation.js +130 -0
  103. package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +35 -0
  104. package/lib/queryBuilder/operations/UpsertGraphOperation.js +47 -0
  105. package/lib/queryBuilder/operations/WhereCompositeOperation.js +48 -0
  106. package/lib/queryBuilder/operations/WhereInOperation.js +46 -0
  107. package/lib/queryBuilder/operations/eager/EagerOperation.js +46 -0
  108. package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +41 -0
  109. package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +10 -0
  110. package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +227 -0
  111. package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +29 -0
  112. package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectOperation.js +37 -0
  113. package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +30 -0
  114. package/lib/queryBuilder/operations/jsonApi/WhereJsonOverlapsOperation.js +33 -0
  115. package/lib/queryBuilder/operations/jsonApi/mysqlJsonApi.js +155 -0
  116. package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +135 -0
  117. package/lib/queryBuilder/operations/select/SelectOperation.js +50 -0
  118. package/lib/queryBuilder/operations/select/Selection.js +112 -0
  119. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +84 -0
  120. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +90 -0
  121. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +95 -0
  122. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +787 -0
  123. package/lib/queryBuilder/parsers/relationExpressionParser.js +930 -0
  124. package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +17 -0
  125. package/lib/queryBuilder/transformations/QueryTransformation.js +9 -0
  126. package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +57 -0
  127. package/lib/queryBuilder/transformations/index.js +9 -0
  128. package/lib/queryBuilder/whereScopes.js +199 -0
  129. package/lib/relations/Relation.js +317 -0
  130. package/lib/relations/RelationDeleteOperation.js +23 -0
  131. package/lib/relations/RelationFindOperation.js +116 -0
  132. package/lib/relations/RelationInsertOperation.js +25 -0
  133. package/lib/relations/RelationOwner.js +199 -0
  134. package/lib/relations/RelationProperty.js +207 -0
  135. package/lib/relations/RelationUpdateOperation.js +23 -0
  136. package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +18 -0
  137. package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +33 -0
  138. package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +39 -0
  139. package/lib/relations/belongsToOne/BelongsToOneRelation.js +45 -0
  140. package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +46 -0
  141. package/lib/relations/hasMany/HasManyInsertOperation.js +45 -0
  142. package/lib/relations/hasMany/HasManyRelateOperation.js +48 -0
  143. package/lib/relations/hasMany/HasManyRelation.js +41 -0
  144. package/lib/relations/hasMany/HasManyUnrelateOperation.js +26 -0
  145. package/lib/relations/hasOne/HasOneRelation.js +10 -0
  146. package/lib/relations/hasOneThrough/HasOneThroughRelation.js +10 -0
  147. package/lib/relations/manyToMany/ManyToManyModifyMixin.js +82 -0
  148. package/lib/relations/manyToMany/ManyToManyRelation.js +405 -0
  149. package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +29 -0
  150. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +8 -0
  151. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +20 -0
  152. package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +8 -0
  153. package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +82 -0
  154. package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +40 -0
  155. package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +64 -0
  156. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +11 -0
  157. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +27 -0
  158. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +11 -0
  159. package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +8 -0
  160. package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +65 -0
  161. package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +8 -0
  162. package/lib/transaction.js +66 -0
  163. package/lib/utils/assert.js +19 -0
  164. package/lib/utils/buildUtils.js +19 -0
  165. package/lib/utils/classUtils.js +9 -0
  166. package/lib/utils/cloneDeep.js +365 -0
  167. package/lib/utils/createModifier.js +37 -0
  168. package/lib/utils/deprecate.js +11 -0
  169. package/lib/utils/identifierMapping.js +188 -0
  170. package/lib/utils/internalPropUtils.js +7 -0
  171. package/lib/utils/knexUtils.js +81 -0
  172. package/lib/utils/mixin.js +18 -0
  173. package/lib/utils/mysqlJsonPath.js +70 -0
  174. package/lib/utils/normalizeIds.js +127 -0
  175. package/lib/utils/objectUtils.js +314 -0
  176. package/lib/utils/parseFieldExpression.js +73 -0
  177. package/lib/utils/postgresJsonPath.js +96 -0
  178. package/lib/utils/promiseUtils/after.js +14 -0
  179. package/lib/utils/promiseUtils/afterReturn.js +14 -0
  180. package/lib/utils/promiseUtils/index.js +15 -0
  181. package/lib/utils/promiseUtils/isPromise.js +8 -0
  182. package/lib/utils/promiseUtils/map.js +96 -0
  183. package/lib/utils/promiseUtils/mapAfterAllReturn.js +23 -0
  184. package/lib/utils/promiseUtils/try.js +19 -0
  185. package/lib/utils/resolveModel.js +104 -0
  186. package/lib/utils/tmpColumnUtils.js +7 -0
  187. package/package.json +113 -4
  188. package/typings/objection/index.d.mts +362 -0
  189. package/typings/objection/index.d.ts +4131 -0
  190. package/typings/objection/relation-expression.d.ts +237 -0
@@ -0,0 +1,157 @@
1
+ 'use strict';
2
+ const { isInternalProp } = require('../utils/internalPropUtils');
3
+ const { mergeQueryProps } = require('./modelQueryProps');
4
+ const { isObject, cloneDeep, isFunction } = require('../utils/objectUtils');
5
+ const EMPTY_ARRAY = [];
6
+ function toJson(model, optIn) {
7
+ const modelClass = model.constructor;
8
+ const opt = {
9
+ virtuals: getVirtuals(optIn),
10
+ shallow: isShallow(optIn),
11
+ omit: getOmit(optIn, modelClass),
12
+ pick: null,
13
+ omitFromJson: model.$omitFromJson() || null,
14
+ cloneObjects: modelClass.cloneObjectAttributes,
15
+ };
16
+ let json = toExternalJsonImpl(model, opt);
17
+ json = model.$formatJson(json);
18
+ return json;
19
+ }
20
+ function toDatabaseJson(model, builder) {
21
+ const modelClass = model.constructor;
22
+ const opt = {
23
+ virtuals: false,
24
+ shallow: true,
25
+ omit: modelClass.getRelationNames(),
26
+ pick: getPick(modelClass),
27
+ omitFromJson: model.$omitFromDatabaseJson() || null,
28
+ cloneObjects: modelClass.cloneObjectAttributes,
29
+ };
30
+ let json = toDatabaseJsonImpl(model, opt);
31
+ json = model.$formatDatabaseJson(json);
32
+ return mergeQueryProps(model, json, opt.omitFromJson, builder);
33
+ }
34
+ function getVirtuals(opt) {
35
+ if (!opt) {
36
+ return true;
37
+ }
38
+ else if (Array.isArray(opt.virtuals)) {
39
+ return opt.virtuals;
40
+ }
41
+ else {
42
+ return opt.virtuals !== false;
43
+ }
44
+ }
45
+ function isShallow(opt) {
46
+ return !!opt && !!opt.shallow;
47
+ }
48
+ function getOmit(opt, modelClass) {
49
+ return isShallow(opt) ? modelClass.getRelationNames() : null;
50
+ }
51
+ function getPick(modelClass) {
52
+ const jsonSchema = modelClass.getJsonSchema();
53
+ return (jsonSchema && modelClass.pickJsonSchemaProperties && jsonSchema.properties) || null;
54
+ }
55
+ function toExternalJsonImpl(model, opt) {
56
+ const json = {};
57
+ const keys = Object.keys(model);
58
+ const vAttr = getVirtualAttributes(model, opt);
59
+ for (let i = 0, l = keys.length; i < l; ++i) {
60
+ const key = keys[i];
61
+ const value = model[key];
62
+ assignJsonValue(json, key, value, opt);
63
+ }
64
+ if (vAttr.length !== 0) {
65
+ assignVirtualAttributes(json, model, vAttr, opt);
66
+ }
67
+ return json;
68
+ }
69
+ function getVirtualAttributes(model, opt) {
70
+ if (Array.isArray(opt.virtuals)) {
71
+ return opt.virtuals;
72
+ }
73
+ else if (opt.virtuals === true) {
74
+ return model.constructor.getVirtualAttributes();
75
+ }
76
+ else {
77
+ return EMPTY_ARRAY;
78
+ }
79
+ }
80
+ function toDatabaseJsonImpl(model, opt) {
81
+ const json = {};
82
+ const keys = Object.keys(model);
83
+ for (let i = 0, l = keys.length; i < l; ++i) {
84
+ const key = keys[i];
85
+ const value = model[key];
86
+ assignJsonValue(json, key, value, opt);
87
+ }
88
+ return json;
89
+ }
90
+ function assignJsonValue(json, key, value, opt) {
91
+ const type = typeof value;
92
+ if (type !== 'function' &&
93
+ type !== 'undefined' &&
94
+ !isInternalProp(key) &&
95
+ !shouldOmit(opt, key) &&
96
+ shouldPick(opt, key)) {
97
+ if (isObject(value)) {
98
+ json[key] = toJsonObject(value, opt);
99
+ }
100
+ else {
101
+ json[key] = value;
102
+ }
103
+ }
104
+ }
105
+ function shouldOmit(opt, key) {
106
+ return ((opt.omit !== null && opt.omit.includes(key)) ||
107
+ (opt.omitFromJson !== null && opt.omitFromJson.includes(key)));
108
+ }
109
+ function shouldPick(opt, key) {
110
+ return opt.pick === null || key in opt.pick;
111
+ }
112
+ function assignVirtualAttributes(json, model, vAttr, opt) {
113
+ for (let i = 0, l = vAttr.length; i < l; ++i) {
114
+ const key = vAttr[i];
115
+ let value = model[key];
116
+ if (isFunction(value)) {
117
+ value = value.call(model);
118
+ }
119
+ assignJsonValue(json, key, value, opt);
120
+ }
121
+ }
122
+ function toJsonObject(value, opt) {
123
+ if (Array.isArray(value)) {
124
+ return toJsonArray(value, opt);
125
+ }
126
+ else if (value.$isObjectionModel) {
127
+ // No branch for $toDatabaseJson here since there is never a need
128
+ // to have nested models in database rows.
129
+ return value.$toJson(opt);
130
+ }
131
+ else if (Buffer.isBuffer(value)) {
132
+ return value;
133
+ }
134
+ else if (opt.cloneObjects) {
135
+ return cloneDeep(value);
136
+ }
137
+ else {
138
+ return value;
139
+ }
140
+ }
141
+ function toJsonArray(value, opt) {
142
+ const ret = new Array(value.length);
143
+ for (let i = 0, l = ret.length; i < l; ++i) {
144
+ const item = value[i];
145
+ if (isObject(item)) {
146
+ ret[i] = toJsonObject(item, opt);
147
+ }
148
+ else {
149
+ ret[i] = item;
150
+ }
151
+ }
152
+ return ret;
153
+ }
154
+ module.exports = {
155
+ toJson,
156
+ toDatabaseJson,
157
+ };
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+ const hiddenProps = ['$$queryProps'];
3
+ const staticHiddenProps = [
4
+ '$$knex',
5
+ '$$validator',
6
+ '$$jsonSchema',
7
+ '$$colToProp',
8
+ '$$propToCol',
9
+ '$$relationMappings',
10
+ '$$relations',
11
+ '$$relationNames',
12
+ '$$jsonAttributes',
13
+ '$$columnNameMappers',
14
+ '$$tableMetadata',
15
+ '$$readOnlyAttributes',
16
+ '$$idRelationProperty',
17
+ '$$virtualAttributes',
18
+ ];
19
+ function defineNonEnumerableProperty(obj, prop, value) {
20
+ Object.defineProperty(obj, prop, {
21
+ enumerable: false,
22
+ writable: true,
23
+ configurable: true,
24
+ value,
25
+ });
26
+ }
27
+ function keyByProps(models, props) {
28
+ const map = new Map();
29
+ for (let i = 0, l = models.length; i < l; ++i) {
30
+ const model = models[i];
31
+ map.set(model.$propKey(props), model);
32
+ }
33
+ return map;
34
+ }
35
+ module.exports = {
36
+ hiddenProps,
37
+ staticHiddenProps,
38
+ defineNonEnumerableProperty,
39
+ keyByProps,
40
+ };
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+ const { clone } = require('./modelClone');
3
+ function validate(model, json, options = {}) {
4
+ json = json || model;
5
+ const inputJson = json;
6
+ const validatingModelInstance = inputJson && inputJson.$isObjectionModel;
7
+ if (options.skipValidation) {
8
+ return json;
9
+ }
10
+ if (validatingModelInstance) {
11
+ // Strip away relations and other internal stuff.
12
+ // TODO 1: This should use `json.$toJson()` since we always validate the input representation!
13
+ // TODO 2: This should also keep the relations in the object because some validators may
14
+ // depend on the relations.
15
+ json = clone(json, true, true);
16
+ // We can mutate `json` now that we took a copy of it.
17
+ options = Object.assign({}, options, { mutable: true });
18
+ }
19
+ const modelClass = model.constructor;
20
+ const validator = modelClass.getValidator();
21
+ const args = {
22
+ options,
23
+ model,
24
+ json,
25
+ ctx: Object.create(null),
26
+ };
27
+ validator.beforeValidate(args);
28
+ json = validator.validate(args);
29
+ validator.afterValidate(args);
30
+ if (validatingModelInstance) {
31
+ // If we cloned `json`, we need to copy the possible default values.
32
+ return inputJson.$set(json);
33
+ }
34
+ else {
35
+ return json;
36
+ }
37
+ }
38
+ module.exports = {
39
+ validate,
40
+ };
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+ const { isObject } = require('../utils/objectUtils');
3
+ // Property keys needs to be prefixed with a non-numeric character so that
4
+ // they are not considered indexes when used as object keys.
5
+ const PROP_KEY_PREFIX = 'k_';
6
+ function values(model, args) {
7
+ switch (args.length) {
8
+ case 1:
9
+ return values1(model, args);
10
+ case 2:
11
+ return values2(model, args);
12
+ case 3:
13
+ return values3(model, args);
14
+ default:
15
+ return valuesN(model, args);
16
+ }
17
+ }
18
+ function propKey(model, props) {
19
+ switch (props.length) {
20
+ case 1:
21
+ return propKey1(model, props);
22
+ case 2:
23
+ return propKey2(model, props);
24
+ case 3:
25
+ return propKey3(model, props);
26
+ default:
27
+ return propKeyN(model, props);
28
+ }
29
+ }
30
+ function hasProps(model, props) {
31
+ for (let i = 0; i < props.length; ++i) {
32
+ const value = model[props[i]];
33
+ if (isNullOrUndefined(value)) {
34
+ return false;
35
+ }
36
+ }
37
+ return true;
38
+ }
39
+ function values1(model, args) {
40
+ return [model[args[0]]];
41
+ }
42
+ function values2(model, args) {
43
+ return [model[args[0]], model[args[1]]];
44
+ }
45
+ function values3(model, args) {
46
+ return [model[args[0]], model[args[1]], model[args[2]]];
47
+ }
48
+ function valuesN(model, args) {
49
+ const ret = new Array(args.length);
50
+ for (let i = 0, l = args.length; i < l; ++i) {
51
+ ret[i] = model[args[i]];
52
+ }
53
+ return ret;
54
+ }
55
+ function propKey1(model, props) {
56
+ return PROP_KEY_PREFIX + propToStr(model[props[0]]);
57
+ }
58
+ function propKey2(model, props) {
59
+ return PROP_KEY_PREFIX + propToStr(model[props[0]]) + ',' + propToStr(model[props[1]]);
60
+ }
61
+ function propKey3(model, props) {
62
+ return (PROP_KEY_PREFIX +
63
+ propToStr(model[props[0]]) +
64
+ ',' +
65
+ propToStr(model[props[1]]) +
66
+ ',' +
67
+ propToStr(model[props[2]]));
68
+ }
69
+ function propKeyN(model, props) {
70
+ let key = PROP_KEY_PREFIX;
71
+ for (let i = 0, l = props.length; i < l; ++i) {
72
+ key += propToStr(model[props[i]]);
73
+ if (i < l - 1) {
74
+ key += ',';
75
+ }
76
+ }
77
+ return key;
78
+ }
79
+ function propToStr(value) {
80
+ // Ids are almost always numbers or strings.
81
+ const type = typeof value;
82
+ if (type === 'string') {
83
+ return value;
84
+ }
85
+ else if (type === 'number') {
86
+ return `${value}`;
87
+ }
88
+ else if (value === null) {
89
+ return 'null';
90
+ }
91
+ else if (value === undefined) {
92
+ return 'undefined';
93
+ }
94
+ else if (Buffer.isBuffer(value)) {
95
+ return value.toString('hex');
96
+ }
97
+ else if (isObject(value)) {
98
+ return JSON.stringify(value);
99
+ }
100
+ else {
101
+ return `${value}`;
102
+ }
103
+ }
104
+ function isNullOrUndefined(val) {
105
+ return val === null || val === undefined;
106
+ }
107
+ module.exports = {
108
+ PROP_KEY_PREFIX,
109
+ propToStr,
110
+ values,
111
+ hasProps,
112
+ propKey,
113
+ };
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+ function visitModels(models, modelClass, visitor) {
3
+ doVisit(models, modelClass, null, null, visitor);
4
+ }
5
+ function doVisit(models, modelClass, parent, rel, visitor) {
6
+ if (Array.isArray(models)) {
7
+ visitMany(models, modelClass, parent, rel, visitor);
8
+ }
9
+ else if (models) {
10
+ visitOne(models, modelClass, parent, rel, visitor);
11
+ }
12
+ }
13
+ function visitMany(models, modelClass, parent, rel, visitor) {
14
+ for (let i = 0, l = models.length; i < l; ++i) {
15
+ visitOne(models[i], modelClass, parent, rel, visitor);
16
+ }
17
+ }
18
+ function visitOne(model, modelClass, parent, rel, visitor) {
19
+ if (model) {
20
+ visitor(model, modelClass, parent, rel);
21
+ }
22
+ const relationNames = modelClass.getRelationNames();
23
+ for (let i = 0, l = relationNames.length; i < l; ++i) {
24
+ const relationName = relationNames[i];
25
+ const relatedObj = model[relationName];
26
+ if (relatedObj) {
27
+ const relation = modelClass.getRelation(relationName);
28
+ doVisit(relatedObj, relation.relatedModelClass, model, relation, visitor);
29
+ }
30
+ }
31
+ }
32
+ module.exports = {
33
+ visitModels,
34
+ };
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+ const { DBError, UniqueViolationError, NotNullViolationError, ForeignKeyViolationError, ConstraintViolationError, CheckViolationError, DataError, } = require('db-errors');
3
+ const { Model: NativeModel } = require('./model/Model');
4
+ const { QueryBuilder: NativeQueryBuilder } = require('./queryBuilder/QueryBuilder');
5
+ const { QueryBuilderBase } = require('./queryBuilder/QueryBuilderBase');
6
+ const { QueryBuilderOperation } = require('./queryBuilder/operations/QueryBuilderOperation');
7
+ const { RelationExpression } = require('./queryBuilder/RelationExpression');
8
+ const { ValidationError } = require('./model/ValidationError');
9
+ const { NotFoundError } = require('./model/NotFoundError');
10
+ const { AjvValidator: NativeAjvValidator } = require('./model/AjvValidator');
11
+ const { Validator: NativeValidator } = require('./model/Validator');
12
+ const { Relation } = require('./relations/Relation');
13
+ const { HasOneRelation } = require('./relations/hasOne/HasOneRelation');
14
+ const { HasManyRelation } = require('./relations/hasMany/HasManyRelation');
15
+ const { BelongsToOneRelation } = require('./relations/belongsToOne/BelongsToOneRelation');
16
+ const { HasOneThroughRelation } = require('./relations/hasOneThrough/HasOneThroughRelation');
17
+ const { ManyToManyRelation } = require('./relations/manyToMany/ManyToManyRelation');
18
+ const { transaction } = require('./transaction');
19
+ const { initialize } = require('./initialize');
20
+ const { snakeCaseMappers, knexSnakeCaseMappers, knexIdentifierMapping, } = require('./utils/identifierMapping');
21
+ const { compose, mixin } = require('./utils/mixin');
22
+ const { ref } = require('./queryBuilder/ReferenceBuilder');
23
+ const { val } = require('./queryBuilder/ValueBuilder');
24
+ const { raw } = require('./queryBuilder/RawBuilder');
25
+ const { fn } = require('./queryBuilder/FunctionBuilder');
26
+ const { inherit } = require('./utils/classUtils');
27
+ // We need to wrap the classes, that people can inherit, with ES5 classes
28
+ // so that babel is able to use ES5 inheritance. sigh... Maybe people
29
+ // should stop transpiling node apps to ES5 in the year 2019? Node 6
30
+ // with full class support was released three years ago.
31
+ function Model() {
32
+ // Nothing to do here.
33
+ }
34
+ function QueryBuilder(...args) {
35
+ NativeQueryBuilder.init(this, ...args);
36
+ }
37
+ function Validator(...args) {
38
+ NativeValidator.init(this, ...args);
39
+ }
40
+ function AjvValidator(...args) {
41
+ NativeAjvValidator.init(this, ...args);
42
+ }
43
+ // Returns the relation mappings as is. This only exists for typescript: it
44
+ // preserves the exact types of the mappings (like the names of `extra`
45
+ // columns) so that the relation types can be inferred from them.
46
+ function defineRelations(relationMappings) {
47
+ return relationMappings;
48
+ }
49
+ inherit(Model, NativeModel);
50
+ inherit(QueryBuilder, NativeQueryBuilder);
51
+ inherit(Validator, NativeValidator);
52
+ inherit(AjvValidator, NativeAjvValidator);
53
+ Model.QueryBuilder = QueryBuilder;
54
+ module.exports = {
55
+ Model,
56
+ QueryBuilder,
57
+ QueryBuilderBase,
58
+ QueryBuilderOperation,
59
+ RelationExpression,
60
+ ValidationError,
61
+ NotFoundError,
62
+ AjvValidator,
63
+ Validator,
64
+ Relation,
65
+ HasOneRelation,
66
+ HasManyRelation,
67
+ BelongsToOneRelation,
68
+ HasOneThroughRelation,
69
+ ManyToManyRelation,
70
+ transaction,
71
+ initialize,
72
+ compose,
73
+ mixin,
74
+ defineRelations,
75
+ ref,
76
+ val,
77
+ raw,
78
+ fn,
79
+ snakeCaseMappers,
80
+ knexSnakeCaseMappers,
81
+ knexIdentifierMapping,
82
+ DBError,
83
+ UniqueViolationError,
84
+ NotNullViolationError,
85
+ ForeignKeyViolationError,
86
+ ConstraintViolationError,
87
+ CheckViolationError,
88
+ DataError,
89
+ };