@goatlab/fluent 0.6.6 → 0.6.9
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 +79 -0
- package/dist/BaseConnector.js +361 -0
- package/dist/Fluent.d.ts +26 -0
- package/dist/Fluent.js +52 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +2 -2
- package/dist/TypeOrmConnector/TypeOrmConnector.js +511 -0
- package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.js +52 -0
- package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.js +55 -0
- package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.d.ts +1 -0
- package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.js +114 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +16 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +57 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.js +11 -0
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.d.ts +1 -0
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +45 -0
- package/dist/TypeOrmConnector/test/basic/goat.dto.d.ts +8 -0
- package/dist/TypeOrmConnector/test/basic/goat.dto.js +18 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +10 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +42 -0
- package/dist/TypeOrmConnector/test/basic/goat.repository.js +11 -0
- package/dist/TypeOrmConnector/test/flock.d.ts +4 -0
- package/dist/TypeOrmConnector/test/flock.js +25 -0
- package/dist/TypeOrmConnector/test/relations/car/car.dto.d.ts +5 -0
- package/dist/TypeOrmConnector/test/relations/car/car.dto.js +12 -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.repositoryTypeOrm.js +13 -0
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -0
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +93 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.d.ts +5 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.js +12 -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.js +14 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.d.ts +5 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.js +12 -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_users.repositoryTypeOrm.js +11 -0
- package/dist/TypeOrmConnector/test/relations/user/user.dto.d.ts +5 -0
- package/dist/TypeOrmConnector/test/relations/user/user.dto.js +12 -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.js +16 -0
- package/dist/core/Loopback/build-schema.d.ts +31 -0
- package/dist/core/Loopback/build-schema.js +335 -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/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 +290 -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 +35 -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 +50 -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 +30 -0
- package/dist/core/Nestjs/types/reflection.utils.d.ts +15 -0
- package/dist/core/Nestjs/types/reflection.utils.js +58 -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 +13 -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/database/createConnection.d.ts +30 -0
- package/dist/core/database/createConnection.js +43 -0
- package/dist/core/database/decorators.d.ts +43 -0
- package/dist/core/database/decorators.js +98 -0
- package/dist/core/dtos/access.dto.d.ts +4 -0
- package/dist/core/dtos/access.dto.js +21 -0
- package/dist/core/types.d.ts +23 -0
- package/dist/core/types.js +29 -0
- package/dist/generatorDatasource.d.ts +2 -0
- package/dist/generatorDatasource.js +12 -0
- package/dist/loadRelations.js +92 -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 +85 -0
- package/dist/types.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RolesUser = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const decorators_1 = require("../../../../core/database/decorators");
|
|
6
|
+
let RolesUser = class RolesUser {
|
|
7
|
+
};
|
|
8
|
+
tslib_1.__decorate([
|
|
9
|
+
decorators_1.Decorators.id(),
|
|
10
|
+
tslib_1.__metadata("design:type", String)
|
|
11
|
+
], RolesUser.prototype, "id", void 0);
|
|
12
|
+
tslib_1.__decorate([
|
|
13
|
+
decorators_1.Decorators.property({ required: false }),
|
|
14
|
+
tslib_1.__metadata("design:type", String)
|
|
15
|
+
], RolesUser.prototype, "userId", void 0);
|
|
16
|
+
tslib_1.__decorate([
|
|
17
|
+
decorators_1.Decorators.property({ required: false }),
|
|
18
|
+
tslib_1.__metadata("design:type", String)
|
|
19
|
+
], RolesUser.prototype, "roleId", void 0);
|
|
20
|
+
RolesUser = tslib_1.__decorate([
|
|
21
|
+
decorators_1.Decorators.entity('roles_users')
|
|
22
|
+
], RolesUser);
|
|
23
|
+
exports.RolesUser = RolesUser;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RoleUsersRepository = void 0;
|
|
4
|
+
const roles_user_entity_1 = require("./roles_user.entity");
|
|
5
|
+
const TypeOrmConnector_1 = require("../../../TypeOrmConnector");
|
|
6
|
+
class RoleUsersRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
7
|
+
constructor(relations) {
|
|
8
|
+
super(roles_user_entity_1.RolesUser, relations, 'runningTest');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.RoleUsersRepository = RoleUsersRepository;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UsersEntityIn = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const types_1 = require("../../../../core/types");
|
|
6
|
+
const user_entity_1 = require("./user.entity");
|
|
7
|
+
let UsersEntityIn = class UsersEntityIn extends (0, types_1.OmitType)(user_entity_1.UsersEntity, ['id']) {
|
|
8
|
+
};
|
|
9
|
+
UsersEntityIn = tslib_1.__decorate([
|
|
10
|
+
(0, types_1.InputType)()
|
|
11
|
+
], UsersEntityIn);
|
|
12
|
+
exports.UsersEntityIn = UsersEntityIn;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CarsEntity } from '../car/car.entity';
|
|
2
|
+
import { RoleEntity } from '../roles/roles.entity';
|
|
3
|
+
export declare class Family {
|
|
4
|
+
family?: string;
|
|
5
|
+
members?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class UsersEntity {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
age?: number;
|
|
11
|
+
breed?: Family;
|
|
12
|
+
cars?: CarsEntity[];
|
|
13
|
+
roles?: RoleEntity[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UsersEntity = exports.Family = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const car_entity_1 = require("../car/car.entity");
|
|
6
|
+
const decorators_1 = require("../../../../core/database/decorators");
|
|
7
|
+
const roles_entity_1 = require("../roles/roles.entity");
|
|
8
|
+
class Family {
|
|
9
|
+
}
|
|
10
|
+
tslib_1.__decorate([
|
|
11
|
+
decorators_1.Decorators.property({ required: false }),
|
|
12
|
+
tslib_1.__metadata("design:type", String)
|
|
13
|
+
], Family.prototype, "family", void 0);
|
|
14
|
+
tslib_1.__decorate([
|
|
15
|
+
decorators_1.Decorators.property({ required: false }),
|
|
16
|
+
tslib_1.__metadata("design:type", Number)
|
|
17
|
+
], Family.prototype, "members", void 0);
|
|
18
|
+
exports.Family = Family;
|
|
19
|
+
let UsersEntity = class UsersEntity {
|
|
20
|
+
};
|
|
21
|
+
tslib_1.__decorate([
|
|
22
|
+
decorators_1.Decorators.id(),
|
|
23
|
+
tslib_1.__metadata("design:type", String)
|
|
24
|
+
], UsersEntity.prototype, "id", void 0);
|
|
25
|
+
tslib_1.__decorate([
|
|
26
|
+
decorators_1.Decorators.property({ required: true }),
|
|
27
|
+
tslib_1.__metadata("design:type", String)
|
|
28
|
+
], UsersEntity.prototype, "name", void 0);
|
|
29
|
+
tslib_1.__decorate([
|
|
30
|
+
decorators_1.Decorators.property({ required: false }),
|
|
31
|
+
tslib_1.__metadata("design:type", Number)
|
|
32
|
+
], UsersEntity.prototype, "age", void 0);
|
|
33
|
+
tslib_1.__decorate([
|
|
34
|
+
decorators_1.Decorators.embed(Family),
|
|
35
|
+
tslib_1.__metadata("design:type", Family)
|
|
36
|
+
], UsersEntity.prototype, "breed", void 0);
|
|
37
|
+
tslib_1.__decorate([
|
|
38
|
+
decorators_1.Decorators.hasMany({
|
|
39
|
+
entity: () => car_entity_1.CarsEntity,
|
|
40
|
+
inverse: cars => cars.userId
|
|
41
|
+
}),
|
|
42
|
+
tslib_1.__metadata("design:type", Array)
|
|
43
|
+
], UsersEntity.prototype, "cars", void 0);
|
|
44
|
+
tslib_1.__decorate([
|
|
45
|
+
decorators_1.Decorators.belongsToMany({
|
|
46
|
+
entity: () => roles_entity_1.RoleEntity,
|
|
47
|
+
joinTableName: 'roles_users',
|
|
48
|
+
foreignKey: 'userId',
|
|
49
|
+
inverseForeignKey: 'roleId'
|
|
50
|
+
}),
|
|
51
|
+
tslib_1.__metadata("design:type", Array)
|
|
52
|
+
], UsersEntity.prototype, "roles", void 0);
|
|
53
|
+
UsersEntity = tslib_1.__decorate([
|
|
54
|
+
decorators_1.Decorators.entity('users')
|
|
55
|
+
], UsersEntity);
|
|
56
|
+
exports.UsersEntity = UsersEntity;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserRepository = void 0;
|
|
4
|
+
const car_repositoryTypeOrm_1 = require("../car/car.repositoryTypeOrm");
|
|
5
|
+
const roles_repositoryTypeOrm_1 = require("../roles/roles.repositoryTypeOrm");
|
|
6
|
+
const roles_users_repositoryTypeOrm_1 = require("../roles/roles_users.repositoryTypeOrm");
|
|
7
|
+
const TypeOrmConnector_1 = require("../../../TypeOrmConnector");
|
|
8
|
+
const user_entity_1 = require("./user.entity");
|
|
9
|
+
class UserRepository extends TypeOrmConnector_1.TypeOrmConnector {
|
|
10
|
+
constructor(relations) {
|
|
11
|
+
super(user_entity_1.UsersEntity, relations, 'runningTest');
|
|
12
|
+
this.cars = () => this.hasMany(car_repositoryTypeOrm_1.CarsRepository, 'cars');
|
|
13
|
+
this.roles = () => this.belongsToMany(roles_repositoryTypeOrm_1.RoleRepository, roles_users_repositoryTypeOrm_1.RoleUsersRepository, 'roles');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.UserRepository = UserRepository;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MetadataAccessor } from '@loopback/metadata';
|
|
2
|
+
import { SchemaObject as JsonSchema } from 'openapi3-ts';
|
|
3
|
+
import { RelationMetadata } from './relation.types';
|
|
4
|
+
import { PropertyDefinition, PropertyType } from './model';
|
|
5
|
+
export declare const JSON_SCHEMA_KEY: MetadataAccessor<{
|
|
6
|
+
[key: string]: JsonSchema;
|
|
7
|
+
}, ClassDecorator>;
|
|
8
|
+
export interface JsonSchemaOptions<T extends object> {
|
|
9
|
+
title?: string;
|
|
10
|
+
includeRelations?: boolean;
|
|
11
|
+
partial?: boolean | 'deep';
|
|
12
|
+
exclude?: (keyof T)[];
|
|
13
|
+
optional?: (keyof T)[];
|
|
14
|
+
visited?: {
|
|
15
|
+
[key: string]: JsonSchema;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare function buildModelCacheKey<T extends object>(options?: JsonSchemaOptions<T>): string;
|
|
19
|
+
export declare function getJsonSchema<T extends object>(ctor: Function & {
|
|
20
|
+
prototype: T;
|
|
21
|
+
}, options?: JsonSchemaOptions<T>): JsonSchema;
|
|
22
|
+
export declare function getJsonSchemaRef<T extends object>(modelCtor: Function & {
|
|
23
|
+
prototype: T;
|
|
24
|
+
}, options?: JsonSchemaOptions<T>): JsonSchema;
|
|
25
|
+
export declare function stringTypeToWrapper(type: string | Function): Function;
|
|
26
|
+
export declare function isArrayType(type: string | Function | PropertyType): boolean;
|
|
27
|
+
export declare function metaToJsonProperty(meta: PropertyDefinition): JsonSchema;
|
|
28
|
+
export declare function getNavigationalPropertyForRelation(relMeta: RelationMetadata, targetRef: JsonSchema): JsonSchema;
|
|
29
|
+
export declare function modelToJsonSchema<T extends object>(ctor: Function & {
|
|
30
|
+
prototype: T;
|
|
31
|
+
}, jsonSchemaOptions?: JsonSchemaOptions<T>): JsonSchema;
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.modelToJsonSchema = exports.getNavigationalPropertyForRelation = exports.metaToJsonProperty = exports.isArrayType = exports.stringTypeToWrapper = exports.getJsonSchemaRef = exports.getJsonSchema = exports.buildModelCacheKey = exports.JSON_SCHEMA_KEY = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const metadata_1 = require("@loopback/metadata");
|
|
6
|
+
const debug_1 = tslib_1.__importDefault(require("debug"));
|
|
7
|
+
const util_1 = require("util");
|
|
8
|
+
const type_resolver_1 = require("./type-resolver");
|
|
9
|
+
const metadata_2 = require("./metadata");
|
|
10
|
+
exports.JSON_SCHEMA_KEY = metadata_1.MetadataAccessor.create('loopback:json-schema');
|
|
11
|
+
const debug = (0, debug_1.default)('loopback:repository-json-schema:build-schema');
|
|
12
|
+
function buildModelCacheKey(options = {}) {
|
|
13
|
+
if (Object.keys(options).length === 0) {
|
|
14
|
+
return 'modelOnly';
|
|
15
|
+
}
|
|
16
|
+
return `model${options.title ?? ''}${getTitleSuffix(options)}`;
|
|
17
|
+
}
|
|
18
|
+
exports.buildModelCacheKey = buildModelCacheKey;
|
|
19
|
+
function getJsonSchema(ctor, options) {
|
|
20
|
+
const cached = metadata_1.MetadataInspector.getClassMetadata(exports.JSON_SCHEMA_KEY, ctor, {
|
|
21
|
+
ownMetadataOnly: true
|
|
22
|
+
});
|
|
23
|
+
const key = buildModelCacheKey(options);
|
|
24
|
+
let schema = cached?.[key];
|
|
25
|
+
if (!schema) {
|
|
26
|
+
schema = modelToJsonSchema(ctor, options);
|
|
27
|
+
if (cached) {
|
|
28
|
+
cached[key] = schema;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
metadata_1.MetadataInspector.defineMetadata(exports.JSON_SCHEMA_KEY.key, { [key]: schema }, ctor);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return schema;
|
|
35
|
+
}
|
|
36
|
+
exports.getJsonSchema = getJsonSchema;
|
|
37
|
+
function getJsonSchemaRef(modelCtor, options) {
|
|
38
|
+
const schemaWithDefinitions = getJsonSchema(modelCtor, options);
|
|
39
|
+
const key = schemaWithDefinitions.title;
|
|
40
|
+
if (!key)
|
|
41
|
+
return schemaWithDefinitions;
|
|
42
|
+
const definitions = { ...schemaWithDefinitions.definitions };
|
|
43
|
+
const schema = { ...schemaWithDefinitions };
|
|
44
|
+
delete schema.definitions;
|
|
45
|
+
definitions[key] = schema;
|
|
46
|
+
return {
|
|
47
|
+
$ref: `#/definitions/${key}`,
|
|
48
|
+
definitions
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
exports.getJsonSchemaRef = getJsonSchemaRef;
|
|
52
|
+
function stringTypeToWrapper(type) {
|
|
53
|
+
if (typeof type === 'function') {
|
|
54
|
+
return type;
|
|
55
|
+
}
|
|
56
|
+
type = type.toLowerCase();
|
|
57
|
+
let wrapper;
|
|
58
|
+
switch (type) {
|
|
59
|
+
case 'number': {
|
|
60
|
+
wrapper = Number;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case 'string': {
|
|
64
|
+
wrapper = String;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case 'boolean': {
|
|
68
|
+
wrapper = Boolean;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'array': {
|
|
72
|
+
wrapper = Array;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case 'object':
|
|
76
|
+
case 'any': {
|
|
77
|
+
wrapper = Object;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
case 'date': {
|
|
81
|
+
wrapper = Date;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case 'buffer': {
|
|
85
|
+
wrapper = Buffer;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case 'null': {
|
|
89
|
+
wrapper = type_resolver_1.Null;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
default: {
|
|
93
|
+
throw new Error(`Unsupported type: ${type}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return wrapper;
|
|
97
|
+
}
|
|
98
|
+
exports.stringTypeToWrapper = stringTypeToWrapper;
|
|
99
|
+
function isArrayType(type) {
|
|
100
|
+
return type === Array || type === 'array';
|
|
101
|
+
}
|
|
102
|
+
exports.isArrayType = isArrayType;
|
|
103
|
+
function metaToJsonProperty(meta) {
|
|
104
|
+
const propDef = {};
|
|
105
|
+
let result;
|
|
106
|
+
let propertyType = meta.type;
|
|
107
|
+
if (isArrayType(propertyType) && meta.itemType) {
|
|
108
|
+
if (isArrayType(meta.itemType) && !meta.jsonSchema) {
|
|
109
|
+
throw new Error('You must provide the "jsonSchema" field when define ' +
|
|
110
|
+
'a nested array property');
|
|
111
|
+
}
|
|
112
|
+
result = { type: 'array', items: propDef };
|
|
113
|
+
propertyType = meta.itemType;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
result = propDef;
|
|
117
|
+
}
|
|
118
|
+
const wrappedType = stringTypeToWrapper(propertyType);
|
|
119
|
+
const resolvedType = (0, type_resolver_1.resolveType)(wrappedType);
|
|
120
|
+
if (resolvedType === Date) {
|
|
121
|
+
Object.assign(propDef, {
|
|
122
|
+
type: 'string',
|
|
123
|
+
format: 'date-time'
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else if (propertyType === 'any') {
|
|
127
|
+
}
|
|
128
|
+
else if ((0, type_resolver_1.isBuiltinType)(resolvedType)) {
|
|
129
|
+
Object.assign(propDef, {
|
|
130
|
+
type: resolvedType.name.toLowerCase()
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
Object.assign(propDef, { $ref: `#/definitions/${resolvedType.name}` });
|
|
135
|
+
}
|
|
136
|
+
if (meta.description) {
|
|
137
|
+
Object.assign(propDef, {
|
|
138
|
+
description: meta.description
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
if (meta.jsonSchema) {
|
|
142
|
+
Object.assign(propDef, meta.jsonSchema);
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
exports.metaToJsonProperty = metaToJsonProperty;
|
|
147
|
+
function getNavigationalPropertyForRelation(relMeta, targetRef) {
|
|
148
|
+
if (relMeta.targetsMany === true) {
|
|
149
|
+
return {
|
|
150
|
+
type: 'array',
|
|
151
|
+
items: targetRef
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if (relMeta.targetsMany === false) {
|
|
155
|
+
return targetRef;
|
|
156
|
+
}
|
|
157
|
+
throw new Error(`targetsMany attribute missing for ${relMeta.name}`);
|
|
158
|
+
}
|
|
159
|
+
exports.getNavigationalPropertyForRelation = getNavigationalPropertyForRelation;
|
|
160
|
+
function buildSchemaTitle(ctor, meta, options) {
|
|
161
|
+
if (options.title)
|
|
162
|
+
return options.title;
|
|
163
|
+
const title = meta.title || ctor.name;
|
|
164
|
+
return title + getTitleSuffix(options);
|
|
165
|
+
}
|
|
166
|
+
function getTitleSuffix(options = {}) {
|
|
167
|
+
let suffix = '';
|
|
168
|
+
if (options.optional?.length) {
|
|
169
|
+
suffix += `Optional_${options.optional.join('-')}_`;
|
|
170
|
+
}
|
|
171
|
+
else if (options.partial) {
|
|
172
|
+
suffix += 'Partial';
|
|
173
|
+
}
|
|
174
|
+
if (options.exclude?.length) {
|
|
175
|
+
suffix += `Excluding_${options.exclude.join('-')}_`;
|
|
176
|
+
}
|
|
177
|
+
if (options.includeRelations) {
|
|
178
|
+
suffix += 'WithRelations';
|
|
179
|
+
}
|
|
180
|
+
return suffix;
|
|
181
|
+
}
|
|
182
|
+
function stringifyOptions(modelSettings = {}) {
|
|
183
|
+
return (0, util_1.inspect)(modelSettings, {
|
|
184
|
+
depth: Infinity,
|
|
185
|
+
maxArrayLength: Infinity,
|
|
186
|
+
breakLength: Infinity
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function isEmptyJson(obj) {
|
|
190
|
+
return !(obj && Object.keys(obj).length);
|
|
191
|
+
}
|
|
192
|
+
function getDescriptionSuffix(typeName, rawOptions = {}) {
|
|
193
|
+
const options = { ...rawOptions };
|
|
194
|
+
delete options.visited;
|
|
195
|
+
if (options.optional && !options.optional.length) {
|
|
196
|
+
delete options.optional;
|
|
197
|
+
}
|
|
198
|
+
const type = typeName;
|
|
199
|
+
let tsType = type;
|
|
200
|
+
if (options.includeRelations) {
|
|
201
|
+
tsType = `${type}WithRelations`;
|
|
202
|
+
}
|
|
203
|
+
if (options.partial) {
|
|
204
|
+
tsType = `Partial<${tsType}>`;
|
|
205
|
+
}
|
|
206
|
+
if (options.exclude) {
|
|
207
|
+
const excludedProps = options.exclude.map(p => `'${p}'`);
|
|
208
|
+
tsType = `Omit<${tsType}, ${excludedProps.join(' | ')}>`;
|
|
209
|
+
}
|
|
210
|
+
if (options.optional) {
|
|
211
|
+
const optionalProps = options.optional.map(p => `'${p}'`);
|
|
212
|
+
tsType = `@loopback/repository-json-schema#Optional<${tsType}, ${optionalProps.join(' | ')}>`;
|
|
213
|
+
}
|
|
214
|
+
return !isEmptyJson(options)
|
|
215
|
+
? `(tsType: ${tsType}, schemaOptions: ${stringifyOptions(options)})`
|
|
216
|
+
: '';
|
|
217
|
+
}
|
|
218
|
+
function modelToJsonSchema(ctor, jsonSchemaOptions = {}) {
|
|
219
|
+
const options = { ...jsonSchemaOptions };
|
|
220
|
+
options.visited = options.visited ?? {};
|
|
221
|
+
options.optional = options.optional ?? [];
|
|
222
|
+
const partial = options.partial && !options.optional.length;
|
|
223
|
+
if (options.partial && !partial) {
|
|
224
|
+
debug('Overriding "partial" option with "optional" option');
|
|
225
|
+
delete options.partial;
|
|
226
|
+
}
|
|
227
|
+
debug('Creating schema for model %s', ctor.name);
|
|
228
|
+
debug('JSON schema options: %o', options);
|
|
229
|
+
const modelDef = metadata_2.ModelMetadataHelper.getModelMetadata(ctor);
|
|
230
|
+
if (modelDef == null || Object.keys(modelDef).length === 0) {
|
|
231
|
+
return {};
|
|
232
|
+
}
|
|
233
|
+
const meta = modelDef;
|
|
234
|
+
debug('Model settings', meta.settings);
|
|
235
|
+
const title = buildSchemaTitle(ctor, meta, options);
|
|
236
|
+
if (options.visited[title])
|
|
237
|
+
return options.visited[title];
|
|
238
|
+
const result = { title };
|
|
239
|
+
options.visited[title] = result;
|
|
240
|
+
result.type = 'object';
|
|
241
|
+
const descriptionSuffix = getDescriptionSuffix(ctor.name, options);
|
|
242
|
+
if (meta.description) {
|
|
243
|
+
const formatSuffix = descriptionSuffix ? ` ${descriptionSuffix}` : '';
|
|
244
|
+
result.description = meta.description + formatSuffix;
|
|
245
|
+
}
|
|
246
|
+
else if (descriptionSuffix) {
|
|
247
|
+
result.description = descriptionSuffix;
|
|
248
|
+
}
|
|
249
|
+
for (const p in meta.properties) {
|
|
250
|
+
if (options.exclude?.includes(p)) {
|
|
251
|
+
debug('Property % is excluded by %s', p, options.exclude);
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (meta.properties[p].type == null) {
|
|
255
|
+
throw new Error(`Property ${ctor.name}.${p} does not have "type" in its definition`);
|
|
256
|
+
}
|
|
257
|
+
result.properties = result.properties ?? {};
|
|
258
|
+
result.properties[p] = result.properties[p] || {};
|
|
259
|
+
const metaProperty = { ...meta.properties[p] };
|
|
260
|
+
result.properties[p] = metaToJsonProperty(metaProperty);
|
|
261
|
+
const optional = options.optional.includes(p);
|
|
262
|
+
if (metaProperty.required && !(partial || optional)) {
|
|
263
|
+
result.required = result.required ?? [];
|
|
264
|
+
result.required.push(p);
|
|
265
|
+
}
|
|
266
|
+
const resolvedType = (0, type_resolver_1.resolveType)(metaProperty.type);
|
|
267
|
+
const referenceType = isArrayType(resolvedType)
|
|
268
|
+
?
|
|
269
|
+
(0, type_resolver_1.resolveType)(metaProperty.itemType)
|
|
270
|
+
: resolvedType;
|
|
271
|
+
if (typeof referenceType !== 'function' || (0, type_resolver_1.isBuiltinType)(referenceType)) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const propOptions = { ...options };
|
|
275
|
+
if (propOptions.partial !== 'deep') {
|
|
276
|
+
delete propOptions.partial;
|
|
277
|
+
}
|
|
278
|
+
if (propOptions.includeRelations === true) {
|
|
279
|
+
delete propOptions.includeRelations;
|
|
280
|
+
}
|
|
281
|
+
delete propOptions.title;
|
|
282
|
+
const propSchema = getJsonSchema(referenceType, propOptions);
|
|
283
|
+
if (typeof result.properties[p] !== 'boolean') {
|
|
284
|
+
const prop = result.properties[p];
|
|
285
|
+
const propTitle = propSchema.title ?? referenceType.name;
|
|
286
|
+
const targetRef = { $ref: `#/definitions/${propTitle}` };
|
|
287
|
+
if (prop.type === 'array' && prop.items) {
|
|
288
|
+
prop.items = targetRef;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
result.properties[p] = targetRef;
|
|
292
|
+
}
|
|
293
|
+
includeReferencedSchema(propTitle, propSchema);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
result.additionalProperties = meta.settings.strict === false;
|
|
297
|
+
debug(' additionalProperties?', result.additionalProperties);
|
|
298
|
+
if (options.includeRelations) {
|
|
299
|
+
for (const r in meta.relations) {
|
|
300
|
+
result.properties = result.properties ?? {};
|
|
301
|
+
const relMeta = meta.relations[r];
|
|
302
|
+
const targetType = (0, type_resolver_1.resolveType)(relMeta.target);
|
|
303
|
+
const targetOptions = { ...options };
|
|
304
|
+
delete targetOptions.title;
|
|
305
|
+
const targetSchema = getJsonSchema(targetType, targetOptions);
|
|
306
|
+
const targetRef = { $ref: `#/definitions/${targetSchema.title}` };
|
|
307
|
+
const propDef = getNavigationalPropertyForRelation(relMeta, targetRef);
|
|
308
|
+
result.properties[relMeta.name] =
|
|
309
|
+
result.properties[relMeta.name] || propDef;
|
|
310
|
+
includeReferencedSchema(targetSchema.title, targetSchema);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function includeReferencedSchema(name, schema) {
|
|
314
|
+
if (!schema || !Object.keys(schema).length)
|
|
315
|
+
return;
|
|
316
|
+
if (result !== schema?.definitions) {
|
|
317
|
+
for (const key in schema.definitions) {
|
|
318
|
+
if (key === title)
|
|
319
|
+
continue;
|
|
320
|
+
result.definitions = result.definitions ?? {};
|
|
321
|
+
result.definitions[key] = schema.definitions[key];
|
|
322
|
+
}
|
|
323
|
+
delete schema.definitions;
|
|
324
|
+
}
|
|
325
|
+
if (result !== schema) {
|
|
326
|
+
result.definitions = result.definitions ?? {};
|
|
327
|
+
result.definitions[name] = schema;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (meta.jsonSchema) {
|
|
331
|
+
Object.assign(result, meta.jsonSchema);
|
|
332
|
+
}
|
|
333
|
+
return result;
|
|
334
|
+
}
|
|
335
|
+
exports.modelToJsonSchema = modelToJsonSchema;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface Class<T> {
|
|
2
|
+
new (...args: any[]): T;
|
|
3
|
+
[property: string]: any;
|
|
4
|
+
}
|
|
5
|
+
export interface ConstructorFunction<T> {
|
|
6
|
+
(...args: any[]): T;
|
|
7
|
+
}
|
|
8
|
+
export declare type Constructor<T> = Class<T> | ConstructorFunction<T>;
|
|
9
|
+
export interface AnyObject {
|
|
10
|
+
[property: string]: any;
|
|
11
|
+
}
|
|
12
|
+
export declare type DeepPartial<T> = Partial<T> | {
|
|
13
|
+
[P in keyof T]?: DeepPartial<T[P]>;
|
|
14
|
+
};
|
|
15
|
+
export declare type DataObject<T extends object> = T | DeepPartial<T>;
|
|
16
|
+
export declare type Options = AnyObject;
|
|
17
|
+
export declare type Callback<T> = (err: Error | string | null | undefined, result?: T) => void;
|
|
18
|
+
export declare type Command = string | AnyObject;
|
|
19
|
+
export declare type NamedParameters = AnyObject;
|
|
20
|
+
export declare type PositionalParameters = any[];
|
|
21
|
+
export interface Count {
|
|
22
|
+
count: number;
|
|
23
|
+
}
|
|
24
|
+
export declare const CountSchema: {
|
|
25
|
+
type: "object";
|
|
26
|
+
title: string;
|
|
27
|
+
'x-typescript-type': string;
|
|
28
|
+
properties: {
|
|
29
|
+
count: {
|
|
30
|
+
type: "number";
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export declare type PrototypeOf<Ctor extends Function> = Ctor extends {
|
|
35
|
+
prototype: infer Proto;
|
|
36
|
+
} ? Proto : never;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CountSchema = void 0;
|
|
4
|
+
exports.CountSchema = {
|
|
5
|
+
type: 'object',
|
|
6
|
+
title: 'loopback.Count',
|
|
7
|
+
'x-typescript-type': '@loopback/repository#Count',
|
|
8
|
+
properties: {
|
|
9
|
+
count: {
|
|
10
|
+
type: 'number'
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ReferenceObject, SchemaObject, SchemasObject } from 'openapi3-ts';
|
|
2
|
+
export declare type SchemaRef = ReferenceObject & {
|
|
3
|
+
definitions: SchemasObject;
|
|
4
|
+
};
|
|
5
|
+
export declare function jsonToSchemaObject(json: SchemaObject, visited?: Map<SchemaObject, SchemaObject | SchemaRef>): SchemaObject | SchemaRef;
|
|
6
|
+
export declare function jsonOrBooleanToJSON(jsonOrBool: boolean | SchemaObject): SchemaObject;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.jsonOrBooleanToJSON = exports.jsonToSchemaObject = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
6
|
+
const openapi3_ts_1 = require("openapi3-ts");
|
|
7
|
+
function jsonToSchemaObject(json, visited = new Map()) {
|
|
8
|
+
const converted = 'x-loopback-converted';
|
|
9
|
+
const schema = visited.get(json);
|
|
10
|
+
if (schema != null && (0, openapi3_ts_1.isSchemaObject)(schema) && schema[converted] === false) {
|
|
11
|
+
return { $ref: `#/components/schemas/${json.title}` };
|
|
12
|
+
}
|
|
13
|
+
if (schema != null)
|
|
14
|
+
return schema;
|
|
15
|
+
const result = {
|
|
16
|
+
[converted]: false
|
|
17
|
+
};
|
|
18
|
+
visited.set(json, result);
|
|
19
|
+
const propsToIgnore = ['additionalItems', 'defaultProperties', 'typeof'];
|
|
20
|
+
for (const property in json) {
|
|
21
|
+
if (propsToIgnore.includes(property)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
switch (property) {
|
|
25
|
+
case 'type': {
|
|
26
|
+
if (json.type === 'array' && !json.items) {
|
|
27
|
+
throw new Error('"items" property must be present if "type" is an array');
|
|
28
|
+
}
|
|
29
|
+
result.type = Array.isArray(json.type) ? json.type[0] : json.type;
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case 'allOf': {
|
|
33
|
+
result.allOf = lodash_1.default.map(json.allOf, item => jsonToSchemaObject(item, visited));
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case 'anyOf': {
|
|
37
|
+
result.anyOf = lodash_1.default.map(json.anyOf, item => jsonToSchemaObject(item, visited));
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case 'oneOf': {
|
|
41
|
+
result.oneOf = lodash_1.default.map(json.oneOf, item => jsonToSchemaObject(item, visited));
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case 'definitions': {
|
|
45
|
+
result.definitions = lodash_1.default.mapValues(json.definitions, def => jsonToSchemaObject(jsonOrBooleanToJSON(def), visited));
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case 'properties': {
|
|
49
|
+
result.properties = lodash_1.default.mapValues(json.properties, item => jsonToSchemaObject(jsonOrBooleanToJSON(item), visited));
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case 'additionalProperties': {
|
|
53
|
+
if (typeof json.additionalProperties === 'boolean') {
|
|
54
|
+
result.additionalProperties = json.additionalProperties;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result.additionalProperties = jsonToSchemaObject(json.additionalProperties, visited);
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case 'items': {
|
|
62
|
+
const items = Array.isArray(json.items) ? json.items[0] : json.items;
|
|
63
|
+
result.items = jsonToSchemaObject(jsonOrBooleanToJSON(items), visited);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case '$ref': {
|
|
67
|
+
result.$ref = json.$ref.replace('#/definitions', '#/components/schemas');
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
case 'examples': {
|
|
71
|
+
if (Array.isArray(json.examples)) {
|
|
72
|
+
result.example = json.examples[0];
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
default: {
|
|
77
|
+
result[property] = json[property];
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
delete result[converted];
|
|
83
|
+
const matched = result.description?.match(/^\(tsType: (.+), schemaOptions:/);
|
|
84
|
+
if (matched) {
|
|
85
|
+
result['x-typescript-type'] = matched[1];
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
exports.jsonToSchemaObject = jsonToSchemaObject;
|
|
90
|
+
function jsonOrBooleanToJSON(jsonOrBool) {
|
|
91
|
+
if (typeof jsonOrBool === 'object') {
|
|
92
|
+
return jsonOrBool;
|
|
93
|
+
}
|
|
94
|
+
return jsonOrBool ? {} : { not: {} };
|
|
95
|
+
}
|
|
96
|
+
exports.jsonOrBooleanToJSON = jsonOrBooleanToJSON;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { InspectionOptions, MetadataAccessor, MetadataMap } from '@loopback/metadata';
|
|
2
|
+
import { ModelDefinition, ModelDefinitionSyntax, PropertyDefinition } from './model';
|
|
3
|
+
export declare const MODEL_KEY: MetadataAccessor<Partial<ModelDefinitionSyntax>, ClassDecorator>;
|
|
4
|
+
export declare const MODEL_PROPERTIES_KEY: MetadataAccessor<PropertyDefinition, PropertyDecorator>;
|
|
5
|
+
export declare const MODEL_WITH_PROPERTIES_KEY: MetadataAccessor<ModelDefinition, ClassDecorator>;
|
|
6
|
+
export declare type PropertyMap = MetadataMap<Partial<PropertyDefinition>>;
|
|
7
|
+
export declare class ModelMetadataHelper {
|
|
8
|
+
static getModelMetadata(target: Function, options?: InspectionOptions): ModelDefinition | {};
|
|
9
|
+
}
|