@goatlab/fluent 0.7.21 → 0.7.24
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/dist/BaseConnector.d.ts +43 -0
- package/dist/BaseConnector.js +258 -0
- package/dist/Fluent.d.ts +7 -0
- package/dist/Fluent.js +22 -0
- package/dist/FluentConnectorInterface.d.ts +17 -0
- package/dist/FluentConnectorInterface.js +2 -0
- package/dist/FluentEntity.d.ts +7 -0
- package/dist/FluentEntity.js +28 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +38 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.js +370 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +45 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoOrderBy.d.ts +4 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoOrderBy.js +19 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
- package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.d.ts +1 -0
- package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.js +256 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +116 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +74 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.js +17 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.js +17 -0
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.d.ts +1 -0
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +193 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +53 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +53 -0
- package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.js +16 -0
- package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.js +16 -0
- package/dist/TypeOrmConnector/test/basic/goat.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/basic/goat.repository.js +16 -0
- package/dist/TypeOrmConnector/test/dbEntities.d.ts +6 -0
- package/dist/TypeOrmConnector/test/dbEntities.js +17 -0
- package/dist/TypeOrmConnector/test/docker/docker.d.ts +35 -0
- package/dist/TypeOrmConnector/test/docker/docker.js +148 -0
- package/dist/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
- package/dist/TypeOrmConnector/test/docker/mongo.js +93 -0
- package/dist/TypeOrmConnector/test/docker/mysql.d.ts +17 -0
- package/dist/TypeOrmConnector/test/docker/mysql.js +132 -0
- package/dist/TypeOrmConnector/test/flock.d.ts +4 -0
- package/dist/TypeOrmConnector/test/flock.js +25 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +28 -0
- package/dist/TypeOrmConnector/test/mongo/mongoDatasource.d.ts +2 -0
- package/dist/TypeOrmConnector/test/mongo/mongoDatasource.js +12 -0
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +9 -0
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +25 -0
- package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +32 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +26 -0
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.d.ts +2 -0
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +16 -0
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +9 -0
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +25 -0
- package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +33 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +7 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.js +32 -0
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +10 -0
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +26 -0
- package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +15 -0
- package/dist/TypeOrmConnector/test/relations/car/car.schema.js +9 -0
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -0
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +548 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +12 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +8 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles.entity.d.ts +6 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles.entity.js +29 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +9 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +25 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.d.ts +5 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.js +23 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.d.ts +15 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.js +9 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.d.ts +6 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.js +17 -0
- package/dist/TypeOrmConnector/test/relations/user/user.entity.d.ts +14 -0
- package/dist/TypeOrmConnector/test/relations/user/user.entity.js +56 -0
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +10 -0
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +30 -0
- package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +546 -0
- package/dist/TypeOrmConnector/test/relations/user/user.schema.js +67 -0
- package/dist/TypeOrmConnector/test/sqlite/memoryDataSource.d.ts +2 -0
- package/dist/TypeOrmConnector/test/sqlite/memoryDataSource.js +12 -0
- package/dist/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
- package/dist/TypeOrmConnector/util/clearEmpties.js +25 -0
- package/dist/TypeOrmConnector/util/extractConditions.d.ts +6 -0
- package/dist/TypeOrmConnector/util/extractConditions.js +80 -0
- package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
- package/dist/TypeOrmConnector/util/extractInclude.js +25 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.js +18 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
- package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
- package/dist/TypeOrmConnector/util/isAnyObject.js +7 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.js +31 -0
- package/dist/cache.d.ts +9 -0
- package/dist/cache.js +43 -0
- package/dist/core/Loopback/build-schema.d.ts +31 -0
- package/dist/core/Loopback/build-schema.js +333 -0
- package/dist/core/Loopback/common-types.d.ts +36 -0
- package/dist/core/Loopback/common-types.js +13 -0
- package/dist/core/Loopback/json-to-schema.d.ts +6 -0
- package/dist/core/Loopback/json-to-schema.js +96 -0
- package/dist/core/Loopback/mapValues.d.ts +2 -0
- package/dist/core/Loopback/mapValues.js +835 -0
- package/dist/core/Loopback/metadata.d.ts +9 -0
- package/dist/core/Loopback/metadata.js +28 -0
- package/dist/core/Loopback/model.d.ts +87 -0
- package/dist/core/Loopback/model.js +244 -0
- package/dist/core/Loopback/query.d.ts +97 -0
- package/dist/core/Loopback/query.js +292 -0
- package/dist/core/Loopback/relation.types.d.ts +45 -0
- package/dist/core/Loopback/relation.types.js +13 -0
- package/dist/core/Loopback/type-resolver.d.ts +7 -0
- package/dist/core/Loopback/type-resolver.js +34 -0
- package/dist/core/Loopback/type.d.ts +9 -0
- package/dist/core/Loopback/type.js +2 -0
- package/dist/core/Nestjs/applyDecorators.d.ts +1 -0
- package/dist/core/Nestjs/applyDecorators.js +17 -0
- package/dist/core/Nestjs/types/common.d.ts +16 -0
- package/dist/core/Nestjs/types/common.js +37 -0
- package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.d.ts +1 -0
- package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.js +7 -0
- package/dist/core/Nestjs/types/decorators/api-property.decorator.d.ts +27 -0
- package/dist/core/Nestjs/types/decorators/api-property.decorator.js +65 -0
- package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +5 -0
- package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.js +131 -0
- package/dist/core/Nestjs/types/decorators/args-type.decorator.d.ts +1 -0
- package/dist/core/Nestjs/types/decorators/args-type.decorator.js +19 -0
- package/dist/core/Nestjs/types/decorators/create-property.decorator.d.ts +2 -0
- package/dist/core/Nestjs/types/decorators/create-property.decorator.js +55 -0
- package/dist/core/Nestjs/types/decorators/directive.decorator.d.ts +1 -0
- package/dist/core/Nestjs/types/decorators/directive.decorator.js +36 -0
- package/dist/core/Nestjs/types/decorators/extensions.decorator.d.ts +1 -0
- package/dist/core/Nestjs/types/decorators/extensions.decorator.js +25 -0
- package/dist/core/Nestjs/types/decorators/field.decorator.d.ts +15 -0
- package/dist/core/Nestjs/types/decorators/field.decorator.js +56 -0
- package/dist/core/Nestjs/types/decorators/input-type.decorator.d.ts +7 -0
- package/dist/core/Nestjs/types/decorators/input-type.decorator.js +23 -0
- package/dist/core/Nestjs/types/decorators/interface-type.decorator.d.ts +9 -0
- package/dist/core/Nestjs/types/decorators/interface-type.decorator.js +27 -0
- package/dist/core/Nestjs/types/decorators/partial-type.helper.d.ts +3 -0
- package/dist/core/Nestjs/types/decorators/partial-type.helper.js +42 -0
- package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.d.ts +3 -0
- package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.js +9 -0
- package/dist/core/Nestjs/types/errors/directive-parsing.error.d.ts +3 -0
- package/dist/core/Nestjs/types/errors/directive-parsing.error.js +9 -0
- package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.d.ts +3 -0
- package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.js +9 -0
- package/dist/core/Nestjs/types/errors/undefined-type.error.d.ts +3 -0
- package/dist/core/Nestjs/types/errors/undefined-type.error.js +10 -0
- package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.d.ts +3 -0
- package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.js +10 -0
- package/dist/core/Nestjs/types/interfaces/base-type-options.interface.d.ts +5 -0
- package/dist/core/Nestjs/types/interfaces/base-type-options.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.d.ts +5 -0
- package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/complexity.interface.d.ts +11 -0
- package/dist/core/Nestjs/types/interfaces/complexity.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/field-middleware.interface.d.ts +15 -0
- package/dist/core/Nestjs/types/interfaces/field-middleware.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.d.ts +235 -0
- package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.d.ts +2 -0
- package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/return-type-func.interface.d.ts +5 -0
- package/dist/core/Nestjs/types/interfaces/return-type-func.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.d.ts +9 -0
- package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.js +2 -0
- package/dist/core/Nestjs/types/interfaces/type-options.interface.d.ts +5 -0
- package/dist/core/Nestjs/types/interfaces/type-options.interface.js +2 -0
- package/dist/core/Nestjs/types/lazy-metadata.storage.d.ts +15 -0
- package/dist/core/Nestjs/types/lazy-metadata.storage.js +67 -0
- package/dist/core/Nestjs/types/metadata/class.metadata.d.ts +11 -0
- package/dist/core/Nestjs/types/metadata/class.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/directive.metadata.d.ts +8 -0
- package/dist/core/Nestjs/types/metadata/directive.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/enum.metadata.d.ts +11 -0
- package/dist/core/Nestjs/types/metadata/enum.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/extensions.metadata.d.ts +8 -0
- package/dist/core/Nestjs/types/metadata/extensions.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/index.d.ts +8 -0
- package/dist/core/Nestjs/types/metadata/index.js +11 -0
- package/dist/core/Nestjs/types/metadata/interface.metadata.d.ts +6 -0
- package/dist/core/Nestjs/types/metadata/interface.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/object-type.metadata.d.ts +4 -0
- package/dist/core/Nestjs/types/metadata/object-type.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/param.metadata.d.ts +18 -0
- package/dist/core/Nestjs/types/metadata/param.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/property.metadata.d.ts +20 -0
- package/dist/core/Nestjs/types/metadata/property.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/resolver.metadata.d.ts +34 -0
- package/dist/core/Nestjs/types/metadata/resolver.metadata.js +2 -0
- package/dist/core/Nestjs/types/metadata/union.metadata.d.ts +9 -0
- package/dist/core/Nestjs/types/metadata/union.metadata.js +2 -0
- package/dist/core/Nestjs/types/object-type.decorator.d.ts +8 -0
- package/dist/core/Nestjs/types/object-type.decorator.js +25 -0
- package/dist/core/Nestjs/types/omit-type.d.ts +2 -0
- package/dist/core/Nestjs/types/omit-type.js +34 -0
- package/dist/core/Nestjs/types/reflection.utils.d.ts +15 -0
- package/dist/core/Nestjs/types/reflection.utils.js +65 -0
- package/dist/core/Nestjs/types/set-metadata.decorator.d.ts +4 -0
- package/dist/core/Nestjs/types/set-metadata.decorator.js +16 -0
- package/dist/core/Nestjs/types/type-metadata.storage.d.ts +69 -0
- package/dist/core/Nestjs/types/type-metadata.storage.js +342 -0
- package/dist/core/Nestjs/types/utils/enum.utils.d.ts +3 -0
- package/dist/core/Nestjs/types/utils/enum.utils.js +29 -0
- package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +3 -0
- package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.js +72 -0
- package/dist/core/Nestjs/types/utils/mapped-types.utils.d.ts +2 -0
- package/dist/core/Nestjs/types/utils/mapped-types.utils.js +38 -0
- package/dist/core/Nestjs/types/utils/model-properties-accessor.d.ts +6 -0
- package/dist/core/Nestjs/types/utils/model-properties-accessor.js +36 -0
- package/dist/core/Nestjs/types/utils/type-helpers.utils.d.ts +2 -0
- package/dist/core/Nestjs/types/utils/type-helpers.utils.js +16 -0
- package/dist/core/types.d.ts +23 -0
- package/dist/core/types.js +29 -0
- package/dist/decorators.d.ts +47 -0
- package/dist/decorators.js +104 -0
- package/dist/generatorDatasource.d.ts +2 -0
- package/dist/generatorDatasource.js +12 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +49 -0
- package/dist/loadRelations.d.ts +12 -0
- package/dist/loadRelations.js +133 -0
- package/dist/outputKeys.d.ts +2 -0
- package/dist/outputKeys.js +17 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +141 -0
- package/dist/types.js +22 -0
- package/package.json +2 -2
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.basicTestSuite = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const flock_1 = require("../flock");
|
|
6
|
+
const basicTestSuite = Repo => {
|
|
7
|
+
let storedId;
|
|
8
|
+
let Repository;
|
|
9
|
+
beforeAll(() => {
|
|
10
|
+
Repository = new Repo();
|
|
11
|
+
});
|
|
12
|
+
test('insert - Should insert data', async () => {
|
|
13
|
+
const a = await Repository.insert({ name: 'myGoat', age: 13 });
|
|
14
|
+
expect(typeof a.id).toBe('string');
|
|
15
|
+
expect(a.name).toBe('myGoat');
|
|
16
|
+
expect(0).toBe(0);
|
|
17
|
+
});
|
|
18
|
+
test('insert - Should insert data with customId', async () => {
|
|
19
|
+
const a = await Repository.insert({
|
|
20
|
+
id: '631ce4304f9183f61ffb613a',
|
|
21
|
+
name: 'myGoat',
|
|
22
|
+
age: 13
|
|
23
|
+
});
|
|
24
|
+
expect(typeof a.id).toBe('string');
|
|
25
|
+
expect(a.id).toBe('631ce4304f9183f61ffb613a');
|
|
26
|
+
});
|
|
27
|
+
it('insertMany - Should insert Multiple elements', async () => {
|
|
28
|
+
const insertedFlock = await Repository.insertMany(flock_1.flock);
|
|
29
|
+
expect(insertedFlock[0].name).toBe('Goatee');
|
|
30
|
+
storedId = insertedFlock[0].id;
|
|
31
|
+
});
|
|
32
|
+
test('findById - Should GET an object by its ID', async () => {
|
|
33
|
+
const goats = await Repository.insertMany(flock_1.flock);
|
|
34
|
+
const goat = await Repository.findById(goats[0].id);
|
|
35
|
+
expect(goat?.id).toBe(goats[0].id);
|
|
36
|
+
expect(typeof goat?.id).toBe('string');
|
|
37
|
+
const anotherGoat = await Repository.findById('507f1f77bcf86cd799439011');
|
|
38
|
+
expect(anotherGoat).toBe(null);
|
|
39
|
+
});
|
|
40
|
+
test('findById - Should GET selected Data', async () => {
|
|
41
|
+
const goats = await Repository.insertMany(flock_1.flock);
|
|
42
|
+
const goat = await Repository.findById(goats[0].id, {
|
|
43
|
+
select: {
|
|
44
|
+
age: true
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
expect(goat).not.toHaveProperty('name');
|
|
48
|
+
expect(goat?.age).toBe(goats[0].age);
|
|
49
|
+
});
|
|
50
|
+
test('findByIds - Should GET data', async () => {
|
|
51
|
+
const goats = await Repository.insertMany(flock_1.flock);
|
|
52
|
+
const ids = [goats[0].id, goats[1].id];
|
|
53
|
+
const selectedGoats = await Repository.findByIds(ids);
|
|
54
|
+
expect(selectedGoats.length).toBe(2);
|
|
55
|
+
expect(selectedGoats[0].id === ids[0] || selectedGoats[1].id === ids[0]).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
test('findByIds - Should GET selectedData', async () => {
|
|
58
|
+
const goats = await Repository.insertMany(flock_1.flock);
|
|
59
|
+
const ids = [goats[0].id, goats[1].id];
|
|
60
|
+
const ages = [goats[0].age, goats[1].age];
|
|
61
|
+
const selectedGoats = await Repository.findByIds(ids, {
|
|
62
|
+
select: {
|
|
63
|
+
age: true
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
expect(selectedGoats.length).toBe(2);
|
|
67
|
+
expect(selectedGoats[0].age === ages[0] || selectedGoats[1].age === ages[0]).toBe(true);
|
|
68
|
+
expect(selectedGoats[0]).not.toHaveProperty('name');
|
|
69
|
+
});
|
|
70
|
+
test('findMany - Should GET data', async () => {
|
|
71
|
+
await Repository.insertMany(flock_1.flock);
|
|
72
|
+
const storedGoats = await Repository.findMany();
|
|
73
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
74
|
+
expect(typeof storedGoats[0].id).toBe('string');
|
|
75
|
+
});
|
|
76
|
+
test('findMany - Should FILTER data', async () => {
|
|
77
|
+
await Repository.insertMany(flock_1.flock);
|
|
78
|
+
const storedGoats = await Repository.findMany({
|
|
79
|
+
where: {
|
|
80
|
+
name: 'Goatee'
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
84
|
+
for (const goat of storedGoats) {
|
|
85
|
+
expect(goat.name).toBe('Goatee');
|
|
86
|
+
}
|
|
87
|
+
expect(typeof storedGoats[0].id).toBe('string');
|
|
88
|
+
});
|
|
89
|
+
test('findMany - Should FILTER not existing data', async () => {
|
|
90
|
+
await Repository.insertMany(flock_1.flock);
|
|
91
|
+
const storedGoats = await Repository.findMany({
|
|
92
|
+
where: {
|
|
93
|
+
name: 'SOMENOTEXISTINGGOAT'
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
97
|
+
expect(storedGoats.length).toBe(0);
|
|
98
|
+
});
|
|
99
|
+
test('findMany - Should SELECT attributes', async () => {
|
|
100
|
+
await Repository.insertMany(flock_1.flock);
|
|
101
|
+
const storedGoats = await Repository.findMany({
|
|
102
|
+
where: {
|
|
103
|
+
name: 'Goatee'
|
|
104
|
+
},
|
|
105
|
+
select: {
|
|
106
|
+
age: true
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
expect(Array.isArray(storedGoats)).toBe(true);
|
|
110
|
+
expect(storedGoats.length > 0).toBe(true);
|
|
111
|
+
expect(storedGoats[0]).not.toHaveProperty('name');
|
|
112
|
+
});
|
|
113
|
+
test('findFirst - Should get only 1 object back', async () => {
|
|
114
|
+
await Repository.insertMany(flock_1.flock);
|
|
115
|
+
const storedGoats = await Repository.findFirst({
|
|
116
|
+
where: {
|
|
117
|
+
name: 'Goatee'
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
expect(Array.isArray(storedGoats)).toBe(false);
|
|
121
|
+
expect(typeof storedGoats.id).toBe('string');
|
|
122
|
+
});
|
|
123
|
+
test('findFirst - Should FILTER AND SELECT DATA', async () => {
|
|
124
|
+
await Repository.insertMany(flock_1.flock);
|
|
125
|
+
const storedGoats = await Repository.findFirst({
|
|
126
|
+
where: {
|
|
127
|
+
name: 'Goatee'
|
|
128
|
+
},
|
|
129
|
+
select: {
|
|
130
|
+
name: true,
|
|
131
|
+
age: true,
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
expect(Array.isArray(storedGoats)).toBe(false);
|
|
135
|
+
expect(storedGoats.name).toBe('Goatee');
|
|
136
|
+
expect(storedGoats).not.toHaveProperty('id');
|
|
137
|
+
});
|
|
138
|
+
test('requireFirst - Should fail if not found', async () => {
|
|
139
|
+
const insertedUser = await Repository.insert({
|
|
140
|
+
name: 'testGoat',
|
|
141
|
+
age: 20
|
|
142
|
+
});
|
|
143
|
+
const [error] = await js_utils_1.Promises.try(Repository.requireFirst({
|
|
144
|
+
where: {
|
|
145
|
+
name: 'noneExistingGoat'
|
|
146
|
+
}
|
|
147
|
+
}));
|
|
148
|
+
expect(error?.message).toBe('No objects found matching: {"where":{"name":"noneExistingGoat"}}');
|
|
149
|
+
});
|
|
150
|
+
test('requireFirst - Should find first item', async () => {
|
|
151
|
+
const insertedUser = await Repository.insert({
|
|
152
|
+
name: 'testGoat',
|
|
153
|
+
age: 20
|
|
154
|
+
});
|
|
155
|
+
const [error, goat] = await js_utils_1.Promises.try(Repository.requireFirst({
|
|
156
|
+
where: {
|
|
157
|
+
name: 'testGoat'
|
|
158
|
+
}
|
|
159
|
+
}));
|
|
160
|
+
expect(error).toBe(null);
|
|
161
|
+
expect(goat.name).toBe(insertedUser.name);
|
|
162
|
+
});
|
|
163
|
+
it('UpdateById - Should Update a single element', async () => {
|
|
164
|
+
await Repository.insertMany(flock_1.flock);
|
|
165
|
+
const goats = await Repository.findMany();
|
|
166
|
+
const data = await Repository.updateById(goats[0].id, {
|
|
167
|
+
age: 99,
|
|
168
|
+
name: 'MyUpdatedGoat'
|
|
169
|
+
});
|
|
170
|
+
expect(data.name).toBe('MyUpdatedGoat');
|
|
171
|
+
expect(data.id).toBe(goats[0].id);
|
|
172
|
+
});
|
|
173
|
+
it('ReplaceById - Should Update a single element', async () => {
|
|
174
|
+
await Repository.insertMany(flock_1.flock);
|
|
175
|
+
const goats = await Repository.findMany();
|
|
176
|
+
const data = await Repository.replaceById(goats[0].id, {
|
|
177
|
+
age: 2,
|
|
178
|
+
name: 'MyReplacedGoat'
|
|
179
|
+
});
|
|
180
|
+
expect(data.name).toBe('MyReplacedGoat');
|
|
181
|
+
expect(data.id).toBe(goats[0].id);
|
|
182
|
+
});
|
|
183
|
+
it('deleteById - Should delete an item', async () => {
|
|
184
|
+
await Repository.insertMany(flock_1.flock);
|
|
185
|
+
const goats = await Repository.findMany();
|
|
186
|
+
const foundGoat = await Repository.requireById(goats[0].id);
|
|
187
|
+
expect(foundGoat.id).toBe(goats[0].id);
|
|
188
|
+
await Repository.deleteById(foundGoat.id);
|
|
189
|
+
const [error] = await js_utils_1.Promises.try(Repository.requireById(goats[0].id));
|
|
190
|
+
expect(error?.message).toBe(`Object ${goats[0].id} not found`);
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
exports.basicTestSuite = basicTestSuite;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare class Breed {
|
|
3
|
+
family?: string;
|
|
4
|
+
members?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class GoatEntity {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
age?: number;
|
|
10
|
+
breed?: Breed;
|
|
11
|
+
}
|
|
12
|
+
export declare const BreedSchema: z.ZodObject<{
|
|
13
|
+
family: z.ZodString;
|
|
14
|
+
members: z.ZodNumber;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
family: string;
|
|
17
|
+
members: number;
|
|
18
|
+
}, {
|
|
19
|
+
family: string;
|
|
20
|
+
members: number;
|
|
21
|
+
}>;
|
|
22
|
+
export declare const GoatSchema: z.ZodObject<{
|
|
23
|
+
id: z.ZodOptional<z.ZodString>;
|
|
24
|
+
name: z.ZodOptional<z.ZodString>;
|
|
25
|
+
age: z.ZodNumber;
|
|
26
|
+
breed: z.ZodOptional<z.ZodObject<{
|
|
27
|
+
family: z.ZodString;
|
|
28
|
+
members: z.ZodNumber;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
family: string;
|
|
31
|
+
members: number;
|
|
32
|
+
}, {
|
|
33
|
+
family: string;
|
|
34
|
+
members: number;
|
|
35
|
+
}>>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
id?: string | undefined;
|
|
38
|
+
name?: string | undefined;
|
|
39
|
+
breed?: {
|
|
40
|
+
family: string;
|
|
41
|
+
members: number;
|
|
42
|
+
} | undefined;
|
|
43
|
+
age: number;
|
|
44
|
+
}, {
|
|
45
|
+
id?: string | undefined;
|
|
46
|
+
name?: string | undefined;
|
|
47
|
+
breed?: {
|
|
48
|
+
family: string;
|
|
49
|
+
members: number;
|
|
50
|
+
} | undefined;
|
|
51
|
+
age: number;
|
|
52
|
+
}>;
|
|
53
|
+
export declare type GoatInputSchema = z.infer<typeof GoatSchema>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GoatSchema = exports.BreedSchema = exports.GoatEntity = exports.Breed = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const types_1 = require("../../../core/types");
|
|
6
|
+
const decorators_1 = require("../../../decorators");
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
let Breed = class Breed {
|
|
9
|
+
};
|
|
10
|
+
tslib_1.__decorate([
|
|
11
|
+
decorators_1.f.property({ required: false }),
|
|
12
|
+
tslib_1.__metadata("design:type", String)
|
|
13
|
+
], Breed.prototype, "family", void 0);
|
|
14
|
+
tslib_1.__decorate([
|
|
15
|
+
decorators_1.f.property({ required: false }),
|
|
16
|
+
tslib_1.__metadata("design:type", Number)
|
|
17
|
+
], Breed.prototype, "members", void 0);
|
|
18
|
+
Breed = tslib_1.__decorate([
|
|
19
|
+
(0, types_1.ObjectType)()
|
|
20
|
+
], Breed);
|
|
21
|
+
exports.Breed = Breed;
|
|
22
|
+
let GoatEntity = class GoatEntity {
|
|
23
|
+
};
|
|
24
|
+
tslib_1.__decorate([
|
|
25
|
+
decorators_1.f.id(),
|
|
26
|
+
tslib_1.__metadata("design:type", String)
|
|
27
|
+
], GoatEntity.prototype, "id", void 0);
|
|
28
|
+
tslib_1.__decorate([
|
|
29
|
+
decorators_1.f.property({ required: true }),
|
|
30
|
+
tslib_1.__metadata("design:type", String)
|
|
31
|
+
], GoatEntity.prototype, "name", void 0);
|
|
32
|
+
tslib_1.__decorate([
|
|
33
|
+
decorators_1.f.property({ required: false }),
|
|
34
|
+
tslib_1.__metadata("design:type", Number)
|
|
35
|
+
], GoatEntity.prototype, "age", void 0);
|
|
36
|
+
tslib_1.__decorate([
|
|
37
|
+
decorators_1.f.embed(Breed),
|
|
38
|
+
tslib_1.__metadata("design:type", Breed)
|
|
39
|
+
], GoatEntity.prototype, "breed", void 0);
|
|
40
|
+
GoatEntity = tslib_1.__decorate([
|
|
41
|
+
decorators_1.f.entity('goat')
|
|
42
|
+
], GoatEntity);
|
|
43
|
+
exports.GoatEntity = GoatEntity;
|
|
44
|
+
exports.BreedSchema = zod_1.z.object({
|
|
45
|
+
family: zod_1.z.string(),
|
|
46
|
+
members: zod_1.z.number()
|
|
47
|
+
});
|
|
48
|
+
exports.GoatSchema = zod_1.z.object({
|
|
49
|
+
id: zod_1.z.string().optional(),
|
|
50
|
+
name: zod_1.z.string().optional(),
|
|
51
|
+
age: zod_1.z.number(),
|
|
52
|
+
breed: exports.BreedSchema.optional()
|
|
53
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GoatRepository = void 0;
|
|
4
|
+
const goat_entity_1 = require("./goat.entity");
|
|
5
|
+
const TypeOrmConnector_1 = require("../../TypeOrmConnector");
|
|
6
|
+
const mongoDatasource_1 = require("../mongo/mongoDatasource");
|
|
7
|
+
class GoatRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
8
|
+
constructor() {
|
|
9
|
+
super({
|
|
10
|
+
entity: goat_entity_1.GoatEntity,
|
|
11
|
+
dataSource: mongoDatasource_1.MongoDataSource,
|
|
12
|
+
inputSchema: goat_entity_1.GoatSchema
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.GoatRepository = GoatRepository;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GoatRepository = void 0;
|
|
4
|
+
const goat_entity_1 = require("./goat.entity");
|
|
5
|
+
const TypeOrmConnector_1 = require("../../TypeOrmConnector");
|
|
6
|
+
const mysqlDataSource_1 = require("../mysql/mysqlDataSource");
|
|
7
|
+
class GoatRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
8
|
+
constructor() {
|
|
9
|
+
super({
|
|
10
|
+
entity: goat_entity_1.GoatEntity,
|
|
11
|
+
dataSource: mysqlDataSource_1.MYSQLDataSource,
|
|
12
|
+
inputSchema: goat_entity_1.GoatSchema
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.GoatRepository = GoatRepository;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GoatRepository = void 0;
|
|
4
|
+
const goat_entity_1 = require("./goat.entity");
|
|
5
|
+
const TypeOrmConnector_1 = require("../../TypeOrmConnector");
|
|
6
|
+
const memoryDataSource_1 = require("../sqlite/memoryDataSource");
|
|
7
|
+
class GoatRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
8
|
+
constructor() {
|
|
9
|
+
super({
|
|
10
|
+
entity: goat_entity_1.GoatEntity,
|
|
11
|
+
dataSource: memoryDataSource_1.MemoryDataSource,
|
|
12
|
+
inputSchema: goat_entity_1.GoatSchema
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.GoatRepository = GoatRepository;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TypeORMDataModel } from './advanced/typeOrm.entity';
|
|
2
|
+
import { GoatEntity } from './basic/goat.entity';
|
|
3
|
+
import { CarsEntity } from './relations/car/car.entity';
|
|
4
|
+
import { RoleEntity } from './relations/roles/roles.entity';
|
|
5
|
+
import { RolesUser } from './relations/roles/roles_user.entity';
|
|
6
|
+
export declare const dbEntities: (typeof TypeORMDataModel | typeof GoatEntity | typeof RoleEntity | typeof CarsEntity | typeof RolesUser)[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dbEntities = void 0;
|
|
4
|
+
const typeOrm_entity_1 = require("./advanced/typeOrm.entity");
|
|
5
|
+
const goat_entity_1 = require("./basic/goat.entity");
|
|
6
|
+
const car_entity_1 = require("./relations/car/car.entity");
|
|
7
|
+
const roles_entity_1 = require("./relations/roles/roles.entity");
|
|
8
|
+
const roles_user_entity_1 = require("./relations/roles/roles_user.entity");
|
|
9
|
+
const user_entity_1 = require("./relations/user/user.entity");
|
|
10
|
+
exports.dbEntities = [
|
|
11
|
+
goat_entity_1.GoatEntity,
|
|
12
|
+
typeOrm_entity_1.TypeORMDataModel,
|
|
13
|
+
car_entity_1.CarsEntity,
|
|
14
|
+
user_entity_1.UsersEntity,
|
|
15
|
+
roles_entity_1.RoleEntity,
|
|
16
|
+
roles_user_entity_1.RolesUser
|
|
17
|
+
];
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const detectPort: (defaultPort: number) => Promise<number>;
|
|
2
|
+
export interface Options {
|
|
3
|
+
debug: boolean;
|
|
4
|
+
image: string;
|
|
5
|
+
containerName: string;
|
|
6
|
+
defaultExternalPort: number;
|
|
7
|
+
externalPort?: number;
|
|
8
|
+
internalPort: number;
|
|
9
|
+
connectTimeoutSeconds: number;
|
|
10
|
+
environment?: {
|
|
11
|
+
[key: string]: string;
|
|
12
|
+
};
|
|
13
|
+
command?: string[];
|
|
14
|
+
cap_add?: 'SYS_NICE' | 'IPC_LOCK';
|
|
15
|
+
refreshImage?: boolean;
|
|
16
|
+
detached?: boolean;
|
|
17
|
+
enableDebugInstructions?: string;
|
|
18
|
+
testConnection?: (opts: NormalizedOptions & {
|
|
19
|
+
testPortConnection: () => Promise<boolean>;
|
|
20
|
+
}) => Promise<boolean>;
|
|
21
|
+
}
|
|
22
|
+
export interface NormalizedOptions extends Pick<Options, Exclude<keyof Options, 'defaultExternalPort'>> {
|
|
23
|
+
detached: boolean;
|
|
24
|
+
externalPort: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function imageExists(options: NormalizedOptions | Options): Promise<boolean>;
|
|
27
|
+
export declare function pullDockerImage(options: NormalizedOptions | Options): Promise<void>;
|
|
28
|
+
export declare function startDockerContainer(options: NormalizedOptions): any;
|
|
29
|
+
export declare function waitForDatabaseToStart(options: NormalizedOptions): Promise<void>;
|
|
30
|
+
export declare function killOldContainers(options: Pick<NormalizedOptions, 'debug' | 'containerName'>): Promise<void>;
|
|
31
|
+
export default function startContainer(options: Options): Promise<{
|
|
32
|
+
proc: any;
|
|
33
|
+
externalPort: number;
|
|
34
|
+
kill: () => Promise<void>;
|
|
35
|
+
}>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.killOldContainers = exports.waitForDatabaseToStart = exports.startDockerContainer = exports.pullDockerImage = exports.imageExists = exports.detectPort = void 0;
|
|
4
|
+
const net_1 = require("net");
|
|
5
|
+
const spawn = require("cross-spawn");
|
|
6
|
+
const modern_spawn_1 = require("modern-spawn");
|
|
7
|
+
exports.detectPort = require('detect-port');
|
|
8
|
+
async function imageExists(options) {
|
|
9
|
+
const stdout = await (0, modern_spawn_1.spawnBuffered)('docker', ['images', '--format', '{{json .}}'], {
|
|
10
|
+
debug: options.debug
|
|
11
|
+
}).getResult('utf8');
|
|
12
|
+
const existingImages = stdout
|
|
13
|
+
.trim()
|
|
14
|
+
.split('\n')
|
|
15
|
+
.map(str => {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(str);
|
|
18
|
+
}
|
|
19
|
+
catch (ex) {
|
|
20
|
+
console.log('Unable to parse: ' + str);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
.filter(n => n != null);
|
|
25
|
+
const [Repository, Tag] = options.image.split(':');
|
|
26
|
+
return existingImages.some(i => i.Repository === Repository && (!Tag || i.Tag === Tag));
|
|
27
|
+
}
|
|
28
|
+
exports.imageExists = imageExists;
|
|
29
|
+
async function pullDockerImage(options) {
|
|
30
|
+
if (!options.refreshImage &&
|
|
31
|
+
/.+\:.+/.test(options.image) &&
|
|
32
|
+
(await imageExists(options))) {
|
|
33
|
+
console.log(options.image +
|
|
34
|
+
' already pulled (use mysql-test start --refresh or ops.refreshImage to refresh)');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
console.log('Pulling Docker Image ' + options.image);
|
|
38
|
+
await (0, modern_spawn_1.spawnBuffered)('docker', ['pull', options.image], {
|
|
39
|
+
debug: options.debug
|
|
40
|
+
}).getResult();
|
|
41
|
+
}
|
|
42
|
+
exports.pullDockerImage = pullDockerImage;
|
|
43
|
+
function startDockerContainer(options) {
|
|
44
|
+
const env = options.environment || {};
|
|
45
|
+
const envArgs = [];
|
|
46
|
+
Object.keys(env).forEach(key => {
|
|
47
|
+
envArgs.push('--env');
|
|
48
|
+
envArgs.push(`${key}=${env[key]}`);
|
|
49
|
+
});
|
|
50
|
+
return spawn('docker', [
|
|
51
|
+
'run',
|
|
52
|
+
'--name',
|
|
53
|
+
options.containerName,
|
|
54
|
+
'-t',
|
|
55
|
+
'--rm',
|
|
56
|
+
'-p',
|
|
57
|
+
`${options.externalPort}:${options.internalPort}`,
|
|
58
|
+
...(options.detached ? ['--detach'] : []),
|
|
59
|
+
...envArgs,
|
|
60
|
+
options.image
|
|
61
|
+
], {
|
|
62
|
+
stdio: options.debug ? 'inherit' : 'ignore'
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
exports.startDockerContainer = startDockerContainer;
|
|
66
|
+
async function waitForDatabaseToStart(options) {
|
|
67
|
+
await new Promise((resolve, reject) => {
|
|
68
|
+
let finished = false;
|
|
69
|
+
const timeout = setTimeout(() => {
|
|
70
|
+
finished = true;
|
|
71
|
+
reject(new Error(`Unable to connect to database after ${options.connectTimeoutSeconds} seconds.${options.enableDebugInstructions
|
|
72
|
+
? ` ${options.enableDebugInstructions}`
|
|
73
|
+
: ``}`));
|
|
74
|
+
}, options.connectTimeoutSeconds * 1000);
|
|
75
|
+
function test() {
|
|
76
|
+
console.log(`Waiting for ${options.containerName} on port ${options.externalPort}...`);
|
|
77
|
+
(options.testConnection
|
|
78
|
+
? options.testConnection({
|
|
79
|
+
...options,
|
|
80
|
+
testPortConnection: async () => await testConnection(options)
|
|
81
|
+
})
|
|
82
|
+
: testConnection(options)).then(isConnected => {
|
|
83
|
+
if (finished)
|
|
84
|
+
return;
|
|
85
|
+
if (isConnected) {
|
|
86
|
+
finished = true;
|
|
87
|
+
clearTimeout(timeout);
|
|
88
|
+
setTimeout(resolve, 1000);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
setTimeout(test, 500);
|
|
92
|
+
}
|
|
93
|
+
}, err => {
|
|
94
|
+
reject(err);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
test();
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
exports.waitForDatabaseToStart = waitForDatabaseToStart;
|
|
101
|
+
async function testConnection(options) {
|
|
102
|
+
return new Promise(resolve => {
|
|
103
|
+
const connection = (0, net_1.connect)(options.externalPort)
|
|
104
|
+
.on('error', () => {
|
|
105
|
+
resolve(false);
|
|
106
|
+
})
|
|
107
|
+
.on('connect', () => {
|
|
108
|
+
connection.end();
|
|
109
|
+
resolve(true);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function killOldContainers(options) {
|
|
114
|
+
await (0, modern_spawn_1.spawnBuffered)('docker', ['kill', options.containerName], {
|
|
115
|
+
debug: options.debug
|
|
116
|
+
});
|
|
117
|
+
await (0, modern_spawn_1.spawnBuffered)('docker', ['rm', options.containerName], {
|
|
118
|
+
debug: options.debug
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
exports.killOldContainers = killOldContainers;
|
|
122
|
+
async function startContainer(options) {
|
|
123
|
+
if (isNaN(options.connectTimeoutSeconds)) {
|
|
124
|
+
throw new Error('connectTimeoutSeconds must be a valid integer.');
|
|
125
|
+
}
|
|
126
|
+
await Promise.all([pullDockerImage(options), killOldContainers(options)]);
|
|
127
|
+
const { defaultExternalPort, ...rawOptions } = options;
|
|
128
|
+
const externalPort = rawOptions.externalPort || (await (0, exports.detectPort)(defaultExternalPort));
|
|
129
|
+
if (typeof externalPort !== 'number') {
|
|
130
|
+
throw new Error('Expected external port to be a number');
|
|
131
|
+
}
|
|
132
|
+
const opts = {
|
|
133
|
+
detached: false,
|
|
134
|
+
...rawOptions,
|
|
135
|
+
externalPort
|
|
136
|
+
};
|
|
137
|
+
console.log('Starting Docker Container ' + opts.containerName);
|
|
138
|
+
const proc = startDockerContainer(opts);
|
|
139
|
+
await waitForDatabaseToStart(opts);
|
|
140
|
+
return {
|
|
141
|
+
proc,
|
|
142
|
+
externalPort,
|
|
143
|
+
kill: async () => {
|
|
144
|
+
return await killOldContainers(options);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
exports.default = startContainer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Options as WithContainerOptions } from './docker';
|
|
2
|
+
export interface Options extends Omit<WithContainerOptions, 'internalPort' | 'enableDebugInstructions' | 'testConnection'> {
|
|
3
|
+
mongoUser: string;
|
|
4
|
+
mongoPassword: string;
|
|
5
|
+
mongoDb: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function waitForConnection(databaseURL: string, timeoutSeconds: number): Promise<void>;
|
|
8
|
+
export default function getDatabase(options?: Partial<Options>): Promise<{
|
|
9
|
+
proc: any;
|
|
10
|
+
databaseURL: string;
|
|
11
|
+
kill: () => Promise<void>;
|
|
12
|
+
user: string;
|
|
13
|
+
password: string;
|
|
14
|
+
port: number;
|
|
15
|
+
dbName: string;
|
|
16
|
+
}>;
|