@nest-omni/core 4.1.3-12 → 4.1.3-14

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 (72) hide show
  1. package/cache/dependencies/db.dependency.d.ts +55 -6
  2. package/cache/dependencies/db.dependency.js +64 -13
  3. package/common/boilerplate.polyfill.js +1 -1
  4. package/file-upload/decorators/column.decorator.d.ts +151 -0
  5. package/file-upload/decorators/column.decorator.js +273 -0
  6. package/file-upload/decorators/csv-data.decorator.d.ts +17 -31
  7. package/file-upload/decorators/csv-data.decorator.js +45 -91
  8. package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
  9. package/file-upload/decorators/csv-import.decorator.js +24 -0
  10. package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
  11. package/file-upload/decorators/examples/column-mapping.example.js +122 -0
  12. package/file-upload/decorators/excel-data.decorator.d.ts +15 -29
  13. package/file-upload/decorators/excel-data.decorator.js +42 -82
  14. package/file-upload/decorators/index.d.ts +3 -2
  15. package/file-upload/decorators/index.js +20 -2
  16. package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
  17. package/file-upload/decorators/validate-data.decorator.js +39 -0
  18. package/file-upload/dto/update-file.dto.d.ts +0 -1
  19. package/file-upload/dto/update-file.dto.js +0 -4
  20. package/file-upload/entities/file-metadata.entity.d.ts +6 -3
  21. package/file-upload/entities/file-metadata.entity.js +2 -10
  22. package/file-upload/entities/file.entity.d.ts +3 -18
  23. package/file-upload/entities/file.entity.js +0 -34
  24. package/file-upload/file-upload.module.d.ts +1 -1
  25. package/file-upload/file-upload.module.js +44 -16
  26. package/file-upload/index.d.ts +13 -2
  27. package/file-upload/index.js +21 -3
  28. package/file-upload/interceptors/file-upload.interceptor.d.ts +61 -8
  29. package/file-upload/interceptors/file-upload.interceptor.js +417 -257
  30. package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
  31. package/file-upload/interfaces/file-processor.interface.js +2 -0
  32. package/file-upload/interfaces/file-upload-options.interface.d.ts +3 -46
  33. package/file-upload/interfaces/file-upload-options.interface.js +3 -0
  34. package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
  35. package/file-upload/interfaces/processor-options.interface.js +2 -0
  36. package/file-upload/processors/csv.processor.d.ts +98 -0
  37. package/file-upload/processors/csv.processor.js +391 -0
  38. package/file-upload/processors/excel.processor.d.ts +130 -0
  39. package/file-upload/processors/excel.processor.js +547 -0
  40. package/file-upload/processors/image.processor.d.ts +199 -0
  41. package/file-upload/processors/image.processor.js +377 -0
  42. package/file-upload/services/file.service.d.ts +3 -0
  43. package/file-upload/services/file.service.js +39 -10
  44. package/file-upload/services/malicious-file-detector.service.d.ts +29 -3
  45. package/file-upload/services/malicious-file-detector.service.js +256 -57
  46. package/file-upload/utils/dynamic-import.util.d.ts +6 -2
  47. package/file-upload/utils/dynamic-import.util.js +17 -5
  48. package/http-client/decorators/http-client.decorators.d.ts +4 -2
  49. package/http-client/decorators/http-client.decorators.js +2 -1
  50. package/http-client/entities/http-log.entity.js +1 -9
  51. package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
  52. package/http-client/examples/proxy-from-environment.example.js +410 -0
  53. package/http-client/http-client.module.js +65 -6
  54. package/http-client/interfaces/http-client-config.interface.d.ts +6 -0
  55. package/http-client/services/http-client.service.d.ts +8 -0
  56. package/http-client/services/http-client.service.js +61 -17
  57. package/http-client/services/logging.service.d.ts +1 -1
  58. package/http-client/services/logging.service.js +74 -58
  59. package/http-client/utils/index.d.ts +1 -0
  60. package/http-client/utils/index.js +1 -0
  61. package/http-client/utils/proxy-environment.util.d.ts +42 -0
  62. package/http-client/utils/proxy-environment.util.js +148 -0
  63. package/package.json +9 -5
  64. package/shared/service-registry.module.js +18 -0
  65. package/transaction/data-source.util.d.ts +142 -0
  66. package/transaction/data-source.util.js +330 -0
  67. package/transaction/index.d.ts +1 -0
  68. package/transaction/index.js +12 -1
  69. package/validators/is-exists.validator.d.ts +19 -2
  70. package/validators/is-exists.validator.js +27 -2
  71. package/validators/is-unique.validator.d.ts +12 -1
  72. package/validators/is-unique.validator.js +26 -1
@@ -0,0 +1,133 @@
1
+ /**
2
+ * ProxyFromEnvironment 使用示例
3
+ *
4
+ * 本文件演示如何在 HTTP Client 中使用代理环境变量支持
5
+ */
6
+ import { HttpClientService } from '@nest-omni/core';
7
+ /**
8
+ * 示例 1: 使用环境变量配置代理 (推荐方式)
9
+ *
10
+ * 设置环境变量:
11
+ * export HTTP_PROXY=http://proxy.example.com:8080
12
+ * export HTTPS_PROXY=https://secure-proxy.example.com:8443
13
+ * export NO_PROXY=localhost,127.0.0.1,.internal.com
14
+ */
15
+ export declare class ProxyFromEnvironmentExample {
16
+ private readonly httpClient;
17
+ constructor(httpClient: HttpClientService);
18
+ /**
19
+ * 使用装饰器从环境变量读取代理配置
20
+ */
21
+ fetchWithProxyFromEnv(): Promise<any>;
22
+ /**
23
+ * 直接配置请求时指定从环境变量读取代理
24
+ */
25
+ fetchWithConfiguredProxy(): Promise<any>;
26
+ }
27
+ /**
28
+ * 示例 2: 带认证的代理环境变量
29
+ *
30
+ * 设置环境变量:
31
+ * export HTTP_PROXY=http://username:password@proxy.example.com:8080
32
+ */
33
+ export declare class ProxyWithAuthExample {
34
+ private readonly httpClient;
35
+ constructor(httpClient: HttpClientService);
36
+ fetchWithAuthenticatedProxy(): Promise<any>;
37
+ }
38
+ /**
39
+ * 示例 3: NO_PROXY 使用示例
40
+ *
41
+ * 设置环境变量:
42
+ * export HTTP_PROXY=http://proxy.example.com:8080
43
+ * export NO_PROXY=localhost,127.0.0.1,.internal.com,.local
44
+ */
45
+ export declare class NoProxyExample {
46
+ private readonly httpClient;
47
+ constructor(httpClient: HttpClientService);
48
+ fetchExternalApi(): Promise<any>;
49
+ fetchInternalApi(): Promise<any>;
50
+ fetchLocalhost(): Promise<any>;
51
+ }
52
+ /**
53
+ * 示例 4: 混合使用 - 部分请求使用代理,部分不使用
54
+ */
55
+ export declare class MixedProxyExample {
56
+ private readonly httpClient;
57
+ constructor(httpClient: HttpClientService);
58
+ fetchWithProxy(): Promise<any>;
59
+ fetchWithoutProxy(): Promise<any>;
60
+ }
61
+ /**
62
+ * 示例 5: 企业环境中的实际使用场景
63
+ *
64
+ * 在 docker-compose.yml 或 Kubernetes 配置中设置:
65
+ * environment:
66
+ * - HTTP_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
67
+ * - HTTPS_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
68
+ * - NO_PROXY=localhost,127.0.0.1,.company.com,.svc.cluster.local
69
+ */
70
+ export declare class EnterpriseProxyExample {
71
+ private readonly httpClient;
72
+ constructor(httpClient: HttpClientService);
73
+ /**
74
+ * 访问外部 API(使用企业代理)
75
+ */
76
+ fetchFromExternalApi(): Promise<any>;
77
+ /**
78
+ * 访问内部服务(不使用代理)
79
+ */
80
+ fetchFromInternalService(): Promise<any>;
81
+ /**
82
+ * 访问 Kubernetes 集群内服务(不使用代理)
83
+ */
84
+ fetchFromK8sService(): Promise<any>;
85
+ }
86
+ /**
87
+ * 示例 6: 开发环境调试代理
88
+ *
89
+ * 本地开发时使用 Charles、Fiddler 等代理工具调试:
90
+ * export HTTP_PROXY=http://localhost:8888
91
+ * export HTTPS_PROXY=http://localhost:8888
92
+ */
93
+ export declare class DevelopmentProxyExample {
94
+ private readonly httpClient;
95
+ constructor(httpClient: HttpClientService);
96
+ debugRequest(): Promise<any>;
97
+ }
98
+ /**
99
+ * 示例 7: 程序化检查代理配置
100
+ */
101
+ export declare class ProxyUtilityExample {
102
+ checkProxyConfiguration(): Promise<void>;
103
+ }
104
+ /**
105
+ * 模块配置示例
106
+ */
107
+ export declare const httpClientModuleConfig: {
108
+ globalProxyFromEnv: {
109
+ imports: {
110
+ proxy: {
111
+ enabled: boolean;
112
+ fromEnvironment: boolean;
113
+ };
114
+ }[];
115
+ };
116
+ selectiveProxy: {
117
+ imports: {
118
+ proxy: {
119
+ enabled: boolean;
120
+ };
121
+ }[];
122
+ };
123
+ };
124
+ /**
125
+ * 环境变量配置示例
126
+ */
127
+ export declare const environmentVariablesExamples: {
128
+ basic: string;
129
+ withAuth: string;
130
+ specialChars: string;
131
+ enterprise: string;
132
+ development: string;
133
+ };
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ /**
3
+ * ProxyFromEnvironment 使用示例
4
+ *
5
+ * 本文件演示如何在 HTTP Client 中使用代理环境变量支持
6
+ */
7
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
12
+ };
13
+ var __metadata = (this && this.__metadata) || function (k, v) {
14
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15
+ };
16
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
17
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
18
+ return new (P || (P = Promise))(function (resolve, reject) {
19
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
20
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
21
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
22
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
23
+ });
24
+ };
25
+ var _a, _b, _c, _d, _e, _f;
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.environmentVariablesExamples = exports.httpClientModuleConfig = exports.ProxyUtilityExample = exports.DevelopmentProxyExample = exports.EnterpriseProxyExample = exports.MixedProxyExample = exports.NoProxyExample = exports.ProxyWithAuthExample = exports.ProxyFromEnvironmentExample = void 0;
28
+ const common_1 = require("@nestjs/common");
29
+ const core_1 = require("@nest-omni/core");
30
+ /**
31
+ * 示例 1: 使用环境变量配置代理 (推荐方式)
32
+ *
33
+ * 设置环境变量:
34
+ * export HTTP_PROXY=http://proxy.example.com:8080
35
+ * export HTTPS_PROXY=https://secure-proxy.example.com:8443
36
+ * export NO_PROXY=localhost,127.0.0.1,.internal.com
37
+ */
38
+ let ProxyFromEnvironmentExample = class ProxyFromEnvironmentExample {
39
+ constructor(httpClient) {
40
+ this.httpClient = httpClient;
41
+ }
42
+ /**
43
+ * 使用装饰器从环境变量读取代理配置
44
+ */
45
+ fetchWithProxyFromEnv() {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ // 此请求将根据环境变量使用代理
48
+ // - HTTP 请求使用 HTTP_PROXY
49
+ // - HTTPS 请求使用 HTTPS_PROXY(如果未设置则使用 HTTP_PROXY)
50
+ // - 匹配 NO_PROXY 的域名不使用代理
51
+ return this.httpClient.get('https://api.example.com/data');
52
+ });
53
+ }
54
+ /**
55
+ * 直接配置请求时指定从环境变量读取代理
56
+ */
57
+ fetchWithConfiguredProxy() {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ return this.httpClient.request({
60
+ url: 'https://api.example.com/data',
61
+ method: 'GET',
62
+ // 代理配置会在模块级别或请求级别应用
63
+ });
64
+ });
65
+ }
66
+ };
67
+ exports.ProxyFromEnvironmentExample = ProxyFromEnvironmentExample;
68
+ __decorate([
69
+ (0, core_1.HttpUseProxy)({
70
+ enabled: true,
71
+ fromEnvironment: true,
72
+ }),
73
+ __metadata("design:type", Function),
74
+ __metadata("design:paramtypes", []),
75
+ __metadata("design:returntype", Promise)
76
+ ], ProxyFromEnvironmentExample.prototype, "fetchWithProxyFromEnv", null);
77
+ exports.ProxyFromEnvironmentExample = ProxyFromEnvironmentExample = __decorate([
78
+ (0, common_1.Injectable)(),
79
+ __metadata("design:paramtypes", [typeof (_a = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _a : Object])
80
+ ], ProxyFromEnvironmentExample);
81
+ /**
82
+ * 示例 2: 带认证的代理环境变量
83
+ *
84
+ * 设置环境变量:
85
+ * export HTTP_PROXY=http://username:password@proxy.example.com:8080
86
+ */
87
+ let ProxyWithAuthExample = class ProxyWithAuthExample {
88
+ constructor(httpClient) {
89
+ this.httpClient = httpClient;
90
+ }
91
+ fetchWithAuthenticatedProxy() {
92
+ return __awaiter(this, void 0, void 0, function* () {
93
+ // 自动从环境变量解析认证信息
94
+ return this.httpClient.get('https://api.example.com/data');
95
+ });
96
+ }
97
+ };
98
+ exports.ProxyWithAuthExample = ProxyWithAuthExample;
99
+ __decorate([
100
+ (0, core_1.HttpUseProxy)({
101
+ enabled: true,
102
+ fromEnvironment: true,
103
+ }),
104
+ __metadata("design:type", Function),
105
+ __metadata("design:paramtypes", []),
106
+ __metadata("design:returntype", Promise)
107
+ ], ProxyWithAuthExample.prototype, "fetchWithAuthenticatedProxy", null);
108
+ exports.ProxyWithAuthExample = ProxyWithAuthExample = __decorate([
109
+ (0, common_1.Injectable)(),
110
+ __metadata("design:paramtypes", [typeof (_b = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _b : Object])
111
+ ], ProxyWithAuthExample);
112
+ /**
113
+ * 示例 3: NO_PROXY 使用示例
114
+ *
115
+ * 设置环境变量:
116
+ * export HTTP_PROXY=http://proxy.example.com:8080
117
+ * export NO_PROXY=localhost,127.0.0.1,.internal.com,.local
118
+ */
119
+ let NoProxyExample = class NoProxyExample {
120
+ constructor(httpClient) {
121
+ this.httpClient = httpClient;
122
+ }
123
+ fetchExternalApi() {
124
+ return __awaiter(this, void 0, void 0, function* () {
125
+ // 此请求会使用代理
126
+ return this.httpClient.get('https://api.external.com/data');
127
+ });
128
+ }
129
+ fetchInternalApi() {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ // 此请求不会使用代理(匹配 NO_PROXY 中的 .internal.com)
132
+ return this.httpClient.get('https://api.internal.com/data');
133
+ });
134
+ }
135
+ fetchLocalhost() {
136
+ return __awaiter(this, void 0, void 0, function* () {
137
+ // 此请求不会使用代理(匹配 NO_PROXY 中的 localhost)
138
+ return this.httpClient.get('http://localhost:3000/api');
139
+ });
140
+ }
141
+ };
142
+ exports.NoProxyExample = NoProxyExample;
143
+ __decorate([
144
+ (0, core_1.HttpUseProxy)({
145
+ enabled: true,
146
+ fromEnvironment: true,
147
+ }),
148
+ __metadata("design:type", Function),
149
+ __metadata("design:paramtypes", []),
150
+ __metadata("design:returntype", Promise)
151
+ ], NoProxyExample.prototype, "fetchExternalApi", null);
152
+ __decorate([
153
+ (0, core_1.HttpUseProxy)({
154
+ enabled: true,
155
+ fromEnvironment: true,
156
+ }),
157
+ __metadata("design:type", Function),
158
+ __metadata("design:paramtypes", []),
159
+ __metadata("design:returntype", Promise)
160
+ ], NoProxyExample.prototype, "fetchInternalApi", null);
161
+ __decorate([
162
+ (0, core_1.HttpUseProxy)({
163
+ enabled: true,
164
+ fromEnvironment: true,
165
+ }),
166
+ __metadata("design:type", Function),
167
+ __metadata("design:paramtypes", []),
168
+ __metadata("design:returntype", Promise)
169
+ ], NoProxyExample.prototype, "fetchLocalhost", null);
170
+ exports.NoProxyExample = NoProxyExample = __decorate([
171
+ (0, common_1.Injectable)(),
172
+ __metadata("design:paramtypes", [typeof (_c = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _c : Object])
173
+ ], NoProxyExample);
174
+ /**
175
+ * 示例 4: 混合使用 - 部分请求使用代理,部分不使用
176
+ */
177
+ let MixedProxyExample = class MixedProxyExample {
178
+ constructor(httpClient) {
179
+ this.httpClient = httpClient;
180
+ }
181
+ // 使用代理
182
+ fetchWithProxy() {
183
+ return __awaiter(this, void 0, void 0, function* () {
184
+ return this.httpClient.get('https://api.external.com/data');
185
+ });
186
+ }
187
+ // 不使用代理
188
+ fetchWithoutProxy() {
189
+ return __awaiter(this, void 0, void 0, function* () {
190
+ return this.httpClient.get('https://api.direct.com/data');
191
+ });
192
+ }
193
+ };
194
+ exports.MixedProxyExample = MixedProxyExample;
195
+ __decorate([
196
+ (0, core_1.HttpUseProxy)({
197
+ enabled: true,
198
+ fromEnvironment: true,
199
+ }),
200
+ __metadata("design:type", Function),
201
+ __metadata("design:paramtypes", []),
202
+ __metadata("design:returntype", Promise)
203
+ ], MixedProxyExample.prototype, "fetchWithProxy", null);
204
+ exports.MixedProxyExample = MixedProxyExample = __decorate([
205
+ (0, common_1.Injectable)(),
206
+ __metadata("design:paramtypes", [typeof (_d = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _d : Object])
207
+ ], MixedProxyExample);
208
+ /**
209
+ * 示例 5: 企业环境中的实际使用场景
210
+ *
211
+ * 在 docker-compose.yml 或 Kubernetes 配置中设置:
212
+ * environment:
213
+ * - HTTP_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
214
+ * - HTTPS_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
215
+ * - NO_PROXY=localhost,127.0.0.1,.company.com,.svc.cluster.local
216
+ */
217
+ let EnterpriseProxyExample = class EnterpriseProxyExample {
218
+ constructor(httpClient) {
219
+ this.httpClient = httpClient;
220
+ }
221
+ /**
222
+ * 访问外部 API(使用企业代理)
223
+ */
224
+ fetchFromExternalApi() {
225
+ return __awaiter(this, void 0, void 0, function* () {
226
+ // 通过企业代理访问外部 API
227
+ return this.httpClient.get('https://api.github.com/repos/microsoft/TypeScript');
228
+ });
229
+ }
230
+ /**
231
+ * 访问内部服务(不使用代理)
232
+ */
233
+ fetchFromInternalService() {
234
+ return __awaiter(this, void 0, void 0, function* () {
235
+ // 直接访问内部服务(匹配 NO_PROXY: .company.com)
236
+ return this.httpClient.get('https://api.company.com/internal/users');
237
+ });
238
+ }
239
+ /**
240
+ * 访问 Kubernetes 集群内服务(不使用代理)
241
+ */
242
+ fetchFromK8sService() {
243
+ return __awaiter(this, void 0, void 0, function* () {
244
+ // 直接访问 K8s 服务(匹配 NO_PROXY: .svc.cluster.local)
245
+ return this.httpClient.get('http://user-service.default.svc.cluster.local/api/users');
246
+ });
247
+ }
248
+ };
249
+ exports.EnterpriseProxyExample = EnterpriseProxyExample;
250
+ __decorate([
251
+ (0, core_1.HttpUseProxy)({
252
+ enabled: true,
253
+ fromEnvironment: true,
254
+ }),
255
+ __metadata("design:type", Function),
256
+ __metadata("design:paramtypes", []),
257
+ __metadata("design:returntype", Promise)
258
+ ], EnterpriseProxyExample.prototype, "fetchFromExternalApi", null);
259
+ __decorate([
260
+ (0, core_1.HttpUseProxy)({
261
+ enabled: true,
262
+ fromEnvironment: true,
263
+ }),
264
+ __metadata("design:type", Function),
265
+ __metadata("design:paramtypes", []),
266
+ __metadata("design:returntype", Promise)
267
+ ], EnterpriseProxyExample.prototype, "fetchFromInternalService", null);
268
+ __decorate([
269
+ (0, core_1.HttpUseProxy)({
270
+ enabled: true,
271
+ fromEnvironment: true,
272
+ }),
273
+ __metadata("design:type", Function),
274
+ __metadata("design:paramtypes", []),
275
+ __metadata("design:returntype", Promise)
276
+ ], EnterpriseProxyExample.prototype, "fetchFromK8sService", null);
277
+ exports.EnterpriseProxyExample = EnterpriseProxyExample = __decorate([
278
+ (0, common_1.Injectable)(),
279
+ __metadata("design:paramtypes", [typeof (_e = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _e : Object])
280
+ ], EnterpriseProxyExample);
281
+ /**
282
+ * 示例 6: 开发环境调试代理
283
+ *
284
+ * 本地开发时使用 Charles、Fiddler 等代理工具调试:
285
+ * export HTTP_PROXY=http://localhost:8888
286
+ * export HTTPS_PROXY=http://localhost:8888
287
+ */
288
+ let DevelopmentProxyExample = class DevelopmentProxyExample {
289
+ constructor(httpClient) {
290
+ this.httpClient = httpClient;
291
+ }
292
+ debugRequest() {
293
+ return __awaiter(this, void 0, void 0, function* () {
294
+ // 开发环境下会通过本地代理工具
295
+ // 可以查看详细的请求和响应内容
296
+ return this.httpClient.post('https://api.example.com/debug', {
297
+ test: 'data',
298
+ });
299
+ });
300
+ }
301
+ };
302
+ exports.DevelopmentProxyExample = DevelopmentProxyExample;
303
+ __decorate([
304
+ (0, core_1.HttpUseProxy)({
305
+ enabled: process.env.NODE_ENV === 'development',
306
+ fromEnvironment: true,
307
+ }),
308
+ __metadata("design:type", Function),
309
+ __metadata("design:paramtypes", []),
310
+ __metadata("design:returntype", Promise)
311
+ ], DevelopmentProxyExample.prototype, "debugRequest", null);
312
+ exports.DevelopmentProxyExample = DevelopmentProxyExample = __decorate([
313
+ (0, common_1.Injectable)(),
314
+ __metadata("design:paramtypes", [typeof (_f = typeof core_1.HttpClientService !== "undefined" && core_1.HttpClientService) === "function" ? _f : Object])
315
+ ], DevelopmentProxyExample);
316
+ /**
317
+ * 示例 7: 程序化检查代理配置
318
+ */
319
+ let ProxyUtilityExample = class ProxyUtilityExample {
320
+ checkProxyConfiguration() {
321
+ return __awaiter(this, void 0, void 0, function* () {
322
+ const { ProxyEnvironmentParser } = yield Promise.resolve().then(() => require('@nest-omni/core'));
323
+ // 检查是否设置了代理环境变量
324
+ const hasProxy = ProxyEnvironmentParser.hasProxyEnvironment();
325
+ console.log('Has proxy environment:', hasProxy);
326
+ // 获取所有代理环境变量
327
+ const vars = ProxyEnvironmentParser.getProxyEnvironmentVariables();
328
+ console.log('Proxy environment variables:', vars);
329
+ // 解析特定 URL 的代理配置
330
+ const proxyConfig = ProxyEnvironmentParser.parseFromEnvironment('https', 'https://api.example.com/data');
331
+ console.log('Parsed proxy config:', proxyConfig);
332
+ });
333
+ }
334
+ };
335
+ exports.ProxyUtilityExample = ProxyUtilityExample;
336
+ exports.ProxyUtilityExample = ProxyUtilityExample = __decorate([
337
+ (0, common_1.Injectable)()
338
+ ], ProxyUtilityExample);
339
+ /**
340
+ * 模块配置示例
341
+ */
342
+ exports.httpClientModuleConfig = {
343
+ // 方式 1: 全局启用环境变量代理
344
+ globalProxyFromEnv: {
345
+ imports: [
346
+ {
347
+ // HttpClientModule.forRoot({
348
+ proxy: {
349
+ enabled: true,
350
+ fromEnvironment: true, // 所有请求默认使用环境变量代理
351
+ },
352
+ // })
353
+ },
354
+ ],
355
+ },
356
+ // 方式 2: 全局禁用,按需启用
357
+ selectiveProxy: {
358
+ imports: [
359
+ {
360
+ // HttpClientModule.forRoot({
361
+ proxy: {
362
+ enabled: false, // 全局禁用,使用装饰器按需启用
363
+ },
364
+ // })
365
+ },
366
+ ],
367
+ },
368
+ };
369
+ /**
370
+ * 环境变量配置示例
371
+ */
372
+ exports.environmentVariablesExamples = {
373
+ // 基本配置
374
+ basic: `
375
+ # 基本 HTTP 代理
376
+ HTTP_PROXY=http://proxy.example.com:8080
377
+
378
+ # HTTPS 代理
379
+ HTTPS_PROXY=https://proxy.example.com:8443
380
+
381
+ # 不使用代理的域名
382
+ NO_PROXY=localhost,127.0.0.1
383
+ `,
384
+ // 带认证
385
+ withAuth: `
386
+ # 带认证的代理
387
+ HTTP_PROXY=http://username:password@proxy.example.com:8080
388
+ HTTPS_PROXY=http://username:password@proxy.example.com:8080
389
+ `,
390
+ // 特殊字符认证(URL 编码)
391
+ specialChars: `
392
+ # 用户名: user@domain.com
393
+ # 密码: p@ssw0rd
394
+ HTTP_PROXY=http://user%40domain.com:p%40ssw0rd@proxy.example.com:8080
395
+ `,
396
+ // 企业环境
397
+ enterprise: `
398
+ # 企业代理配置
399
+ HTTP_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
400
+ HTTPS_PROXY=http://proxy-user:proxy-pass@corporate-proxy.company.com:8080
401
+ NO_PROXY=localhost,127.0.0.1,.company.com,.internal.com,.svc.cluster.local,10.0.0.0/8
402
+ `,
403
+ // 开发环境
404
+ development: `
405
+ # 本地代理工具(Charles, Fiddler 等)
406
+ HTTP_PROXY=http://localhost:8888
407
+ HTTPS_PROXY=http://localhost:8888
408
+ NO_PROXY=localhost,127.0.0.1
409
+ `,
410
+ };
@@ -20,6 +20,7 @@ exports.HttpClientModule = void 0;
20
20
  const common_1 = require("@nestjs/common");
21
21
  const config_1 = require("@nestjs/config");
22
22
  const typeorm_1 = require("@nestjs/typeorm");
23
+ const typeorm_2 = require("typeorm");
23
24
  const cache_service_1 = require("../cache/cache.service");
24
25
  const http_client_service_1 = require("./services/http-client.service");
25
26
  const circuit_breaker_service_1 = require("./services/circuit-breaker.service");
@@ -52,11 +53,38 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
52
53
  inject: [config_1.ConfigService, cache_service_1.CacheService],
53
54
  },
54
55
  circuit_breaker_service_1.HttpCircuitBreakerService,
55
- logging_service_1.HttpLoggingService,
56
+ {
57
+ provide: logging_service_1.HttpLoggingService,
58
+ useFactory: (httpConfig, dataSource) => {
59
+ var _a, _b;
60
+ // Check if database logging is enabled in the config
61
+ const databaseLoggingEnabled = (_b = (_a = httpConfig === null || httpConfig === void 0 ? void 0 : httpConfig.logging) === null || _a === void 0 ? void 0 : _a.databaseLogging) === null || _b === void 0 ? void 0 : _b.enabled;
62
+ return new logging_service_1.HttpLoggingService(databaseLoggingEnabled ? dataSource : undefined);
63
+ },
64
+ inject: ['HTTP_CLIENT_CONFIG', typeorm_2.DataSource],
65
+ },
56
66
  cache_service_2.HttpCacheService,
57
67
  http_log_query_service_1.HttpLogQueryService,
58
- log_cleanup_service_1.HttpLogCleanupService,
59
- api_client_registry_service_1.ApiClientRegistryService,
68
+ {
69
+ provide: log_cleanup_service_1.HttpLogCleanupService,
70
+ useFactory: (logQueryService, httpConfig) => {
71
+ return new log_cleanup_service_1.HttpLogCleanupService(logQueryService, httpConfig.logCleanup || {});
72
+ },
73
+ inject: [http_log_query_service_1.HttpLogQueryService, 'HTTP_CLIENT_CONFIG'],
74
+ },
75
+ {
76
+ provide: api_client_registry_service_1.ApiClientRegistryService,
77
+ useFactory: (httpClientService, circuitBreakerService, loggingService, cacheService, httpConfig) => {
78
+ return new api_client_registry_service_1.ApiClientRegistryService(httpClientService, circuitBreakerService, loggingService, cacheService, {});
79
+ },
80
+ inject: [
81
+ http_client_service_1.HttpClientService,
82
+ circuit_breaker_service_1.HttpCircuitBreakerService,
83
+ logging_service_1.HttpLoggingService,
84
+ cache_service_2.HttpCacheService,
85
+ 'HTTP_CLIENT_CONFIG',
86
+ ],
87
+ },
60
88
  {
61
89
  provide: http_client_service_1.HttpClientService,
62
90
  useFactory: (circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig) => {
@@ -97,6 +125,10 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
97
125
  * 异步注册HTTP客户端模块
98
126
  */
99
127
  static forRootAsync(config) {
128
+ // Determine if database logging will be enabled
129
+ // We need to check if the config will enable database logging
130
+ // This is a bit tricky since the config is async, so we'll inject DataSource conditionally later
131
+ const httpConfig = config.useFactory ? {} : {};
100
132
  // 基础服务提供者
101
133
  const baseProviders = [
102
134
  {
@@ -109,11 +141,38 @@ let HttpClientModule = HttpClientModule_1 = class HttpClientModule {
109
141
  inject: config.inject || [config_1.ConfigService],
110
142
  },
111
143
  circuit_breaker_service_1.HttpCircuitBreakerService,
112
- logging_service_1.HttpLoggingService,
144
+ {
145
+ provide: logging_service_1.HttpLoggingService,
146
+ useFactory: (httpConfig, dataSource) => {
147
+ var _a, _b;
148
+ // Check if database logging is enabled in the config
149
+ const databaseLoggingEnabled = (_b = (_a = httpConfig === null || httpConfig === void 0 ? void 0 : httpConfig.logging) === null || _a === void 0 ? void 0 : _a.databaseLogging) === null || _b === void 0 ? void 0 : _b.enabled;
150
+ return new logging_service_1.HttpLoggingService(databaseLoggingEnabled ? dataSource : undefined);
151
+ },
152
+ inject: ['HTTP_CLIENT_CONFIG', typeorm_2.DataSource],
153
+ },
113
154
  cache_service_2.HttpCacheService,
114
155
  http_log_query_service_1.HttpLogQueryService,
115
- log_cleanup_service_1.HttpLogCleanupService,
116
- api_client_registry_service_1.ApiClientRegistryService,
156
+ {
157
+ provide: log_cleanup_service_1.HttpLogCleanupService,
158
+ useFactory: (logQueryService, httpConfig) => {
159
+ return new log_cleanup_service_1.HttpLogCleanupService(logQueryService, httpConfig.logCleanup || {});
160
+ },
161
+ inject: [http_log_query_service_1.HttpLogQueryService, 'HTTP_CLIENT_CONFIG'],
162
+ },
163
+ {
164
+ provide: api_client_registry_service_1.ApiClientRegistryService,
165
+ useFactory: (httpClientService, circuitBreakerService, loggingService, cacheService, httpConfig) => {
166
+ return new api_client_registry_service_1.ApiClientRegistryService(httpClientService, circuitBreakerService, loggingService, cacheService, {});
167
+ },
168
+ inject: [
169
+ http_client_service_1.HttpClientService,
170
+ circuit_breaker_service_1.HttpCircuitBreakerService,
171
+ logging_service_1.HttpLoggingService,
172
+ cache_service_2.HttpCacheService,
173
+ 'HTTP_CLIENT_CONFIG',
174
+ ],
175
+ },
117
176
  {
118
177
  provide: http_client_service_1.HttpClientService,
119
178
  useFactory: (circuitBreakerService, loggingService, cacheService, redisLockService, httpConfig) => {
@@ -72,9 +72,15 @@ export interface HttpCacheConfig {
72
72
  */
73
73
  export interface ProxyConfig {
74
74
  enabled: boolean;
75
+ /** 是否从环境变量读取代理配置 (HTTP_PROXY, HTTPS_PROXY, NO_PROXY) */
76
+ fromEnvironment?: boolean;
77
+ /** 手动指定的代理主机 (当 fromEnvironment 为 false 时使用) */
75
78
  host?: string;
79
+ /** 手动指定的代理端口 (当 fromEnvironment 为 false 时使用) */
76
80
  port?: number;
81
+ /** 代理协议 */
77
82
  protocol?: 'http' | 'https';
83
+ /** 代理认证信息 */
78
84
  auth?: {
79
85
  username: string;
80
86
  password: string;
@@ -123,5 +123,13 @@ export declare class HttpClientService {
123
123
  * 深度合并对象
124
124
  */
125
125
  private deepMerge;
126
+ /**
127
+ * 解析代理配置
128
+ * 支持从环境变量或手动配置中读取
129
+ * @param proxyConfig 代理配置
130
+ * @param targetUrl 目标 URL(用于 NO_PROXY 检查)
131
+ * @returns 解析后的代理配置,如果不应使用代理则返回 false 或 undefined
132
+ */
133
+ private resolveProxyConfig;
126
134
  }
127
135
  export {};