@uql/core 0.4.80 → 0.4.83

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 (57) hide show
  1. package/README.md +11 -11
  2. package/dialect/abstractSqlDialect-spec.d.ts +49 -0
  3. package/dialect/abstractSqlDialect-spec.js +765 -0
  4. package/dialect/abstractSqlDialect.js +11 -17
  5. package/dialect/mysqlDialect.js +2 -2
  6. package/dialect/mysqlDialect.spec.d.ts +6 -0
  7. package/dialect/mysqlDialect.spec.js +33 -0
  8. package/dialect/postgresDialect.js +2 -2
  9. package/dialect/postgresDialect.spec.d.ts +1 -0
  10. package/dialect/postgresDialect.spec.js +139 -0
  11. package/dialect/sqliteDialect.spec.d.ts +1 -0
  12. package/dialect/sqliteDialect.spec.js +12 -0
  13. package/entity/decorator/definition.js +22 -24
  14. package/entity/decorator/definition.spec.d.ts +1 -0
  15. package/entity/decorator/definition.spec.js +725 -0
  16. package/entity/decorator/relation.spec.d.ts +1 -0
  17. package/entity/decorator/relation.spec.js +55 -0
  18. package/options.js +2 -2
  19. package/options.spec.d.ts +1 -0
  20. package/options.spec.js +50 -0
  21. package/package.json +3 -3
  22. package/querier/abstractQuerier-it.d.ts +41 -0
  23. package/querier/abstractQuerier-it.js +410 -0
  24. package/querier/abstractSqlQuerier-it.d.ts +9 -0
  25. package/querier/abstractSqlQuerier-it.js +19 -0
  26. package/querier/abstractSqlQuerier-spec.d.ts +53 -0
  27. package/querier/abstractSqlQuerier-spec.js +607 -0
  28. package/querier/abstractSqlQuerier.js +2 -3
  29. package/querier/decorator/injectQuerier.js +2 -3
  30. package/querier/decorator/injectQuerier.spec.d.ts +1 -0
  31. package/querier/decorator/injectQuerier.spec.js +108 -0
  32. package/querier/decorator/transactional.js +2 -2
  33. package/querier/decorator/transactional.spec.d.ts +1 -0
  34. package/querier/decorator/transactional.spec.js +241 -0
  35. package/repository/genericRepository.spec.d.ts +1 -0
  36. package/repository/genericRepository.spec.js +86 -0
  37. package/test/entityMock.d.ts +180 -0
  38. package/test/entityMock.js +451 -0
  39. package/test/index.d.ts +3 -0
  40. package/test/index.js +7 -0
  41. package/test/it.util.d.ts +4 -0
  42. package/test/it.util.js +60 -0
  43. package/test/spec.util.d.ts +13 -0
  44. package/test/spec.util.js +54 -0
  45. package/type/entity.d.ts +12 -17
  46. package/type/entity.js +1 -1
  47. package/type/utility.d.ts +3 -2
  48. package/type/utility.js +1 -1
  49. package/util/dialect.util.js +2 -3
  50. package/util/dialect.util.spec.d.ts +1 -0
  51. package/util/dialect.util.spec.js +23 -0
  52. package/util/object.util.spec.d.ts +1 -0
  53. package/util/object.util.spec.js +26 -0
  54. package/util/sql.util.spec.d.ts +1 -0
  55. package/util/sql.util.spec.js +164 -0
  56. package/util/string.util.spec.d.ts +1 -0
  57. package/util/string.util.spec.js +26 -0
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractQuerierIt = void 0;
4
+ const entity_1 = require("@uql/core/entity");
5
+ const test_1 = require("@uql/core/test");
6
+ class AbstractQuerierIt {
7
+ constructor(pool) {
8
+ this.pool = pool;
9
+ }
10
+ async beforeAll() {
11
+ this.querier = await this.pool.getQuerier();
12
+ await this.dropTables();
13
+ await this.createTables();
14
+ await this.querier.release();
15
+ }
16
+ async beforeEach() {
17
+ this.querier = await this.pool.getQuerier();
18
+ await this.clearTables();
19
+ }
20
+ async afterEach() {
21
+ await this.querier.release();
22
+ }
23
+ async afterAll() {
24
+ await this.pool.end();
25
+ }
26
+ shouldGetRepository() {
27
+ const repository = this.querier.getRepository(test_1.User);
28
+ expect(repository).toBeDefined();
29
+ }
30
+ async shouldInsertMany() {
31
+ const ids = await this.querier.insertMany(test_1.User, [
32
+ {
33
+ name: 'Some Name A',
34
+ email: 'someemaila@example.com',
35
+ password: '123456789a!',
36
+ },
37
+ {
38
+ name: 'Some Name B',
39
+ email: 'someemailb@example.com',
40
+ password: '123456789b!',
41
+ },
42
+ ]);
43
+ expect(ids).toHaveLength(2);
44
+ for (const id of ids) {
45
+ expect(id).toBeDefined();
46
+ }
47
+ }
48
+ async shouldInsertOne() {
49
+ const creatorId = await this.querier.insertOne(test_1.User, {
50
+ name: 'Some Name C',
51
+ email: 'someemailc@example.com',
52
+ password: '123456789z!',
53
+ });
54
+ expect(creatorId).toBeDefined();
55
+ const companyId = await this.querier.insertOne(test_1.Company, {
56
+ name: 'Some Name C',
57
+ creatorId,
58
+ });
59
+ expect(companyId).toBeDefined();
60
+ const taxCategoryId = await this.querier.insertOne(test_1.TaxCategory, {
61
+ name: 'Some Name C',
62
+ description: 'Some Description Z',
63
+ creatorId,
64
+ companyId,
65
+ });
66
+ expect(taxCategoryId).toBeDefined();
67
+ }
68
+ async shouldInsertOneWithOnInsertId() {
69
+ const id1 = await this.querier.insertOne(test_1.TaxCategory, {
70
+ name: 'Some Name',
71
+ });
72
+ const id2 = await this.querier.insertOne(test_1.TaxCategory, {
73
+ pk: '123',
74
+ name: 'Some Name',
75
+ });
76
+ expect(id1).toBeDefined();
77
+ expect(id2).toBeDefined();
78
+ }
79
+ async shouldInsertManyWithSpecifiedIdsAndOnInsertIdAsDefault() {
80
+ const ids = await this.querier.insertMany(test_1.TaxCategory, [
81
+ {
82
+ name: 'Some Name A',
83
+ },
84
+ {
85
+ pk: '50',
86
+ name: 'Some Name B',
87
+ },
88
+ {
89
+ name: 'Some Name C',
90
+ },
91
+ {
92
+ pk: '70',
93
+ name: 'Some Name D',
94
+ },
95
+ ]);
96
+ expect(ids).toHaveLength(4);
97
+ for (const id of ids) {
98
+ expect(id).toBeDefined();
99
+ }
100
+ }
101
+ async shouldInsertManyWithAutoIncrementIdAsDefault() {
102
+ const ids = await this.querier.insertMany(test_1.LedgerAccount, [
103
+ {
104
+ name: 'Some Name A',
105
+ },
106
+ {
107
+ name: 'Some Name B',
108
+ },
109
+ {
110
+ name: 'Some Name C',
111
+ },
112
+ ]);
113
+ expect(ids).toHaveLength(3);
114
+ for (const id of ids) {
115
+ expect(id).toBeDefined();
116
+ }
117
+ const founds = await this.querier.findMany(test_1.LedgerAccount, {});
118
+ expect(founds.map(({ id }) => id)).toEqual(ids);
119
+ }
120
+ async shouldInsertOneAndCascadeOneToOne() {
121
+ const payload = {
122
+ name: 'Some Name D',
123
+ createdAt: 123,
124
+ profile: { picture: 'abc', createdAt: 123 },
125
+ };
126
+ const id = await this.querier.insertOne(test_1.User, payload);
127
+ expect(id).toBeDefined();
128
+ const found = await this.querier.findOneById(test_1.User, id, { $project: ['profile'] });
129
+ expect(found).toMatchObject({ id, profile: payload.profile });
130
+ }
131
+ async shouldInsertOneAndCascadeManyToOne() {
132
+ const payload = {
133
+ name: 'Centimeter',
134
+ createdAt: 123,
135
+ category: { name: 'Metric', createdAt: 123 },
136
+ };
137
+ const id = await this.querier.insertOne(test_1.MeasureUnit, payload);
138
+ expect(id).toBeDefined();
139
+ const found = await this.querier.findOneById(test_1.MeasureUnit, id, { $project: { category: true } });
140
+ expect(found).toMatchObject({ id, category: payload.category });
141
+ }
142
+ async shouldInsertOneAndCascadeOneToMany() {
143
+ const itemAdjustments = [{ buyPrice: 50 }, { buyPrice: 300 }];
144
+ const date = new Date();
145
+ const inventoryAdjustmentId = await this.querier.insertOne(test_1.InventoryAdjustment, {
146
+ description: 'some description',
147
+ date,
148
+ itemAdjustments,
149
+ });
150
+ expect(inventoryAdjustmentId).toBeDefined();
151
+ const inventoryAdjustmentFound = await this.querier.findOneById(test_1.InventoryAdjustment, inventoryAdjustmentId, {
152
+ $project: { itemAdjustments: true },
153
+ });
154
+ expect(inventoryAdjustmentFound).toMatchObject({
155
+ id: inventoryAdjustmentId,
156
+ itemAdjustments,
157
+ });
158
+ const itemAdjustmentsFound = await this.querier.findMany(test_1.ItemAdjustment, { $filter: { inventoryAdjustmentId } });
159
+ expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
160
+ }
161
+ async shouldInsertOneAndCascadeOneToManyWithSpecificFields() {
162
+ const itemAdjustments = [{ buyPrice: 50 }, { buyPrice: 300 }];
163
+ const inventoryAdjustmentId = await this.querier.insertOne(test_1.InventoryAdjustment, {
164
+ description: 'some description',
165
+ itemAdjustments: itemAdjustments.slice(),
166
+ });
167
+ expect(inventoryAdjustmentId).toBeDefined();
168
+ const inventoryAdjustmentFound = await this.querier.findOneById(test_1.InventoryAdjustment, inventoryAdjustmentId, {
169
+ $project: { itemAdjustments: ['buyPrice'] },
170
+ });
171
+ expect(inventoryAdjustmentFound).toMatchObject({
172
+ id: inventoryAdjustmentId,
173
+ itemAdjustments,
174
+ });
175
+ const itemAdjustmentsFound = await this.querier.findMany(test_1.ItemAdjustment, { $filter: { inventoryAdjustmentId } });
176
+ expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
177
+ }
178
+ async shouldUpdateOneAndCascadeOneToMany() {
179
+ const itemAdjustments = [{ buyPrice: 50 }, { buyPrice: 300 }];
180
+ const inventoryAdjustmentId = await this.querier.insertOne(test_1.InventoryAdjustment, {
181
+ description: 'some description',
182
+ });
183
+ expect(inventoryAdjustmentId).toBeDefined();
184
+ const changes = await this.querier.updateOneById(test_1.InventoryAdjustment, inventoryAdjustmentId, {
185
+ itemAdjustments,
186
+ });
187
+ expect(changes).toBe(1);
188
+ const inventoryAdjustmentFound = await this.querier.findOneById(test_1.InventoryAdjustment, inventoryAdjustmentId, {
189
+ $project: { itemAdjustments: ['buyPrice'] },
190
+ });
191
+ expect(inventoryAdjustmentFound).toMatchObject({
192
+ id: inventoryAdjustmentId,
193
+ itemAdjustments,
194
+ });
195
+ const itemAdjustmentsFound = await this.querier.findMany(test_1.ItemAdjustment, { $filter: { inventoryAdjustmentId } });
196
+ expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
197
+ }
198
+ async shouldUpdateOneByIdAndCascadeOneToManyNull() {
199
+ const id = await this.querier.insertOne(test_1.InventoryAdjustment, { itemAdjustments: [{}, {}] });
200
+ await expect(this.querier.count(test_1.ItemAdjustment)).resolves.toBe(2);
201
+ await this.querier.updateOneById(test_1.InventoryAdjustment, id, {
202
+ itemAdjustments: null,
203
+ });
204
+ await expect(this.querier.count(test_1.ItemAdjustment)).resolves.toBe(0);
205
+ }
206
+ async shouldUpdateManyAndCascadeOneToManyNull() {
207
+ await this.querier.insertOne(test_1.InventoryAdjustment, { itemAdjustments: [{}, {}] });
208
+ await expect(this.querier.count(test_1.ItemAdjustment)).resolves.toBe(2);
209
+ await this.querier.updateMany(test_1.InventoryAdjustment, { $filter: {} }, {
210
+ itemAdjustments: null,
211
+ });
212
+ await expect(this.querier.count(test_1.ItemAdjustment)).resolves.toBe(0);
213
+ }
214
+ async shouldInsertOneAndCascadeManyToMany() {
215
+ const payload = {
216
+ name: 'item one',
217
+ createdAt: 1,
218
+ tags: [
219
+ {
220
+ name: 'tag one',
221
+ createdAt: 1,
222
+ },
223
+ {
224
+ name: 'tag two',
225
+ createdAt: 1,
226
+ },
227
+ ],
228
+ };
229
+ const id = await this.querier.insertOne(test_1.Item, payload);
230
+ expect(id).toBeDefined();
231
+ const foundItem = await this.querier.findOneById(test_1.Item, id, {
232
+ $project: { name: true, createdAt: true, tags: ['name', 'createdAt'] },
233
+ });
234
+ expect(foundItem).toMatchObject({
235
+ id,
236
+ ...payload,
237
+ });
238
+ const foundTags = await this.querier.findMany(test_1.Tag, {
239
+ $project: { name: true, createdAt: true, items: ['name', 'createdAt'] },
240
+ });
241
+ delete foundItem.tags;
242
+ expect(foundTags).toMatchObject(payload.tags.map((tag) => ({ ...tag, items: [foundItem] })));
243
+ }
244
+ async shouldUpdateOneAndCascadeManyToMany() {
245
+ const id = await this.querier.insertOne(test_1.Item, { createdAt: 1 });
246
+ const payload = {
247
+ name: 'item one',
248
+ updatedAt: 1,
249
+ tags: [
250
+ {
251
+ name: 'tag one',
252
+ createdAt: 1,
253
+ },
254
+ {
255
+ name: 'tag two',
256
+ createdAt: 1,
257
+ },
258
+ ],
259
+ };
260
+ await this.querier.updateOneById(test_1.Item, id, payload);
261
+ const found = await this.querier.findOneById(test_1.Item, id, {
262
+ $project: { name: true, updatedAt: true, tags: true },
263
+ });
264
+ expect(found).toMatchObject({
265
+ id,
266
+ ...payload,
267
+ });
268
+ }
269
+ async shouldFindMany() {
270
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
271
+ const users = await this.querier.findMany(test_1.User, {
272
+ $project: ['name'],
273
+ $skip: 1,
274
+ $limit: 2,
275
+ $sort: {
276
+ name: 1,
277
+ },
278
+ });
279
+ expect(users).toMatchObject([
280
+ {
281
+ name: 'Some Name B',
282
+ },
283
+ {
284
+ name: 'Some Name C',
285
+ },
286
+ ]);
287
+ }
288
+ async shouldFindOne() {
289
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
290
+ const found = await this.querier.findOne(test_1.User, {
291
+ $project: ['id', 'name', 'email', 'password'],
292
+ $filter: {
293
+ email: 'someemaila@example.com',
294
+ },
295
+ });
296
+ expect(found).toMatchObject({
297
+ name: 'Some Name A',
298
+ email: 'someemaila@example.com',
299
+ password: '123456789a!',
300
+ });
301
+ const notFound = await this.querier.findOne(test_1.User, {
302
+ $filter: {
303
+ name: 'some name',
304
+ },
305
+ });
306
+ expect(notFound).toBeUndefined();
307
+ }
308
+ async shouldCount() {
309
+ await expect(this.querier.count(test_1.User, {})).resolves.toBe(0);
310
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
311
+ await expect(this.querier.count(test_1.User)).resolves.toBe(3);
312
+ await expect(this.querier.count(test_1.User, { $filter: { companyId: null } })).resolves.toBe(3);
313
+ await expect(this.querier.count(test_1.User, { $filter: { companyId: 1 } })).resolves.toBe(0);
314
+ }
315
+ async shouldUpdateMany() {
316
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
317
+ await expect(this.querier.updateMany(test_1.User, { $filter: { companyId: 1 } }, { companyId: null })).resolves.toBe(0);
318
+ await expect(this.querier.updateMany(test_1.User, { $filter: { companyId: null } }, { companyId: 1 })).resolves.toBe(3);
319
+ await expect(this.querier.updateMany(test_1.User, { $filter: { companyId: 1 } }, { companyId: null })).resolves.toBe(3);
320
+ }
321
+ async shouldThrowWhenRollbackTransactionWithoutBeginTransaction() {
322
+ await expect(this.querier.rollbackTransaction()).rejects.toThrow('not a pending transaction');
323
+ }
324
+ async shouldThrowIfUnknownComparisonOperator() {
325
+ await expect(this.querier.findMany(test_1.User, {
326
+ $filter: { name: { $someInvalidOperator: 'some' } },
327
+ })).rejects.toThrow('unknown operator: $someInvalidOperator');
328
+ }
329
+ async shouldCommit() {
330
+ await expect(this.querier.count(test_1.User)).resolves.toBe(0);
331
+ await this.querier.beginTransaction();
332
+ await this.querier.insertOne(test_1.User, {});
333
+ await expect(this.querier.count(test_1.User)).resolves.toBe(1);
334
+ await this.querier.commitTransaction();
335
+ await expect(this.querier.count(test_1.User)).resolves.toBe(1);
336
+ }
337
+ async shouldRollback() {
338
+ await expect(this.querier.count(test_1.User)).resolves.toBe(0);
339
+ await this.querier.beginTransaction();
340
+ await this.querier.insertOne(test_1.User, {});
341
+ await expect(this.querier.count(test_1.User)).resolves.toBe(1);
342
+ await this.querier.rollbackTransaction();
343
+ await expect(this.querier.count(test_1.User)).resolves.toBe(0);
344
+ }
345
+ async shouldThrowWhenBeginTransactionAfterBeginTransaction() {
346
+ expect(this.querier.hasOpenTransaction).toBeFalsy();
347
+ await this.querier.beginTransaction();
348
+ expect(this.querier.hasOpenTransaction).toBe(true);
349
+ await expect(this.querier.beginTransaction()).rejects.toThrow('pending transaction');
350
+ await expect(this.querier.release()).rejects.toThrow('pending transaction');
351
+ await this.querier.rollbackTransaction();
352
+ }
353
+ async shouldProjectOneToMany() {
354
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
355
+ const [user, company] = await Promise.all([
356
+ this.querier.findOne(test_1.User, { $project: ['id'] }),
357
+ this.querier.findOne(test_1.Company, { $project: ['id'] }),
358
+ ]);
359
+ const [firstItemId, secondItemId] = await this.querier.insertMany(test_1.Item, [
360
+ {
361
+ name: 'some item name a',
362
+ creatorId: user.id,
363
+ companyId: company.id,
364
+ },
365
+ {
366
+ name: 'some item name b',
367
+ creatorId: user.id,
368
+ companyId: company.id,
369
+ },
370
+ ]);
371
+ const inventoryAdjustmentId = await this.querier.insertOne(test_1.InventoryAdjustment, {
372
+ description: 'some inventory adjustment',
373
+ creatorId: user.id,
374
+ companyId: company.id,
375
+ itemAdjustments: [
376
+ { buyPrice: 1000, itemId: firstItemId },
377
+ { buyPrice: 2000, itemId: secondItemId },
378
+ ],
379
+ });
380
+ const inventoryAdjustmentFound = await this.querier.findOneById(test_1.InventoryAdjustment, inventoryAdjustmentId, {
381
+ $project: { itemAdjustments: true, creator: true },
382
+ });
383
+ expect(inventoryAdjustmentFound).toMatchObject({
384
+ id: inventoryAdjustmentId,
385
+ itemAdjustments: [
386
+ { buyPrice: 1000, itemId: firstItemId },
387
+ { buyPrice: 2000, itemId: secondItemId },
388
+ ],
389
+ creator: {
390
+ email: 'someemaila@example.com',
391
+ name: 'Some Name A',
392
+ password: '123456789a!',
393
+ },
394
+ });
395
+ }
396
+ async shouldDeleteMany() {
397
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
398
+ await expect(this.querier.deleteMany(test_1.User, { $filter: { companyId: 1 } })).resolves.toBe(0);
399
+ await expect(this.querier.deleteMany(test_1.User, { $filter: { companyId: null } })).resolves.toBe(3);
400
+ }
401
+ async shouldThrowWhenCommitTransactionWithoutBeginTransaction() {
402
+ await expect(this.querier.commitTransaction()).rejects.toThrow('not a pending transaction');
403
+ }
404
+ async clearTables() {
405
+ const entities = (0, entity_1.getEntities)();
406
+ await Promise.all(entities.map((entity) => this.querier.deleteMany(entity, {})));
407
+ }
408
+ }
409
+ exports.AbstractQuerierIt = AbstractQuerierIt;
410
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RRdWVyaWVyLWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJpZXIvYWJzdHJhY3RRdWVyaWVyLWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDZDQUErQztBQUMvQyx5Q0FBOEk7QUFFOUksTUFBc0IsaUJBQWlCO0lBR3JDLFlBQXFCLElBQW9CO1FBQXBCLFNBQUksR0FBSixJQUFJLENBQWdCO0lBQUcsQ0FBQztJQUU3QyxLQUFLLENBQUMsU0FBUztRQUNiLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBSSxDQUFDLENBQUM7UUFDcEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BC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SyxDQUFDLHVEQUF1RDtRQUMzRCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBVyxHQUFFLENBQUM7UUFDL0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztDQUtGO0FBcmZELDhDQXFmQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFF1ZXJpZXIsIFF1ZXJpZXJQb29sIH0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuaW1wb3J0IHsgZ2V0RW50aXRpZXMgfSBmcm9tICdAdXFsL2NvcmUvZW50aXR5JztcbmltcG9ydCB7IENvbXBhbnksIEludmVudG9yeUFkanVzdG1lbnQsIEl0ZW0sIEl0ZW1BZGp1c3RtZW50LCBMZWRnZXJBY2NvdW50LCBNZWFzdXJlVW5pdCwgU3BlYywgVGFnLCBUYXhDYXRlZ29yeSwgVXNlciB9IGZyb20gJ0B1cWwvY29yZS90ZXN0JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVlcmllckl0PFEgZXh0ZW5kcyBRdWVyaWVyPiBpbXBsZW1lbnRzIFNwZWMge1xuICBxdWVyaWVyOiBRO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHBvb2w6IFF1ZXJpZXJQb29sPFE+KSB7fVxuXG4gIGFzeW5jIGJlZm9yZUFsbCgpIHtcbiAgICB0aGlzLnF1ZXJpZXIgPSBhd2FpdCB0aGlzLnBvb2wuZ2V0UXVlcmllcigpO1xuICAgIGF3YWl0IHRoaXMuZHJvcFRhYmxlcygpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGVzKCk7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLnJlbGVhc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGJlZm9yZUVhY2goKSB7XG4gICAgdGhpcy5xdWVyaWVyID0gYXdhaXQgdGhpcy5wb29sLmdldFF1ZXJpZXIoKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFyVGFibGVzKCk7XG4gIH1cblxuICBhc3luYyBhZnRlckVhY2goKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLnJlbGVhc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGFmdGVyQWxsKCkge1xuICAgIGF3YWl0IHRoaXMucG9vbC5lbmQoKTtcbiAgfVxuXG4gIHNob3VsZEdldFJlcG9zaXRvcnkoKSB7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHRoaXMucXVlcmllci5nZXRSZXBvc2l0b3J5KFVzZXIpO1xuICAgIGV4cGVjdChyZXBvc2l0b3J5KS50b0JlRGVmaW5lZCgpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0TWFueSgpIHtcbiAgICBjb25zdCBpZHMgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0TWFueShVc2VyLCBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICAgIGVtYWlsOiAnc29tZWVtYWlsYUBleGFtcGxlLmNvbScsXG4gICAgICAgIHBhc3N3b3JkOiAnMTIzNDU2Nzg5YSEnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBCJyxcbiAgICAgICAgZW1haWw6ICdzb21lZW1haWxiQGV4YW1wbGUuY29tJyxcbiAgICAgICAgcGFzc3dvcmQ6ICcxMjM0NTY3ODliIScsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGV4cGVjdChpZHMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgZXhwZWN0KGlkKS50b0JlRGVmaW5lZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNob3VsZEluc2VydE9uZSgpIHtcbiAgICBjb25zdCBjcmVhdG9ySWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFVzZXIsIHtcbiAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgICBlbWFpbDogJ3NvbWVlbWFpbGNAZXhhbXBsZS5jb20nLFxuICAgICAgcGFzc3dvcmQ6ICcxMjM0NTY3ODl6IScsXG4gICAgfSk7XG4gICAgZXhwZWN0KGNyZWF0b3JJZCkudG9CZURlZmluZWQoKTtcblxuICAgIGNvbnN0IGNvbXBhbnlJZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoQ29tcGFueSwge1xuICAgICAgbmFtZTogJ1NvbWUgTmFtZSBDJyxcbiAgICAgIGNyZWF0b3JJZCxcbiAgICB9KTtcbiAgICBleHBlY3QoY29tcGFueUlkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgY29uc3QgdGF4Q2F0ZWdvcnlJZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoVGF4Q2F0ZWdvcnksIHtcbiAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NvbWUgRGVzY3JpcHRpb24gWicsXG4gICAgICBjcmVhdG9ySWQsXG4gICAgICBjb21wYW55SWQsXG4gICAgfSk7XG4gICAgZXhwZWN0KHRheENhdGVnb3J5SWQpLnRvQmVEZWZpbmVkKCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRJbnNlcnRPbmVXaXRoT25JbnNlcnRJZCgpIHtcbiAgICBjb25zdCBpZDEgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFRheENhdGVnb3J5LCB7XG4gICAgICBuYW1lOiAnU29tZSBOYW1lJyxcbiAgICB9KTtcbiAgICBjb25zdCBpZDIgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFRheENhdGVnb3J5LCB7XG4gICAgICBwazogJzEyMycsXG4gICAgICBuYW1lOiAnU29tZSBOYW1lJyxcbiAgICB9KTtcbiAgICBleHBlY3QoaWQxKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChpZDIpLnRvQmVEZWZpbmVkKCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRJbnNlcnRNYW55V2l0aFNwZWNpZmllZElkc0FuZE9uSW5zZXJ0SWRBc0RlZmF1bHQoKSB7XG4gICAgY29uc3QgaWRzID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE1hbnkoVGF4Q2F0ZWdvcnksIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBBJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBrOiAnNTAnLFxuICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBDJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBrOiAnNzAnLFxuICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEQnLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBleHBlY3QoaWRzKS50b0hhdmVMZW5ndGgoNCk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgIGV4cGVjdChpZCkudG9CZURlZmluZWQoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzaG91bGRJbnNlcnRNYW55V2l0aEF1dG9JbmNyZW1lbnRJZEFzRGVmYXVsdCgpIHtcbiAgICBjb25zdCBpZHMgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0TWFueShMZWRnZXJBY2NvdW50LCBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBDJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgZXhwZWN0KGlkcykudG9IYXZlTGVuZ3RoKDMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICBleHBlY3QoaWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kcyA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kTWFueShMZWRnZXJBY2NvdW50LCB7fSk7XG4gICAgZXhwZWN0KGZvdW5kcy5tYXAoKHsgaWQgfSkgPT4gaWQpKS50b0VxdWFsKGlkcyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRJbnNlcnRPbmVBbmRDYXNjYWRlT25lVG9PbmUoKSB7XG4gICAgY29uc3QgcGF5bG9hZDogVXNlciA9IHtcbiAgICAgIG5hbWU6ICdTb21lIE5hbWUgRCcsXG4gICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgIHByb2ZpbGU6IHsgcGljdHVyZTogJ2FiYycsIGNyZWF0ZWRBdDogMTIzIH0sXG4gICAgfTtcbiAgICBjb25zdCBpZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoVXNlciwgcGF5bG9hZCk7XG4gICAgZXhwZWN0KGlkKS50b0JlRGVmaW5lZCgpO1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmVCeUlkKFVzZXIsIGlkLCB7ICRwcm9qZWN0OiBbJ3Byb2ZpbGUnXSB9KTtcbiAgICBleHBlY3QoZm91bmQpLnRvTWF0Y2hPYmplY3QoeyBpZCwgcHJvZmlsZTogcGF5bG9hZC5wcm9maWxlIH0pO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0T25lQW5kQ2FzY2FkZU1hbnlUb09uZSgpIHtcbiAgICBjb25zdCBwYXlsb2FkOiBNZWFzdXJlVW5pdCA9IHtcbiAgICAgIG5hbWU6ICdDZW50aW1ldGVyJyxcbiAgICAgIGNyZWF0ZWRBdDogMTIzLFxuICAgICAgY2F0ZWdvcnk6IHsgbmFtZTogJ01ldHJpYycsIGNyZWF0ZWRBdDogMTIzIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShNZWFzdXJlVW5pdCwgcGF5bG9hZCk7XG5cbiAgICBleHBlY3QoaWQpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lQnlJZChNZWFzdXJlVW5pdCwgaWQsIHsgJHByb2plY3Q6IHsgY2F0ZWdvcnk6IHRydWUgfSB9KTtcblxuICAgIGV4cGVjdChmb3VuZCkudG9NYXRjaE9iamVjdCh7IGlkLCBjYXRlZ29yeTogcGF5bG9hZC5jYXRlZ29yeSB9KTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZEluc2VydE9uZUFuZENhc2NhZGVPbmVUb01hbnkoKSB7XG4gICAgY29uc3QgaXRlbUFkanVzdG1lbnRzOiBJdGVtQWRqdXN0bWVudFtdID0gW3sgYnV5UHJpY2U6IDUwIH0sIHsgYnV5UHJpY2U6IDMwMCB9XTtcblxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3QgaW52ZW50b3J5QWRqdXN0bWVudElkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShJbnZlbnRvcnlBZGp1c3RtZW50LCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NvbWUgZGVzY3JpcHRpb24nLFxuICAgICAgZGF0ZSxcbiAgICAgIGl0ZW1BZGp1c3RtZW50cyxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50SWQpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICBjb25zdCBpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE9uZUJ5SWQoSW52ZW50b3J5QWRqdXN0bWVudCwgaW52ZW50b3J5QWRqdXN0bWVudElkLCB7XG4gICAgICAkcHJvamVjdDogeyBpdGVtQWRqdXN0bWVudHM6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaWQ6IGludmVudG9yeUFkanVzdG1lbnRJZCxcbiAgICAgIGl0ZW1BZGp1c3RtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGl0ZW1BZGp1c3RtZW50c0ZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRNYW55KEl0ZW1BZGp1c3RtZW50LCB7ICRmaWx0ZXI6IHsgaW52ZW50b3J5QWRqdXN0bWVudElkIH0gfSk7XG5cbiAgICBleHBlY3QoaXRlbUFkanVzdG1lbnRzRm91bmQpLnRvTWF0Y2hPYmplY3QoaXRlbUFkanVzdG1lbnRzKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZEluc2VydE9uZUFuZENhc2NhZGVPbmVUb01hbnlXaXRoU3BlY2lmaWNGaWVsZHMoKSB7XG4gICAgY29uc3QgaXRlbUFkanVzdG1lbnRzOiBJdGVtQWRqdXN0bWVudFtdID0gW3sgYnV5UHJpY2U6IDUwIH0sIHsgYnV5UHJpY2U6IDMwMCB9XTtcblxuICAgIGNvbnN0IGludmVudG9yeUFkanVzdG1lbnRJZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoSW52ZW50b3J5QWRqdXN0bWVudCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzb21lIGRlc2NyaXB0aW9uJyxcbiAgICAgIGl0ZW1BZGp1c3RtZW50czogaXRlbUFkanVzdG1lbnRzLnNsaWNlKCksXG4gICAgfSk7XG5cbiAgICBleHBlY3QoaW52ZW50b3J5QWRqdXN0bWVudElkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgY29uc3QgaW52ZW50b3J5QWRqdXN0bWVudEZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmVCeUlkKEludmVudG9yeUFkanVzdG1lbnQsIGludmVudG9yeUFkanVzdG1lbnRJZCwge1xuICAgICAgJHByb2plY3Q6IHsgaXRlbUFkanVzdG1lbnRzOiBbJ2J1eVByaWNlJ10gfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaWQ6IGludmVudG9yeUFkanVzdG1lbnRJZCxcbiAgICAgIGl0ZW1BZGp1c3RtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGl0ZW1BZGp1c3RtZW50c0ZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRNYW55KEl0ZW1BZGp1c3RtZW50LCB7ICRmaWx0ZXI6IHsgaW52ZW50b3J5QWRqdXN0bWVudElkIH0gfSk7XG5cbiAgICBleHBlY3QoaXRlbUFkanVzdG1lbnRzRm91bmQpLnRvTWF0Y2hPYmplY3QoaXRlbUFkanVzdG1lbnRzKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFVwZGF0ZU9uZUFuZENhc2NhZGVPbmVUb01hbnkoKSB7XG4gICAgY29uc3QgaXRlbUFkanVzdG1lbnRzOiBJdGVtQWRqdXN0bWVudFtdID0gW3sgYnV5UHJpY2U6IDUwIH0sIHsgYnV5UHJpY2U6IDMwMCB9XTtcblxuICAgIGNvbnN0IGludmVudG9yeUFkanVzdG1lbnRJZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoSW52ZW50b3J5QWRqdXN0bWVudCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzb21lIGRlc2NyaXB0aW9uJyxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50SWQpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgdGhpcy5xdWVyaWVyLnVwZGF0ZU9uZUJ5SWQoSW52ZW50b3J5QWRqdXN0bWVudCwgaW52ZW50b3J5QWRqdXN0bWVudElkLCB7XG4gICAgICBpdGVtQWRqdXN0bWVudHMsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoY2hhbmdlcykudG9CZSgxKTtcblxuICAgIGNvbnN0IGludmVudG9yeUFkanVzdG1lbnRGb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lQnlJZChJbnZlbnRvcnlBZGp1c3RtZW50LCBpbnZlbnRvcnlBZGp1c3RtZW50SWQsIHtcbiAgICAgICRwcm9qZWN0OiB7IGl0ZW1BZGp1c3RtZW50czogWydidXlQcmljZSddIH0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QoaW52ZW50b3J5QWRqdXN0bWVudEZvdW5kKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGlkOiBpbnZlbnRvcnlBZGp1c3RtZW50SWQsXG4gICAgICBpdGVtQWRqdXN0bWVudHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpdGVtQWRqdXN0bWVudHNGb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kTWFueShJdGVtQWRqdXN0bWVudCwgeyAkZmlsdGVyOiB7IGludmVudG9yeUFkanVzdG1lbnRJZCB9IH0pO1xuXG4gICAgZXhwZWN0KGl0ZW1BZGp1c3RtZW50c0ZvdW5kKS50b01hdGNoT2JqZWN0KGl0ZW1BZGp1c3RtZW50cyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRVcGRhdGVPbmVCeUlkQW5kQ2FzY2FkZU9uZVRvTWFueU51bGwoKSB7XG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKEludmVudG9yeUFkanVzdG1lbnQsIHsgaXRlbUFkanVzdG1lbnRzOiBbe30sIHt9XSB9KTtcblxuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoSXRlbUFkanVzdG1lbnQpKS5yZXNvbHZlcy50b0JlKDIpO1xuXG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLnVwZGF0ZU9uZUJ5SWQoSW52ZW50b3J5QWRqdXN0bWVudCwgaWQsIHtcbiAgICAgIGl0ZW1BZGp1c3RtZW50czogbnVsbCxcbiAgICB9KTtcblxuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoSXRlbUFkanVzdG1lbnQpKS5yZXNvbHZlcy50b0JlKDApO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkVXBkYXRlTWFueUFuZENhc2NhZGVPbmVUb01hbnlOdWxsKCkge1xuICAgIGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoSW52ZW50b3J5QWRqdXN0bWVudCwgeyBpdGVtQWRqdXN0bWVudHM6IFt7fSwge31dIH0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChJdGVtQWRqdXN0bWVudCkpLnJlc29sdmVzLnRvQmUoMik7XG5cbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIudXBkYXRlTWFueShcbiAgICAgIEludmVudG9yeUFkanVzdG1lbnQsXG4gICAgICB7ICRmaWx0ZXI6IHt9IH0sXG4gICAgICB7XG4gICAgICAgIGl0ZW1BZGp1c3RtZW50czogbnVsbCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChJdGVtQWRqdXN0bWVudCkpLnJlc29sdmVzLnRvQmUoMCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRJbnNlcnRPbmVBbmRDYXNjYWRlTWFueVRvTWFueSgpIHtcbiAgICBjb25zdCBwYXlsb2FkOiBJdGVtID0ge1xuICAgICAgbmFtZTogJ2l0ZW0gb25lJyxcbiAgICAgIGNyZWF0ZWRBdDogMSxcbiAgICAgIHRhZ3M6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICd0YWcgb25lJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAndGFnIHR3bycsXG4gICAgICAgICAgY3JlYXRlZEF0OiAxLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKEl0ZW0sIHBheWxvYWQpO1xuXG4gICAgZXhwZWN0KGlkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgY29uc3QgZm91bmRJdGVtID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmVCeUlkKEl0ZW0sIGlkLCB7XG4gICAgICAkcHJvamVjdDogeyBuYW1lOiB0cnVlLCBjcmVhdGVkQXQ6IHRydWUsIHRhZ3M6IFsnbmFtZScsICdjcmVhdGVkQXQnXSB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGZvdW5kSXRlbSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBpZCxcbiAgICAgIC4uLnBheWxvYWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3VuZFRhZ3MgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE1hbnkoVGFnLCB7XG4gICAgICAkcHJvamVjdDogeyBuYW1lOiB0cnVlLCBjcmVhdGVkQXQ6IHRydWUsIGl0ZW1zOiBbJ25hbWUnLCAnY3JlYXRlZEF0J10gfSxcbiAgICB9KTtcblxuICAgIGRlbGV0ZSBmb3VuZEl0ZW0udGFncztcblxuICAgIGV4cGVjdChmb3VuZFRhZ3MpLnRvTWF0Y2hPYmplY3QocGF5bG9hZC50YWdzLm1hcCgodGFnKSA9PiAoeyAuLi50YWcsIGl0ZW1zOiBbZm91bmRJdGVtXSB9KSkpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkVXBkYXRlT25lQW5kQ2FzY2FkZU1hbnlUb01hbnkoKSB7XG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKEl0ZW0sIHsgY3JlYXRlZEF0OiAxIH0pO1xuICAgIGNvbnN0IHBheWxvYWQ6IEl0ZW0gPSB7XG4gICAgICBuYW1lOiAnaXRlbSBvbmUnLFxuICAgICAgdXBkYXRlZEF0OiAxLFxuICAgICAgdGFnczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3RhZyBvbmUnLFxuICAgICAgICAgIGNyZWF0ZWRBdDogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICd0YWcgdHdvJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDEsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIudXBkYXRlT25lQnlJZChJdGVtLCBpZCwgcGF5bG9hZCk7XG5cbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lQnlJZChJdGVtLCBpZCwge1xuICAgICAgJHByb2plY3Q6IHsgbmFtZTogdHJ1ZSwgdXBkYXRlZEF0OiB0cnVlLCB0YWdzOiB0cnVlIH0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZm91bmQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaWQsXG4gICAgICAuLi5wYXlsb2FkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkRmluZE1hbnkoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuc2hvdWxkSW5zZXJ0TWFueSgpLCB0aGlzLnNob3VsZEluc2VydE9uZSgpXSk7XG5cbiAgICBjb25zdCB1c2VycyA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kTWFueShVc2VyLCB7XG4gICAgICAkcHJvamVjdDogWyduYW1lJ10sXG4gICAgICAkc2tpcDogMSxcbiAgICAgICRsaW1pdDogMixcbiAgICAgICRzb3J0OiB7XG4gICAgICAgIG5hbWU6IDEsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHVzZXJzKS50b01hdGNoT2JqZWN0KFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBCJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkRmluZE9uZSgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5zaG91bGRJbnNlcnRNYW55KCksIHRoaXMuc2hvdWxkSW5zZXJ0T25lKCldKTtcblxuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmUoVXNlciwge1xuICAgICAgJHByb2plY3Q6IFsnaWQnLCAnbmFtZScsICdlbWFpbCcsICdwYXNzd29yZCddLFxuICAgICAgJGZpbHRlcjoge1xuICAgICAgICBlbWFpbDogJ3NvbWVlbWFpbGFAZXhhbXBsZS5jb20nLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChmb3VuZCkudG9NYXRjaE9iamVjdCh7XG4gICAgICBuYW1lOiAnU29tZSBOYW1lIEEnLFxuICAgICAgZW1haWw6ICdzb21lZW1haWxhQGV4YW1wbGUuY29tJyxcbiAgICAgIHBhc3N3b3JkOiAnMTIzNDU2Nzg5YSEnLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgbm90Rm91bmQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE9uZShVc2VyLCB7XG4gICAgICAkZmlsdGVyOiB7XG4gICAgICAgIG5hbWU6ICdzb21lIG5hbWUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChub3RGb3VuZCkudG9CZVVuZGVmaW5lZCgpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkQ291bnQoKSB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyLCB7fSkpLnJlc29sdmVzLnRvQmUoMCk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5zaG91bGRJbnNlcnRNYW55KCksIHRoaXMuc2hvdWxkSW5zZXJ0T25lKCldKTtcblxuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoVXNlcikpLnJlc29sdmVzLnRvQmUoMyk7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyLCB7ICRmaWx0ZXI6IHsgY29tcGFueUlkOiBudWxsIH0gfSkpLnJlc29sdmVzLnRvQmUoMyk7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyLCB7ICRmaWx0ZXI6IHsgY29tcGFueUlkOiAxIH0gfSkpLnJlc29sdmVzLnRvQmUoMCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRVcGRhdGVNYW55KCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnNob3VsZEluc2VydE1hbnkoKSwgdGhpcy5zaG91bGRJbnNlcnRPbmUoKV0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci51cGRhdGVNYW55KFVzZXIsIHsgJGZpbHRlcjogeyBjb21wYW55SWQ6IDEgfSB9LCB7IGNvbXBhbnlJZDogbnVsbCB9KSkucmVzb2x2ZXMudG9CZSgwKTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLnVwZGF0ZU1hbnkoVXNlciwgeyAkZmlsdGVyOiB7IGNvbXBhbnlJZDogbnVsbCB9IH0sIHsgY29tcGFueUlkOiAxIH0pKS5yZXNvbHZlcy50b0JlKDMpO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIudXBkYXRlTWFueShVc2VyLCB7ICRmaWx0ZXI6IHsgY29tcGFueUlkOiAxIH0gfSwgeyBjb21wYW55SWQ6IG51bGwgfSkpLnJlc29sdmVzLnRvQmUoMyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRUaHJvd1doZW5Sb2xsYmFja1RyYW5zYWN0aW9uV2l0aG91dEJlZ2luVHJhbnNhY3Rpb24oKSB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5yb2xsYmFja1RyYW5zYWN0aW9uKCkpLnJlamVjdHMudG9UaHJvdygnbm90IGEgcGVuZGluZyB0cmFuc2FjdGlvbicpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkVGhyb3dJZlVua25vd25Db21wYXJpc29uT3BlcmF0b3IoKSB7XG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgdGhpcy5xdWVyaWVyLmZpbmRNYW55KFVzZXIsIHtcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRzb21lSW52YWxpZE9wZXJhdG9yOiAnc29tZScgfSBhcyBhbnkgfSxcbiAgICAgIH0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3coJ3Vua25vd24gb3BlcmF0b3I6ICRzb21lSW52YWxpZE9wZXJhdG9yJyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRDb21taXQoKSB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyKSkucmVzb2x2ZXMudG9CZSgwKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICAgIGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoVXNlciwge30pO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoVXNlcikpLnJlc29sdmVzLnRvQmUoMSk7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLmNvbW1pdFRyYW5zYWN0aW9uKCk7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyKSkucmVzb2x2ZXMudG9CZSgxKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFJvbGxiYWNrKCkge1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoVXNlcikpLnJlc29sdmVzLnRvQmUoMCk7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFVzZXIsIHt9KTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KFVzZXIpKS5yZXNvbHZlcy50b0JlKDEpO1xuICAgIGF3YWl0IHRoaXMucXVlcmllci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyKSkucmVzb2x2ZXMudG9CZSgwKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFRocm93V2hlbkJlZ2luVHJhbnNhY3Rpb25BZnRlckJlZ2luVHJhbnNhY3Rpb24oKSB7XG4gICAgZXhwZWN0KHRoaXMucXVlcmllci5oYXNPcGVuVHJhbnNhY3Rpb24pLnRvQmVGYWxzeSgpO1xuICAgIGF3YWl0IHRoaXMucXVlcmllci5iZWdpblRyYW5zYWN0aW9uKCk7XG4gICAgZXhwZWN0KHRoaXMucXVlcmllci5oYXNPcGVuVHJhbnNhY3Rpb24pLnRvQmUodHJ1ZSk7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5iZWdpblRyYW5zYWN0aW9uKCkpLnJlamVjdHMudG9UaHJvdygncGVuZGluZyB0cmFuc2FjdGlvbicpO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIucmVsZWFzZSgpKS5yZWplY3RzLnRvVGhyb3coJ3BlbmRpbmcgdHJhbnNhY3Rpb24nKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkUHJvamVjdE9uZVRvTWFueSgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5zaG91bGRJbnNlcnRNYW55KCksIHRoaXMuc2hvdWxkSW5zZXJ0T25lKCldKTtcblxuICAgIGNvbnN0IFt1c2VyLCBjb21wYW55XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMucXVlcmllci5maW5kT25lKFVzZXIsIHsgJHByb2plY3Q6IFsnaWQnXSB9KSxcbiAgICAgIHRoaXMucXVlcmllci5maW5kT25lKENvbXBhbnksIHsgJHByb2plY3Q6IFsnaWQnXSB9KSxcbiAgICBdKTtcblxuICAgIGNvbnN0IFtmaXJzdEl0ZW1JZCwgc2Vjb25kSXRlbUlkXSA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRNYW55KEl0ZW0sIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NvbWUgaXRlbSBuYW1lIGEnLFxuICAgICAgICBjcmVhdG9ySWQ6IHVzZXIuaWQsXG4gICAgICAgIGNvbXBhbnlJZDogY29tcGFueS5pZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzb21lIGl0ZW0gbmFtZSBiJyxcbiAgICAgICAgY3JlYXRvcklkOiB1c2VyLmlkLFxuICAgICAgICBjb21wYW55SWQ6IGNvbXBhbnkuaWQsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgY29uc3QgaW52ZW50b3J5QWRqdXN0bWVudElkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShJbnZlbnRvcnlBZGp1c3RtZW50LCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NvbWUgaW52ZW50b3J5IGFkanVzdG1lbnQnLFxuICAgICAgY3JlYXRvcklkOiB1c2VyLmlkLFxuICAgICAgY29tcGFueUlkOiBjb21wYW55LmlkLFxuICAgICAgaXRlbUFkanVzdG1lbnRzOiBbXG4gICAgICAgIHsgYnV5UHJpY2U6IDEwMDAsIGl0ZW1JZDogZmlyc3RJdGVtSWQgfSxcbiAgICAgICAgeyBidXlQcmljZTogMjAwMCwgaXRlbUlkOiBzZWNvbmRJdGVtSWQgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE9uZUJ5SWQoSW52ZW50b3J5QWRqdXN0bWVudCwgaW52ZW50b3J5QWRqdXN0bWVudElkLCB7XG4gICAgICAkcHJvamVjdDogeyBpdGVtQWRqdXN0bWVudHM6IHRydWUsIGNyZWF0b3I6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaWQ6IGludmVudG9yeUFkanVzdG1lbnRJZCxcbiAgICAgIGl0ZW1BZGp1c3RtZW50czogW1xuICAgICAgICB7IGJ1eVByaWNlOiAxMDAwLCBpdGVtSWQ6IGZpcnN0SXRlbUlkIH0sXG4gICAgICAgIHsgYnV5UHJpY2U6IDIwMDAsIGl0ZW1JZDogc2Vjb25kSXRlbUlkIH0sXG4gICAgICBdLFxuICAgICAgY3JlYXRvcjoge1xuICAgICAgICBlbWFpbDogJ3NvbWVlbWFpbGFAZXhhbXBsZS5jb20nLFxuICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEEnLFxuICAgICAgICBwYXNzd29yZDogJzEyMzQ1Njc4OWEhJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaG91bGREZWxldGVNYW55KCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnNob3VsZEluc2VydE1hbnkoKSwgdGhpcy5zaG91bGRJbnNlcnRPbmUoKV0pO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuZGVsZXRlTWFueShVc2VyLCB7ICRmaWx0ZXI6IHsgY29tcGFueUlkOiAxIH0gfSkpLnJlc29sdmVzLnRvQmUoMCk7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5kZWxldGVNYW55KFVzZXIsIHsgJGZpbHRlcjogeyBjb21wYW55SWQ6IG51bGwgfSB9KSkucmVzb2x2ZXMudG9CZSgzKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFRocm93V2hlbkNvbW1pdFRyYW5zYWN0aW9uV2l0aG91dEJlZ2luVHJhbnNhY3Rpb24oKSB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb21taXRUcmFuc2FjdGlvbigpKS5yZWplY3RzLnRvVGhyb3coJ25vdCBhIHBlbmRpbmcgdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyVGFibGVzKCkge1xuICAgIGNvbnN0IGVudGl0aWVzID0gZ2V0RW50aXRpZXMoKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gdGhpcy5xdWVyaWVyLmRlbGV0ZU1hbnkoZW50aXR5LCB7fSkpKTtcbiAgfVxuXG4gIGFic3RyYWN0IGNyZWF0ZVRhYmxlcygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGFic3RyYWN0IGRyb3BUYWJsZXMoKTogUHJvbWlzZTx2b2lkPjtcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import { QuerierPool } from '@uql/core/type';
2
+ import { AbstractQuerierIt } from './abstractQuerier-it';
3
+ import { AbstractSqlQuerier } from './abstractSqlQuerier';
4
+ export declare abstract class AbstractSqlQuerierIt extends AbstractQuerierIt<AbstractSqlQuerier> {
5
+ readonly idType: string;
6
+ constructor(pool: QuerierPool<AbstractSqlQuerier>, idType: string);
7
+ createTables(): Promise<void>;
8
+ dropTables(): Promise<void>;
9
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractSqlQuerierIt = void 0;
4
+ const test_1 = require("@uql/core/test");
5
+ const abstractQuerier_it_1 = require("./abstractQuerier-it");
6
+ class AbstractSqlQuerierIt extends abstractQuerier_it_1.AbstractQuerierIt {
7
+ constructor(pool, idType) {
8
+ super(pool);
9
+ this.idType = idType;
10
+ }
11
+ createTables() {
12
+ return (0, test_1.createTables)(this.querier, this.idType);
13
+ }
14
+ dropTables() {
15
+ return (0, test_1.dropTables)(this.querier);
16
+ }
17
+ }
18
+ exports.AbstractSqlQuerierIt = AbstractSqlQuerierIt;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxRdWVyaWVyLWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJpZXIvYWJzdHJhY3RTcWxRdWVyaWVyLWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUEwRDtBQUMxRCw2REFBeUQ7QUFHekQsTUFBc0Isb0JBQXFCLFNBQVEsc0NBQXFDO0lBQ3RGLFlBQVksSUFBcUMsRUFBVyxNQUFjO1FBQ3hFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUQ4QyxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBRTFFLENBQUM7SUFFUSxZQUFZO1FBQ25CLE9BQU8sSUFBQSxtQkFBWSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFUSxVQUFVO1FBQ2pCLE9BQU8sSUFBQSxpQkFBVSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFaRCxvREFZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFF1ZXJpZXJQb29sIH0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuaW1wb3J0IHsgY3JlYXRlVGFibGVzLCBkcm9wVGFibGVzIH0gZnJvbSAnQHVxbC9jb3JlL3Rlc3QnO1xuaW1wb3J0IHsgQWJzdHJhY3RRdWVyaWVySXQgfSBmcm9tICcuL2Fic3RyYWN0UXVlcmllci1pdCc7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbFF1ZXJpZXIgfSBmcm9tICcuL2Fic3RyYWN0U3FsUXVlcmllcic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNxbFF1ZXJpZXJJdCBleHRlbmRzIEFic3RyYWN0UXVlcmllckl0PEFic3RyYWN0U3FsUXVlcmllcj4ge1xuICBjb25zdHJ1Y3Rvcihwb29sOiBRdWVyaWVyUG9vbDxBYnN0cmFjdFNxbFF1ZXJpZXI+LCByZWFkb25seSBpZFR5cGU6IHN0cmluZykge1xuICAgIHN1cGVyKHBvb2wpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlVGFibGVzKCkge1xuICAgIHJldHVybiBjcmVhdGVUYWJsZXModGhpcy5xdWVyaWVyLCB0aGlzLmlkVHlwZSk7XG4gIH1cblxuICBvdmVycmlkZSBkcm9wVGFibGVzKCkge1xuICAgIHJldHVybiBkcm9wVGFibGVzKHRoaXMucXVlcmllcik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ import { Spec } from '@uql/core/test';
2
+ import { QuerierPool } from '@uql/core/type';
3
+ import { AbstractSqlQuerier } from './abstractSqlQuerier';
4
+ export declare abstract class AbstractSqlQuerierSpec implements Spec {
5
+ readonly pool: QuerierPool<AbstractSqlQuerier>;
6
+ readonly idType: string;
7
+ querier: AbstractSqlQuerier;
8
+ constructor(pool: QuerierPool<AbstractSqlQuerier>, idType: string);
9
+ beforeAll(): Promise<void>;
10
+ beforeEach(): Promise<void>;
11
+ afterEach(): Promise<void>;
12
+ afterAll(): Promise<void>;
13
+ shouldFindOneById(): Promise<void>;
14
+ shouldFindOne(): Promise<void>;
15
+ shouldFindOneAndProjectOneToMany(): Promise<void>;
16
+ shouldFindAndProjectRaw(): Promise<void>;
17
+ shouldVirtualField(): Promise<void>;
18
+ shouldFind$exists(): Promise<void>;
19
+ shouldFind$nexists(): Promise<void>;
20
+ shouldFindOneAndProjectOneToManyOnly(): Promise<void>;
21
+ shouldFindOneAndProjectOneToManyWithSpecifiedFields(): Promise<void>;
22
+ shouldFindManyAndProjectOneToMany(): Promise<void>;
23
+ shouldFindOneAndProjectManyToMany(): Promise<void>;
24
+ shouldFindOneByIdAndProjectManyToMany(): Promise<void>;
25
+ shouldFindMany(): Promise<void>;
26
+ shouldFindManyAndCount(): Promise<void>;
27
+ shouldInsertOne(): Promise<void>;
28
+ shouldInsertOneAndCascadeOneToOne(): Promise<void>;
29
+ shouldInsertOneAndCascadeManyToOne(): Promise<void>;
30
+ shouldInsertOneAndCascadeOneToMany(): Promise<void>;
31
+ shouldUpdateMany(): Promise<void>;
32
+ shouldUpdateOneById(): Promise<void>;
33
+ shouldUpdateOneByIdAndCascadeOneToOne(): Promise<void>;
34
+ shouldUpdateOneByIdAndCascadeOneToOneNull(): Promise<void>;
35
+ shouldUpdateOneByIdAndCascadeOneToMany(): Promise<void>;
36
+ shouldUpdateOneByIdAndCascadeOneToManyNull(): Promise<void>;
37
+ shouldUpdateManyAndCascadeOneToManyNull(): Promise<void>;
38
+ shouldInsertOneAndCascadeManyToManyInserts(): Promise<void>;
39
+ shouldUpdateAndCascadeManyToManyInserts(): Promise<void>;
40
+ shouldUpdateAndCascadeManyToManyLinks(): Promise<void>;
41
+ shouldDeleteOneAndCascadeManyToManyDeletes(): Promise<void>;
42
+ shouldDeleteOneAndNoCascadeManyToManyDeletes(): Promise<void>;
43
+ shouldDeleteOneById(): Promise<void>;
44
+ shouldDeleteMany(): Promise<void>;
45
+ shouldCount(): Promise<void>;
46
+ shouldUseTransaction(): Promise<void>;
47
+ shouldUseTransactionCallback(): Promise<void>;
48
+ shouldThrowIfRollbackIfErrorInCallback(): Promise<void>;
49
+ shouldThrowIfTransactionIsPending(): Promise<void>;
50
+ shouldThrowIfCommitWithNoPendingTransaction(): Promise<void>;
51
+ shouldThrowIfRollbackWithNoPendingTransaction(): Promise<void>;
52
+ shouldThrowIfReleaseWithPendingTransaction(): Promise<void>;
53
+ }