@nest-omni/core 4.1.3-0 → 4.1.3-10
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/audit/audit.module.d.ts +10 -0
- package/audit/audit.module.js +15 -0
- package/audit/controllers/audit.controller.d.ts +24 -0
- package/audit/controllers/audit.controller.js +24 -0
- package/audit/decorators/audit-controller.decorator.d.ts +8 -0
- package/audit/decorators/audit-controller.decorator.js +9 -0
- package/audit/decorators/audit-operation.decorator.d.ts +45 -0
- package/audit/decorators/audit-operation.decorator.js +49 -0
- package/audit/decorators/entity-audit.decorator.d.ts +8 -0
- package/audit/decorators/entity-audit.decorator.js +9 -0
- package/audit/dto/audit-log-query.dto.d.ts +3 -0
- package/audit/dto/audit-log-query.dto.js +3 -0
- package/audit/dto/begin-transaction.dto.d.ts +3 -0
- package/audit/dto/begin-transaction.dto.js +3 -0
- package/audit/dto/compare-entities.dto.d.ts +3 -0
- package/audit/dto/compare-entities.dto.js +3 -0
- package/audit/dto/pre-check-restore.dto.d.ts +3 -0
- package/audit/dto/pre-check-restore.dto.js +3 -0
- package/audit/dto/restore-entity.dto.d.ts +3 -0
- package/audit/dto/restore-entity.dto.js +3 -0
- package/audit/entities/entity-audit-log.entity.d.ts +3 -0
- package/audit/entities/entity-audit-log.entity.js +3 -0
- package/audit/entities/entity-transaction.entity.d.ts +3 -0
- package/audit/entities/entity-transaction.entity.js +3 -0
- package/audit/entities/manual-operation-log.entity.d.ts +4 -0
- package/audit/entities/manual-operation-log.entity.js +4 -0
- package/audit/entities/operation-template.entity.d.ts +4 -0
- package/audit/entities/operation-template.entity.js +4 -0
- package/audit/enums/audit.enums.d.ts +17 -2
- package/audit/enums/audit.enums.js +15 -0
- package/audit/index.js +10 -0
- package/audit/interceptors/audit.interceptor.d.ts +15 -0
- package/audit/interceptors/audit.interceptor.js +23 -1
- package/audit/interfaces/audit.interfaces.d.ts +42 -0
- package/audit/services/audit-context.service.d.ts +15 -0
- package/audit/services/audit-context.service.js +15 -0
- package/audit/services/audit-strategy.service.d.ts +6 -0
- package/audit/services/audit-strategy.service.js +13 -0
- package/audit/services/entity-audit.service.d.ts +57 -0
- package/audit/services/entity-audit.service.js +91 -0
- package/audit/services/manual-audit-log.service.d.ts +124 -0
- package/audit/services/manual-audit-log.service.js +138 -0
- package/audit/services/multi-database.service.d.ts +12 -0
- package/audit/services/multi-database.service.js +12 -0
- package/audit/services/operation-description.service.d.ts +59 -0
- package/audit/services/operation-description.service.js +76 -2
- package/audit/services/transaction-audit.service.d.ts +30 -0
- package/audit/services/transaction-audit.service.js +47 -0
- package/audit/subscribers/entity-audit.subscriber.d.ts +15 -0
- package/audit/subscribers/entity-audit.subscriber.js +29 -1
- package/cache/cache-metrics.service.d.ts +67 -0
- package/cache/cache-metrics.service.js +68 -4
- package/cache/cache-serialization.service.d.ts +31 -0
- package/cache/cache-serialization.service.js +25 -0
- package/cache/cache.constants.d.ts +9 -0
- package/cache/cache.constants.js +9 -0
- package/cache/cache.health.d.ts +26 -0
- package/cache/cache.health.js +30 -0
- package/cache/cache.module.d.ts +86 -0
- package/cache/cache.module.js +71 -0
- package/cache/cache.service.d.ts +140 -0
- package/cache/cache.service.js +157 -0
- package/cache/cache.warmup.service.d.ts +39 -0
- package/cache/cache.warmup.service.js +32 -0
- package/cache/decorators/cache-evict.decorator.d.ts +47 -0
- package/cache/decorators/cache-evict.decorator.js +56 -0
- package/cache/decorators/cache-put.decorator.d.ts +34 -0
- package/cache/decorators/cache-put.decorator.js +39 -0
- package/cache/decorators/cacheable.decorator.d.ts +40 -0
- package/cache/decorators/cacheable.decorator.js +55 -0
- package/cache/dependencies/callback.dependency.d.ts +33 -0
- package/cache/dependencies/callback.dependency.js +39 -1
- package/cache/dependencies/chain.dependency.d.ts +28 -0
- package/cache/dependencies/chain.dependency.js +34 -0
- package/cache/dependencies/db.dependency.d.ts +45 -0
- package/cache/dependencies/db.dependency.js +48 -1
- package/cache/dependencies/file.dependency.d.ts +32 -0
- package/cache/dependencies/file.dependency.js +34 -0
- package/cache/dependencies/tag.dependency.d.ts +36 -0
- package/cache/dependencies/tag.dependency.js +36 -0
- package/cache/dependencies/time.dependency.d.ts +43 -0
- package/cache/dependencies/time.dependency.js +43 -0
- package/cache/examples/basic-usage.d.ts +15 -0
- package/cache/examples/basic-usage.js +62 -8
- package/cache/index.js +9 -0
- package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
- package/cache/interfaces/cache-options.interface.d.ts +81 -0
- package/cache/interfaces/cache-options.interface.js +6 -0
- package/cache/interfaces/cache-provider.interface.d.ts +78 -0
- package/cache/providers/base-cache.provider.d.ts +14 -0
- package/cache/providers/base-cache.provider.js +16 -0
- package/cache/providers/cls-cache.provider.d.ts +20 -0
- package/cache/providers/cls-cache.provider.js +28 -0
- package/cache/providers/memory-cache.provider.d.ts +23 -0
- package/cache/providers/memory-cache.provider.js +26 -0
- package/cache/providers/redis-cache.provider.d.ts +26 -0
- package/cache/providers/redis-cache.provider.js +29 -0
- package/cache/utils/dependency-manager.util.d.ts +52 -0
- package/cache/utils/dependency-manager.util.js +59 -0
- package/cache/utils/key-generator.util.d.ts +42 -0
- package/cache/utils/key-generator.util.js +53 -1
- package/common/abstract.entity.d.ts +14 -0
- package/common/abstract.entity.js +14 -0
- package/common/boilerplate.polyfill.d.ts +142 -4
- package/common/boilerplate.polyfill.js +24 -131
- package/common/dto/dto-container.d.ts +16 -0
- package/common/dto/dto-container.js +20 -0
- package/common/dto/dto-decorators.d.ts +18 -0
- package/common/dto/dto-decorators.js +14 -0
- package/common/dto/dto-extensions.d.ts +11 -0
- package/common/dto/dto-extensions.js +9 -0
- package/common/dto/dto-service-accessor.d.ts +17 -0
- package/common/dto/dto-service-accessor.js +18 -0
- package/common/dto/dto-transformer.d.ts +12 -0
- package/common/dto/dto-transformer.js +9 -0
- package/common/dto/index.js +2 -0
- package/common/examples/paginate-and-map.example.d.ts +6 -0
- package/common/examples/paginate-and-map.example.js +26 -0
- package/common/utils.d.ts +15 -0
- package/common/utils.js +15 -0
- package/constants/language-code.js +1 -0
- package/decorators/field.decorators.js +8 -1
- package/decorators/property.decorators.js +1 -0
- package/decorators/public-route.decorator.js +1 -0
- package/decorators/transform.decorators.d.ts +27 -0
- package/decorators/transform.decorators.js +29 -0
- package/decorators/translate.decorator.js +1 -0
- package/decorators/user.decorator.js +1 -0
- package/decorators/validator.decorators.d.ts +8 -18
- package/decorators/validator.decorators.js +22 -190
- package/filters/constraint-errors.js +1 -0
- package/helpers/common.helper.d.ts +13 -0
- package/helpers/common.helper.js +13 -0
- package/http-client/config/http-client.config.d.ts +15 -0
- package/http-client/config/http-client.config.js +25 -9
- package/http-client/decorators/http-client.decorators.d.ts +63 -0
- package/http-client/decorators/http-client.decorators.js +71 -3
- package/http-client/entities/http-log.entity.d.ts +229 -0
- package/http-client/entities/http-log.entity.js +6 -1
- package/http-client/errors/http-client.errors.d.ts +57 -0
- package/http-client/errors/http-client.errors.js +58 -0
- package/http-client/examples/advanced-usage.example.d.ts +41 -0
- package/http-client/examples/advanced-usage.example.js +68 -24
- package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
- package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
- package/http-client/examples/basic-usage.example.d.ts +60 -0
- package/http-client/examples/basic-usage.example.js +60 -0
- package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
- package/http-client/examples/multi-api-configuration.example.js +76 -5
- package/http-client/http-client.module.d.ts +13 -0
- package/http-client/http-client.module.js +19 -0
- package/http-client/index.js +8 -0
- package/http-client/interfaces/api-client-config.interface.d.ts +125 -0
- package/http-client/interfaces/api-client-config.interface.js +3 -0
- package/http-client/interfaces/http-client-config.interface.d.ts +60 -0
- package/http-client/services/api-client-registry.service.d.ts +57 -0
- package/http-client/services/api-client-registry.service.js +84 -1
- package/http-client/services/cache.service.d.ts +52 -0
- package/http-client/services/cache.service.js +72 -3
- package/http-client/services/circuit-breaker.service.d.ts +46 -0
- package/http-client/services/circuit-breaker.service.js +52 -0
- package/http-client/services/http-client.service.d.ts +67 -0
- package/http-client/services/http-client.service.js +105 -4
- package/http-client/services/http-log-query.service.d.ts +83 -0
- package/http-client/services/http-log-query.service.js +122 -1
- package/http-client/services/http-replay.service.d.ts +101 -0
- package/http-client/services/http-replay.service.js +86 -0
- package/http-client/services/log-cleanup.service.d.ts +63 -0
- package/http-client/services/log-cleanup.service.js +54 -2
- package/http-client/services/logging.service.d.ts +40 -0
- package/http-client/services/logging.service.js +53 -0
- package/http-client/utils/call-stack-extractor.util.d.ts +37 -0
- package/http-client/utils/call-stack-extractor.util.js +48 -0
- package/http-client/utils/context-extractor.util.d.ts +49 -0
- package/http-client/utils/context-extractor.util.js +52 -0
- package/http-client/utils/curl-generator.util.d.ts +21 -0
- package/http-client/utils/curl-generator.util.js +44 -3
- package/http-client/utils/request-id.util.d.ts +18 -0
- package/http-client/utils/request-id.util.js +20 -0
- package/http-client/utils/retry-recorder.util.d.ts +42 -0
- package/http-client/utils/retry-recorder.util.js +44 -0
- package/i18n/en_US/validation.json +2 -1
- package/i18n/zh_CN/validation.json +2 -1
- package/index.js +8 -0
- package/interceptors/translation-interceptor.service.js +5 -0
- package/package.json +1 -1
- package/providers/context.provider.js +2 -0
- package/providers/generator.provider.d.ts +4 -0
- package/providers/generator.provider.js +4 -0
- package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
- package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
- package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
- package/redis-lock/examples/lock-strategy.examples.js +130 -15
- package/redis-lock/index.d.ts +2 -0
- package/redis-lock/index.js +8 -1
- package/redis-lock/lock-heartbeat.service.d.ts +78 -0
- package/redis-lock/lock-heartbeat.service.js +222 -0
- package/redis-lock/redis-lock.decorator.d.ts +101 -0
- package/redis-lock/redis-lock.decorator.js +120 -0
- package/redis-lock/redis-lock.module.d.ts +66 -0
- package/redis-lock/redis-lock.module.js +175 -70
- package/redis-lock/redis-lock.service.d.ts +260 -0
- package/redis-lock/redis-lock.service.js +244 -4
- package/setup/bootstrap.setup.js +20 -0
- package/setup/mode.setup.d.ts +44 -0
- package/setup/mode.setup.js +44 -0
- package/setup/schedule.decorator.d.ts +227 -0
- package/setup/schedule.decorator.js +219 -6
- package/setup/worker.decorator.d.ts +86 -0
- package/setup/worker.decorator.js +88 -0
- package/shared/serviceRegistryModule.js +9 -1
- package/shared/services/api-config.service.d.ts +3 -0
- package/shared/services/api-config.service.js +20 -9
- package/validator-json/decorators.d.ts +17 -0
- package/validator-json/decorators.js +17 -2
- package/validator-json/default.d.ts +6 -0
- package/validator-json/default.js +30 -2
- package/validator-json/defaultConverters.js +1 -0
- package/validator-json/options.d.ts +23 -0
- package/validators/common-validators.d.ts +143 -0
- package/validators/common-validators.js +249 -0
- package/validators/custom-validate.examples.d.ts +96 -0
- package/validators/custom-validate.examples.js +400 -0
- package/validators/custom-validate.validator.d.ts +134 -0
- package/validators/custom-validate.validator.js +214 -0
- package/validators/index.d.ts +2 -0
- package/validators/index.js +2 -0
- package/validators/is-exists.validator.d.ts +18 -4
- package/validators/is-exists.validator.js +67 -6
- package/validators/is-unique.validator.d.ts +32 -5
- package/validators/is-unique.validator.js +99 -17
- package/validators/skip-empty.validator.d.ts +5 -0
- package/validators/skip-empty.validator.js +5 -0
- package/vault/interfaces/vault-options.interface.d.ts +9 -0
- package/vault/vault-config.loader.d.ts +30 -0
- package/vault/vault-config.loader.js +48 -1
- package/vault/vault-config.service.d.ts +53 -0
- package/vault/vault-config.service.js +57 -0
- package/vault/vault.module.d.ts +4 -0
- package/vault/vault.module.js +4 -0
- package/decorators/examples/validation-decorators.example.d.ts +0 -69
- package/decorators/examples/validation-decorators.example.js +0 -331
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
import { Constructor } from '../types';
|
|
2
2
|
import { TransformFnParams } from 'class-transformer';
|
|
3
|
+
/**
|
|
4
|
+
* 扩展的TransformFnParams,包含context
|
|
5
|
+
*/
|
|
3
6
|
export interface ExtendedTransformFnParams extends TransformFnParams {
|
|
4
7
|
context?: any;
|
|
5
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* DTO服务装饰器 - 标记可以在DTO中使用的服务
|
|
11
|
+
*/
|
|
6
12
|
export declare const DTO_SERVICE_KEY = "dto:service-name";
|
|
7
13
|
export declare function DtoService(serviceName?: string): ClassDecorator;
|
|
14
|
+
/**
|
|
15
|
+
* 使用服务装饰器 - 在DTO类中声明需要的服务
|
|
16
|
+
*/
|
|
8
17
|
export declare const DTO_REQUIRED_SERVICES_KEY = "dto:required-services";
|
|
9
18
|
export declare function UseServices(...serviceTokens: Array<string | Constructor<any>>): ClassDecorator;
|
|
19
|
+
/**
|
|
20
|
+
* DTO类装饰器 - 标记这是一个DTO类并关联到Entity
|
|
21
|
+
*/
|
|
10
22
|
export declare const DTO_ENTITY_KEY = "dto:entity";
|
|
11
23
|
export declare function Dto(entityClass: Constructor<any>): ClassDecorator;
|
|
24
|
+
/**
|
|
25
|
+
* DTO字段装饰器 - 类似@Column,用于DTO类
|
|
26
|
+
*/
|
|
12
27
|
export interface DtoFieldOptions {
|
|
13
28
|
source?: string;
|
|
14
29
|
transform?: (value: any) => any;
|
|
15
30
|
}
|
|
16
31
|
export declare function DtoField(source?: string, transform?: (value: any) => any): PropertyDecorator;
|
|
17
32
|
export declare function DtoField(options?: DtoFieldOptions): PropertyDecorator;
|
|
33
|
+
/**
|
|
34
|
+
* DTO计算字段装饰器 - 用于需要计算的复杂字段
|
|
35
|
+
*/
|
|
18
36
|
export declare function DtoComputed(computeFn: (entity: any, context?: any) => any): PropertyDecorator;
|
|
@@ -7,6 +7,9 @@ exports.Dto = Dto;
|
|
|
7
7
|
exports.DtoField = DtoField;
|
|
8
8
|
exports.DtoComputed = DtoComputed;
|
|
9
9
|
const common_1 = require("@nestjs/common");
|
|
10
|
+
/**
|
|
11
|
+
* DTO服务装饰器 - 标记可以在DTO中使用的服务
|
|
12
|
+
*/
|
|
10
13
|
exports.DTO_SERVICE_KEY = 'dto:service-name';
|
|
11
14
|
function DtoService(serviceName) {
|
|
12
15
|
return function (target) {
|
|
@@ -14,18 +17,26 @@ function DtoService(serviceName) {
|
|
|
14
17
|
(0, common_1.SetMetadata)(exports.DTO_SERVICE_KEY, name)(target);
|
|
15
18
|
};
|
|
16
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* 使用服务装饰器 - 在DTO类中声明需要的服务
|
|
22
|
+
*/
|
|
17
23
|
exports.DTO_REQUIRED_SERVICES_KEY = 'dto:required-services';
|
|
18
24
|
function UseServices(...serviceTokens) {
|
|
19
25
|
return function (target) {
|
|
26
|
+
// 将Constructor转换为服务名
|
|
20
27
|
const tokens = serviceTokens.map(token => {
|
|
21
28
|
if (typeof token === 'string') {
|
|
22
29
|
return token;
|
|
23
30
|
}
|
|
31
|
+
// 假设服务名就是类名的小写版本
|
|
24
32
|
return token.name.charAt(0).toLowerCase() + token.name.slice(1);
|
|
25
33
|
});
|
|
26
34
|
(0, common_1.SetMetadata)(exports.DTO_REQUIRED_SERVICES_KEY, tokens)(target);
|
|
27
35
|
};
|
|
28
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* DTO类装饰器 - 标记这是一个DTO类并关联到Entity
|
|
39
|
+
*/
|
|
29
40
|
exports.DTO_ENTITY_KEY = 'dto:entity';
|
|
30
41
|
function Dto(entityClass) {
|
|
31
42
|
return function (target) {
|
|
@@ -46,6 +57,9 @@ function DtoField(sourceOrOptions, transform) {
|
|
|
46
57
|
Reflect.defineMetadata('dto:fields', fields, target.constructor);
|
|
47
58
|
};
|
|
48
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* DTO计算字段装饰器 - 用于需要计算的复杂字段
|
|
62
|
+
*/
|
|
49
63
|
function DtoComputed(computeFn) {
|
|
50
64
|
return function (target, propertyKey) {
|
|
51
65
|
const fields = Reflect.getMetadata('dto:fields', target.constructor) || [];
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { Constructor } from '../types';
|
|
2
2
|
declare global {
|
|
3
3
|
interface Array<T> {
|
|
4
|
+
/**
|
|
5
|
+
* 将实体数组转换为DTO数组
|
|
6
|
+
* @param dtoClass DTO类
|
|
7
|
+
* @param context 转换上下文
|
|
8
|
+
*/
|
|
4
9
|
toDto<DtoType>(dtoClass: Constructor<DtoType>, context?: any): Promise<DtoType[]>;
|
|
5
10
|
}
|
|
6
11
|
}
|
|
7
12
|
declare module 'typeorm' {
|
|
8
13
|
interface SelectQueryBuilder<Entity> {
|
|
14
|
+
/**
|
|
15
|
+
* 执行分页查询并转换为DTO页面
|
|
16
|
+
* @param pageOptionsDto 分页选项
|
|
17
|
+
* @param dtoClass DTO类
|
|
18
|
+
* @param context 转换上下文
|
|
19
|
+
*/
|
|
9
20
|
toDtoPage<DtoType>(pageOptionsDto: any, dtoClass: Constructor<DtoType>, context?: any): Promise<any>;
|
|
10
21
|
}
|
|
11
22
|
}
|
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.transformEntityToDto = transformEntityToDto;
|
|
13
13
|
const typeorm_1 = require("typeorm");
|
|
14
14
|
const dto_transformer_1 = require("./dto-transformer");
|
|
15
|
+
// 实现Array.toDto方法
|
|
15
16
|
Array.prototype.toDto = function (dtoClass, context) {
|
|
16
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
17
18
|
if (!this || this.length === 0) {
|
|
@@ -20,6 +21,7 @@ Array.prototype.toDto = function (dtoClass, context) {
|
|
|
20
21
|
return yield dto_transformer_1.DtoTransformer.transformArray(this, dtoClass, context);
|
|
21
22
|
});
|
|
22
23
|
};
|
|
24
|
+
// 避免直接修改Object原型,改为使用独立的函数
|
|
23
25
|
function transformEntityToDto(entity, dtoClass, context) {
|
|
24
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
27
|
if (!entity) {
|
|
@@ -28,21 +30,28 @@ function transformEntityToDto(entity, dtoClass, context) {
|
|
|
28
30
|
return yield dto_transformer_1.DtoTransformer.transform(entity, dtoClass, context);
|
|
29
31
|
});
|
|
30
32
|
}
|
|
33
|
+
// 实现QueryBuilder.toDtoPage方法
|
|
31
34
|
typeorm_1.SelectQueryBuilder.prototype.toDtoPage = function (pageOptionsDto, dtoClass, context) {
|
|
32
35
|
return __awaiter(this, void 0, void 0, function* () {
|
|
33
36
|
const page = pageOptionsDto.page || 1;
|
|
34
37
|
const pageSize = pageOptionsDto.pageSize || 10;
|
|
35
38
|
const skip = (page - 1) * pageSize;
|
|
39
|
+
// 获取总数
|
|
36
40
|
const total = yield this.getCount();
|
|
41
|
+
// 应用分页
|
|
37
42
|
const entities = yield this.skip(skip).take(pageSize).getMany();
|
|
38
43
|
const count = entities.length;
|
|
44
|
+
// 调试:输出原始实体数据
|
|
39
45
|
if (count) {
|
|
40
46
|
console.log('Raw entity sample:', JSON.stringify(entities[0], null, 2));
|
|
41
47
|
}
|
|
48
|
+
// 转换为DTO
|
|
42
49
|
const data = yield entities.toDto(dtoClass, context);
|
|
50
|
+
// 调试:输出转换后的DTO数据
|
|
43
51
|
if (data.length > 0) {
|
|
44
52
|
console.log('Converted DTO sample:', JSON.stringify(data[0], null, 2));
|
|
45
53
|
}
|
|
54
|
+
// 计算分页信息
|
|
46
55
|
const pageCount = Math.ceil(total / pageSize);
|
|
47
56
|
const hasPreviousPage = page > 1;
|
|
48
57
|
const hasNextPage = page < pageCount;
|
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import { Constructor } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* DTO服务访问器 - 使用全局容器获取服务
|
|
4
|
+
* 类似class-validator的useContainer机制
|
|
5
|
+
*/
|
|
2
6
|
export declare class DtoServiceAccessor {
|
|
7
|
+
/**
|
|
8
|
+
* 获取服务实例
|
|
9
|
+
*/
|
|
3
10
|
static getService<T = any>(serviceToken: string | symbol | Constructor<any>): Promise<T | null>;
|
|
11
|
+
/**
|
|
12
|
+
* 批量获取服务
|
|
13
|
+
*/
|
|
4
14
|
static getServices<T = any>(serviceTokens: Array<string | symbol | Constructor<any>>): Promise<Record<string, T>>;
|
|
15
|
+
/**
|
|
16
|
+
* 为特定DTO类获取所需服务
|
|
17
|
+
* 基于预定义的服务依赖列表
|
|
18
|
+
*/
|
|
5
19
|
static getServicesForDto(dtoClass: Constructor<any>): Promise<Record<string, any>>;
|
|
20
|
+
/**
|
|
21
|
+
* 检查是否已初始化
|
|
22
|
+
*/
|
|
6
23
|
static isInitialized(): boolean;
|
|
7
24
|
}
|
|
@@ -11,12 +11,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.DtoServiceAccessor = void 0;
|
|
13
13
|
const dto_container_1 = require("./dto-container");
|
|
14
|
+
/**
|
|
15
|
+
* DTO服务访问器 - 使用全局容器获取服务
|
|
16
|
+
* 类似class-validator的useContainer机制
|
|
17
|
+
*/
|
|
14
18
|
class DtoServiceAccessor {
|
|
19
|
+
/**
|
|
20
|
+
* 获取服务实例
|
|
21
|
+
*/
|
|
15
22
|
static getService(serviceToken) {
|
|
16
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
17
24
|
return yield dto_container_1.DtoContainer.get(serviceToken);
|
|
18
25
|
});
|
|
19
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* 批量获取服务
|
|
29
|
+
*/
|
|
20
30
|
static getServices(serviceTokens) {
|
|
21
31
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
32
|
const services = {};
|
|
@@ -33,8 +43,13 @@ class DtoServiceAccessor {
|
|
|
33
43
|
return services;
|
|
34
44
|
});
|
|
35
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* 为特定DTO类获取所需服务
|
|
48
|
+
* 基于预定义的服务依赖列表
|
|
49
|
+
*/
|
|
36
50
|
static getServicesForDto(dtoClass) {
|
|
37
51
|
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
// 从元数据获取服务依赖
|
|
38
53
|
const serviceTokens = Reflect.getMetadata('dto:required-services', dtoClass) || [];
|
|
39
54
|
if (serviceTokens.length === 0) {
|
|
40
55
|
return {};
|
|
@@ -42,6 +57,9 @@ class DtoServiceAccessor {
|
|
|
42
57
|
return yield DtoServiceAccessor.getServices(serviceTokens);
|
|
43
58
|
});
|
|
44
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* 检查是否已初始化
|
|
62
|
+
*/
|
|
45
63
|
static isInitialized() {
|
|
46
64
|
return dto_container_1.DtoContainer.isInitialized();
|
|
47
65
|
}
|
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
import { Constructor } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* DTO转换上下文
|
|
4
|
+
*/
|
|
2
5
|
export interface DtoTransformContext {
|
|
3
6
|
user?: any;
|
|
4
7
|
request?: any;
|
|
5
8
|
services?: Record<string, any>;
|
|
6
9
|
[key: string]: any;
|
|
7
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* 简化的DTO转换器 - 利用class-transformer和自动服务注入
|
|
13
|
+
*/
|
|
8
14
|
export declare class DtoTransformer {
|
|
15
|
+
/**
|
|
16
|
+
* 转换单个实体到DTO
|
|
17
|
+
*/
|
|
9
18
|
static transform<EntityType, DtoType>(entity: EntityType, dtoClass: Constructor<DtoType>, context?: DtoTransformContext): Promise<DtoType>;
|
|
19
|
+
/**
|
|
20
|
+
* 批量转换实体数组到DTO数组
|
|
21
|
+
*/
|
|
10
22
|
static transformArray<EntityType, DtoType>(entities: EntityType[], dtoClass: Constructor<DtoType>, context?: DtoTransformContext): Promise<DtoType[]>;
|
|
11
23
|
}
|
|
@@ -12,7 +12,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.DtoTransformer = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const dto_service_accessor_1 = require("./dto-service-accessor");
|
|
15
|
+
/**
|
|
16
|
+
* 简化的DTO转换器 - 利用class-transformer和自动服务注入
|
|
17
|
+
*/
|
|
15
18
|
class DtoTransformer {
|
|
19
|
+
/**
|
|
20
|
+
* 转换单个实体到DTO
|
|
21
|
+
*/
|
|
16
22
|
static transform(entity, dtoClass, context) {
|
|
17
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
24
|
const services = yield dto_service_accessor_1.DtoServiceAccessor.getServicesForDto(dtoClass);
|
|
@@ -27,6 +33,9 @@ class DtoTransformer {
|
|
|
27
33
|
return (0, class_transformer_1.plainToInstance)(dtoClass, entity, options);
|
|
28
34
|
});
|
|
29
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* 批量转换实体数组到DTO数组
|
|
38
|
+
*/
|
|
30
39
|
static transformArray(entities, dtoClass, context) {
|
|
31
40
|
return __awaiter(this, void 0, void 0, function* () {
|
|
32
41
|
if (!entities || entities.length === 0) {
|
package/common/dto/index.js
CHANGED
|
@@ -20,9 +20,11 @@ __exportStar(require("./create-translation.dto"), exports);
|
|
|
20
20
|
__exportStar(require("./page.dto"), exports);
|
|
21
21
|
__exportStar(require("./page-meta.dto"), exports);
|
|
22
22
|
__exportStar(require("./page-options.dto"), exports);
|
|
23
|
+
// 导出新的DTO转换功能
|
|
23
24
|
__exportStar(require("./dto-service-accessor"), exports);
|
|
24
25
|
__exportStar(require("./dto-decorators"), exports);
|
|
25
26
|
__exportStar(require("./dto-transformer"), exports);
|
|
26
27
|
__exportStar(require("./dto-extensions"), exports);
|
|
27
28
|
__exportStar(require("./dto-container"), exports);
|
|
29
|
+
// 需要导入扩展文件以激活原型方法扩展
|
|
28
30
|
require("./dto-extensions");
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example usage of the paginateAndMap method with async transform
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates various ways to use the enhanced paginateAndMap method
|
|
5
|
+
* with support for both synchronous and asynchronous transform functions.
|
|
6
|
+
*/
|
|
1
7
|
import { Repository } from 'typeorm';
|
|
2
8
|
import { PageOptionsDto } from '../dto/page-options.dto';
|
|
3
9
|
export declare function basicPaginationExample(repository: Repository<any>, pageOptions: PageOptionsDto): Promise<import("..").PageDto<import("..").AbstractDto>>;
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Example usage of the paginateAndMap method with async transform
|
|
4
|
+
*
|
|
5
|
+
* This file demonstrates various ways to use the enhanced paginateAndMap method
|
|
6
|
+
* with support for both synchronous and asynchronous transform functions.
|
|
7
|
+
*/
|
|
2
8
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
9
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
10
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -24,6 +30,7 @@ exports.complexAsyncTransformExample = complexAsyncTransformExample;
|
|
|
24
30
|
exports.iterateExample = iterateExample;
|
|
25
31
|
exports.eachBatchSingleExample = eachBatchSingleExample;
|
|
26
32
|
exports.eachBatchGroupExample = eachBatchGroupExample;
|
|
33
|
+
// Example 1: Basic usage without transform
|
|
27
34
|
function basicPaginationExample(repository, pageOptions) {
|
|
28
35
|
return __awaiter(this, void 0, void 0, function* () {
|
|
29
36
|
const result = yield repository
|
|
@@ -32,6 +39,7 @@ function basicPaginationExample(repository, pageOptions) {
|
|
|
32
39
|
return result;
|
|
33
40
|
});
|
|
34
41
|
}
|
|
42
|
+
// Example 2: Synchronous transform
|
|
35
43
|
function syncTransformExample(repository, pageOptions) {
|
|
36
44
|
return __awaiter(this, void 0, void 0, function* () {
|
|
37
45
|
const result = yield repository
|
|
@@ -39,12 +47,14 @@ function syncTransformExample(repository, pageOptions) {
|
|
|
39
47
|
.where('entity.isActive = :isActive', { isActive: true })
|
|
40
48
|
.paginateAndMap(pageOptions, {
|
|
41
49
|
transform: (items) => {
|
|
50
|
+
// Filter items synchronously
|
|
42
51
|
return items.filter(item => item.status === 'approved');
|
|
43
52
|
},
|
|
44
53
|
});
|
|
45
54
|
return result;
|
|
46
55
|
});
|
|
47
56
|
}
|
|
57
|
+
// Example 3: Async transform with external service call
|
|
48
58
|
function asyncTransformExample(repository, pageOptions, externalService) {
|
|
49
59
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
60
|
const result = yield repository
|
|
@@ -52,16 +62,19 @@ function asyncTransformExample(repository, pageOptions, externalService) {
|
|
|
52
62
|
.where('entity.isActive = :isActive', { isActive: true })
|
|
53
63
|
.paginateAndMap(pageOptions, {
|
|
54
64
|
transform: (items) => __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
// Enrich each item with data from external service
|
|
55
66
|
const enrichedItems = yield Promise.all(items.map((item) => __awaiter(this, void 0, void 0, function* () {
|
|
56
67
|
const additionalData = yield externalService.fetchData(item.id);
|
|
57
68
|
return Object.assign(Object.assign({}, item), { additionalData });
|
|
58
69
|
})));
|
|
70
|
+
// Filter after enrichment
|
|
59
71
|
return enrichedItems.filter(item => { var _a; return (_a = item.additionalData) === null || _a === void 0 ? void 0 : _a.isValid; });
|
|
60
72
|
}),
|
|
61
73
|
});
|
|
62
74
|
return result;
|
|
63
75
|
});
|
|
64
76
|
}
|
|
77
|
+
// Example 4: Async transform with batch processing
|
|
65
78
|
function asyncBatchTransformExample(repository, pageOptions, batchProcessor) {
|
|
66
79
|
return __awaiter(this, void 0, void 0, function* () {
|
|
67
80
|
const result = yield repository
|
|
@@ -70,13 +83,16 @@ function asyncBatchTransformExample(repository, pageOptions, batchProcessor) {
|
|
|
70
83
|
.paginateAndMap(pageOptions, {
|
|
71
84
|
dtoOptions: { includeRelations: true },
|
|
72
85
|
transform: (items) => __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
// Process items in batches for better performance
|
|
73
87
|
const processedItems = yield batchProcessor.processBatch(items);
|
|
88
|
+
// Additional filtering or transformation
|
|
74
89
|
return processedItems.map(item => (Object.assign(Object.assign({}, item), { processed: true, processedAt: new Date() })));
|
|
75
90
|
}),
|
|
76
91
|
});
|
|
77
92
|
return result;
|
|
78
93
|
});
|
|
79
94
|
}
|
|
95
|
+
// Example 5: Complex async transform with error handling
|
|
80
96
|
function complexAsyncTransformExample(repository, pageOptions, services) {
|
|
81
97
|
return __awaiter(this, void 0, void 0, function* () {
|
|
82
98
|
const result = yield repository
|
|
@@ -85,6 +101,7 @@ function complexAsyncTransformExample(repository, pageOptions, services) {
|
|
|
85
101
|
.paginateAndMap(pageOptions, {
|
|
86
102
|
skipCount: false,
|
|
87
103
|
transform: (items) => __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
// Step 1: Validate items
|
|
88
105
|
const validatedItems = yield Promise.all(items.map((item) => __awaiter(this, void 0, void 0, function* () {
|
|
89
106
|
try {
|
|
90
107
|
const isValid = yield services.validation.validate(item);
|
|
@@ -95,11 +112,14 @@ function complexAsyncTransformExample(repository, pageOptions, services) {
|
|
|
95
112
|
return null;
|
|
96
113
|
}
|
|
97
114
|
})));
|
|
115
|
+
// Filter out invalid items
|
|
98
116
|
const validItems = validatedItems.filter(item => item !== null);
|
|
117
|
+
// Step 2: Enrich with external data
|
|
99
118
|
const enrichedItems = yield Promise.all(validItems.map((item) => __awaiter(this, void 0, void 0, function* () {
|
|
100
119
|
const enrichmentData = yield services.enrichment.enrich(item.id);
|
|
101
120
|
return Object.assign(Object.assign({}, item), enrichmentData);
|
|
102
121
|
})));
|
|
122
|
+
// Step 3: Calculate derived fields
|
|
103
123
|
const finalItems = yield Promise.all(enrichedItems.map((item) => __awaiter(this, void 0, void 0, function* () {
|
|
104
124
|
const calculatedFields = yield services.calculation.calculate(item);
|
|
105
125
|
return Object.assign(Object.assign({}, item), calculatedFields);
|
|
@@ -110,6 +130,7 @@ function complexAsyncTransformExample(repository, pageOptions, services) {
|
|
|
110
130
|
return result;
|
|
111
131
|
});
|
|
112
132
|
}
|
|
133
|
+
// Example 6: Using iterate for large datasets
|
|
113
134
|
function iterateExample(repository, processor) {
|
|
114
135
|
return __awaiter(this, void 0, void 0, function* () {
|
|
115
136
|
var _a, e_1, _b, _c;
|
|
@@ -117,6 +138,7 @@ function iterateExample(repository, processor) {
|
|
|
117
138
|
.createQueryBuilder('entity')
|
|
118
139
|
.where('entity.needsProcessing = :needsProcessing', { needsProcessing: true });
|
|
119
140
|
try {
|
|
141
|
+
// Process large dataset in batches without loading everything into memory
|
|
120
142
|
for (var _d = true, _e = __asyncValues(queryBuilder.iterate({ batchSize: 500 })), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {
|
|
121
143
|
_c = _f.value;
|
|
122
144
|
_d = false;
|
|
@@ -134,23 +156,27 @@ function iterateExample(repository, processor) {
|
|
|
134
156
|
}
|
|
135
157
|
});
|
|
136
158
|
}
|
|
159
|
+
// Example 7: Using eachBatch with individual processing
|
|
137
160
|
function eachBatchSingleExample(repository, processor) {
|
|
138
161
|
return __awaiter(this, void 0, void 0, function* () {
|
|
139
162
|
yield repository
|
|
140
163
|
.createQueryBuilder('entity')
|
|
141
164
|
.where('entity.status = :status', { status: 'pending' })
|
|
142
165
|
.eachBatch((entity) => __awaiter(this, void 0, void 0, function* () {
|
|
166
|
+
// Process each entity individually
|
|
143
167
|
console.log(`Processing entity ${entity.id}`);
|
|
144
168
|
yield processor.processOne(entity);
|
|
145
169
|
}), { batchSize: 100, mode: 'single' });
|
|
146
170
|
});
|
|
147
171
|
}
|
|
172
|
+
// Example 8: Using eachBatch with batch processing
|
|
148
173
|
function eachBatchGroupExample(repository, processor) {
|
|
149
174
|
return __awaiter(this, void 0, void 0, function* () {
|
|
150
175
|
yield repository
|
|
151
176
|
.createQueryBuilder('entity')
|
|
152
177
|
.where('entity.status = :status', { status: 'pending' })
|
|
153
178
|
.eachBatch((batch) => __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
// Process entire batch at once
|
|
154
180
|
console.log(`Processing batch of ${batch.length} entities`);
|
|
155
181
|
yield processor.processBatch(batch);
|
|
156
182
|
}), { batchSize: 500, mode: 'batch' });
|
package/common/utils.d.ts
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generate hash from password or string
|
|
3
|
+
* @param {string} password
|
|
4
|
+
* @returns {string}
|
|
5
|
+
*/
|
|
1
6
|
export declare function generateHash(password: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* validate text with hash
|
|
9
|
+
* @param {string} password
|
|
10
|
+
* @param {string} hash
|
|
11
|
+
* @returns {Promise<boolean>}
|
|
12
|
+
*/
|
|
2
13
|
export declare function validateHash(password: string | undefined, hash: string | undefined): Promise<boolean>;
|
|
3
14
|
export declare function getVariableName<TResult>(getVar: () => TResult): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate a unique request ID
|
|
17
|
+
* @returns {string}
|
|
18
|
+
*/
|
|
4
19
|
export declare function generateRequestId(): string;
|
package/common/utils.js
CHANGED
|
@@ -5,9 +5,20 @@ exports.validateHash = validateHash;
|
|
|
5
5
|
exports.getVariableName = getVariableName;
|
|
6
6
|
exports.generateRequestId = generateRequestId;
|
|
7
7
|
const bcrypt_1 = require("bcrypt");
|
|
8
|
+
/**
|
|
9
|
+
* generate hash from password or string
|
|
10
|
+
* @param {string} password
|
|
11
|
+
* @returns {string}
|
|
12
|
+
*/
|
|
8
13
|
function generateHash(password) {
|
|
9
14
|
return bcrypt_1.default.hashSync(password, 10);
|
|
10
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* validate text with hash
|
|
18
|
+
* @param {string} password
|
|
19
|
+
* @param {string} hash
|
|
20
|
+
* @returns {Promise<boolean>}
|
|
21
|
+
*/
|
|
11
22
|
function validateHash(password, hash) {
|
|
12
23
|
if (!password || !hash) {
|
|
13
24
|
return Promise.resolve(false);
|
|
@@ -23,6 +34,10 @@ function getVariableName(getVar) {
|
|
|
23
34
|
const memberParts = fullMemberName.split('.');
|
|
24
35
|
return memberParts[memberParts.length - 1];
|
|
25
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate a unique request ID
|
|
39
|
+
* @returns {string}
|
|
40
|
+
*/
|
|
26
41
|
function generateRequestId() {
|
|
27
42
|
return Math.random().toString(36).substring(2, 15) +
|
|
28
43
|
Math.random().toString(36).substring(2, 15) +
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.supportedLanguageCount = exports.LanguageCode = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
4
5
|
var LanguageCode;
|
|
5
6
|
(function (LanguageCode) {
|
|
6
7
|
LanguageCode["en_US"] = "en-US";
|
|
@@ -145,7 +145,7 @@ function StringFieldOptional(options = {}) {
|
|
|
145
145
|
}
|
|
146
146
|
function PasswordField(options = {}) {
|
|
147
147
|
const decorators = [
|
|
148
|
-
StringField(Object.assign(Object.assign({}, options), { minLength: 6 }))
|
|
148
|
+
StringField(Object.assign(Object.assign({}, options), { minLength: 6 })) /*IsPassword()*/,
|
|
149
149
|
];
|
|
150
150
|
if (options.nullable) {
|
|
151
151
|
decorators.push((0, validator_decorators_1.IsNullable)());
|
|
@@ -223,7 +223,9 @@ function getEnumDescription(enumType) {
|
|
|
223
223
|
const keys = Object.keys(enumType).filter((k) => typeof enumType[k] === 'number');
|
|
224
224
|
return keys.map((k) => `${enumType[k]}: ${k}`).join(', ');
|
|
225
225
|
}
|
|
226
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
226
227
|
function EnumField(getEnum, options = {}) {
|
|
228
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/ban-types
|
|
227
229
|
const enumValue = getEnum();
|
|
228
230
|
const decorators = [
|
|
229
231
|
(0, class_validator_1.IsEnum)(enumValue, {
|
|
@@ -245,7 +247,9 @@ function EnumField(getEnum, options = {}) {
|
|
|
245
247
|
}
|
|
246
248
|
return (0, common_1.applyDecorators)(...decorators);
|
|
247
249
|
}
|
|
250
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
248
251
|
function ClassField(getClass, options = {}) {
|
|
252
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
249
253
|
const classValue = getClass();
|
|
250
254
|
if (!classValue) {
|
|
251
255
|
throw new Error('ClassField: recursive class definition');
|
|
@@ -271,9 +275,11 @@ function ClassField(getClass, options = {}) {
|
|
|
271
275
|
}
|
|
272
276
|
return (0, common_1.applyDecorators)(...decorators);
|
|
273
277
|
}
|
|
278
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
274
279
|
function EnumFieldOptional(getEnum, options = {}) {
|
|
275
280
|
return (0, common_1.applyDecorators)((0, validator_decorators_1.IsEmptyable)(), EnumField(getEnum, Object.assign({ required: false }, options)));
|
|
276
281
|
}
|
|
282
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
277
283
|
function ClassFieldOptional(getClass, options = {}) {
|
|
278
284
|
return (0, common_1.applyDecorators)((0, validator_decorators_1.IsEmptyable)(), ClassField(getClass, Object.assign({ required: false }, options)));
|
|
279
285
|
}
|
|
@@ -407,6 +413,7 @@ function DateField(options = {}) {
|
|
|
407
413
|
}));
|
|
408
414
|
}
|
|
409
415
|
if (options.swagger !== false) {
|
|
416
|
+
// Add default example with current date
|
|
410
417
|
const swaggerOptions = Object.assign({ type: Date, example: (_a = options.example) !== null && _a !== void 0 ? _a : new Date() }, options);
|
|
411
418
|
decorators.push((0, swagger_1.ApiProperty)(swaggerOptions));
|
|
412
419
|
}
|
|
@@ -22,6 +22,7 @@ function ApiUUIDPropertyOptional(options = {}) {
|
|
|
22
22
|
return ApiUUIDProperty(Object.assign({ required: false }, options));
|
|
23
23
|
}
|
|
24
24
|
function ApiEnumProperty(getEnum, options = {}) {
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
26
|
const enumValue = getEnum();
|
|
26
27
|
options.description = (0, field_decorators_1.getEnumDescription)(enumValue);
|
|
27
28
|
return (0, swagger_1.ApiProperty)(Object.assign({ enum: enumValue, enumName: (0, utils_1.getVariableName)(getEnum) }, options));
|
|
@@ -3,5 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PublicRoute = exports.PUBLIC_ROUTE_KEY = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
exports.PUBLIC_ROUTE_KEY = 'public_route';
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
6
7
|
const PublicRoute = (isPublic = false) => (0, common_1.SetMetadata)(exports.PUBLIC_ROUTE_KEY, isPublic);
|
|
7
8
|
exports.PublicRoute = PublicRoute;
|
|
@@ -1,6 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description trim spaces from start and end, replace multiple spaces with one.
|
|
3
|
+
* @example
|
|
4
|
+
* @ApiProperty()
|
|
5
|
+
* @IsString()
|
|
6
|
+
* @Trim()
|
|
7
|
+
* name: string;
|
|
8
|
+
* @returns PropertyDecorator
|
|
9
|
+
* @constructor
|
|
10
|
+
*/
|
|
1
11
|
export declare function Trim(): PropertyDecorator;
|
|
2
12
|
export declare function ToBoolean(): PropertyDecorator;
|
|
13
|
+
/**
|
|
14
|
+
* @description convert string or number to integer
|
|
15
|
+
* @example
|
|
16
|
+
* @IsNumber()
|
|
17
|
+
* @ToInt()
|
|
18
|
+
* name: number;
|
|
19
|
+
* @returns PropertyDecorator
|
|
20
|
+
* @constructor
|
|
21
|
+
*/
|
|
3
22
|
export declare function ToInt(): PropertyDecorator;
|
|
23
|
+
/**
|
|
24
|
+
* @description transforms to array, specially for query params
|
|
25
|
+
* @example
|
|
26
|
+
* @IsNumber()
|
|
27
|
+
* @ToArray()
|
|
28
|
+
* name: number;
|
|
29
|
+
* @constructor
|
|
30
|
+
*/
|
|
4
31
|
export declare function ToArray(): PropertyDecorator;
|
|
5
32
|
export declare function ToLowerCase(): PropertyDecorator;
|
|
6
33
|
export declare function ToUpperCase(): PropertyDecorator;
|
|
@@ -12,12 +12,24 @@ const class_transformer_1 = require("class-transformer");
|
|
|
12
12
|
const libphonenumber_js_1 = require("libphonenumber-js");
|
|
13
13
|
const lodash_1 = require("lodash");
|
|
14
14
|
const providers_1 = require("../providers");
|
|
15
|
+
/**
|
|
16
|
+
* @description trim spaces from start and end, replace multiple spaces with one.
|
|
17
|
+
* @example
|
|
18
|
+
* @ApiProperty()
|
|
19
|
+
* @IsString()
|
|
20
|
+
* @Trim()
|
|
21
|
+
* name: string;
|
|
22
|
+
* @returns PropertyDecorator
|
|
23
|
+
* @constructor
|
|
24
|
+
*/
|
|
15
25
|
function Trim() {
|
|
16
26
|
return (0, class_transformer_1.Transform)((params) => {
|
|
17
27
|
const value = params.value;
|
|
18
28
|
if ((0, lodash_1.isArray)(value)) {
|
|
29
|
+
// @ts-ignore
|
|
19
30
|
return (0, lodash_1.map)(value, (v) => (0, lodash_1.trim)(v).replaceAll(/\s\s+/g, ' '));
|
|
20
31
|
}
|
|
32
|
+
// @ts-ignore
|
|
21
33
|
return (0, lodash_1.trim)(value).replaceAll(/\s\s+/g, ' ');
|
|
22
34
|
});
|
|
23
35
|
}
|
|
@@ -36,12 +48,29 @@ function ToBoolean() {
|
|
|
36
48
|
}
|
|
37
49
|
}, { toClassOnly: true });
|
|
38
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* @description convert string or number to integer
|
|
53
|
+
* @example
|
|
54
|
+
* @IsNumber()
|
|
55
|
+
* @ToInt()
|
|
56
|
+
* name: number;
|
|
57
|
+
* @returns PropertyDecorator
|
|
58
|
+
* @constructor
|
|
59
|
+
*/
|
|
39
60
|
function ToInt() {
|
|
40
61
|
return (0, class_transformer_1.Transform)((params) => {
|
|
41
62
|
const value = params.value;
|
|
42
63
|
return Number.parseInt(value, 10);
|
|
43
64
|
}, { toClassOnly: true });
|
|
44
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* @description transforms to array, specially for query params
|
|
68
|
+
* @example
|
|
69
|
+
* @IsNumber()
|
|
70
|
+
* @ToArray()
|
|
71
|
+
* name: number;
|
|
72
|
+
* @constructor
|
|
73
|
+
*/
|
|
45
74
|
function ToArray() {
|
|
46
75
|
return (0, class_transformer_1.Transform)((params) => {
|
|
47
76
|
const value = params.value;
|
|
@@ -5,6 +5,7 @@ exports.StaticTranslate = StaticTranslate;
|
|
|
5
5
|
exports.DynamicTranslate = DynamicTranslate;
|
|
6
6
|
exports.STATIC_TRANSLATION_DECORATOR_KEY = 'custom:static-translate';
|
|
7
7
|
exports.DYNAMIC_TRANSLATION_DECORATOR_KEY = 'custom:dynamic-translate';
|
|
8
|
+
// FIXME: This is a temporary solution to get the translation decorator working.
|
|
8
9
|
function StaticTranslate(data = {}) {
|
|
9
10
|
return (target, key) => {
|
|
10
11
|
Reflect.defineMetadata(exports.STATIC_TRANSLATION_DECORATOR_KEY, data, target, key);
|