@nest-omni/core 4.1.3-2 → 4.1.3-3

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 (235) hide show
  1. package/audit/audit.module.d.ts +10 -0
  2. package/audit/audit.module.js +15 -0
  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 +8 -0
  6. package/audit/decorators/audit-controller.decorator.js +9 -0
  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 +8 -0
  10. package/audit/decorators/entity-audit.decorator.js +9 -0
  11. package/audit/dto/audit-log-query.dto.d.ts +3 -0
  12. package/audit/dto/audit-log-query.dto.js +3 -0
  13. package/audit/dto/begin-transaction.dto.d.ts +3 -0
  14. package/audit/dto/begin-transaction.dto.js +3 -0
  15. package/audit/dto/compare-entities.dto.d.ts +3 -0
  16. package/audit/dto/compare-entities.dto.js +3 -0
  17. package/audit/dto/pre-check-restore.dto.d.ts +3 -0
  18. package/audit/dto/pre-check-restore.dto.js +3 -0
  19. package/audit/dto/restore-entity.dto.d.ts +3 -0
  20. package/audit/dto/restore-entity.dto.js +3 -0
  21. package/audit/entities/entity-audit-log.entity.d.ts +3 -0
  22. package/audit/entities/entity-audit-log.entity.js +3 -0
  23. package/audit/entities/entity-transaction.entity.d.ts +3 -0
  24. package/audit/entities/entity-transaction.entity.js +3 -0
  25. package/audit/entities/manual-operation-log.entity.d.ts +4 -0
  26. package/audit/entities/manual-operation-log.entity.js +4 -0
  27. package/audit/entities/operation-template.entity.d.ts +4 -0
  28. package/audit/entities/operation-template.entity.js +4 -0
  29. package/audit/enums/audit.enums.d.ts +17 -2
  30. package/audit/enums/audit.enums.js +15 -0
  31. package/audit/index.js +10 -0
  32. package/audit/interceptors/audit.interceptor.d.ts +15 -0
  33. package/audit/interceptors/audit.interceptor.js +23 -1
  34. package/audit/interfaces/audit.interfaces.d.ts +42 -0
  35. package/audit/services/audit-context.service.d.ts +15 -0
  36. package/audit/services/audit-context.service.js +15 -0
  37. package/audit/services/audit-strategy.service.d.ts +6 -0
  38. package/audit/services/audit-strategy.service.js +13 -0
  39. package/audit/services/entity-audit.service.d.ts +57 -0
  40. package/audit/services/entity-audit.service.js +91 -0
  41. package/audit/services/manual-audit-log.service.d.ts +124 -0
  42. package/audit/services/manual-audit-log.service.js +138 -0
  43. package/audit/services/multi-database.service.d.ts +12 -0
  44. package/audit/services/multi-database.service.js +12 -0
  45. package/audit/services/operation-description.service.d.ts +59 -0
  46. package/audit/services/operation-description.service.js +76 -2
  47. package/audit/services/transaction-audit.service.d.ts +30 -0
  48. package/audit/services/transaction-audit.service.js +47 -0
  49. package/audit/subscribers/entity-audit.subscriber.d.ts +15 -0
  50. package/audit/subscribers/entity-audit.subscriber.js +29 -1
  51. package/cache/cache-metrics.service.d.ts +67 -0
  52. package/cache/cache-metrics.service.js +68 -4
  53. package/cache/cache-serialization.service.d.ts +31 -0
  54. package/cache/cache-serialization.service.js +25 -0
  55. package/cache/cache.constants.d.ts +9 -0
  56. package/cache/cache.constants.js +9 -0
  57. package/cache/cache.health.d.ts +26 -0
  58. package/cache/cache.health.js +30 -0
  59. package/cache/cache.module.d.ts +86 -0
  60. package/cache/cache.module.js +71 -0
  61. package/cache/cache.service.d.ts +140 -0
  62. package/cache/cache.service.js +157 -0
  63. package/cache/cache.warmup.service.d.ts +39 -0
  64. package/cache/cache.warmup.service.js +32 -0
  65. package/cache/decorators/cache-evict.decorator.d.ts +47 -0
  66. package/cache/decorators/cache-evict.decorator.js +56 -0
  67. package/cache/decorators/cache-put.decorator.d.ts +34 -0
  68. package/cache/decorators/cache-put.decorator.js +39 -0
  69. package/cache/decorators/cacheable.decorator.d.ts +40 -0
  70. package/cache/decorators/cacheable.decorator.js +55 -0
  71. package/cache/dependencies/callback.dependency.d.ts +33 -0
  72. package/cache/dependencies/callback.dependency.js +39 -1
  73. package/cache/dependencies/chain.dependency.d.ts +28 -0
  74. package/cache/dependencies/chain.dependency.js +34 -0
  75. package/cache/dependencies/db.dependency.d.ts +45 -0
  76. package/cache/dependencies/db.dependency.js +48 -1
  77. package/cache/dependencies/file.dependency.d.ts +32 -0
  78. package/cache/dependencies/file.dependency.js +34 -0
  79. package/cache/dependencies/tag.dependency.d.ts +36 -0
  80. package/cache/dependencies/tag.dependency.js +36 -0
  81. package/cache/dependencies/time.dependency.d.ts +43 -0
  82. package/cache/dependencies/time.dependency.js +43 -0
  83. package/cache/examples/basic-usage.d.ts +15 -0
  84. package/cache/examples/basic-usage.js +62 -8
  85. package/cache/index.js +9 -0
  86. package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
  87. package/cache/interfaces/cache-options.interface.d.ts +81 -0
  88. package/cache/interfaces/cache-options.interface.js +6 -0
  89. package/cache/interfaces/cache-provider.interface.d.ts +78 -0
  90. package/cache/providers/base-cache.provider.d.ts +14 -0
  91. package/cache/providers/base-cache.provider.js +16 -0
  92. package/cache/providers/cls-cache.provider.d.ts +20 -0
  93. package/cache/providers/cls-cache.provider.js +28 -0
  94. package/cache/providers/memory-cache.provider.d.ts +23 -0
  95. package/cache/providers/memory-cache.provider.js +26 -0
  96. package/cache/providers/redis-cache.provider.d.ts +26 -0
  97. package/cache/providers/redis-cache.provider.js +29 -0
  98. package/cache/utils/dependency-manager.util.d.ts +52 -0
  99. package/cache/utils/dependency-manager.util.js +59 -0
  100. package/cache/utils/key-generator.util.d.ts +42 -0
  101. package/cache/utils/key-generator.util.js +53 -1
  102. package/common/abstract.entity.d.ts +14 -0
  103. package/common/abstract.entity.js +14 -0
  104. package/common/boilerplate.polyfill.d.ts +142 -0
  105. package/common/boilerplate.polyfill.js +17 -0
  106. package/common/dto/dto-container.d.ts +16 -0
  107. package/common/dto/dto-container.js +20 -0
  108. package/common/dto/dto-decorators.d.ts +18 -0
  109. package/common/dto/dto-decorators.js +14 -0
  110. package/common/dto/dto-extensions.d.ts +11 -0
  111. package/common/dto/dto-extensions.js +9 -0
  112. package/common/dto/dto-service-accessor.d.ts +17 -0
  113. package/common/dto/dto-service-accessor.js +18 -0
  114. package/common/dto/dto-transformer.d.ts +12 -0
  115. package/common/dto/dto-transformer.js +9 -0
  116. package/common/dto/index.js +2 -0
  117. package/common/examples/paginate-and-map.example.d.ts +6 -0
  118. package/common/examples/paginate-and-map.example.js +26 -0
  119. package/common/utils.d.ts +15 -0
  120. package/common/utils.js +15 -0
  121. package/constants/language-code.js +1 -0
  122. package/decorators/field.decorators.js +8 -1
  123. package/decorators/property.decorators.js +1 -0
  124. package/decorators/public-route.decorator.js +1 -0
  125. package/decorators/transform.decorators.d.ts +27 -0
  126. package/decorators/transform.decorators.js +29 -0
  127. package/decorators/translate.decorator.js +1 -0
  128. package/decorators/user.decorator.js +1 -0
  129. package/decorators/validator.decorators.d.ts +8 -18
  130. package/decorators/validator.decorators.js +22 -190
  131. package/filters/constraint-errors.js +1 -0
  132. package/helpers/common.helper.d.ts +13 -0
  133. package/helpers/common.helper.js +13 -0
  134. package/http-client/config/http-client.config.d.ts +15 -0
  135. package/http-client/config/http-client.config.js +25 -9
  136. package/http-client/decorators/http-client.decorators.d.ts +63 -0
  137. package/http-client/decorators/http-client.decorators.js +71 -3
  138. package/http-client/entities/http-log.entity.d.ts +229 -0
  139. package/http-client/entities/http-log.entity.js +6 -1
  140. package/http-client/errors/http-client.errors.d.ts +57 -0
  141. package/http-client/errors/http-client.errors.js +58 -0
  142. package/http-client/examples/advanced-usage.example.d.ts +41 -0
  143. package/http-client/examples/advanced-usage.example.js +68 -24
  144. package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
  145. package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
  146. package/http-client/examples/basic-usage.example.d.ts +60 -0
  147. package/http-client/examples/basic-usage.example.js +60 -0
  148. package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
  149. package/http-client/examples/multi-api-configuration.example.js +76 -5
  150. package/http-client/http-client.module.d.ts +13 -0
  151. package/http-client/http-client.module.js +19 -0
  152. package/http-client/index.js +8 -0
  153. package/http-client/interfaces/api-client-config.interface.d.ts +125 -0
  154. package/http-client/interfaces/api-client-config.interface.js +3 -0
  155. package/http-client/interfaces/http-client-config.interface.d.ts +60 -0
  156. package/http-client/services/api-client-registry.service.d.ts +57 -0
  157. package/http-client/services/api-client-registry.service.js +84 -1
  158. package/http-client/services/cache.service.d.ts +52 -0
  159. package/http-client/services/cache.service.js +72 -3
  160. package/http-client/services/circuit-breaker.service.d.ts +46 -0
  161. package/http-client/services/circuit-breaker.service.js +52 -0
  162. package/http-client/services/http-client.service.d.ts +67 -0
  163. package/http-client/services/http-client.service.js +105 -4
  164. package/http-client/services/http-log-query.service.d.ts +83 -0
  165. package/http-client/services/http-log-query.service.js +122 -1
  166. package/http-client/services/http-replay.service.d.ts +101 -0
  167. package/http-client/services/http-replay.service.js +86 -0
  168. package/http-client/services/log-cleanup.service.d.ts +63 -0
  169. package/http-client/services/log-cleanup.service.js +54 -2
  170. package/http-client/services/logging.service.d.ts +40 -0
  171. package/http-client/services/logging.service.js +53 -0
  172. package/http-client/utils/call-stack-extractor.util.d.ts +37 -0
  173. package/http-client/utils/call-stack-extractor.util.js +48 -0
  174. package/http-client/utils/context-extractor.util.d.ts +49 -0
  175. package/http-client/utils/context-extractor.util.js +52 -0
  176. package/http-client/utils/curl-generator.util.d.ts +21 -0
  177. package/http-client/utils/curl-generator.util.js +44 -3
  178. package/http-client/utils/request-id.util.d.ts +18 -0
  179. package/http-client/utils/request-id.util.js +20 -0
  180. package/http-client/utils/retry-recorder.util.d.ts +42 -0
  181. package/http-client/utils/retry-recorder.util.js +44 -0
  182. package/index.js +8 -0
  183. package/interceptors/translation-interceptor.service.js +5 -0
  184. package/package.json +1 -1
  185. package/providers/context.provider.js +2 -0
  186. package/providers/generator.provider.d.ts +4 -0
  187. package/providers/generator.provider.js +4 -0
  188. package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
  189. package/redis-lock/examples/lock-strategy.examples.js +130 -15
  190. package/redis-lock/index.js +3 -0
  191. package/redis-lock/redis-lock.decorator.d.ts +101 -0
  192. package/redis-lock/redis-lock.decorator.js +120 -0
  193. package/redis-lock/redis-lock.module.d.ts +60 -0
  194. package/redis-lock/redis-lock.module.js +46 -0
  195. package/redis-lock/redis-lock.service.d.ts +251 -0
  196. package/redis-lock/redis-lock.service.js +219 -3
  197. package/setup/bootstrap.setup.js +20 -0
  198. package/setup/mode.setup.d.ts +44 -0
  199. package/setup/mode.setup.js +44 -0
  200. package/setup/schedule.decorator.d.ts +226 -0
  201. package/setup/schedule.decorator.js +214 -1
  202. package/setup/worker.decorator.d.ts +86 -0
  203. package/setup/worker.decorator.js +88 -0
  204. package/shared/serviceRegistryModule.js +5 -1
  205. package/shared/services/api-config.service.d.ts +3 -0
  206. package/shared/services/api-config.service.js +20 -9
  207. package/validator-json/decorators.d.ts +17 -0
  208. package/validator-json/decorators.js +17 -2
  209. package/validator-json/default.d.ts +6 -0
  210. package/validator-json/default.js +30 -2
  211. package/validator-json/defaultConverters.js +1 -0
  212. package/validator-json/options.d.ts +23 -0
  213. package/validators/common-validators.d.ts +143 -0
  214. package/validators/common-validators.js +249 -0
  215. package/validators/custom-validate.examples.d.ts +23 -0
  216. package/validators/custom-validate.examples.js +78 -6
  217. package/validators/custom-validate.validator.d.ts +107 -0
  218. package/validators/custom-validate.validator.js +84 -0
  219. package/validators/index.d.ts +1 -0
  220. package/validators/index.js +1 -0
  221. package/validators/is-exists.validator.d.ts +11 -0
  222. package/validators/is-exists.validator.js +22 -0
  223. package/validators/is-unique.validator.d.ts +11 -0
  224. package/validators/is-unique.validator.js +18 -0
  225. package/validators/skip-empty.validator.d.ts +5 -0
  226. package/validators/skip-empty.validator.js +5 -0
  227. package/vault/interfaces/vault-options.interface.d.ts +9 -0
  228. package/vault/vault-config.loader.d.ts +30 -0
  229. package/vault/vault-config.loader.js +48 -1
  230. package/vault/vault-config.service.d.ts +53 -0
  231. package/vault/vault-config.service.js +57 -0
  232. package/vault/vault.module.d.ts +4 -0
  233. package/vault/vault.module.js +4 -0
  234. package/decorators/examples/validation-decorators.example.d.ts +0 -69
  235. package/decorators/examples/validation-decorators.example.js +0 -331
@@ -1,4 +1,10 @@
1
1
  "use strict";
2
+ /**
3
+ * Worker Decorators for Bull Queue Processors
4
+ *
5
+ * These decorators conditionally apply Bull decorators based on the application mode.
6
+ * They only register processors when running in Worker or Hybrid mode.
7
+ */
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
3
9
  exports.WorkerProcessor = WorkerProcessor;
4
10
  exports.WorkerProcess = WorkerProcess;
@@ -16,22 +22,60 @@ exports.WorkerOnQueuePaused = WorkerOnQueuePaused;
16
22
  exports.WorkerOnQueueResumed = WorkerOnQueueResumed;
17
23
  const bull_1 = require("@nestjs/bull");
18
24
  const mode_setup_1 = require("./mode.setup");
25
+ /**
26
+ * Conditionally applies Bull's @Processor decorator
27
+ * Only registers the processor class when running in Worker or Hybrid mode
28
+ *
29
+ * @param queueName - Name of the queue to process
30
+ * @param options - Processor options (optional)
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * @WorkerProcessor('email')
35
+ * export class EmailProcessor {
36
+ * @WorkerProcess('send')
37
+ * async sendEmail(job: Job) {
38
+ * // Process email sending
39
+ * }
40
+ * }
41
+ * ```
42
+ */
19
43
  function WorkerProcessor(queueName) {
20
44
  if ((0, mode_setup_1.shouldProcessQueues)()) {
21
45
  return (0, bull_1.Processor)(queueName);
22
46
  }
47
+ // In HTTP-only mode, return a no-op decorator
23
48
  return function (constructor) {
24
49
  return constructor;
25
50
  };
26
51
  }
52
+ /**
53
+ * Conditionally applies Bull's @Process decorator
54
+ * Only registers the processor method when running in Worker or Hybrid mode
55
+ *
56
+ * @param name - Job name to process (optional)
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * @WorkerProcess('send-email')
61
+ * async sendEmail(job: Job<EmailData>) {
62
+ * // Process job
63
+ * }
64
+ * ```
65
+ */
27
66
  function WorkerProcess(name) {
28
67
  if ((0, mode_setup_1.shouldProcessQueues)()) {
29
68
  return (0, bull_1.Process)(name);
30
69
  }
70
+ // In HTTP-only mode, return a no-op decorator
31
71
  return function (target, propertyKey, descriptor) {
32
72
  return descriptor;
33
73
  };
34
74
  }
75
+ /**
76
+ * Conditionally applies Bull's @OnQueueActive decorator
77
+ * Only registers when running in Worker or Hybrid mode
78
+ */
35
79
  function WorkerOnQueueActive() {
36
80
  if ((0, mode_setup_1.shouldProcessQueues)()) {
37
81
  return (0, bull_1.OnQueueActive)();
@@ -40,6 +84,10 @@ function WorkerOnQueueActive() {
40
84
  return descriptor;
41
85
  };
42
86
  }
87
+ /**
88
+ * Conditionally applies Bull's @OnQueueCompleted decorator
89
+ * Only registers when running in Worker or Hybrid mode
90
+ */
43
91
  function WorkerOnQueueCompleted() {
44
92
  if ((0, mode_setup_1.shouldProcessQueues)()) {
45
93
  return (0, bull_1.OnQueueCompleted)();
@@ -48,6 +96,10 @@ function WorkerOnQueueCompleted() {
48
96
  return descriptor;
49
97
  };
50
98
  }
99
+ /**
100
+ * Conditionally applies Bull's @OnQueueProgress decorator
101
+ * Only registers when running in Worker or Hybrid mode
102
+ */
51
103
  function WorkerOnQueueProgress() {
52
104
  if ((0, mode_setup_1.shouldProcessQueues)()) {
53
105
  return (0, bull_1.OnQueueProgress)();
@@ -56,6 +108,10 @@ function WorkerOnQueueProgress() {
56
108
  return descriptor;
57
109
  };
58
110
  }
111
+ /**
112
+ * Conditionally applies Bull's @OnQueueFailed decorator
113
+ * Only registers when running in Worker or Hybrid mode
114
+ */
59
115
  function WorkerOnQueueFailed() {
60
116
  if ((0, mode_setup_1.shouldProcessQueues)()) {
61
117
  return (0, bull_1.OnQueueFailed)();
@@ -64,6 +120,10 @@ function WorkerOnQueueFailed() {
64
120
  return descriptor;
65
121
  };
66
122
  }
123
+ /**
124
+ * Conditionally applies Bull's @OnQueueError decorator
125
+ * Only registers when running in Worker or Hybrid mode
126
+ */
67
127
  function WorkerOnQueueError() {
68
128
  if ((0, mode_setup_1.shouldProcessQueues)()) {
69
129
  return (0, bull_1.OnQueueError)();
@@ -72,6 +132,10 @@ function WorkerOnQueueError() {
72
132
  return descriptor;
73
133
  };
74
134
  }
135
+ /**
136
+ * Conditionally applies Bull's @OnQueueWaiting decorator
137
+ * Only registers when running in Worker or Hybrid mode
138
+ */
75
139
  function WorkerOnQueueWaiting() {
76
140
  if ((0, mode_setup_1.shouldProcessQueues)()) {
77
141
  return (0, bull_1.OnQueueWaiting)();
@@ -80,6 +144,10 @@ function WorkerOnQueueWaiting() {
80
144
  return descriptor;
81
145
  };
82
146
  }
147
+ /**
148
+ * Conditionally applies Bull's @OnQueueStalled decorator
149
+ * Only registers when running in Worker or Hybrid mode
150
+ */
83
151
  function WorkerOnQueueStalled() {
84
152
  if ((0, mode_setup_1.shouldProcessQueues)()) {
85
153
  return (0, bull_1.OnQueueStalled)();
@@ -88,6 +156,10 @@ function WorkerOnQueueStalled() {
88
156
  return descriptor;
89
157
  };
90
158
  }
159
+ /**
160
+ * Conditionally applies Bull's @OnQueueRemoved decorator
161
+ * Only registers when running in Worker or Hybrid mode
162
+ */
91
163
  function WorkerOnQueueRemoved() {
92
164
  if ((0, mode_setup_1.shouldProcessQueues)()) {
93
165
  return (0, bull_1.OnQueueRemoved)();
@@ -96,6 +168,10 @@ function WorkerOnQueueRemoved() {
96
168
  return descriptor;
97
169
  };
98
170
  }
171
+ /**
172
+ * Conditionally applies Bull's @OnQueueCleaned decorator
173
+ * Only registers when running in Worker or Hybrid mode
174
+ */
99
175
  function WorkerOnQueueCleaned() {
100
176
  if ((0, mode_setup_1.shouldProcessQueues)()) {
101
177
  return (0, bull_1.OnQueueCleaned)();
@@ -104,6 +180,10 @@ function WorkerOnQueueCleaned() {
104
180
  return descriptor;
105
181
  };
106
182
  }
183
+ /**
184
+ * Conditionally applies Bull's @OnQueueDrained decorator
185
+ * Only registers when running in Worker or Hybrid mode
186
+ */
107
187
  function WorkerOnQueueDrained() {
108
188
  if ((0, mode_setup_1.shouldProcessQueues)()) {
109
189
  return (0, bull_1.OnQueueDrained)();
@@ -112,6 +192,10 @@ function WorkerOnQueueDrained() {
112
192
  return descriptor;
113
193
  };
114
194
  }
195
+ /**
196
+ * Conditionally applies Bull's @OnQueuePaused decorator
197
+ * Only registers when running in Worker or Hybrid mode
198
+ */
115
199
  function WorkerOnQueuePaused() {
116
200
  if ((0, mode_setup_1.shouldProcessQueues)()) {
117
201
  return (0, bull_1.OnQueuePaused)();
@@ -120,6 +204,10 @@ function WorkerOnQueuePaused() {
120
204
  return descriptor;
121
205
  };
122
206
  }
207
+ /**
208
+ * Conditionally applies Bull's @OnQueueResumed decorator
209
+ * Only registers when running in Worker or Hybrid mode
210
+ */
123
211
  function WorkerOnQueueResumed() {
124
212
  if ((0, mode_setup_1.shouldProcessQueues)()) {
125
213
  return (0, bull_1.OnQueueResumed)();
@@ -48,6 +48,7 @@ const providers = [
48
48
  validators_1.CustomValidateValidator,
49
49
  ];
50
50
  if (!((_a = process === null || process === void 0 ? void 0 : process.env) === null || _a === void 0 ? void 0 : _a.ENV_FILE_PATH)) {
51
+ // 兼容单元测试,没有加载初始化文件,手动引入
51
52
  Promise.resolve().then(() => require('../setup/bootstrap.setup'));
52
53
  }
53
54
  services_1.ApiConfigService.rootPath = process.env.ROOT_PATH;
@@ -117,6 +118,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.CACHE_ENABLED)) {
117
118
  isGlobal: true,
118
119
  useFactory: (config, redisService, dataSource) => __awaiter(void 0, void 0, void 0, function* () {
119
120
  let redisClient = null;
121
+ // Try to get Redis client (use default client)
120
122
  try {
121
123
  redisClient = redisService.getClient();
122
124
  }
@@ -135,6 +137,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.CACHE_ENABLED)) {
135
137
  }),
136
138
  }));
137
139
  }
140
+ // Add RedisLockModule if both Redis and Cache are enabled
138
141
  if (services_1.ApiConfigService.toBoolean(process.env.SCHEDULE_ENABLED) &&
139
142
  services_1.ApiConfigService.toBoolean(process.env.REDIS_LOCK_ENABLED, true)) {
140
143
  modules.push(redis_lock_1.RedisLockModule.forRootAsync({
@@ -142,6 +145,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.SCHEDULE_ENABLED) &&
142
145
  isGlobal: true,
143
146
  useFactory: (config, redisService) => __awaiter(void 0, void 0, void 0, function* () {
144
147
  let redisClient = null;
148
+ // Try to get Redis client (use default client)
145
149
  try {
146
150
  redisClient = redisService.getClient();
147
151
  }
@@ -150,7 +154,7 @@ if (services_1.ApiConfigService.toBoolean(process.env.SCHEDULE_ENABLED) &&
150
154
  }
151
155
  return {
152
156
  redisClient,
153
- defaultTtl: config.getNumber('REDIS_LOCK_TTL', 300000),
157
+ defaultTtl: config.getNumber('REDIS_LOCK_TTL', 300000), // 5 minutes
154
158
  defaultKeyPrefix: config.getString('REDIS_LOCK_KEY_PREFIX', 'lock'),
155
159
  defaultRetryCount: config.getNumber('REDIS_LOCK_RETRY_COUNT', 3),
156
160
  defaultRetryDelay: config.getNumber('REDIS_LOCK_RETRY_DELAY', 200),
@@ -41,6 +41,9 @@ export declare class ApiConfigService {
41
41
  password: string;
42
42
  db: number;
43
43
  };
44
+ /**
45
+ * 是否使用Redis,用于health check
46
+ */
44
47
  get isRedisEnabled(): boolean;
45
48
  get bullConfig(): BullRootModuleOptions;
46
49
  get pinoConfig(): Params;
@@ -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), { retryStrategy: (times) => Math.min(times * 1000, 5000) }),
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
- maxStalledCount: 2,
185
- guardInterval: 5000,
186
- retryProcessDelay: 1000,
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);
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defaultConverters = void 0;
4
+ // tslint:disable:no-submodule-imports
4
5
  const cv = require("class-validator");
5
6
  require("reflect-metadata");
6
7
  exports.defaultConverters = {
@@ -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;