@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,207 +1,165 @@
1
1
  'use strict';
2
-
3
2
  const NO_RELATE = 'noRelate';
4
3
  const NO_UNRELATE = 'noUnrelate';
5
4
  const NO_INSERT = 'noInsert';
6
5
  const NO_UPDATE = 'noUpdate';
7
6
  const NO_DELETE = 'noDelete';
8
-
9
7
  const UPDATE = 'update';
10
8
  const RELATE = 'relate';
11
9
  const UNRELATE = 'unrelate';
12
10
  const INSERT_MISSING = 'insertMissing';
13
11
  const FETCH_STRATEGY = 'fetchStrategy';
14
12
  const ALLOW_REFS = 'allowRefs';
15
-
16
13
  const FetchStrategy = {
17
- OnlyIdentifiers: 'OnlyIdentifiers',
18
- Everything: 'Everything',
19
- OnlyNeeded: 'OnlyNeeded',
14
+ OnlyIdentifiers: 'OnlyIdentifiers',
15
+ Everything: 'Everything',
16
+ OnlyNeeded: 'OnlyNeeded',
20
17
  };
21
-
22
18
  class GraphOptions {
23
- constructor(options) {
24
- if (options instanceof GraphOptions) {
25
- this.options = options.options;
26
- } else {
27
- this.options = options;
28
- }
29
- }
30
-
31
- isFetchStrategy(strategy) {
32
- if (!FetchStrategy[strategy]) {
33
- throw new Error(`unknown strategy "${strategy}"`);
34
- }
35
-
36
- if (!this.options[FETCH_STRATEGY]) {
37
- return strategy === FetchStrategy.OnlyNeeded;
38
- } else {
39
- return this.options[FETCH_STRATEGY] === strategy;
40
- }
41
- }
42
-
43
- isInsertOnly() {
44
- // NO_RELATE is not in the list, since the `insert only` mode does
45
- // relate things that can be related using inserts.
46
- // TODO: Use a special key for this.
47
- return [NO_DELETE, NO_UPDATE, NO_UNRELATE, INSERT_MISSING].every((opt) => {
48
- return this.options[opt] === true;
49
- });
50
- }
51
-
52
- // Like `shouldRelate` but ignores settings that explicitly disable relate operations.
53
- shouldRelateIgnoreDisable(node, graphData) {
54
- if (node.isReference || node.isDbReference) {
55
- return true;
56
- }
57
-
58
- return (
59
- this._hasOption(node, RELATE) &&
60
- !getCurrentNode(node, graphData) &&
61
- !!node.parentEdge &&
62
- !!node.parentEdge.relation &&
63
- node.parentEdge.relation.hasRelateProp(node.obj) &&
64
- graphData.nodeDbExistence.doesNodeExistInDb(node)
65
- );
66
- }
67
-
68
- shouldRelate(node, graphData) {
69
- return !this._hasOption(node, NO_RELATE) && this.shouldRelateIgnoreDisable(node, graphData);
70
- }
71
-
72
- // Like `shouldInsert` but ignores settings that explicitly disable insert operations.
73
- shouldInsertIgnoreDisable(node, graphData) {
74
- return (
75
- !getCurrentNode(node, graphData) &&
76
- !this.shouldRelateIgnoreDisable(node, graphData) &&
77
- (!node.hasId || this.shouldInsertMissing(node))
78
- );
79
- }
80
-
81
- shouldInsert(node, graphData) {
82
- return !this._hasOption(node, NO_INSERT) && this.shouldInsertIgnoreDisable(node, graphData);
83
- }
84
-
85
- shouldInsertMissing(node) {
86
- return this._hasOption(node, INSERT_MISSING);
87
- }
88
-
89
- // Like `shouldPatch() || shouldUpdate()` but ignores settings that explicitly disable
90
- // update or patch operations.
91
- shouldPatchOrUpdateIgnoreDisable(node, graphData) {
92
- if (this.shouldRelate(node, graphData)) {
93
- // We should update all nodes that are going to be related. Note that
94
- // we don't actually update anything unless there is something to update
95
- // so this is just a preliminary test.
96
- return true;
97
- }
98
-
99
- return !!getCurrentNode(node, graphData);
100
- }
101
-
102
- shouldPatch(node, graphData) {
103
- return (
104
- this.shouldPatchOrUpdateIgnoreDisable(node, graphData) &&
105
- !this._hasOption(node, NO_UPDATE) &&
106
- !this._hasOption(node, UPDATE)
107
- );
108
- }
109
-
110
- shouldUpdate(node, graphData) {
111
- return (
112
- this.shouldPatchOrUpdateIgnoreDisable(node, graphData) &&
113
- !this._hasOption(node, NO_UPDATE) &&
114
- this._hasOption(node, UPDATE)
115
- );
116
- }
117
-
118
- // Like `shouldUnrelate` but ignores settings that explicitly disable unrelate operations.
119
- shouldUnrelateIgnoreDisable(currentNode) {
120
- return this._hasOption(currentNode, UNRELATE);
121
- }
122
-
123
- shouldUnrelate(currentNode, graphData) {
124
- return (
125
- !getNode(currentNode, graphData.graph) &&
126
- !this._hasOption(currentNode, NO_UNRELATE) &&
127
- this.shouldUnrelateIgnoreDisable(currentNode)
128
- );
129
- }
130
-
131
- shouldDelete(currentNode, graphData) {
132
- return (
133
- !getNode(currentNode, graphData.graph) &&
134
- !this._hasOption(currentNode, NO_DELETE) &&
135
- !this.shouldUnrelateIgnoreDisable(currentNode)
136
- );
137
- }
138
-
139
- shouldInsertOrRelate(node, graphData) {
140
- return this.shouldInsert(node, graphData) || this.shouldRelate(node, graphData);
141
- }
142
-
143
- shouldDeleteOrUnrelate(currentNode, graphData) {
144
- return this.shouldDelete(currentNode, graphData) || this.shouldUnrelate(currentNode, graphData);
145
- }
146
-
147
- allowRefs() {
148
- return !!this.options[ALLOW_REFS];
149
- }
150
-
151
- rebasedOptions(newRoot) {
152
- const newOpt = {};
153
- const newRootRelationPath = newRoot.relationPathKey;
154
-
155
- for (const name of Object.keys(this.options)) {
156
- const value = this.options[name];
157
-
158
- if (Array.isArray(value)) {
159
- newOpt[name] = value
160
- .filter((it) => it.startsWith(newRootRelationPath))
161
- .map((it) => it.slice(newRootRelationPath.length + 1))
162
- .filter((it) => !!it);
163
- } else {
164
- newOpt[name] = value;
165
- }
166
- }
167
-
168
- return new GraphOptions(newOpt);
169
- }
170
-
171
- _hasOption(node, optionName) {
172
- const option = this.options[optionName];
173
-
174
- if (Array.isArray(option)) {
175
- return option.indexOf(node.relationPathKey) !== -1;
176
- } else if (typeof option === 'boolean') {
177
- return option;
178
- } else if (option === undefined) {
179
- return false;
180
- } else {
181
- throw new Error(
182
- `expected ${optionName} option value "${option}" to be an instance of boolean or array of strings`,
183
- );
184
- }
185
- }
19
+ constructor(options) {
20
+ if (options instanceof GraphOptions) {
21
+ this.options = options.options;
22
+ }
23
+ else {
24
+ this.options = options;
25
+ }
26
+ }
27
+ isFetchStrategy(strategy) {
28
+ if (!FetchStrategy[strategy]) {
29
+ throw new Error(`unknown strategy "${strategy}"`);
30
+ }
31
+ if (!this.options[FETCH_STRATEGY]) {
32
+ return strategy === FetchStrategy.OnlyNeeded;
33
+ }
34
+ else {
35
+ return this.options[FETCH_STRATEGY] === strategy;
36
+ }
37
+ }
38
+ isInsertOnly() {
39
+ // NO_RELATE is not in the list, since the `insert only` mode does
40
+ // relate things that can be related using inserts.
41
+ // TODO: Use a special key for this.
42
+ return [NO_DELETE, NO_UPDATE, NO_UNRELATE, INSERT_MISSING].every((opt) => {
43
+ return this.options[opt] === true;
44
+ });
45
+ }
46
+ // Like `shouldRelate` but ignores settings that explicitly disable relate operations.
47
+ shouldRelateIgnoreDisable(node, graphData) {
48
+ if (node.isReference || node.isDbReference) {
49
+ return true;
50
+ }
51
+ return (this._hasOption(node, RELATE) &&
52
+ !getCurrentNode(node, graphData) &&
53
+ !!node.parentEdge &&
54
+ !!node.parentEdge.relation &&
55
+ node.parentEdge.relation.hasRelateProp(node.obj) &&
56
+ graphData.nodeDbExistence.doesNodeExistInDb(node));
57
+ }
58
+ shouldRelate(node, graphData) {
59
+ return !this._hasOption(node, NO_RELATE) && this.shouldRelateIgnoreDisable(node, graphData);
60
+ }
61
+ // Like `shouldInsert` but ignores settings that explicitly disable insert operations.
62
+ shouldInsertIgnoreDisable(node, graphData) {
63
+ return (!getCurrentNode(node, graphData) &&
64
+ !this.shouldRelateIgnoreDisable(node, graphData) &&
65
+ (!node.hasId || this.shouldInsertMissing(node)));
66
+ }
67
+ shouldInsert(node, graphData) {
68
+ return !this._hasOption(node, NO_INSERT) && this.shouldInsertIgnoreDisable(node, graphData);
69
+ }
70
+ shouldInsertMissing(node) {
71
+ return this._hasOption(node, INSERT_MISSING);
72
+ }
73
+ // Like `shouldPatch() || shouldUpdate()` but ignores settings that explicitly disable
74
+ // update or patch operations.
75
+ shouldPatchOrUpdateIgnoreDisable(node, graphData) {
76
+ if (this.shouldRelate(node, graphData)) {
77
+ // We should update all nodes that are going to be related. Note that
78
+ // we don't actually update anything unless there is something to update
79
+ // so this is just a preliminary test.
80
+ return true;
81
+ }
82
+ return !!getCurrentNode(node, graphData);
83
+ }
84
+ shouldPatch(node, graphData) {
85
+ return (this.shouldPatchOrUpdateIgnoreDisable(node, graphData) &&
86
+ !this._hasOption(node, NO_UPDATE) &&
87
+ !this._hasOption(node, UPDATE));
88
+ }
89
+ shouldUpdate(node, graphData) {
90
+ return (this.shouldPatchOrUpdateIgnoreDisable(node, graphData) &&
91
+ !this._hasOption(node, NO_UPDATE) &&
92
+ this._hasOption(node, UPDATE));
93
+ }
94
+ // Like `shouldUnrelate` but ignores settings that explicitly disable unrelate operations.
95
+ shouldUnrelateIgnoreDisable(currentNode) {
96
+ return this._hasOption(currentNode, UNRELATE);
97
+ }
98
+ shouldUnrelate(currentNode, graphData) {
99
+ return (!getNode(currentNode, graphData.graph) &&
100
+ !this._hasOption(currentNode, NO_UNRELATE) &&
101
+ this.shouldUnrelateIgnoreDisable(currentNode));
102
+ }
103
+ shouldDelete(currentNode, graphData) {
104
+ return (!getNode(currentNode, graphData.graph) &&
105
+ !this._hasOption(currentNode, NO_DELETE) &&
106
+ !this.shouldUnrelateIgnoreDisable(currentNode));
107
+ }
108
+ shouldInsertOrRelate(node, graphData) {
109
+ return this.shouldInsert(node, graphData) || this.shouldRelate(node, graphData);
110
+ }
111
+ shouldDeleteOrUnrelate(currentNode, graphData) {
112
+ return this.shouldDelete(currentNode, graphData) || this.shouldUnrelate(currentNode, graphData);
113
+ }
114
+ allowRefs() {
115
+ return !!this.options[ALLOW_REFS];
116
+ }
117
+ rebasedOptions(newRoot) {
118
+ const newOpt = {};
119
+ const newRootRelationPath = newRoot.relationPathKey;
120
+ for (const name of Object.keys(this.options)) {
121
+ const value = this.options[name];
122
+ if (Array.isArray(value)) {
123
+ newOpt[name] = value
124
+ .filter((it) => it.startsWith(newRootRelationPath))
125
+ .map((it) => it.slice(newRootRelationPath.length + 1))
126
+ .filter((it) => !!it);
127
+ }
128
+ else {
129
+ newOpt[name] = value;
130
+ }
131
+ }
132
+ return new GraphOptions(newOpt);
133
+ }
134
+ _hasOption(node, optionName) {
135
+ const option = this.options[optionName];
136
+ if (Array.isArray(option)) {
137
+ return option.indexOf(node.relationPathKey) !== -1;
138
+ }
139
+ else if (typeof option === 'boolean') {
140
+ return option;
141
+ }
142
+ else if (option === undefined) {
143
+ return false;
144
+ }
145
+ else {
146
+ throw new Error(`expected ${optionName} option value "${option}" to be an instance of boolean or array of strings`);
147
+ }
148
+ }
186
149
  }
187
-
188
150
  function getCurrentNode(node, graphData) {
189
- if (!graphData || !node) {
190
- return null;
191
- }
192
-
193
- return graphData.currentGraph.nodeForNode(node);
151
+ if (!graphData || !node) {
152
+ return null;
153
+ }
154
+ return graphData.currentGraph.nodeForNode(node);
194
155
  }
195
-
196
156
  function getNode(currentNode, graph) {
197
- if (!graph || !currentNode) {
198
- return null;
199
- }
200
-
201
- return graph.nodeForNode(currentNode);
157
+ if (!graph || !currentNode) {
158
+ return null;
159
+ }
160
+ return graph.nodeForNode(currentNode);
202
161
  }
203
-
204
162
  module.exports = {
205
- GraphOptions,
206
- FetchStrategy,
163
+ GraphOptions,
164
+ FetchStrategy,
207
165
  };