@uql/core 0.4.89 → 0.4.92
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.
- package/README.md +35 -35
- package/package.json +4 -4
- package/dialect/abstractSqlDialect-spec.d.ts +0 -49
- package/dialect/abstractSqlDialect-spec.js +0 -765
- package/dialect/mysqlDialect.spec.d.ts +0 -6
- package/dialect/mysqlDialect.spec.js +0 -33
- package/dialect/postgresDialect.spec.d.ts +0 -1
- package/dialect/postgresDialect.spec.js +0 -139
- package/dialect/sqliteDialect.spec.d.ts +0 -1
- package/dialect/sqliteDialect.spec.js +0 -12
- package/entity/decorator/definition.spec.d.ts +0 -1
- package/entity/decorator/definition.spec.js +0 -725
- package/entity/decorator/relation.spec.d.ts +0 -1
- package/entity/decorator/relation.spec.js +0 -55
- package/options.spec.d.ts +0 -1
- package/options.spec.js +0 -27
- package/querier/abstractQuerier-it.d.ts +0 -41
- package/querier/abstractQuerier-it.js +0 -410
- package/querier/abstractSqlQuerier-it.d.ts +0 -9
- package/querier/abstractSqlQuerier-it.js +0 -19
- package/querier/abstractSqlQuerier-spec.d.ts +0 -53
- package/querier/abstractSqlQuerier-spec.js +0 -607
- package/querier/decorator/injectQuerier.spec.d.ts +0 -1
- package/querier/decorator/injectQuerier.spec.js +0 -108
- package/querier/decorator/transactional.spec.d.ts +0 -1
- package/querier/decorator/transactional.spec.js +0 -239
- package/repository/genericRepository.spec.d.ts +0 -1
- package/repository/genericRepository.spec.js +0 -86
- package/test/entityMock.d.ts +0 -180
- package/test/entityMock.js +0 -451
- package/test/index.d.ts +0 -3
- package/test/index.js +0 -7
- package/test/it.util.d.ts +0 -4
- package/test/it.util.js +0 -60
- package/test/spec.util.d.ts +0 -13
- package/test/spec.util.js +0 -54
- package/util/dialect.util.spec.d.ts +0 -1
- package/util/dialect.util.spec.js +0 -23
- package/util/object.util.spec.d.ts +0 -1
- package/util/object.util.spec.js +0 -26
- package/util/sql.util.spec.d.ts +0 -1
- package/util/sql.util.spec.js +0 -164
- package/util/string.util.spec.d.ts +0 -1
- package/util/string.util.spec.js +0 -26
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
const relation_1 = require("./relation");
|
|
5
|
-
it('invalid auto-inferred type', () => {
|
|
6
|
-
expect(() => {
|
|
7
|
-
class SomeEntity {
|
|
8
|
-
}
|
|
9
|
-
tslib_1.__decorate([
|
|
10
|
-
(0, relation_1.ManyToOne)(),
|
|
11
|
-
tslib_1.__metadata("design:type", Number)
|
|
12
|
-
], SomeEntity.prototype, "idTwo", void 0);
|
|
13
|
-
}).toThrow(`'SomeEntity.idTwo' type was auto-inferred with invalid type 'Number'`);
|
|
14
|
-
expect(() => {
|
|
15
|
-
class SomeEntity {
|
|
16
|
-
}
|
|
17
|
-
tslib_1.__decorate([
|
|
18
|
-
(0, relation_1.ManyToOne)(),
|
|
19
|
-
tslib_1.__metadata("design:type", String)
|
|
20
|
-
], SomeEntity.prototype, "idTwo", void 0);
|
|
21
|
-
}).toThrow(`'SomeEntity.idTwo' type was auto-inferred with invalid type 'String'`);
|
|
22
|
-
expect(() => {
|
|
23
|
-
class SomeEntity {
|
|
24
|
-
}
|
|
25
|
-
tslib_1.__decorate([
|
|
26
|
-
(0, relation_1.ManyToOne)(),
|
|
27
|
-
tslib_1.__metadata("design:type", Boolean)
|
|
28
|
-
], SomeEntity.prototype, "idTwo", void 0);
|
|
29
|
-
}).toThrow(`'SomeEntity.idTwo' type was auto-inferred with invalid type 'Boolean'`);
|
|
30
|
-
expect(() => {
|
|
31
|
-
class SomeEntity {
|
|
32
|
-
}
|
|
33
|
-
tslib_1.__decorate([
|
|
34
|
-
(0, relation_1.ManyToOne)(),
|
|
35
|
-
tslib_1.__metadata("design:type", Object)
|
|
36
|
-
], SomeEntity.prototype, "idTwo", void 0);
|
|
37
|
-
}).toThrow(`'SomeEntity.idTwo' type was auto-inferred with invalid type 'Object'`);
|
|
38
|
-
expect(() => {
|
|
39
|
-
class SomeEntity {
|
|
40
|
-
}
|
|
41
|
-
tslib_1.__decorate([
|
|
42
|
-
(0, relation_1.ManyToOne)(),
|
|
43
|
-
tslib_1.__metadata("design:type", void 0)
|
|
44
|
-
], SomeEntity.prototype, "idTwo", void 0);
|
|
45
|
-
}).toThrow(`'SomeEntity.idTwo' type was auto-inferred with invalid type 'undefined'`);
|
|
46
|
-
expect(() => {
|
|
47
|
-
class SomeEntity {
|
|
48
|
-
}
|
|
49
|
-
tslib_1.__decorate([
|
|
50
|
-
(0, relation_1.ManyToOne)(),
|
|
51
|
-
tslib_1.__metadata("design:type", void 0)
|
|
52
|
-
], SomeEntity.prototype, "idTwo", void 0);
|
|
53
|
-
}).toThrow(`'SomeEntity.idTwo' type was auto-inferred with invalid type 'undefined'`);
|
|
54
|
-
});
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb24uc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnRpdHkvZGVjb3JhdG9yL3JlbGF0aW9uLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXVDO0FBRXZDLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7SUFDcEMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNWLE1BQU0sVUFBVTtTQUdmO1FBREM7WUFEQyxJQUFBLG9CQUFTLEdBQUU7O2lEQUNFO0lBRWxCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDVixNQUFNLFVBQVU7U0FHZjtRQURDO1lBREMsSUFBQSxvQkFBUyxHQUFFOztpREFDRTtJQUVsQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsc0VBQXNFLENBQUMsQ0FBQztJQUNuRixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsTUFBTSxVQUFVO1NBR2Y7UUFEQztZQURDLElBQUEsb0JBQVMsR0FBRTs7aURBQ0c7SUFFbkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7SUFDcEYsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNWLE1BQU0sVUFBVTtTQUdmO1FBREM7WUFEQyxJQUFBLG9CQUFTLEdBQUU7O2lEQUNFO0lBRWxCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDVixNQUFNLFVBQVU7U0FHZjtRQURDO1lBREMsSUFBQSxvQkFBUyxHQUFFOztpREFDQTtJQUVoQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMseUVBQXlFLENBQUMsQ0FBQztJQUN0RixNQUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsTUFBTSxVQUFVO1NBR2Y7UUFEQztZQURDLElBQUEsb0JBQVMsR0FBRTs7aURBQ0s7SUFFckIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7QUFDeEYsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYW55VG9PbmUgfSBmcm9tICcuL3JlbGF0aW9uJztcblxuaXQoJ2ludmFsaWQgYXV0by1pbmZlcnJlZCB0eXBlJywgKCkgPT4ge1xuICBleHBlY3QoKCkgPT4ge1xuICAgIGNsYXNzIFNvbWVFbnRpdHkge1xuICAgICAgQE1hbnlUb09uZSgpXG4gICAgICBpZFR3bzogbnVtYmVyO1xuICAgIH1cbiAgfSkudG9UaHJvdyhgJ1NvbWVFbnRpdHkuaWRUd28nIHR5cGUgd2FzIGF1dG8taW5mZXJyZWQgd2l0aCBpbnZhbGlkIHR5cGUgJ051bWJlcidgKTtcbiAgZXhwZWN0KCgpID0+IHtcbiAgICBjbGFzcyBTb21lRW50aXR5IHtcbiAgICAgIEBNYW55VG9PbmUoKVxuICAgICAgaWRUd286IHN0cmluZztcbiAgICB9XG4gIH0pLnRvVGhyb3coYCdTb21lRW50aXR5LmlkVHdvJyB0eXBlIHdhcyBhdXRvLWluZmVycmVkIHdpdGggaW52YWxpZCB0eXBlICdTdHJpbmcnYCk7XG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgY2xhc3MgU29tZUVudGl0eSB7XG4gICAgICBATWFueVRvT25lKClcbiAgICAgIGlkVHdvOiBib29sZWFuO1xuICAgIH1cbiAgfSkudG9UaHJvdyhgJ1NvbWVFbnRpdHkuaWRUd28nIHR5cGUgd2FzIGF1dG8taW5mZXJyZWQgd2l0aCBpbnZhbGlkIHR5cGUgJ0Jvb2xlYW4nYCk7XG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgY2xhc3MgU29tZUVudGl0eSB7XG4gICAgICBATWFueVRvT25lKClcbiAgICAgIGlkVHdvOiBvYmplY3Q7XG4gICAgfVxuICB9KS50b1Rocm93KGAnU29tZUVudGl0eS5pZFR3bycgdHlwZSB3YXMgYXV0by1pbmZlcnJlZCB3aXRoIGludmFsaWQgdHlwZSAnT2JqZWN0J2ApO1xuICBleHBlY3QoKCkgPT4ge1xuICAgIGNsYXNzIFNvbWVFbnRpdHkge1xuICAgICAgQE1hbnlUb09uZSgpXG4gICAgICBpZFR3bzogbnVsbDtcbiAgICB9XG4gIH0pLnRvVGhyb3coYCdTb21lRW50aXR5LmlkVHdvJyB0eXBlIHdhcyBhdXRvLWluZmVycmVkIHdpdGggaW52YWxpZCB0eXBlICd1bmRlZmluZWQnYCk7XG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgY2xhc3MgU29tZUVudGl0eSB7XG4gICAgICBATWFueVRvT25lKClcbiAgICAgIGlkVHdvOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9KS50b1Rocm93KGAnU29tZUVudGl0eS5pZFR3bycgdHlwZSB3YXMgYXV0by1pbmZlcnJlZCB3aXRoIGludmFsaWQgdHlwZSAndW5kZWZpbmVkJ2ApO1xufSk7XG4iXX0=
|
package/options.spec.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/options.spec.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const test_1 = require("@uql/core/test");
|
|
4
|
-
const options_1 = require("./options");
|
|
5
|
-
describe('options', () => {
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
jest.spyOn(console, 'log');
|
|
8
|
-
});
|
|
9
|
-
it('getDefaultQuerierPool unset', () => {
|
|
10
|
-
expect(() => (0, options_1.getDefaultQuerierPool)()).toThrow('A default querier-pool has to be set first');
|
|
11
|
-
});
|
|
12
|
-
it('getQuerier', async () => {
|
|
13
|
-
const querierMock = {};
|
|
14
|
-
(0, options_1.setDefaultQuerierPool)({
|
|
15
|
-
getQuerier: async () => querierMock,
|
|
16
|
-
end: async () => { },
|
|
17
|
-
});
|
|
18
|
-
const querier1 = await (0, options_1.getDefaultQuerierPool)().getQuerier();
|
|
19
|
-
expect(querier1).toBe(querierMock);
|
|
20
|
-
const querier2 = await (0, options_1.getQuerier)();
|
|
21
|
-
expect(querier2).toBe(querierMock);
|
|
22
|
-
const repository = (0, options_1.getRepository)(test_1.User, querier1);
|
|
23
|
-
expect(repository).toBeDefined();
|
|
24
|
-
expect((0, options_1.getDefaultQuerierPool)()).toBe((0, options_1.getDefaultQuerierPool)());
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29wdGlvbnMuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFzQztBQUV0Qyx1Q0FBb0c7QUFFcEcsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwrQkFBcUIsR0FBRSxDQUFDLENBQUMsT0FBTyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFCLE1BQU0sV0FBVyxHQUFHLEVBQWEsQ0FBQztRQUVsQyxJQUFBLCtCQUFxQixFQUFDO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLFdBQVc7WUFDbkMsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUUsQ0FBQztTQUNwQixDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsK0JBQXFCLEdBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1RCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxvQkFBVSxHQUFFLENBQUM7UUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuQyxNQUFNLFVBQVUsR0FBRyxJQUFBLHVCQUFhLEVBQUMsV0FBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpELE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVqQyxNQUFNLENBQUMsSUFBQSwrQkFBcUIsR0FBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUEsK0JBQXFCLEdBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnQHVxbC9jb3JlL3Rlc3QnO1xuaW1wb3J0IHsgUXVlcmllciB9IGZyb20gJ0B1cWwvY29yZS90eXBlJztcbmltcG9ydCB7IGdldFF1ZXJpZXIsIGdldERlZmF1bHRRdWVyaWVyUG9vbCwgZ2V0UmVwb3NpdG9yeSwgc2V0RGVmYXVsdFF1ZXJpZXJQb29sIH0gZnJvbSAnLi9vcHRpb25zJztcblxuZGVzY3JpYmUoJ29wdGlvbnMnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGplc3Quc3B5T24oY29uc29sZSwgJ2xvZycpO1xuICB9KTtcblxuICBpdCgnZ2V0RGVmYXVsdFF1ZXJpZXJQb29sIHVuc2V0JywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBnZXREZWZhdWx0UXVlcmllclBvb2woKSkudG9UaHJvdygnQSBkZWZhdWx0IHF1ZXJpZXItcG9vbCBoYXMgdG8gYmUgc2V0IGZpcnN0Jyk7XG4gIH0pO1xuXG4gIGl0KCdnZXRRdWVyaWVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1ZXJpZXJNb2NrID0ge30gYXMgUXVlcmllcjtcblxuICAgIHNldERlZmF1bHRRdWVyaWVyUG9vbCh7XG4gICAgICBnZXRRdWVyaWVyOiBhc3luYyAoKSA9PiBxdWVyaWVyTW9jayxcbiAgICAgIGVuZDogYXN5bmMgKCkgPT4ge30sXG4gICAgfSk7XG5cbiAgICBjb25zdCBxdWVyaWVyMSA9IGF3YWl0IGdldERlZmF1bHRRdWVyaWVyUG9vbCgpLmdldFF1ZXJpZXIoKTtcbiAgICBleHBlY3QocXVlcmllcjEpLnRvQmUocXVlcmllck1vY2spO1xuXG4gICAgY29uc3QgcXVlcmllcjIgPSBhd2FpdCBnZXRRdWVyaWVyKCk7XG4gICAgZXhwZWN0KHF1ZXJpZXIyKS50b0JlKHF1ZXJpZXJNb2NrKTtcblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBnZXRSZXBvc2l0b3J5KFVzZXIsIHF1ZXJpZXIxKTtcblxuICAgIGV4cGVjdChyZXBvc2l0b3J5KS50b0JlRGVmaW5lZCgpO1xuXG4gICAgZXhwZWN0KGdldERlZmF1bHRRdWVyaWVyUG9vbCgpKS50b0JlKGdldERlZmF1bHRRdWVyaWVyUG9vbCgpKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { Querier, QuerierPool } from '@uql/core/type';
|
|
2
|
-
import { Spec } from '@uql/core/test';
|
|
3
|
-
export declare abstract class AbstractQuerierIt<Q extends Querier> implements Spec {
|
|
4
|
-
readonly pool: QuerierPool<Q>;
|
|
5
|
-
querier: Q;
|
|
6
|
-
constructor(pool: QuerierPool<Q>);
|
|
7
|
-
beforeAll(): Promise<void>;
|
|
8
|
-
beforeEach(): Promise<void>;
|
|
9
|
-
afterEach(): Promise<void>;
|
|
10
|
-
afterAll(): Promise<void>;
|
|
11
|
-
shouldGetRepository(): void;
|
|
12
|
-
shouldInsertMany(): Promise<void>;
|
|
13
|
-
shouldInsertOne(): Promise<void>;
|
|
14
|
-
shouldInsertOneWithOnInsertId(): Promise<void>;
|
|
15
|
-
shouldInsertManyWithSpecifiedIdsAndOnInsertIdAsDefault(): Promise<void>;
|
|
16
|
-
shouldInsertManyWithAutoIncrementIdAsDefault(): Promise<void>;
|
|
17
|
-
shouldInsertOneAndCascadeOneToOne(): Promise<void>;
|
|
18
|
-
shouldInsertOneAndCascadeManyToOne(): Promise<void>;
|
|
19
|
-
shouldInsertOneAndCascadeOneToMany(): Promise<void>;
|
|
20
|
-
shouldInsertOneAndCascadeOneToManyWithSpecificFields(): Promise<void>;
|
|
21
|
-
shouldUpdateOneAndCascadeOneToMany(): Promise<void>;
|
|
22
|
-
shouldUpdateOneByIdAndCascadeOneToManyNull(): Promise<void>;
|
|
23
|
-
shouldUpdateManyAndCascadeOneToManyNull(): Promise<void>;
|
|
24
|
-
shouldInsertOneAndCascadeManyToMany(): Promise<void>;
|
|
25
|
-
shouldUpdateOneAndCascadeManyToMany(): Promise<void>;
|
|
26
|
-
shouldFindMany(): Promise<void>;
|
|
27
|
-
shouldFindOne(): Promise<void>;
|
|
28
|
-
shouldCount(): Promise<void>;
|
|
29
|
-
shouldUpdateMany(): Promise<void>;
|
|
30
|
-
shouldThrowWhenRollbackTransactionWithoutBeginTransaction(): Promise<void>;
|
|
31
|
-
shouldThrowIfUnknownComparisonOperator(): Promise<void>;
|
|
32
|
-
shouldCommit(): Promise<void>;
|
|
33
|
-
shouldRollback(): Promise<void>;
|
|
34
|
-
shouldThrowWhenBeginTransactionAfterBeginTransaction(): Promise<void>;
|
|
35
|
-
shouldProjectOneToMany(): Promise<void>;
|
|
36
|
-
shouldDeleteMany(): Promise<void>;
|
|
37
|
-
shouldThrowWhenCommitTransactionWithoutBeginTransaction(): Promise<void>;
|
|
38
|
-
clearTables(): Promise<void>;
|
|
39
|
-
abstract createTables(): Promise<void>;
|
|
40
|
-
abstract dropTables(): Promise<void>;
|
|
41
|
-
}
|
|
@@ -1,410 +0,0 @@
|
|
|
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==
|
|
@@ -1,9 +0,0 @@
|
|
|
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
|
-
}
|