@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.
Files changed (249) hide show
  1. package/audit/audit.module.d.ts +10 -0
  2. package/audit/audit.module.js +39 -1
  3. package/audit/controllers/audit.controller.d.ts +24 -0
  4. package/audit/controllers/audit.controller.js +24 -0
  5. package/audit/decorators/audit-controller.decorator.d.ts +9 -1
  6. package/audit/decorators/audit-controller.decorator.js +11 -2
  7. package/audit/decorators/audit-operation.decorator.d.ts +45 -0
  8. package/audit/decorators/audit-operation.decorator.js +49 -0
  9. package/audit/decorators/entity-audit.decorator.d.ts +76 -1
  10. package/audit/decorators/entity-audit.decorator.js +135 -3
  11. package/audit/decorators/index.d.ts +1 -0
  12. package/audit/decorators/index.js +1 -0
  13. package/audit/dto/audit-log-query.dto.d.ts +3 -0
  14. package/audit/dto/audit-log-query.dto.js +3 -0
  15. package/audit/dto/begin-transaction.dto.d.ts +3 -0
  16. package/audit/dto/begin-transaction.dto.js +3 -0
  17. package/audit/dto/compare-entities.dto.d.ts +3 -0
  18. package/audit/dto/compare-entities.dto.js +3 -0
  19. package/audit/dto/pre-check-restore.dto.d.ts +3 -0
  20. package/audit/dto/pre-check-restore.dto.js +3 -0
  21. package/audit/dto/restore-entity.dto.d.ts +3 -0
  22. package/audit/dto/restore-entity.dto.js +3 -0
  23. package/audit/entities/entity-audit-log.entity.d.ts +8 -0
  24. package/audit/entities/entity-audit-log.entity.js +33 -1
  25. package/audit/entities/entity-transaction.entity.d.ts +10 -0
  26. package/audit/entities/entity-transaction.entity.js +33 -1
  27. package/audit/entities/index.d.ts +2 -0
  28. package/audit/entities/index.js +2 -0
  29. package/audit/entities/manual-operation-log.entity.d.ts +4 -0
  30. package/audit/entities/manual-operation-log.entity.js +4 -0
  31. package/audit/entities/operation-template.entity.d.ts +4 -0
  32. package/audit/entities/operation-template.entity.js +4 -0
  33. package/audit/enums/audit.enums.d.ts +45 -5
  34. package/audit/enums/audit.enums.js +47 -4
  35. package/audit/index.d.ts +3 -1
  36. package/audit/index.js +30 -1
  37. package/audit/interceptors/audit.interceptor.d.ts +15 -0
  38. package/audit/interceptors/audit.interceptor.js +23 -1
  39. package/audit/interfaces/audit.interfaces.d.ts +182 -2
  40. package/audit/services/audit-context.service.d.ts +15 -0
  41. package/audit/services/audit-context.service.js +15 -0
  42. package/audit/services/audit-strategy.service.d.ts +6 -0
  43. package/audit/services/audit-strategy.service.js +13 -0
  44. package/audit/services/entity-audit.service.d.ts +129 -3
  45. package/audit/services/entity-audit.service.js +301 -6
  46. package/audit/services/index.d.ts +2 -0
  47. package/audit/services/index.js +2 -0
  48. package/audit/services/manual-audit-log.service.d.ts +124 -0
  49. package/audit/services/manual-audit-log.service.js +138 -0
  50. package/audit/services/multi-database.service.d.ts +12 -0
  51. package/audit/services/multi-database.service.js +12 -0
  52. package/audit/services/operation-description.service.d.ts +59 -0
  53. package/audit/services/operation-description.service.js +76 -2
  54. package/audit/services/transaction-audit.service.d.ts +30 -0
  55. package/audit/services/transaction-audit.service.js +47 -0
  56. package/audit/subscribers/entity-audit.subscriber.d.ts +15 -0
  57. package/audit/subscribers/entity-audit.subscriber.js +29 -1
  58. package/cache/cache-metrics.service.d.ts +67 -0
  59. package/cache/cache-metrics.service.js +68 -4
  60. package/cache/cache-serialization.service.d.ts +31 -0
  61. package/cache/cache-serialization.service.js +25 -0
  62. package/cache/cache.constants.d.ts +9 -0
  63. package/cache/cache.constants.js +9 -0
  64. package/cache/cache.health.d.ts +26 -0
  65. package/cache/cache.health.js +30 -0
  66. package/cache/cache.module.d.ts +86 -0
  67. package/cache/cache.module.js +71 -0
  68. package/cache/cache.service.d.ts +140 -0
  69. package/cache/cache.service.js +157 -0
  70. package/cache/cache.warmup.service.d.ts +39 -0
  71. package/cache/cache.warmup.service.js +32 -0
  72. package/cache/decorators/cache-evict.decorator.d.ts +47 -0
  73. package/cache/decorators/cache-evict.decorator.js +56 -0
  74. package/cache/decorators/cache-put.decorator.d.ts +34 -0
  75. package/cache/decorators/cache-put.decorator.js +39 -0
  76. package/cache/decorators/cacheable.decorator.d.ts +40 -0
  77. package/cache/decorators/cacheable.decorator.js +55 -0
  78. package/cache/dependencies/callback.dependency.d.ts +33 -0
  79. package/cache/dependencies/callback.dependency.js +39 -1
  80. package/cache/dependencies/chain.dependency.d.ts +28 -0
  81. package/cache/dependencies/chain.dependency.js +34 -0
  82. package/cache/dependencies/db.dependency.d.ts +45 -0
  83. package/cache/dependencies/db.dependency.js +48 -1
  84. package/cache/dependencies/file.dependency.d.ts +32 -0
  85. package/cache/dependencies/file.dependency.js +34 -0
  86. package/cache/dependencies/tag.dependency.d.ts +36 -0
  87. package/cache/dependencies/tag.dependency.js +36 -0
  88. package/cache/dependencies/time.dependency.d.ts +43 -0
  89. package/cache/dependencies/time.dependency.js +43 -0
  90. package/cache/examples/basic-usage.d.ts +15 -0
  91. package/cache/examples/basic-usage.js +62 -8
  92. package/cache/index.js +9 -0
  93. package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
  94. package/cache/interfaces/cache-options.interface.d.ts +81 -0
  95. package/cache/interfaces/cache-options.interface.js +6 -0
  96. package/cache/interfaces/cache-provider.interface.d.ts +78 -0
  97. package/cache/providers/base-cache.provider.d.ts +14 -0
  98. package/cache/providers/base-cache.provider.js +16 -0
  99. package/cache/providers/cls-cache.provider.d.ts +20 -0
  100. package/cache/providers/cls-cache.provider.js +28 -0
  101. package/cache/providers/memory-cache.provider.d.ts +23 -0
  102. package/cache/providers/memory-cache.provider.js +26 -0
  103. package/cache/providers/redis-cache.provider.d.ts +26 -0
  104. package/cache/providers/redis-cache.provider.js +29 -0
  105. package/cache/utils/dependency-manager.util.d.ts +52 -0
  106. package/cache/utils/dependency-manager.util.js +59 -0
  107. package/cache/utils/key-generator.util.d.ts +42 -0
  108. package/cache/utils/key-generator.util.js +53 -1
  109. package/common/abstract.entity.d.ts +14 -0
  110. package/common/abstract.entity.js +14 -0
  111. package/common/boilerplate.polyfill.d.ts +142 -4
  112. package/common/boilerplate.polyfill.js +24 -100
  113. package/common/dto/dto-container.d.ts +16 -0
  114. package/common/dto/dto-container.js +20 -0
  115. package/common/dto/dto-decorators.d.ts +18 -0
  116. package/common/dto/dto-decorators.js +14 -0
  117. package/common/dto/dto-extensions.d.ts +11 -0
  118. package/common/dto/dto-extensions.js +9 -0
  119. package/common/dto/dto-service-accessor.d.ts +17 -0
  120. package/common/dto/dto-service-accessor.js +18 -0
  121. package/common/dto/dto-transformer.d.ts +12 -0
  122. package/common/dto/dto-transformer.js +9 -0
  123. package/common/dto/index.js +2 -0
  124. package/common/examples/paginate-and-map.example.d.ts +6 -0
  125. package/common/examples/paginate-and-map.example.js +26 -0
  126. package/common/utils.d.ts +15 -0
  127. package/common/utils.js +15 -0
  128. package/constants/language-code.js +1 -0
  129. package/decorators/field.decorators.js +8 -1
  130. package/decorators/property.decorators.js +1 -0
  131. package/decorators/public-route.decorator.js +1 -0
  132. package/decorators/transform.decorators.d.ts +27 -0
  133. package/decorators/transform.decorators.js +29 -0
  134. package/decorators/translate.decorator.js +1 -0
  135. package/decorators/user.decorator.js +1 -0
  136. package/decorators/validator.decorators.d.ts +8 -18
  137. package/decorators/validator.decorators.js +22 -190
  138. package/filters/constraint-errors.js +1 -0
  139. package/helpers/common.helper.d.ts +13 -0
  140. package/helpers/common.helper.js +13 -0
  141. package/http-client/config/http-client.config.d.ts +15 -0
  142. package/http-client/config/http-client.config.js +25 -9
  143. package/http-client/decorators/http-client.decorators.d.ts +63 -0
  144. package/http-client/decorators/http-client.decorators.js +71 -3
  145. package/http-client/entities/http-log.entity.d.ts +229 -0
  146. package/http-client/entities/http-log.entity.js +6 -1
  147. package/http-client/errors/http-client.errors.d.ts +57 -0
  148. package/http-client/errors/http-client.errors.js +58 -0
  149. package/http-client/examples/advanced-usage.example.d.ts +41 -0
  150. package/http-client/examples/advanced-usage.example.js +68 -24
  151. package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
  152. package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
  153. package/http-client/examples/basic-usage.example.d.ts +60 -0
  154. package/http-client/examples/basic-usage.example.js +60 -0
  155. package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
  156. package/http-client/examples/multi-api-configuration.example.js +76 -5
  157. package/http-client/http-client.module.d.ts +13 -0
  158. package/http-client/http-client.module.js +20 -5
  159. package/http-client/index.js +8 -0
  160. package/http-client/interfaces/api-client-config.interface.d.ts +125 -0
  161. package/http-client/interfaces/api-client-config.interface.js +3 -0
  162. package/http-client/interfaces/http-client-config.interface.d.ts +60 -0
  163. package/http-client/services/api-client-registry.service.d.ts +57 -0
  164. package/http-client/services/api-client-registry.service.js +84 -1
  165. package/http-client/services/cache.service.d.ts +52 -0
  166. package/http-client/services/cache.service.js +72 -3
  167. package/http-client/services/circuit-breaker.service.d.ts +46 -0
  168. package/http-client/services/circuit-breaker.service.js +52 -0
  169. package/http-client/services/http-client.service.d.ts +67 -0
  170. package/http-client/services/http-client.service.js +105 -4
  171. package/http-client/services/http-log-query.service.d.ts +83 -0
  172. package/http-client/services/http-log-query.service.js +122 -1
  173. package/http-client/services/http-replay.service.d.ts +101 -0
  174. package/http-client/services/http-replay.service.js +86 -0
  175. package/http-client/services/log-cleanup.service.d.ts +63 -0
  176. package/http-client/services/log-cleanup.service.js +54 -2
  177. package/http-client/services/logging.service.d.ts +40 -0
  178. package/http-client/services/logging.service.js +53 -0
  179. package/http-client/utils/call-stack-extractor.util.d.ts +37 -0
  180. package/http-client/utils/call-stack-extractor.util.js +48 -0
  181. package/http-client/utils/context-extractor.util.d.ts +49 -0
  182. package/http-client/utils/context-extractor.util.js +52 -0
  183. package/http-client/utils/curl-generator.util.d.ts +21 -0
  184. package/http-client/utils/curl-generator.util.js +44 -3
  185. package/http-client/utils/request-id.util.d.ts +18 -0
  186. package/http-client/utils/request-id.util.js +20 -0
  187. package/http-client/utils/retry-recorder.util.d.ts +42 -0
  188. package/http-client/utils/retry-recorder.util.js +44 -0
  189. package/i18n/en_US/validation.json +2 -1
  190. package/i18n/zh_CN/validation.json +2 -1
  191. package/index.js +8 -0
  192. package/interceptors/translation-interceptor.service.js +5 -0
  193. package/package.json +1 -1
  194. package/providers/context.provider.js +2 -0
  195. package/providers/generator.provider.d.ts +4 -0
  196. package/providers/generator.provider.js +4 -0
  197. package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
  198. package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
  199. package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
  200. package/redis-lock/examples/lock-strategy.examples.js +130 -15
  201. package/redis-lock/index.d.ts +2 -0
  202. package/redis-lock/index.js +8 -1
  203. package/redis-lock/lock-heartbeat.service.d.ts +78 -0
  204. package/redis-lock/lock-heartbeat.service.js +222 -0
  205. package/redis-lock/redis-lock.decorator.d.ts +101 -0
  206. package/redis-lock/redis-lock.decorator.js +120 -0
  207. package/redis-lock/redis-lock.module.d.ts +66 -0
  208. package/redis-lock/redis-lock.module.js +175 -70
  209. package/redis-lock/redis-lock.service.d.ts +278 -0
  210. package/redis-lock/redis-lock.service.js +282 -12
  211. package/setup/bootstrap.setup.js +20 -0
  212. package/setup/mode.setup.d.ts +44 -0
  213. package/setup/mode.setup.js +44 -0
  214. package/setup/schedule.decorator.d.ts +227 -0
  215. package/setup/schedule.decorator.js +235 -12
  216. package/setup/worker.decorator.d.ts +86 -0
  217. package/setup/worker.decorator.js +88 -0
  218. package/shared/serviceRegistryModule.js +27 -14
  219. package/shared/services/api-config.service.d.ts +3 -0
  220. package/shared/services/api-config.service.js +20 -9
  221. package/validator-json/decorators.d.ts +17 -0
  222. package/validator-json/decorators.js +17 -2
  223. package/validator-json/default.d.ts +6 -0
  224. package/validator-json/default.js +30 -2
  225. package/validator-json/defaultConverters.js +1 -0
  226. package/validator-json/options.d.ts +23 -0
  227. package/validators/common-validators.d.ts +143 -0
  228. package/validators/common-validators.js +249 -0
  229. package/validators/custom-validate.examples.d.ts +96 -0
  230. package/validators/custom-validate.examples.js +400 -0
  231. package/validators/custom-validate.validator.d.ts +134 -0
  232. package/validators/custom-validate.validator.js +214 -0
  233. package/validators/index.d.ts +2 -0
  234. package/validators/index.js +2 -0
  235. package/validators/is-exists.validator.d.ts +18 -4
  236. package/validators/is-exists.validator.js +67 -6
  237. package/validators/is-unique.validator.d.ts +32 -5
  238. package/validators/is-unique.validator.js +99 -17
  239. package/validators/skip-empty.validator.d.ts +5 -0
  240. package/validators/skip-empty.validator.js +5 -0
  241. package/vault/interfaces/vault-options.interface.d.ts +9 -0
  242. package/vault/vault-config.loader.d.ts +30 -0
  243. package/vault/vault-config.loader.js +48 -1
  244. package/vault/vault-config.service.d.ts +53 -0
  245. package/vault/vault-config.service.js +57 -0
  246. package/vault/vault.module.d.ts +4 -0
  247. package/vault/vault.module.js +4 -0
  248. package/decorators/examples/validation-decorators.example.d.ts +0 -69
  249. package/decorators/examples/validation-decorators.example.js +0 -331
@@ -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) {
@@ -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);
@@ -14,6 +14,7 @@ function getOmniAuthData(request, key) {
14
14
  const headers = request.headers;
15
15
  let user;
16
16
  const configService = new config_1.ConfigService(request);
17
+ // 未通过网关透传用户信息且处于local开发环境,则从配置获取用户信息
17
18
  if ((0, lodash_1.isEmpty)(headers['x-user-id']) && (0, lodash_1.isEmpty)(headers['x-app-id'])) {
18
19
  if (process.env.NODE_ENV === 'dev' || process.env.MOCK_ENABLED === 'true') {
19
20
  user = {
@@ -1,18 +1,8 @@
1
- import type { ValidationOptions } from 'class-validator';
2
- import { IsPhoneNumber as isPhoneNumber, ValidationArguments, ValidatorConstraintInterface } from 'class-validator';
3
- export declare function IsPassword(validationOptions?: ValidationOptions): PropertyDecorator;
4
- export declare function IsPhoneNumber(validationOptions?: ValidationOptions & {
5
- region?: Parameters<typeof isPhoneNumber>[0];
6
- }): PropertyDecorator;
7
- export declare function IsTmpKey(validationOptions?: ValidationOptions): PropertyDecorator;
8
- export declare function IsUndefinable(options?: ValidationOptions): PropertyDecorator;
9
- export declare function IsEmptyable(options?: ValidationOptions): PropertyDecorator;
10
- export declare function IsNullable(options?: ValidationOptions): PropertyDecorator;
11
- export declare function IsHttpUrl(validationOptions?: ValidationOptions): (object: any, propertyName: string) => void;
12
- export declare class AtLeastOneFieldConstraint implements ValidatorConstraintInterface {
13
- validate(value: any, args: ValidationArguments): boolean;
14
- defaultMessage(args: ValidationArguments): string;
15
- }
16
- export declare function AtLeastOneField(properties: string[], validationOptions?: ValidationOptions): PropertyDecorator;
17
- export declare function CustomValidation<T = any>(validationCallback: (value: T, args: ValidationArguments) => boolean | Promise<boolean>, validationOptions?: ValidationOptions): PropertyDecorator;
18
- export declare function CustomValidationMethod(methodName: string, validationOptions?: ValidationOptions): PropertyDecorator;
1
+ /**
2
+ * Validator decorators
3
+ *
4
+ * 所有验证装饰器已迁移到 validators 目录
5
+ * 此文件仅用于重新导出,保持导入路径的一致性
6
+ */
7
+ export * from '../validators/common-validators';
8
+ export * from '../validators/custom-validate.validator';