@goatlab/fluent 0.6.23 → 0.7.0
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 +49 -82
- package/dist/BaseConnector.js +219 -319
- package/dist/Fluent.d.ts +2 -21
- package/dist/Fluent.js +0 -33
- package/dist/FluentEntity.d.ts +7 -0
- package/dist/FluentEntity.js +28 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +34 -27
- package/dist/TypeOrmConnector/TypeOrmConnector.js +599 -343
- package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.js +182 -48
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +103 -3
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +30 -13
- 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 +3 -3
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.js +8 -3
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.d.ts +1 -1
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +42 -16
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +43 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +19 -8
- 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 +3 -4
- package/dist/TypeOrmConnector/test/basic/goat.repository.js +7 -3
- package/dist/TypeOrmConnector/test/dbEntities.d.ts +6 -6
- package/dist/TypeOrmConnector/test/docker/docker.d.ts +35 -0
- package/dist/TypeOrmConnector/test/docker/docker.js +149 -0
- package/dist/TypeOrmConnector/test/docker/mysql.d.ts +17 -0
- package/dist/TypeOrmConnector/test/docker/mysql.js +132 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +8 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +23 -0
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +4 -0
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +43 -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 +8 -0
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +23 -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 +31 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +17 -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 +8 -0
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +23 -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 +32 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +1 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.js +13 -5
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +11 -4
- package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +38 -0
- package/dist/TypeOrmConnector/test/relations/car/car.schema.js +14 -0
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +85 -32
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +35 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +16 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles.entity.js +4 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +12 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.d.ts +2 -2
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.js +4 -4
- 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 +3 -3
- package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.js +8 -3
- package/dist/TypeOrmConnector/test/relations/user/user.entity.js +10 -10
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +17 -5
- package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +150 -0
- package/dist/TypeOrmConnector/test/relations/user/user.schema.js +18 -0
- package/dist/TypeOrmConnector/test/{memoryDataSource.d.ts → sqlite/memoryDataSource.d.ts} +0 -0
- package/dist/TypeOrmConnector/test/{memoryDataSource.js → sqlite/memoryDataSource.js} +1 -1
- package/dist/core/Loopback/build-schema.js +1 -3
- package/dist/core/Loopback/json-to-schema.js +6 -6
- package/dist/core/Loopback/mapValues.d.ts +2 -0
- package/dist/core/Loopback/mapValues.js +835 -0
- package/dist/core/Loopback/query.js +6 -4
- package/dist/core/Loopback/type-resolver.d.ts +1 -1
- package/dist/core/Nestjs/applyDecorators.d.ts +1 -1
- package/dist/core/Nestjs/types/common.js +3 -1
- package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +1 -1
- package/dist/core/Nestjs/types/decorators/create-property.decorator.js +9 -4
- package/dist/core/Nestjs/types/decorators/field.decorator.d.ts +1 -1
- package/dist/core/Nestjs/types/decorators/field.decorator.js +6 -6
- package/dist/core/Nestjs/types/lazy-metadata.storage.js +3 -3
- package/dist/core/Nestjs/types/omit-type.js +6 -2
- package/dist/core/Nestjs/types/reflection.utils.d.ts +1 -1
- package/dist/core/Nestjs/types/reflection.utils.js +9 -2
- package/dist/core/Nestjs/types/type-metadata.storage.js +4 -4
- package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +1 -11
- package/dist/core/Nestjs/types/utils/mapped-types.utils.js +2 -2
- package/dist/decorators.d.ts +25 -21
- package/dist/decorators.js +76 -70
- package/dist/index.d.ts +6 -7
- package/dist/index.js +5 -7
- package/dist/loadRelations.js +108 -68
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +104 -60
- package/dist/types.js +20 -0
- package/package.json +11 -101
- package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.d.ts +0 -1
- package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.js +0 -52
- package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.d.ts +0 -1
- package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.js +0 -55
- package/dist/TypeOrmConnector/test/basic/goat.dto.d.ts +0 -8
- package/dist/TypeOrmConnector/test/basic/goat.dto.js +0 -18
- package/dist/TypeOrmConnector/test/relations/car/car.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/car/car.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/user/user.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/user/user.dto.js +0 -12
- package/dist/core/dtos/access.dto.d.ts +0 -4
- package/dist/core/dtos/access.dto.js +0 -21
- package/dist/core/dtos/pagination.dto.d.ts +0 -13
- package/dist/core/dtos/pagination.dto.js +0 -62
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
1
2
|
export declare class Breed {
|
|
2
3
|
family?: string;
|
|
3
4
|
members?: number;
|
|
@@ -8,3 +9,45 @@ export declare class GoatEntity {
|
|
|
8
9
|
age?: number;
|
|
9
10
|
breed?: Breed;
|
|
10
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.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
|
+
breed?: {
|
|
39
|
+
family: string;
|
|
40
|
+
members: number;
|
|
41
|
+
} | undefined;
|
|
42
|
+
name: string;
|
|
43
|
+
age: number;
|
|
44
|
+
}, {
|
|
45
|
+
id?: string | undefined;
|
|
46
|
+
breed?: {
|
|
47
|
+
family: string;
|
|
48
|
+
members: number;
|
|
49
|
+
} | undefined;
|
|
50
|
+
name: string;
|
|
51
|
+
age: number;
|
|
52
|
+
}>;
|
|
53
|
+
export declare type GoatInputSchema = z.infer<typeof GoatSchema>;
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GoatEntity = exports.Breed = void 0;
|
|
3
|
+
exports.GoatSchema = exports.BreedSchema = exports.GoatEntity = exports.Breed = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const types_1 = require("../../../core/types");
|
|
6
6
|
const decorators_1 = require("../../../decorators");
|
|
7
|
+
const zod_1 = require("zod");
|
|
7
8
|
let Breed = class Breed {
|
|
8
9
|
};
|
|
9
10
|
tslib_1.__decorate([
|
|
10
|
-
decorators_1.
|
|
11
|
+
decorators_1.f.property({ required: false }),
|
|
11
12
|
tslib_1.__metadata("design:type", String)
|
|
12
13
|
], Breed.prototype, "family", void 0);
|
|
13
14
|
tslib_1.__decorate([
|
|
14
|
-
decorators_1.
|
|
15
|
+
decorators_1.f.property({ required: false }),
|
|
15
16
|
tslib_1.__metadata("design:type", Number)
|
|
16
17
|
], Breed.prototype, "members", void 0);
|
|
17
18
|
Breed = tslib_1.__decorate([
|
|
@@ -21,22 +22,32 @@ exports.Breed = Breed;
|
|
|
21
22
|
let GoatEntity = class GoatEntity {
|
|
22
23
|
};
|
|
23
24
|
tslib_1.__decorate([
|
|
24
|
-
decorators_1.
|
|
25
|
+
decorators_1.f.id(),
|
|
25
26
|
tslib_1.__metadata("design:type", String)
|
|
26
27
|
], GoatEntity.prototype, "id", void 0);
|
|
27
28
|
tslib_1.__decorate([
|
|
28
|
-
decorators_1.
|
|
29
|
+
decorators_1.f.property({ required: true }),
|
|
29
30
|
tslib_1.__metadata("design:type", String)
|
|
30
31
|
], GoatEntity.prototype, "name", void 0);
|
|
31
32
|
tslib_1.__decorate([
|
|
32
|
-
decorators_1.
|
|
33
|
+
decorators_1.f.property({ required: false }),
|
|
33
34
|
tslib_1.__metadata("design:type", Number)
|
|
34
35
|
], GoatEntity.prototype, "age", void 0);
|
|
35
36
|
tslib_1.__decorate([
|
|
36
|
-
decorators_1.
|
|
37
|
+
decorators_1.f.embed(Breed),
|
|
37
38
|
tslib_1.__metadata("design:type", Breed)
|
|
38
39
|
], GoatEntity.prototype, "breed", void 0);
|
|
39
40
|
GoatEntity = tslib_1.__decorate([
|
|
40
|
-
decorators_1.
|
|
41
|
+
decorators_1.f.entity('goat')
|
|
41
42
|
], GoatEntity);
|
|
42
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(),
|
|
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;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { GoatEntity } from './goat.entity';
|
|
1
|
+
import { GoatEntity, GoatInputSchema } from './goat.entity';
|
|
3
2
|
import { TypeOrmConnector } from '../../TypeOrmConnector';
|
|
4
|
-
export declare class GoatRepository extends TypeOrmConnector<GoatEntity,
|
|
5
|
-
constructor(
|
|
3
|
+
export declare class GoatRepository extends TypeOrmConnector<GoatEntity, GoatInputSchema> {
|
|
4
|
+
constructor();
|
|
6
5
|
}
|
|
@@ -3,10 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.GoatRepository = void 0;
|
|
4
4
|
const goat_entity_1 = require("./goat.entity");
|
|
5
5
|
const TypeOrmConnector_1 = require("../../TypeOrmConnector");
|
|
6
|
-
const memoryDataSource_1 = require("../memoryDataSource");
|
|
6
|
+
const memoryDataSource_1 = require("../sqlite/memoryDataSource");
|
|
7
7
|
class GoatRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
8
|
-
constructor(
|
|
9
|
-
super(
|
|
8
|
+
constructor() {
|
|
9
|
+
super({
|
|
10
|
+
entity: goat_entity_1.GoatEntity,
|
|
11
|
+
dataSource: memoryDataSource_1.MemoryDataSource,
|
|
12
|
+
inputSchema: goat_entity_1.GoatSchema
|
|
13
|
+
});
|
|
10
14
|
}
|
|
11
15
|
}
|
|
12
16
|
exports.GoatRepository = GoatRepository;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { TypeORMDataModel } from
|
|
2
|
-
import { GoatEntity } from
|
|
3
|
-
import { CarsEntity } from
|
|
4
|
-
import { RoleEntity } from
|
|
5
|
-
import { RolesUser } from
|
|
6
|
-
export declare const dbEntities: (typeof
|
|
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,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,149 @@
|
|
|
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
|
+
'--default_authentication_plugin=mysql_native_password'
|
|
62
|
+
], {
|
|
63
|
+
stdio: options.debug ? 'inherit' : 'ignore'
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
exports.startDockerContainer = startDockerContainer;
|
|
67
|
+
async function waitForDatabaseToStart(options) {
|
|
68
|
+
await new Promise((resolve, reject) => {
|
|
69
|
+
let finished = false;
|
|
70
|
+
const timeout = setTimeout(() => {
|
|
71
|
+
finished = true;
|
|
72
|
+
reject(new Error(`Unable to connect to database after ${options.connectTimeoutSeconds} seconds.${options.enableDebugInstructions
|
|
73
|
+
? ` ${options.enableDebugInstructions}`
|
|
74
|
+
: ``}`));
|
|
75
|
+
}, options.connectTimeoutSeconds * 1000);
|
|
76
|
+
function test() {
|
|
77
|
+
console.log(`Waiting for ${options.containerName} on port ${options.externalPort}...`);
|
|
78
|
+
(options.testConnection
|
|
79
|
+
? options.testConnection({
|
|
80
|
+
...options,
|
|
81
|
+
testPortConnection: async () => await testConnection(options)
|
|
82
|
+
})
|
|
83
|
+
: testConnection(options)).then(isConnected => {
|
|
84
|
+
if (finished)
|
|
85
|
+
return;
|
|
86
|
+
if (isConnected) {
|
|
87
|
+
finished = true;
|
|
88
|
+
clearTimeout(timeout);
|
|
89
|
+
setTimeout(resolve, 1000);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
setTimeout(test, 500);
|
|
93
|
+
}
|
|
94
|
+
}, err => {
|
|
95
|
+
reject(err);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
test();
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
exports.waitForDatabaseToStart = waitForDatabaseToStart;
|
|
102
|
+
async function testConnection(options) {
|
|
103
|
+
return new Promise(resolve => {
|
|
104
|
+
const connection = (0, net_1.connect)(options.externalPort)
|
|
105
|
+
.on('error', () => {
|
|
106
|
+
resolve(false);
|
|
107
|
+
})
|
|
108
|
+
.on('connect', () => {
|
|
109
|
+
connection.end();
|
|
110
|
+
resolve(true);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async function killOldContainers(options) {
|
|
115
|
+
await (0, modern_spawn_1.spawnBuffered)('docker', ['kill', options.containerName], {
|
|
116
|
+
debug: options.debug
|
|
117
|
+
});
|
|
118
|
+
await (0, modern_spawn_1.spawnBuffered)('docker', ['rm', options.containerName], {
|
|
119
|
+
debug: options.debug
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
exports.killOldContainers = killOldContainers;
|
|
123
|
+
async function startContainer(options) {
|
|
124
|
+
if (isNaN(options.connectTimeoutSeconds)) {
|
|
125
|
+
throw new Error('connectTimeoutSeconds must be a valid integer.');
|
|
126
|
+
}
|
|
127
|
+
await Promise.all([pullDockerImage(options), killOldContainers(options)]);
|
|
128
|
+
const { defaultExternalPort, ...rawOptions } = options;
|
|
129
|
+
const externalPort = rawOptions.externalPort || (await (0, exports.detectPort)(defaultExternalPort));
|
|
130
|
+
if (typeof externalPort !== 'number') {
|
|
131
|
+
throw new Error('Expected external port to be a number');
|
|
132
|
+
}
|
|
133
|
+
const opts = {
|
|
134
|
+
detached: false,
|
|
135
|
+
...rawOptions,
|
|
136
|
+
externalPort
|
|
137
|
+
};
|
|
138
|
+
console.log('Starting Docker Container ' + opts.containerName);
|
|
139
|
+
const proc = startDockerContainer(opts);
|
|
140
|
+
await waitForDatabaseToStart(opts);
|
|
141
|
+
return {
|
|
142
|
+
proc,
|
|
143
|
+
externalPort,
|
|
144
|
+
async kill() {
|
|
145
|
+
await killOldContainers(options);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
exports.default = startContainer;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Options as WithContainerOptions } from './docker';
|
|
2
|
+
export interface Options extends Omit<WithContainerOptions, 'internalPort' | 'enableDebugInstructions' | 'testConnection'> {
|
|
3
|
+
mysqlUser: string;
|
|
4
|
+
mysqlPassword: string;
|
|
5
|
+
mysqlDb: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function waitForConnection(databaseURL: string, timeoutSeconds: number): Promise<void>;
|
|
8
|
+
export declare function killDatabase(options?: Partial<Options>): Promise<void>;
|
|
9
|
+
export default function getDatabase(options?: Partial<Options>): Promise<{
|
|
10
|
+
proc: any;
|
|
11
|
+
databaseURL: string;
|
|
12
|
+
kill: () => Promise<void>;
|
|
13
|
+
user: string;
|
|
14
|
+
password: string;
|
|
15
|
+
port: number;
|
|
16
|
+
dbName: string;
|
|
17
|
+
}>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.killDatabase = exports.waitForConnection = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const docker_1 = tslib_1.__importStar(require("./docker"));
|
|
6
|
+
const { createConnection } = require('mysql2');
|
|
7
|
+
const DEFAULT_IMAGE = 'mysql:8.0';
|
|
8
|
+
const DEFAULT_CONTAINER_NAME = 'fluent-mysql-test';
|
|
9
|
+
const DEFAULT_CONNECT_TIMEOUT_SECONDS = 10;
|
|
10
|
+
const DEFAULT_MYSQL_PORT = 3306;
|
|
11
|
+
const DEFAULT_MYSQL_USER = 'test-user';
|
|
12
|
+
const DEFAULT_MYSQL_PASSWORD = 'password';
|
|
13
|
+
const DEFAULT_MYSQL_DB = 'test-db';
|
|
14
|
+
const DEFAULT_MYSQL_DEBUG = false;
|
|
15
|
+
async function waitForConnection(databaseURL, timeoutSeconds) {
|
|
16
|
+
const start = Date.now();
|
|
17
|
+
const timeoutMilliseconds = timeoutSeconds * 1000;
|
|
18
|
+
let lastAttempt = false;
|
|
19
|
+
while (true) {
|
|
20
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
21
|
+
let conn;
|
|
22
|
+
try {
|
|
23
|
+
try {
|
|
24
|
+
await new Promise((resolve, reject) => {
|
|
25
|
+
let errored = false;
|
|
26
|
+
conn = createConnection(databaseURL);
|
|
27
|
+
const createConnectionErr = new Error();
|
|
28
|
+
conn.once('connect', () => {
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
31
|
+
conn.on('error', (err) => {
|
|
32
|
+
if (errored)
|
|
33
|
+
return;
|
|
34
|
+
errored = true;
|
|
35
|
+
createConnectionErr.message = err.message;
|
|
36
|
+
createConnectionErr.code = err.code;
|
|
37
|
+
createConnectionErr.errno = err.errno;
|
|
38
|
+
createConnectionErr.sqlState = err.sqlState;
|
|
39
|
+
reject(createConnectionErr);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
const result = await new Promise((resolve, reject) => {
|
|
43
|
+
const queryErr = new Error();
|
|
44
|
+
conn.query(`SELECT 1 + 1 AS foo;`, (err, result) => {
|
|
45
|
+
if (err) {
|
|
46
|
+
queryErr.message = err.message;
|
|
47
|
+
reject(queryErr);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
resolve(result);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
if (result && result[0] && result[0].foo === 2) {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
if (lastAttempt) {
|
|
59
|
+
throw new Error('Got unexpected result: ' + JSON.stringify(result));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (ex) {
|
|
64
|
+
if (lastAttempt) {
|
|
65
|
+
throw ex;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
conn.end(() => {
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (Date.now() - timeoutMilliseconds > start) {
|
|
74
|
+
lastAttempt = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.waitForConnection = waitForConnection;
|
|
79
|
+
async function killDatabase(options = {}) {
|
|
80
|
+
await (0, docker_1.killOldContainers)({
|
|
81
|
+
debug: DEFAULT_MYSQL_DEBUG,
|
|
82
|
+
containerName: DEFAULT_CONTAINER_NAME,
|
|
83
|
+
...options,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
exports.killDatabase = killDatabase;
|
|
87
|
+
async function getDatabase(options = {}) {
|
|
88
|
+
const { mysqlUser, mysqlPassword, mysqlDb, environment, ...rawOptions } = {
|
|
89
|
+
debug: DEFAULT_MYSQL_DEBUG,
|
|
90
|
+
image: DEFAULT_IMAGE,
|
|
91
|
+
containerName: DEFAULT_CONTAINER_NAME,
|
|
92
|
+
connectTimeoutSeconds: DEFAULT_CONNECT_TIMEOUT_SECONDS,
|
|
93
|
+
mysqlUser: DEFAULT_MYSQL_USER,
|
|
94
|
+
mysqlPassword: DEFAULT_MYSQL_PASSWORD,
|
|
95
|
+
mysqlDb: DEFAULT_MYSQL_DB,
|
|
96
|
+
defaultExternalPort: DEFAULT_MYSQL_PORT,
|
|
97
|
+
...options,
|
|
98
|
+
};
|
|
99
|
+
const { proc, externalPort, kill } = await (0, docker_1.default)({
|
|
100
|
+
...rawOptions,
|
|
101
|
+
internalPort: DEFAULT_MYSQL_PORT,
|
|
102
|
+
environment: {
|
|
103
|
+
MYSQL_ALLOW_EMPTY_PASSWORD: 'true',
|
|
104
|
+
MYSQL_HOST: '127.0.0.1',
|
|
105
|
+
MYSQL_ROOT_HOST: '%',
|
|
106
|
+
...environment,
|
|
107
|
+
MYSQL_USER: mysqlUser,
|
|
108
|
+
MYSQL_ROOT_PASSWORD: mysqlPassword,
|
|
109
|
+
MYSQL_PASSWORD: mysqlPassword,
|
|
110
|
+
MYSQL_DATABASE: mysqlDb,
|
|
111
|
+
},
|
|
112
|
+
enableDebugInstructions: `To view logs, run with MYSQL_TEST_DEBUG=true environment variable.`,
|
|
113
|
+
command: [
|
|
114
|
+
'--default_authentication_plugin=mysql_native_password',
|
|
115
|
+
'--character-set-server=utf8mb4',
|
|
116
|
+
'--collation-server=utf8mb4_unicode_ci'
|
|
117
|
+
],
|
|
118
|
+
cap_add: 'SYS_NICE'
|
|
119
|
+
});
|
|
120
|
+
const databaseURL = `mysql://${mysqlUser}:${mysqlPassword}@localhost:${externalPort}/${mysqlDb}`;
|
|
121
|
+
await waitForConnection(databaseURL, rawOptions.connectTimeoutSeconds);
|
|
122
|
+
return {
|
|
123
|
+
proc,
|
|
124
|
+
databaseURL,
|
|
125
|
+
kill,
|
|
126
|
+
user: mysqlUser,
|
|
127
|
+
password: mysqlPassword,
|
|
128
|
+
port: externalPort,
|
|
129
|
+
dbName: mysqlDb
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
exports.default = getDatabase;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TypeOrmConnector } from '../../TypeOrmConnector';
|
|
2
|
+
import { CarsEntity } from '../relations/car/car.entity';
|
|
3
|
+
import { CarsEntityInputSchema } from '../relations/car/car.schema';
|
|
4
|
+
import { UserRepository } from './user.mongo.repository';
|
|
5
|
+
export declare class CarsRepository extends TypeOrmConnector<CarsEntity, CarsEntityInputSchema> {
|
|
6
|
+
constructor();
|
|
7
|
+
user: () => UserRepository;
|
|
8
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CarsRepository = void 0;
|
|
4
|
+
const TypeOrmConnector_1 = require("../../TypeOrmConnector");
|
|
5
|
+
const car_entity_1 = require("../relations/car/car.entity");
|
|
6
|
+
const car_schema_1 = require("../relations/car/car.schema");
|
|
7
|
+
const user_entity_1 = require("../relations/user/user.entity");
|
|
8
|
+
const mongoDatasource_1 = require("./mongoDatasource");
|
|
9
|
+
const user_mongo_repository_1 = require("./user.mongo.repository");
|
|
10
|
+
class CarsRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
11
|
+
constructor() {
|
|
12
|
+
super({
|
|
13
|
+
entity: car_entity_1.CarsEntity,
|
|
14
|
+
dataSource: mongoDatasource_1.MongoDataSource,
|
|
15
|
+
inputSchema: car_schema_1.CarsEntitySchema
|
|
16
|
+
});
|
|
17
|
+
this.user = () => this.belongsTo({
|
|
18
|
+
repository: user_mongo_repository_1.UserRepository,
|
|
19
|
+
model: user_entity_1.UsersEntity
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.CarsRepository = CarsRepository;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mongoMemory = void 0;
|
|
4
|
+
const mongodb_memory_server_1 = require("mongodb-memory-server");
|
|
5
|
+
const mongoose_1 = require("mongoose");
|
|
6
|
+
exports.mongoMemory = (() => {
|
|
7
|
+
const createExampleSchema = (url) => {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
const db = (0, mongoose_1.createConnection)(url);
|
|
10
|
+
const testSchema = new mongoose_1.Schema({
|
|
11
|
+
age: Number,
|
|
12
|
+
name: String
|
|
13
|
+
});
|
|
14
|
+
const Test = db.model('test', testSchema);
|
|
15
|
+
const test = new Test({ name: 'Nacho', age: 31 });
|
|
16
|
+
db.once('connected', (err) => {
|
|
17
|
+
if (err) {
|
|
18
|
+
return console.error(err);
|
|
19
|
+
}
|
|
20
|
+
Test.create(test, (error, doc) => {
|
|
21
|
+
if (err) {
|
|
22
|
+
return console.error(error);
|
|
23
|
+
}
|
|
24
|
+
resolve(doc);
|
|
25
|
+
return;
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const start = async () => {
|
|
31
|
+
const mongoServer = await mongodb_memory_server_1.MongoMemoryServer.create({
|
|
32
|
+
instance: {
|
|
33
|
+
storageEngine: 'wiredTiger'
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const url = mongoServer.getUri();
|
|
37
|
+
await createExampleSchema(url);
|
|
38
|
+
return mongoServer;
|
|
39
|
+
};
|
|
40
|
+
return Object.freeze({
|
|
41
|
+
start
|
|
42
|
+
});
|
|
43
|
+
})();
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MongoDataSource = void 0;
|
|
4
|
+
const typeorm_1 = require("typeorm");
|
|
5
|
+
const dbEntities_1 = require("../dbEntities");
|
|
6
|
+
exports.MongoDataSource = new typeorm_1.DataSource({
|
|
7
|
+
type: 'mongodb',
|
|
8
|
+
useNewUrlParser: true,
|
|
9
|
+
useUnifiedTopology: true,
|
|
10
|
+
entities: dbEntities_1.dbEntities,
|
|
11
|
+
logging: false
|
|
12
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TypeOrmConnector } from '../../TypeOrmConnector';
|
|
2
|
+
import { RoleEntityInputSchema } from '../relations/roles/role.schema';
|
|
3
|
+
import { RoleEntity } from '../relations/roles/roles.entity';
|
|
4
|
+
import { UserRepository } from './user.mongo.repository';
|
|
5
|
+
export declare class RoleRepository extends TypeOrmConnector<RoleEntity, RoleEntityInputSchema> {
|
|
6
|
+
constructor();
|
|
7
|
+
users: () => UserRepository;
|
|
8
|
+
}
|