@e22m4u/js-repository 0.0.31

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 (183) hide show
  1. package/.c8rc +9 -0
  2. package/.commitlintrc +5 -0
  3. package/.editorconfig +13 -0
  4. package/.eslintignore +1 -0
  5. package/.eslintrc.cjs +27 -0
  6. package/.husky/commit-msg +4 -0
  7. package/.husky/pre-commit +9 -0
  8. package/.mocharc.cjs +7 -0
  9. package/.prettierrc +7 -0
  10. package/LICENSE +21 -0
  11. package/README.md +523 -0
  12. package/mocha.setup.js +10 -0
  13. package/package.json +57 -0
  14. package/src/adapter/adapter-loader.d.ts +16 -0
  15. package/src/adapter/adapter-loader.js +63 -0
  16. package/src/adapter/adapter-loader.spec.js +31 -0
  17. package/src/adapter/adapter-registry.d.ts +14 -0
  18. package/src/adapter/adapter-registry.js +36 -0
  19. package/src/adapter/adapter-registry.spec.js +36 -0
  20. package/src/adapter/adapter.d.ts +118 -0
  21. package/src/adapter/adapter.js +181 -0
  22. package/src/adapter/adapter.spec.js +144 -0
  23. package/src/adapter/builtin/memory-adapter.d.ts +118 -0
  24. package/src/adapter/builtin/memory-adapter.js +342 -0
  25. package/src/adapter/builtin/memory-adapter.spec.js +2925 -0
  26. package/src/adapter/decorator/data-sanitizing-decorator.d.ts +13 -0
  27. package/src/adapter/decorator/data-sanitizing-decorator.js +44 -0
  28. package/src/adapter/decorator/data-sanitizing-decorator.spec.js +59 -0
  29. package/src/adapter/decorator/data-validation-decorator.d.ts +13 -0
  30. package/src/adapter/decorator/data-validation-decorator.js +41 -0
  31. package/src/adapter/decorator/data-validation-decorator.spec.js +59 -0
  32. package/src/adapter/decorator/default-values-decorator.d.ts +13 -0
  33. package/src/adapter/decorator/default-values-decorator.js +57 -0
  34. package/src/adapter/decorator/default-values-decorator.spec.js +141 -0
  35. package/src/adapter/decorator/fields-filtering-decorator.d.ts +13 -0
  36. package/src/adapter/decorator/fields-filtering-decorator.js +72 -0
  37. package/src/adapter/decorator/fields-filtering-decorator.spec.js +119 -0
  38. package/src/adapter/decorator/inclusion-decorator.d.ts +13 -0
  39. package/src/adapter/decorator/inclusion-decorator.js +78 -0
  40. package/src/adapter/decorator/inclusion-decorator.spec.js +117 -0
  41. package/src/adapter/decorator/index.d.ts +5 -0
  42. package/src/adapter/decorator/index.js +5 -0
  43. package/src/adapter/index.d.ts +3 -0
  44. package/src/adapter/index.js +3 -0
  45. package/src/definition/datasource/datasource-definition-validator.d.ts +14 -0
  46. package/src/definition/datasource/datasource-definition-validator.js +33 -0
  47. package/src/definition/datasource/datasource-definition-validator.spec.js +63 -0
  48. package/src/definition/datasource/datasource-definition.d.ts +7 -0
  49. package/src/definition/datasource/index.d.ts +2 -0
  50. package/src/definition/datasource/index.js +1 -0
  51. package/src/definition/definition-registry.d.ts +50 -0
  52. package/src/definition/definition-registry.js +98 -0
  53. package/src/definition/definition-registry.spec.js +78 -0
  54. package/src/definition/index.d.ts +3 -0
  55. package/src/definition/index.js +3 -0
  56. package/src/definition/model/index.d.ts +7 -0
  57. package/src/definition/model/index.js +6 -0
  58. package/src/definition/model/model-data-sanitizer.d.ts +15 -0
  59. package/src/definition/model/model-data-sanitizer.js +33 -0
  60. package/src/definition/model/model-data-validator.d.ts +32 -0
  61. package/src/definition/model/model-data-validator.js +144 -0
  62. package/src/definition/model/model-data-validator.spec.js +1889 -0
  63. package/src/definition/model/model-definition-utils.d.ts +161 -0
  64. package/src/definition/model/model-definition-utils.js +371 -0
  65. package/src/definition/model/model-definition-utils.spec.js +1474 -0
  66. package/src/definition/model/model-definition-validator.d.ts +14 -0
  67. package/src/definition/model/model-definition-validator.js +83 -0
  68. package/src/definition/model/model-definition-validator.spec.js +143 -0
  69. package/src/definition/model/model-definition.d.ts +28 -0
  70. package/src/definition/model/properties/data-type.d.ts +11 -0
  71. package/src/definition/model/properties/data-type.js +11 -0
  72. package/src/definition/model/properties/default-values-definition-validator.d.ts +15 -0
  73. package/src/definition/model/properties/default-values-definition-validator.js +53 -0
  74. package/src/definition/model/properties/default-values-definition-validator.spec.js +136 -0
  75. package/src/definition/model/properties/index.d.ts +5 -0
  76. package/src/definition/model/properties/index.js +4 -0
  77. package/src/definition/model/properties/primary-keys-definition-validator.d.ts +15 -0
  78. package/src/definition/model/properties/primary-keys-definition-validator.js +55 -0
  79. package/src/definition/model/properties/primary-keys-definition-validator.spec.js +145 -0
  80. package/src/definition/model/properties/properties-definition-validator.d.ts +15 -0
  81. package/src/definition/model/properties/properties-definition-validator.js +194 -0
  82. package/src/definition/model/properties/properties-definition-validator.spec.js +373 -0
  83. package/src/definition/model/properties/property-definition.d.ts +20 -0
  84. package/src/definition/model/relations/index.d.ts +3 -0
  85. package/src/definition/model/relations/index.js +2 -0
  86. package/src/definition/model/relations/relation-definition.d.ts +254 -0
  87. package/src/definition/model/relations/relation-type.d.ts +9 -0
  88. package/src/definition/model/relations/relation-type.js +9 -0
  89. package/src/definition/model/relations/relations-definition-validator.d.ts +15 -0
  90. package/src/definition/model/relations/relations-definition-validator.js +449 -0
  91. package/src/definition/model/relations/relations-definition-validator.spec.js +772 -0
  92. package/src/errors/index.d.ts +3 -0
  93. package/src/errors/index.js +3 -0
  94. package/src/errors/invalid-argument-error.d.ts +6 -0
  95. package/src/errors/invalid-argument-error.js +6 -0
  96. package/src/errors/invalid-argument-error.spec.js +33 -0
  97. package/src/errors/invalid-operator-value-error.d.ts +13 -0
  98. package/src/errors/invalid-operator-value-error.js +24 -0
  99. package/src/errors/invalid-operator-value-error.spec.js +11 -0
  100. package/src/errors/not-implemented-error.d.ts +6 -0
  101. package/src/errors/not-implemented-error.js +6 -0
  102. package/src/errors/not-implemented-error.spec.js +33 -0
  103. package/src/filter/fields-clause-tool.d.ts +38 -0
  104. package/src/filter/fields-clause-tool.js +88 -0
  105. package/src/filter/fields-clause-tool.spec.js +133 -0
  106. package/src/filter/filter.d.ts +335 -0
  107. package/src/filter/include-clause-tool.d.ts +53 -0
  108. package/src/filter/include-clause-tool.js +364 -0
  109. package/src/filter/include-clause-tool.spec.js +653 -0
  110. package/src/filter/index.d.ts +7 -0
  111. package/src/filter/index.js +6 -0
  112. package/src/filter/operator-clause-tool.d.ts +223 -0
  113. package/src/filter/operator-clause-tool.js +515 -0
  114. package/src/filter/operator-clause-tool.spec.js +1064 -0
  115. package/src/filter/order-clause-tool.d.ts +32 -0
  116. package/src/filter/order-clause-tool.js +97 -0
  117. package/src/filter/order-clause-tool.spec.js +438 -0
  118. package/src/filter/slice-clause-tool.d.ts +30 -0
  119. package/src/filter/slice-clause-tool.js +65 -0
  120. package/src/filter/slice-clause-tool.spec.js +117 -0
  121. package/src/filter/where-clause-tool.d.ts +23 -0
  122. package/src/filter/where-clause-tool.js +165 -0
  123. package/src/filter/where-clause-tool.spec.js +280 -0
  124. package/src/index.d.ts +9 -0
  125. package/src/index.js +8 -0
  126. package/src/relations/belongs-to-resolver.d.ts +46 -0
  127. package/src/relations/belongs-to-resolver.js +242 -0
  128. package/src/relations/belongs-to-resolver.spec.js +1047 -0
  129. package/src/relations/has-many-resolver.d.ts +67 -0
  130. package/src/relations/has-many-resolver.js +317 -0
  131. package/src/relations/has-many-resolver.spec.js +2911 -0
  132. package/src/relations/has-one-resolver.d.ts +67 -0
  133. package/src/relations/has-one-resolver.js +311 -0
  134. package/src/relations/has-one-resolver.spec.js +2274 -0
  135. package/src/relations/index.d.ts +4 -0
  136. package/src/relations/index.js +4 -0
  137. package/src/relations/references-many-resolver.d.ts +27 -0
  138. package/src/relations/references-many-resolver.js +113 -0
  139. package/src/relations/references-many-resolver.spec.js +631 -0
  140. package/src/repository/index.d.ts +2 -0
  141. package/src/repository/index.js +2 -0
  142. package/src/repository/repository-registry.d.ts +29 -0
  143. package/src/repository/repository-registry.js +57 -0
  144. package/src/repository/repository-registry.spec.js +38 -0
  145. package/src/repository/repository.d.ts +164 -0
  146. package/src/repository/repository.js +207 -0
  147. package/src/repository/repository.spec.js +202 -0
  148. package/src/schema.d.ts +37 -0
  149. package/src/schema.js +41 -0
  150. package/src/types.d.ts +30 -0
  151. package/src/utils/capitalize.d.ts +6 -0
  152. package/src/utils/capitalize.js +10 -0
  153. package/src/utils/capitalize.spec.js +14 -0
  154. package/src/utils/clone-deep.d.ts +6 -0
  155. package/src/utils/clone-deep.js +61 -0
  156. package/src/utils/clone-deep.spec.js +28 -0
  157. package/src/utils/exclude-object-keys.d.ts +10 -0
  158. package/src/utils/exclude-object-keys.js +20 -0
  159. package/src/utils/exclude-object-keys.spec.js +49 -0
  160. package/src/utils/get-ctor-name.d.ts +6 -0
  161. package/src/utils/get-ctor-name.js +11 -0
  162. package/src/utils/get-ctor-name.spec.js +17 -0
  163. package/src/utils/get-value-by-path.d.ts +12 -0
  164. package/src/utils/get-value-by-path.js +23 -0
  165. package/src/utils/get-value-by-path.spec.js +36 -0
  166. package/src/utils/index.d.ts +10 -0
  167. package/src/utils/index.js +10 -0
  168. package/src/utils/is-ctor.d.ts +7 -0
  169. package/src/utils/is-ctor.js +10 -0
  170. package/src/utils/is-ctor.spec.js +26 -0
  171. package/src/utils/is-pure-object.d.ts +6 -0
  172. package/src/utils/is-pure-object.js +15 -0
  173. package/src/utils/is-pure-object.spec.js +25 -0
  174. package/src/utils/select-object-keys.d.ts +10 -0
  175. package/src/utils/select-object-keys.js +37 -0
  176. package/src/utils/select-object-keys.spec.js +40 -0
  177. package/src/utils/singularize.d.ts +6 -0
  178. package/src/utils/singularize.js +22 -0
  179. package/src/utils/singularize.spec.js +23 -0
  180. package/src/utils/string-to-regexp.d.ts +10 -0
  181. package/src/utils/string-to-regexp.js +22 -0
  182. package/src/utils/string-to-regexp.spec.js +35 -0
  183. package/tsconfig.json +9 -0
@@ -0,0 +1,67 @@
1
+ import {ModelData} from '../types.js';
2
+ import {Filter} from '../filter/index.js';
3
+ import {Service} from '@e22m4u/js-service';
4
+
5
+ /**
6
+ * Has many resolver.
7
+ */
8
+ export declare class HasManyResolver extends Service {
9
+ /**
10
+ * Include to.
11
+ *
12
+ * @param entities
13
+ * @param sourceName
14
+ * @param targetName
15
+ * @param relationName
16
+ * @param foreignKey
17
+ * @param scope
18
+ */
19
+ includeTo(
20
+ entities: ModelData[],
21
+ sourceName: string,
22
+ targetName: string,
23
+ relationName: string,
24
+ foreignKey: string,
25
+ scope?: Filter,
26
+ ): Promise<void>;
27
+
28
+ /**
29
+ * Include polymorphic to.
30
+ *
31
+ * @param entities
32
+ * @param sourceName
33
+ * @param targetName
34
+ * @param relationName
35
+ * @param foreignKey
36
+ * @param discriminator
37
+ * @param scope
38
+ */
39
+ includePolymorphicTo(
40
+ entities: ModelData[],
41
+ sourceName: string,
42
+ targetName: string,
43
+ relationName: string,
44
+ foreignKey: string,
45
+ discriminator: string,
46
+ scope?: Filter,
47
+ ): Promise<void>;
48
+
49
+ /**
50
+ * Include polymorphic by relation name.
51
+ *
52
+ * @param entities
53
+ * @param sourceName
54
+ * @param targetName
55
+ * @param relationName
56
+ * @param targetRelationName
57
+ * @param scope
58
+ */
59
+ includePolymorphicByRelationName(
60
+ entities: ModelData[],
61
+ sourceName: string,
62
+ targetName: string,
63
+ relationName: string,
64
+ targetRelationName: string,
65
+ scope?: Filter,
66
+ ): Promise<void>;
67
+ }
@@ -0,0 +1,317 @@
1
+ import {Service} from '@e22m4u/js-service';
2
+ import {cloneDeep} from '../utils/index.js';
3
+ import {RelationType} from '../definition/index.js';
4
+ import {InvalidArgumentError} from '../errors/index.js';
5
+ import {RepositoryRegistry} from '../repository/index.js';
6
+ import {ModelDefinitionUtils} from '../definition/index.js';
7
+
8
+ /**
9
+ * Has many resolver.
10
+ */
11
+ export class HasManyResolver extends Service {
12
+ /**
13
+ * Include to.
14
+ *
15
+ * @param {object[]} entities
16
+ * @param {string} sourceName
17
+ * @param {string} targetName
18
+ * @param {string} relationName
19
+ * @param {string} foreignKey
20
+ * @param {object|undefined} scope
21
+ * @returns {Promise<void>}
22
+ */
23
+ async includeTo(
24
+ entities,
25
+ sourceName,
26
+ targetName,
27
+ relationName,
28
+ foreignKey,
29
+ scope = undefined,
30
+ ) {
31
+ if (!entities || !Array.isArray(entities))
32
+ throw new InvalidArgumentError(
33
+ 'The parameter "entities" of HasManyResolver.includeTo requires ' +
34
+ 'an Array of Object, but %v given.',
35
+ entities,
36
+ );
37
+ if (!sourceName || typeof sourceName !== 'string')
38
+ throw new InvalidArgumentError(
39
+ 'The parameter "sourceName" of HasManyResolver.includeTo requires ' +
40
+ 'a non-empty String, but %v given.',
41
+ sourceName,
42
+ );
43
+ if (!targetName || typeof targetName !== 'string')
44
+ throw new InvalidArgumentError(
45
+ 'The parameter "targetName" of HasManyResolver.includeTo requires ' +
46
+ 'a non-empty String, but %v given.',
47
+ targetName,
48
+ );
49
+ if (!relationName || typeof relationName !== 'string')
50
+ throw new InvalidArgumentError(
51
+ 'The parameter "relationName" of HasManyResolver.includeTo requires ' +
52
+ 'a non-empty String, but %v given.',
53
+ relationName,
54
+ );
55
+ if (!foreignKey || typeof foreignKey !== 'string')
56
+ throw new InvalidArgumentError(
57
+ 'The parameter "foreignKey" of HasManyResolver.includeTo requires ' +
58
+ 'a non-empty String, but %v given.',
59
+ foreignKey,
60
+ );
61
+ if (scope && (typeof scope !== 'object' || Array.isArray(scope)))
62
+ throw new InvalidArgumentError(
63
+ 'The provided parameter "scope" of HasManyResolver.includeTo ' +
64
+ 'should be an Object, but %v given.',
65
+ scope,
66
+ );
67
+
68
+ const sourcePkPropName =
69
+ this.getService(ModelDefinitionUtils).getPrimaryKeyAsPropertyName(
70
+ sourceName,
71
+ );
72
+ const sourceIds = [];
73
+ entities.forEach(entity => {
74
+ if (!entity || typeof entity !== 'object' || Array.isArray(entity))
75
+ throw new InvalidArgumentError(
76
+ 'The parameter "entities" of HasManyResolver.includeTo requires ' +
77
+ 'an Array of Object, but %v given.',
78
+ entity,
79
+ );
80
+ const sourceId = entity[sourcePkPropName];
81
+ if (sourceIds.includes(sourceId)) return;
82
+ sourceIds.push(sourceId);
83
+ });
84
+
85
+ const promises = [];
86
+ const targetRepository =
87
+ this.getService(RepositoryRegistry).getRepository(targetName);
88
+ scope = scope ? cloneDeep(scope) : {};
89
+ const targetsBySourceId = new Map();
90
+ sourceIds.forEach(sourceId => {
91
+ const filter = cloneDeep(scope);
92
+ filter.where = {
93
+ and: [{[foreignKey]: sourceId}, ...(scope.where ? [scope.where] : [])],
94
+ };
95
+ promises.push(
96
+ targetRepository.find(filter).then(result => {
97
+ if (result.length) {
98
+ let targets = targetsBySourceId.get(sourceId) ?? [];
99
+ targets = [...targets, ...result];
100
+ targetsBySourceId.set(sourceId, targets);
101
+ }
102
+ }),
103
+ );
104
+ });
105
+ await Promise.all(promises);
106
+
107
+ entities.forEach(entity => {
108
+ const sourceId = entity[sourcePkPropName];
109
+ entity[relationName] = targetsBySourceId.get(sourceId) ?? [];
110
+ });
111
+ }
112
+
113
+ /**
114
+ * Include polymorphic to.
115
+ *
116
+ * @param {object[]} entities
117
+ * @param {string} sourceName
118
+ * @param {string} targetName
119
+ * @param {string} relationName
120
+ * @param {string} foreignKey
121
+ * @param {string} discriminator
122
+ * @param {object|undefined} scope
123
+ * @returns {Promise<void>}
124
+ */
125
+ async includePolymorphicTo(
126
+ entities,
127
+ sourceName,
128
+ targetName,
129
+ relationName,
130
+ foreignKey,
131
+ discriminator,
132
+ scope = undefined,
133
+ ) {
134
+ if (!entities || !Array.isArray(entities))
135
+ throw new InvalidArgumentError(
136
+ 'The parameter "entities" of HasManyResolver.includePolymorphicTo requires ' +
137
+ 'an Array of Object, but %v given.',
138
+ entities,
139
+ );
140
+ if (!sourceName || typeof sourceName !== 'string')
141
+ throw new InvalidArgumentError(
142
+ 'The parameter "sourceName" of HasManyResolver.includePolymorphicTo requires ' +
143
+ 'a non-empty String, but %v given.',
144
+ sourceName,
145
+ );
146
+ if (!targetName || typeof targetName !== 'string')
147
+ throw new InvalidArgumentError(
148
+ 'The parameter "targetName" of HasManyResolver.includePolymorphicTo requires ' +
149
+ 'a non-empty String, but %v given.',
150
+ targetName,
151
+ );
152
+ if (!relationName || typeof relationName !== 'string')
153
+ throw new InvalidArgumentError(
154
+ 'The parameter "relationName" of HasManyResolver.includePolymorphicTo requires ' +
155
+ 'a non-empty String, but %v given.',
156
+ relationName,
157
+ );
158
+ if (!foreignKey || typeof foreignKey !== 'string')
159
+ throw new InvalidArgumentError(
160
+ 'The parameter "foreignKey" of HasManyResolver.includePolymorphicTo requires ' +
161
+ 'a non-empty String, but %v given.',
162
+ foreignKey,
163
+ );
164
+ if (!discriminator || typeof discriminator !== 'string')
165
+ throw new InvalidArgumentError(
166
+ 'The parameter "discriminator" of HasManyResolver.includePolymorphicTo requires ' +
167
+ 'a non-empty String, but %v given.',
168
+ discriminator,
169
+ );
170
+ if (scope && (typeof scope !== 'object' || Array.isArray(scope)))
171
+ throw new InvalidArgumentError(
172
+ 'The provided parameter "scope" of HasManyResolver.includePolymorphicTo ' +
173
+ 'should be an Object, but %v given.',
174
+ scope,
175
+ );
176
+
177
+ const sourcePkPropName =
178
+ this.getService(ModelDefinitionUtils).getPrimaryKeyAsPropertyName(
179
+ sourceName,
180
+ );
181
+ const sourceIds = [];
182
+ entities.forEach(entity => {
183
+ if (!entity || typeof entity !== 'object' || Array.isArray(entity))
184
+ throw new InvalidArgumentError(
185
+ 'The parameter "entities" of HasManyResolver.includePolymorphicTo requires ' +
186
+ 'an Array of Object, but %v given.',
187
+ entity,
188
+ );
189
+ const sourceId = entity[sourcePkPropName];
190
+ if (sourceIds.includes(sourceId)) return;
191
+ sourceIds.push(sourceId);
192
+ });
193
+
194
+ const promises = [];
195
+ const targetRepository =
196
+ this.getService(RepositoryRegistry).getRepository(targetName);
197
+ scope = scope ? cloneDeep(scope) : {};
198
+ const targetsBySourceId = new Map();
199
+ sourceIds.forEach(sourceId => {
200
+ const filter = cloneDeep(scope);
201
+ filter.where = {
202
+ and: [
203
+ {[foreignKey]: sourceId, [discriminator]: sourceName},
204
+ ...(scope.where ? [scope.where] : []),
205
+ ],
206
+ };
207
+ promises.push(
208
+ targetRepository.find(filter).then(result => {
209
+ if (result.length) {
210
+ let targets = targetsBySourceId.get(sourceId) ?? [];
211
+ targets = [...targets, ...result];
212
+ targetsBySourceId.set(sourceId, targets);
213
+ }
214
+ }),
215
+ );
216
+ });
217
+ await Promise.all(promises);
218
+
219
+ entities.forEach(entity => {
220
+ const sourceId = entity[sourcePkPropName];
221
+ entity[relationName] = targetsBySourceId.get(sourceId) ?? [];
222
+ });
223
+ }
224
+
225
+ /**
226
+ * Include polymorphic by relation name.
227
+ *
228
+ * @param {object[]} entities
229
+ * @param {string} sourceName
230
+ * @param {string} targetName
231
+ * @param {string} relationName
232
+ * @param {string} targetRelationName
233
+ * @param {object|undefined} scope
234
+ * @returns {Promise<void>}
235
+ */
236
+ async includePolymorphicByRelationName(
237
+ entities,
238
+ sourceName,
239
+ targetName,
240
+ relationName,
241
+ targetRelationName,
242
+ scope = undefined,
243
+ ) {
244
+ if (!entities || !Array.isArray(entities))
245
+ throw new InvalidArgumentError(
246
+ 'The parameter "entities" of HasManyResolver.includePolymorphicByRelationName requires ' +
247
+ 'an Array of Object, but %v given.',
248
+ entities,
249
+ );
250
+ if (!sourceName || typeof sourceName !== 'string')
251
+ throw new InvalidArgumentError(
252
+ 'The parameter "sourceName" of HasManyResolver.includePolymorphicByRelationName requires ' +
253
+ 'a non-empty String, but %v given.',
254
+ sourceName,
255
+ );
256
+ if (!targetName || typeof targetName !== 'string')
257
+ throw new InvalidArgumentError(
258
+ 'The parameter "targetName" of HasManyResolver.includePolymorphicByRelationName requires ' +
259
+ 'a non-empty String, but %v given.',
260
+ targetName,
261
+ );
262
+ if (!relationName || typeof relationName !== 'string')
263
+ throw new InvalidArgumentError(
264
+ 'The parameter "relationName" of HasManyResolver.includePolymorphicByRelationName requires ' +
265
+ 'a non-empty String, but %v given.',
266
+ relationName,
267
+ );
268
+ if (!targetRelationName || typeof targetRelationName !== 'string')
269
+ throw new InvalidArgumentError(
270
+ 'The parameter "targetRelationName" of HasManyResolver.includePolymorphicByRelationName requires ' +
271
+ 'a non-empty String, but %v given.',
272
+ targetRelationName,
273
+ );
274
+ if (scope && (typeof scope !== 'object' || Array.isArray(scope)))
275
+ throw new InvalidArgumentError(
276
+ 'The provided parameter "scope" of HasManyResolver.includePolymorphicByRelationName ' +
277
+ 'should be an Object, but %v given.',
278
+ scope,
279
+ );
280
+
281
+ const targetRelationDef = this.getService(
282
+ ModelDefinitionUtils,
283
+ ).getRelationDefinitionByName(targetName, targetRelationName);
284
+ if (targetRelationDef.type !== RelationType.BELONGS_TO)
285
+ throw new InvalidArgumentError(
286
+ 'The relation %v of the model %v is a polymorphic "hasMany" relation, ' +
287
+ 'so it requires the target relation %v to be a polymorphic "belongsTo", ' +
288
+ 'but %v type given.',
289
+ relationName,
290
+ sourceName,
291
+ targetRelationName,
292
+ targetRelationDef.type,
293
+ );
294
+ if (!targetRelationDef.polymorphic)
295
+ throw new InvalidArgumentError(
296
+ 'The relation %v of the model %v is a polymorphic "hasMany" relation, ' +
297
+ 'so it requires the target relation %v to be a polymorphic too.',
298
+ relationName,
299
+ sourceName,
300
+ targetRelationName,
301
+ );
302
+ const foreignKey =
303
+ targetRelationDef.foreignKey || `${targetRelationName}Id`;
304
+ const discriminator =
305
+ targetRelationDef.discriminator || `${targetRelationName}Type`;
306
+
307
+ return this.includePolymorphicTo(
308
+ entities,
309
+ sourceName,
310
+ targetName,
311
+ relationName,
312
+ foreignKey,
313
+ discriminator,
314
+ scope,
315
+ );
316
+ }
317
+ }