@nest-omni/core 4.1.3-1 → 4.1.3-11
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 +39 -1
- 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 +9 -1
- package/audit/decorators/audit-controller.decorator.js +11 -2
- 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 +76 -1
- package/audit/decorators/entity-audit.decorator.js +135 -3
- package/audit/decorators/index.d.ts +1 -0
- package/audit/decorators/index.js +1 -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 +8 -0
- package/audit/entities/entity-audit-log.entity.js +33 -1
- package/audit/entities/entity-transaction.entity.d.ts +10 -0
- package/audit/entities/entity-transaction.entity.js +33 -1
- package/audit/entities/index.d.ts +2 -0
- package/audit/entities/index.js +2 -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 +45 -5
- package/audit/enums/audit.enums.js +47 -4
- package/audit/index.d.ts +3 -1
- package/audit/index.js +30 -1
- package/audit/interceptors/audit.interceptor.d.ts +15 -0
- package/audit/interceptors/audit.interceptor.js +23 -1
- package/audit/interfaces/audit.interfaces.d.ts +182 -2
- 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 +129 -3
- package/audit/services/entity-audit.service.js +301 -6
- package/audit/services/index.d.ts +2 -0
- package/audit/services/index.js +2 -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 -100
- 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 +20 -5
- 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 +278 -0
- package/redis-lock/redis-lock.service.js +282 -12
- 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 +235 -12
- package/setup/worker.decorator.d.ts +86 -0
- package/setup/worker.decorator.js +88 -0
- package/shared/serviceRegistryModule.js +27 -14
- 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
|
@@ -37,13 +37,18 @@ const nestjs_cls_1 = require("nestjs-cls");
|
|
|
37
37
|
const redis_lock_1 = require("../redis-lock");
|
|
38
38
|
const typeorm_2 = require("typeorm");
|
|
39
39
|
const vault_1 = require("../vault");
|
|
40
|
+
const validators_1 = require("../validators");
|
|
40
41
|
const providers = [
|
|
41
42
|
services_1.ApiConfigService,
|
|
42
43
|
services_1.ValidatorService,
|
|
43
44
|
services_1.GeneratorService,
|
|
44
45
|
services_1.TranslationService,
|
|
46
|
+
validators_1.IsExistsValidator,
|
|
47
|
+
validators_1.IsUniqueValidator,
|
|
48
|
+
validators_1.CustomValidateValidator,
|
|
45
49
|
];
|
|
46
50
|
if (!((_a = process === null || process === void 0 ? void 0 : process.env) === null || _a === void 0 ? void 0 : _a.ENV_FILE_PATH)) {
|
|
51
|
+
// 兼容单元测试,没有加载初始化文件,手动引入
|
|
47
52
|
Promise.resolve().then(() => require('../setup/bootstrap.setup'));
|
|
48
53
|
}
|
|
49
54
|
services_1.ApiConfigService.rootPath = process.env.ROOT_PATH;
|
|
@@ -56,19 +61,6 @@ const modules = [
|
|
|
56
61
|
expandVariables: false,
|
|
57
62
|
envFilePath: [process.env.ENV_FILE_PATH, process.env.BASE_ENV_FILE_PATH],
|
|
58
63
|
}),
|
|
59
|
-
nestjs_cls_1.ClsModule.forRoot({
|
|
60
|
-
global: true,
|
|
61
|
-
middleware: { mount: true, saveReq: true },
|
|
62
|
-
plugins: [
|
|
63
|
-
new transactional_1.ClsPluginTransactional({
|
|
64
|
-
imports: [typeorm_1.TypeOrmModule],
|
|
65
|
-
adapter: new transactional_adapter_typeorm_1.TransactionalAdapterTypeOrm({
|
|
66
|
-
dataSourceToken: typeorm_2.DataSource,
|
|
67
|
-
}),
|
|
68
|
-
enableTransactionProxy: true,
|
|
69
|
-
}),
|
|
70
|
-
],
|
|
71
|
-
}),
|
|
72
64
|
nestjs_pino_1.LoggerModule.forRootAsync({
|
|
73
65
|
inject: [services_1.ApiConfigService],
|
|
74
66
|
useFactory: (config) => config.pinoConfig,
|
|
@@ -100,6 +92,24 @@ if (services_1.ApiConfigService.toBoolean(process.env.DB_ENABLED, true)) {
|
|
|
100
92
|
inject: [services_1.ApiConfigService],
|
|
101
93
|
useFactory: (config) => config.typeormConfig,
|
|
102
94
|
}));
|
|
95
|
+
modules.push(nestjs_cls_1.ClsModule.forRootAsync({
|
|
96
|
+
imports: [typeorm_1.TypeOrmModule],
|
|
97
|
+
useFactory(args) {
|
|
98
|
+
return {
|
|
99
|
+
middleware: { mount: true, saveReq: true },
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
global: true,
|
|
103
|
+
plugins: [
|
|
104
|
+
new transactional_1.ClsPluginTransactional({
|
|
105
|
+
imports: [typeorm_1.TypeOrmModule],
|
|
106
|
+
adapter: new transactional_adapter_typeorm_1.TransactionalAdapterTypeOrm({
|
|
107
|
+
dataSourceToken: (0, typeorm_1.getDataSourceToken)(),
|
|
108
|
+
}),
|
|
109
|
+
enableTransactionProxy: true,
|
|
110
|
+
}),
|
|
111
|
+
]
|
|
112
|
+
}));
|
|
103
113
|
}
|
|
104
114
|
if (services_1.ApiConfigService.toBoolean(process.env.BULL_ENABLED)) {
|
|
105
115
|
modules.push(bull_1.BullModule.forRootAsync({
|
|
@@ -113,6 +123,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.CACHE_ENABLED)) {
|
|
|
113
123
|
isGlobal: true,
|
|
114
124
|
useFactory: (config, redisService, dataSource) => __awaiter(void 0, void 0, void 0, function* () {
|
|
115
125
|
let redisClient = null;
|
|
126
|
+
// Try to get Redis client (use default client)
|
|
116
127
|
try {
|
|
117
128
|
redisClient = redisService.getClient();
|
|
118
129
|
}
|
|
@@ -131,6 +142,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.CACHE_ENABLED)) {
|
|
|
131
142
|
}),
|
|
132
143
|
}));
|
|
133
144
|
}
|
|
145
|
+
// Add RedisLockModule if both Redis and Cache are enabled
|
|
134
146
|
if (services_1.ApiConfigService.toBoolean(process.env.SCHEDULE_ENABLED) &&
|
|
135
147
|
services_1.ApiConfigService.toBoolean(process.env.REDIS_LOCK_ENABLED, true)) {
|
|
136
148
|
modules.push(redis_lock_1.RedisLockModule.forRootAsync({
|
|
@@ -138,6 +150,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.SCHEDULE_ENABLED) &&
|
|
|
138
150
|
isGlobal: true,
|
|
139
151
|
useFactory: (config, redisService) => __awaiter(void 0, void 0, void 0, function* () {
|
|
140
152
|
let redisClient = null;
|
|
153
|
+
// Try to get Redis client (use default client)
|
|
141
154
|
try {
|
|
142
155
|
redisClient = redisService.getClient();
|
|
143
156
|
}
|
|
@@ -146,7 +159,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.SCHEDULE_ENABLED) &&
|
|
|
146
159
|
}
|
|
147
160
|
return {
|
|
148
161
|
redisClient,
|
|
149
|
-
defaultTtl: config.getNumber('REDIS_LOCK_TTL', 300000),
|
|
162
|
+
defaultTtl: config.getNumber('REDIS_LOCK_TTL', 300000), // 5 minutes
|
|
150
163
|
defaultKeyPrefix: config.getString('REDIS_LOCK_KEY_PREFIX', 'lock'),
|
|
151
164
|
defaultRetryCount: config.getNumber('REDIS_LOCK_RETRY_COUNT', 3),
|
|
152
165
|
defaultRetryDelay: config.getNumber('REDIS_LOCK_RETRY_DELAY', 200),
|
|
@@ -99,15 +99,19 @@ let ApiConfigService = ApiConfigService_1 = class ApiConfigService {
|
|
|
99
99
|
if (!origin) {
|
|
100
100
|
return callback(null, true);
|
|
101
101
|
}
|
|
102
|
+
// 支持通配符匹配逻辑
|
|
102
103
|
const isAllowed = allowedDomains.some((domain) => {
|
|
104
|
+
// 处理包含通配符的情况(如 *.example.com)
|
|
103
105
|
if (domain.includes('*')) {
|
|
106
|
+
// 将通配符转换为正则表达式
|
|
104
107
|
const regexPattern = domain
|
|
105
108
|
.replace(/\./g, '\\.')
|
|
106
|
-
.replace(':*', '(:\\d+)?')
|
|
109
|
+
.replace(':*', '(:\\d+)?') // 处理端口通配符
|
|
107
110
|
.replace('*\\.', '(.*\\.)?');
|
|
108
111
|
const fullRegex = new RegExp(`^https?:\/\/${regexPattern}$`, 'i');
|
|
109
112
|
return fullRegex.test(origin);
|
|
110
113
|
}
|
|
114
|
+
// 完全匹配(包含端口匹配)
|
|
111
115
|
return origin === domain || origin.startsWith(`${domain}:`);
|
|
112
116
|
});
|
|
113
117
|
isAllowed
|
|
@@ -160,6 +164,9 @@ let ApiConfigService = ApiConfigService_1 = class ApiConfigService {
|
|
|
160
164
|
db: this.getNumber('REDIS_DB'),
|
|
161
165
|
};
|
|
162
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* 是否使用Redis,用于health check
|
|
169
|
+
*/
|
|
163
170
|
get isRedisEnabled() {
|
|
164
171
|
return (this.getBoolean('BULL_ENABLED') ||
|
|
165
172
|
this.getBoolean('CACHE_ENABLED') ||
|
|
@@ -168,7 +175,9 @@ let ApiConfigService = ApiConfigService_1 = class ApiConfigService {
|
|
|
168
175
|
}
|
|
169
176
|
get bullConfig() {
|
|
170
177
|
return {
|
|
171
|
-
redis: Object.assign(Object.assign({}, this.ioRedisConfig), {
|
|
178
|
+
redis: Object.assign(Object.assign({}, this.ioRedisConfig), {
|
|
179
|
+
// 增加重连策略
|
|
180
|
+
retryStrategy: (times) => Math.min(times * 1000, 5000) }),
|
|
172
181
|
prefix: this.getString('BULL_PREFIX'),
|
|
173
182
|
defaultJobOptions: {
|
|
174
183
|
removeOnComplete: true,
|
|
@@ -178,16 +187,18 @@ let ApiConfigService = ApiConfigService_1 = class ApiConfigService {
|
|
|
178
187
|
type: 'exponential',
|
|
179
188
|
delay: this.getNumber('BULL_JOB_BACKOFF_DELAY_MS', 5000),
|
|
180
189
|
},
|
|
181
|
-
timeout: this.getNumber('BULL_JOB_TIMEOUT_MS', 30 * 1000),
|
|
190
|
+
timeout: this.getNumber('BULL_JOB_TIMEOUT_MS', 30 * 1000), // 默认30秒超时
|
|
182
191
|
},
|
|
183
192
|
settings: {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
193
|
+
// 增强稳定性配置
|
|
194
|
+
maxStalledCount: 2, // 最大卡住重试次数
|
|
195
|
+
guardInterval: 5000, // 检查卡住任务间隔
|
|
196
|
+
retryProcessDelay: 1000, // 进程重启后的重试延迟
|
|
187
197
|
},
|
|
198
|
+
// 增加队列级限流配置
|
|
188
199
|
limiter: {
|
|
189
|
-
max: this.getNumber('BULL_MAX_CONCURRENT_JOBS', 100),
|
|
190
|
-
duration: 1000,
|
|
200
|
+
max: this.getNumber('BULL_MAX_CONCURRENT_JOBS', 100), // 最大并发任务数
|
|
201
|
+
duration: 1000, // 时间窗口
|
|
191
202
|
},
|
|
192
203
|
};
|
|
193
204
|
}
|
|
@@ -275,7 +286,7 @@ let ApiConfigService = ApiConfigService_1 = class ApiConfigService {
|
|
|
275
286
|
if (defaultValue !== undefined) {
|
|
276
287
|
return defaultValue;
|
|
277
288
|
}
|
|
278
|
-
throw new Error(`key:'${key}' - environment does not set`);
|
|
289
|
+
throw new Error(`key:'${key}' - environment does not set`); // probably we should call process.exit() too to avoid locking the service
|
|
279
290
|
}
|
|
280
291
|
return value;
|
|
281
292
|
}
|
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import { ReferenceObject, SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
|
|
2
2
|
import 'reflect-metadata';
|
|
3
3
|
import { IOptions } from './options';
|
|
4
|
+
/**
|
|
5
|
+
* Either a plain JSON Schema object that gets merged into the existing schema,
|
|
6
|
+
* or a function that receives as parameters the existing schema and global
|
|
7
|
+
* options, returning an updated schema.
|
|
8
|
+
*/
|
|
4
9
|
export type DecoratorSchema = ReferenceObject | SchemaObject | ((source: SchemaObject, options: IOptions) => ReferenceObject | SchemaObject);
|
|
10
|
+
/**
|
|
11
|
+
* Supplement class or property with additional JSON Schema keywords.
|
|
12
|
+
*
|
|
13
|
+
* @param schema JSON Schema object that is merged into the schema derived from
|
|
14
|
+
* class-validator decorators. In case of conflicts, keywords defined here
|
|
15
|
+
* overwrite the existing ones. Alternatively you can supply a function that
|
|
16
|
+
* receives as parameters the existing schema and global options, returning an
|
|
17
|
+
* updated schema.
|
|
18
|
+
*/
|
|
5
19
|
export declare function JSONSchema(schema: DecoratorSchema): (target: object | Function, key?: string) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Get the JSON Schema stored in given target's metadata.
|
|
22
|
+
*/
|
|
6
23
|
export declare function getMetadataSchema(target: object | Function, key: string): DecoratorSchema;
|
|
@@ -4,19 +4,34 @@ exports.JSONSchema = JSONSchema;
|
|
|
4
4
|
exports.getMetadataSchema = getMetadataSchema;
|
|
5
5
|
require("reflect-metadata");
|
|
6
6
|
const SCHEMA_KEY = Symbol('class-validator-jsonschema:JSONSchema');
|
|
7
|
+
/**
|
|
8
|
+
* Supplement class or property with additional JSON Schema keywords.
|
|
9
|
+
*
|
|
10
|
+
* @param schema JSON Schema object that is merged into the schema derived from
|
|
11
|
+
* class-validator decorators. In case of conflicts, keywords defined here
|
|
12
|
+
* overwrite the existing ones. Alternatively you can supply a function that
|
|
13
|
+
* receives as parameters the existing schema and global options, returning an
|
|
14
|
+
* updated schema.
|
|
15
|
+
*/
|
|
7
16
|
function JSONSchema(schema) {
|
|
8
17
|
return (target, key) => {
|
|
9
18
|
if (key) {
|
|
10
|
-
setMetadataSchema(schema, target.constructor, key);
|
|
19
|
+
setMetadataSchema(schema, target.constructor, key); // Property metadata
|
|
11
20
|
}
|
|
12
21
|
else {
|
|
13
|
-
setMetadataSchema(schema, target, target.name);
|
|
22
|
+
setMetadataSchema(schema, target, target.name); // Class metadata
|
|
14
23
|
}
|
|
15
24
|
};
|
|
16
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Get the JSON Schema stored in given target's metadata.
|
|
28
|
+
*/
|
|
17
29
|
function getMetadataSchema(target, key) {
|
|
18
30
|
return Reflect.getMetadata(SCHEMA_KEY, target.constructor, key) || {};
|
|
19
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Store given JSON Schema into target object's metadata.
|
|
34
|
+
*/
|
|
20
35
|
function setMetadataSchema(value, target, key) {
|
|
21
36
|
return Reflect.defineMetadata(SCHEMA_KEY, value, target, key);
|
|
22
37
|
}
|
|
@@ -2,5 +2,11 @@ import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMet
|
|
|
2
2
|
import { IOptions } from './options';
|
|
3
3
|
import { I18nService } from 'nestjs-i18n';
|
|
4
4
|
export { JSONSchema } from './decorators';
|
|
5
|
+
/**
|
|
6
|
+
* Convert an array of class-validator metadata into JSON Schema definitions.
|
|
7
|
+
*/
|
|
5
8
|
export declare function validationMetadataArrayToSchemas(metadatas: ValidationMetadata[], i18n: any, userOptions?: Partial<IOptions>): any;
|
|
9
|
+
/**
|
|
10
|
+
* Generate JSON Schema definitions from the target object constructor.
|
|
11
|
+
*/
|
|
6
12
|
export declare function targetConstructorToSchema(targetConstructor: Function, i18n: I18nService, userOptions?: Partial<IOptions>): any;
|
|
@@ -9,6 +9,9 @@ const defaultConverters_1 = require("./defaultConverters");
|
|
|
9
9
|
const options_1 = require("./options");
|
|
10
10
|
var decorators_1 = require("./decorators");
|
|
11
11
|
Object.defineProperty(exports, "JSONSchema", { enumerable: true, get: function () { return decorators_1.JSONSchema; } });
|
|
12
|
+
/**
|
|
13
|
+
* Convert an array of class-validator metadata into JSON Schema definitions.
|
|
14
|
+
*/
|
|
12
15
|
function validationMetadataArrayToSchemas(metadatas, i18n, userOptions) {
|
|
13
16
|
const options = Object.assign(Object.assign({}, options_1.defaultOptions), userOptions);
|
|
14
17
|
const rules = [];
|
|
@@ -46,6 +49,9 @@ function getFirstNonNullDataType(data) {
|
|
|
46
49
|
}
|
|
47
50
|
return undefined;
|
|
48
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Generate JSON Schema definitions from the target object constructor.
|
|
54
|
+
*/
|
|
49
55
|
function targetConstructorToSchema(targetConstructor, i18n, userOptions) {
|
|
50
56
|
const options = Object.assign(Object.assign({}, options_1.defaultOptions), userOptions);
|
|
51
57
|
const storage = options.classValidatorMetadataStorage;
|
|
@@ -64,6 +70,15 @@ function populateMetadatasWithConstraints(storage, metadatas) {
|
|
|
64
70
|
return Object.assign({}, meta);
|
|
65
71
|
});
|
|
66
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Return target class' inherited validation metadatas, with original metadatas
|
|
75
|
+
* given precedence over inherited ones in case of duplicates.
|
|
76
|
+
*
|
|
77
|
+
* Adapted from `class-validator` source.
|
|
78
|
+
*
|
|
79
|
+
* @param target Target child class.
|
|
80
|
+
* @param metadatas All class-validator metadata objects.
|
|
81
|
+
*/
|
|
67
82
|
function getInheritedMetadatas(target, metadatas) {
|
|
68
83
|
return metadatas.filter((d) => d.target instanceof Function &&
|
|
69
84
|
target.prototype instanceof d.target &&
|
|
@@ -71,6 +86,9 @@ function getInheritedMetadatas(target, metadatas) {
|
|
|
71
86
|
m.target === target &&
|
|
72
87
|
m.type === d.type));
|
|
73
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Convert a property's class-validator metadata into a JSON Schema property.
|
|
91
|
+
*/
|
|
74
92
|
function applyConverters(propertyMetadatas, options, i18n) {
|
|
75
93
|
const converters = Object.assign(Object.assign({}, defaultConverters_1.defaultConverters), options.additionalConverters);
|
|
76
94
|
const convert = (meta) => {
|
|
@@ -83,12 +101,13 @@ function applyConverters(propertyMetadatas, options, i18n) {
|
|
|
83
101
|
const converterResult = typeof converter === 'function' ? converter(meta, options) : converter;
|
|
84
102
|
const items = {};
|
|
85
103
|
let message = '';
|
|
104
|
+
// @ts-ignore
|
|
86
105
|
const originMessage = typeof meta.message === 'function'
|
|
87
106
|
? meta.message({
|
|
88
|
-
value: undefined,
|
|
107
|
+
value: undefined, // We don't have the actual value in this context
|
|
89
108
|
constraints: meta.constraints,
|
|
90
109
|
targetName: meta.target.name || '',
|
|
91
|
-
object: {},
|
|
110
|
+
object: {}, // We don't have the actual object in this context
|
|
92
111
|
property: meta.propertyName,
|
|
93
112
|
})
|
|
94
113
|
: meta.message;
|
|
@@ -109,15 +128,23 @@ function applyConverters(propertyMetadatas, options, i18n) {
|
|
|
109
128
|
}
|
|
110
129
|
return meta.each ? { items, type: 'array' } : items;
|
|
111
130
|
};
|
|
131
|
+
// const constraints = [];
|
|
112
132
|
const constraints = propertyMetadatas.map((meta) => {
|
|
113
133
|
return convert(meta);
|
|
114
134
|
});
|
|
115
135
|
return (0, lodash_1.reject)(constraints, (item) => (0, lodash_1.isEmpty)(item));
|
|
116
136
|
}
|
|
137
|
+
/** Check whether property is excluded with class-transformer `@Exclude` decorator. */
|
|
117
138
|
function isExcluded(propertyMetadata, options) {
|
|
118
139
|
var _a;
|
|
119
140
|
return !!((_a = options.classTransformerMetadataStorage) === null || _a === void 0 ? void 0 : _a.findExcludeMetadata(propertyMetadata.target, propertyMetadata.propertyName));
|
|
120
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Get the required property names of a validated class.
|
|
144
|
+
* @param target Validation target class.
|
|
145
|
+
* @param metadatas Validation metadata objects of the validated class.
|
|
146
|
+
* @param options Global class-validator options.
|
|
147
|
+
*/
|
|
121
148
|
function getRequiredPropNames(target, metadatas, options) {
|
|
122
149
|
function isDefined(metas) {
|
|
123
150
|
return (metas && metas.some(({ type }) => type === cv.ValidationTypes.IS_DEFINED));
|
|
@@ -127,6 +154,7 @@ function getRequiredPropNames(target, metadatas, options) {
|
|
|
127
154
|
metas.some(({ type }) => [cv.ValidationTypes.CONDITIONAL_VALIDATION, cv.IS_EMPTY].includes(type)));
|
|
128
155
|
}
|
|
129
156
|
return (Object.entries((0, lodash_1.groupBy)(metadatas, (m) => m.propertyName))
|
|
157
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
130
158
|
.filter(([_, metas]) => {
|
|
131
159
|
const own = metas.filter((m) => m.target === target);
|
|
132
160
|
const inherited = metas.filter((m) => m.target !== target);
|
|
@@ -2,10 +2,33 @@ import type { MetadataStorage as ClassTransformerMetadataStorage } from 'class-t
|
|
|
2
2
|
import { MetadataStorage, ValidatorOptions } from 'class-validator';
|
|
3
3
|
import { ISchemaConverters } from './defaultConverters';
|
|
4
4
|
export interface IOptions extends ValidatorOptions {
|
|
5
|
+
/**
|
|
6
|
+
* A map of additional metadata-to-schema converters that can be used to
|
|
7
|
+
* supplement or override the default ones. The key should correspond to the
|
|
8
|
+
* 'type' property of a ValidationMetadata object.
|
|
9
|
+
*/
|
|
5
10
|
additionalConverters: ISchemaConverters;
|
|
11
|
+
/**
|
|
12
|
+
* Metadata storage instance of class-transformer. This value can be
|
|
13
|
+
* optionally defined in order for class-transformer's @Type decorators to
|
|
14
|
+
* have effect in JSON Schema generation.
|
|
15
|
+
*/
|
|
6
16
|
classTransformerMetadataStorage?: ClassTransformerMetadataStorage;
|
|
17
|
+
/**
|
|
18
|
+
* Metadata storage instance of class-validator. This value can be
|
|
19
|
+
* optionally defined in order to override the default storage used
|
|
20
|
+
* to parse decorator metadata.
|
|
21
|
+
*/
|
|
7
22
|
classValidatorMetadataStorage: MetadataStorage;
|
|
23
|
+
/**
|
|
24
|
+
* A prefix added to all `$ref` JSON pointers referencing other schemas.
|
|
25
|
+
* Defaults to '#/definitions/'.
|
|
26
|
+
*/
|
|
8
27
|
refPointerPrefix: string;
|
|
28
|
+
/**
|
|
29
|
+
* Property used to group schemas.
|
|
30
|
+
* Defaults to `name`, i.e., class name.
|
|
31
|
+
*/
|
|
9
32
|
schemaNameField: string;
|
|
10
33
|
}
|
|
11
34
|
export declare const defaultOptions: IOptions;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { ValidationOptions } from 'class-validator';
|
|
2
|
+
import { IsPhoneNumber as isPhoneNumber, ValidationArguments, ValidatorConstraintInterface } from 'class-validator';
|
|
3
|
+
/**
|
|
4
|
+
* 验证密码格式(只允许字母、数字和特定特殊字符)
|
|
5
|
+
*
|
|
6
|
+
* @param validationOptions 验证选项
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* class UserDto {
|
|
11
|
+
* @IsPassword({ message: 'Invalid password format' })
|
|
12
|
+
* password: string;
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function IsPassword(validationOptions?: ValidationOptions): PropertyDecorator;
|
|
17
|
+
/**
|
|
18
|
+
* 验证手机号码(支持指定国家/地区)
|
|
19
|
+
*
|
|
20
|
+
* @param validationOptions 验证选项,可以指定 region
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* class ContactDto {
|
|
25
|
+
* @IsPhoneNumber({ region: 'CN' })
|
|
26
|
+
* phone: string;
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function IsPhoneNumber(validationOptions?: ValidationOptions & {
|
|
31
|
+
region?: Parameters<typeof isPhoneNumber>[0];
|
|
32
|
+
}): PropertyDecorator;
|
|
33
|
+
/**
|
|
34
|
+
* 验证临时文件路径(必须以 tmp/ 开头)
|
|
35
|
+
*
|
|
36
|
+
* @param validationOptions 验证选项
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* class FileDto {
|
|
41
|
+
* @IsTmpKey()
|
|
42
|
+
* filePath: string; // 必须是 'tmp/...'
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function IsTmpKey(validationOptions?: ValidationOptions): PropertyDecorator;
|
|
47
|
+
/**
|
|
48
|
+
* 允许字段为 undefined,如果不是 undefined 才执行其他验证
|
|
49
|
+
*
|
|
50
|
+
* @param options 验证选项
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* class UserDto {
|
|
55
|
+
* @IsUndefinable()
|
|
56
|
+
* @IsString()
|
|
57
|
+
* nickname?: string; // undefined 或字符串
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function IsUndefinable(options?: ValidationOptions): PropertyDecorator;
|
|
62
|
+
/**
|
|
63
|
+
* 允许字段为空值(null、undefined 或空字符串),如果不为空才执行其他验证
|
|
64
|
+
*
|
|
65
|
+
* @param options 验证选项
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* class UserDto {
|
|
70
|
+
* @IsEmptyable()
|
|
71
|
+
* @IsEmail()
|
|
72
|
+
* email?: string; // 可以为空,或者必须是有效邮箱
|
|
73
|
+
* }
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function IsEmptyable(options?: ValidationOptions): PropertyDecorator;
|
|
77
|
+
/**
|
|
78
|
+
* 允许字段为 null,如果不是 null 才执行其他验证
|
|
79
|
+
*
|
|
80
|
+
* @param options 验证选项
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* class UserDto {
|
|
85
|
+
* @IsNullable()
|
|
86
|
+
* @IsNumber()
|
|
87
|
+
* age?: number | null; // null 或数字
|
|
88
|
+
* }
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function IsNullable(options?: ValidationOptions): PropertyDecorator;
|
|
92
|
+
/**
|
|
93
|
+
* 验证 HTTP/HTTPS URL
|
|
94
|
+
*
|
|
95
|
+
* @param validationOptions 验证选项
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* class WebsiteDto {
|
|
100
|
+
* @IsHttpUrl({ message: 'Invalid URL' })
|
|
101
|
+
* url: string;
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare function IsHttpUrl(validationOptions?: ValidationOptions): (object: any, propertyName: string) => void;
|
|
106
|
+
/**
|
|
107
|
+
* Validator constraint for AtLeastOneField decorator
|
|
108
|
+
*/
|
|
109
|
+
export declare class AtLeastOneFieldConstraint implements ValidatorConstraintInterface {
|
|
110
|
+
validate(value: any, args: ValidationArguments): boolean;
|
|
111
|
+
defaultMessage(args: ValidationArguments): string;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 验证至少提供指定字段中的一个
|
|
115
|
+
*
|
|
116
|
+
* @param properties 要检查的属性名数组
|
|
117
|
+
* @param validationOptions 验证选项
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* class ContactDto {
|
|
122
|
+
* @AtLeastOneField(['email', 'phone'], {
|
|
123
|
+
* message: 'Either email or phone must be provided'
|
|
124
|
+
* })
|
|
125
|
+
* email?: string;
|
|
126
|
+
*
|
|
127
|
+
* phone?: string;
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* 使用虚拟字段(推荐用于类级别验证):
|
|
133
|
+
* ```typescript
|
|
134
|
+
* class ContactDto {
|
|
135
|
+
* @AtLeastOneField(['email', 'phone'])
|
|
136
|
+
* _atLeastOne: any; // 虚拟字段用于验证
|
|
137
|
+
*
|
|
138
|
+
* email?: string;
|
|
139
|
+
* phone?: string;
|
|
140
|
+
* }
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
export declare function AtLeastOneField(properties: string[], validationOptions?: ValidationOptions): PropertyDecorator;
|