@lark-apaas/fullstack-nestjs-core 1.1.1-alpha.37 → 1.1.1-alpha.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -32,6 +32,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
32
32
  // src/index.ts
33
33
  var index_exports = {};
34
34
  __export(index_exports, {
35
+ AutoTrace: () => import_nestjs_common5.AutoTrace,
35
36
  CsrfMiddleware: () => CsrfMiddleware,
36
37
  CsrfTokenMiddleware: () => CsrfTokenMiddleware,
37
38
  DevToolsModule: () => import_nestjs_openapi_devtools2.DevToolsModule,
@@ -44,15 +45,17 @@ __export(index_exports, {
44
45
  module.exports = __toCommonJS(index_exports);
45
46
 
46
47
  // src/modules/platform/module.ts
47
- var import_common7 = require("@nestjs/common");
48
+ var import_common9 = require("@nestjs/common");
48
49
  var import_core2 = require("@nestjs/core");
49
- var import_nestjs_common2 = require("@lark-apaas/nestjs-common");
50
+ var import_nestjs_common3 = require("@lark-apaas/nestjs-common");
50
51
  var import_config2 = require("@nestjs/config");
51
52
  var import_nestjs_observable = require("@lark-apaas/nestjs-observable");
52
- var import_nestjs_logger = require("@lark-apaas/nestjs-logger");
53
+ var import_axios2 = require("@nestjs/axios");
54
+ var import_nestjs_logger2 = require("@lark-apaas/nestjs-logger");
53
55
  var import_nestjs_datapaas = require("@lark-apaas/nestjs-datapaas");
54
56
  var import_nestjs_authnpaas = require("@lark-apaas/nestjs-authnpaas");
55
57
  var import_nestjs_trigger = require("@lark-apaas/nestjs-trigger");
58
+ var import_nestjs_common4 = require("@lark-apaas/nestjs-common");
56
59
 
57
60
  // src/middlewares/user-context/index.ts
58
61
  var import_common = require("@nestjs/common");
@@ -99,7 +102,8 @@ var UserContextMiddleware = class {
99
102
  env: webUser?.env ?? "runtime",
100
103
  userName: webUser?.user_name?.zh_cn ?? "",
101
104
  userNameEn: webUser?.user_name?.en_us ?? "",
102
- userNameI18n: webUser?.user_name ?? {}
105
+ userNameI18n: webUser?.user_name ?? {},
106
+ isSystemAccount: webUser?.is_system_account ?? false
103
107
  };
104
108
  next();
105
109
  }
@@ -166,6 +170,7 @@ CsrfMiddleware = _ts_decorate2([
166
170
 
167
171
  // src/middlewares/view-context/index.ts
168
172
  var import_common3 = require("@nestjs/common");
173
+ var import_nestjs_common = require("@lark-apaas/nestjs-common");
169
174
  function _ts_decorate3(decorators, target, key, desc) {
170
175
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
171
176
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -173,17 +178,57 @@ function _ts_decorate3(decorators, target, key, desc) {
173
178
  return c > 3 && r && Object.defineProperty(target, key, r), r;
174
179
  }
175
180
  __name(_ts_decorate3, "_ts_decorate");
176
- var ViewContextMiddleware = class {
181
+ function _ts_metadata(k, v) {
182
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
183
+ }
184
+ __name(_ts_metadata, "_ts_metadata");
185
+ function _ts_param(paramIndex, decorator) {
186
+ return function(target, key) {
187
+ decorator(target, key, paramIndex);
188
+ };
189
+ }
190
+ __name(_ts_param, "_ts_param");
191
+ var ViewContextMiddleware = class _ViewContextMiddleware {
177
192
  static {
178
193
  __name(this, "ViewContextMiddleware");
179
194
  }
180
- use(req, res, next) {
195
+ client;
196
+ logger = new import_common3.Logger(_ViewContextMiddleware.name);
197
+ constructor(client) {
198
+ this.client = client;
199
+ }
200
+ async getAppInfo(appId) {
201
+ if (!appId) {
202
+ this.logger.warn(`appId is empty, skip get app info`);
203
+ return null;
204
+ }
205
+ try {
206
+ const resp = await this.client.get(`/b/${appId}/get_published_v2`);
207
+ if (resp.status !== 200) {
208
+ throw new Error(`Failed to get app info, status: ${resp.status}`);
209
+ }
210
+ const data = await resp.json();
211
+ if (data.status_code !== "0") {
212
+ throw new Error(`Failed to get app info, status_code: ${data.status_code}`);
213
+ }
214
+ return data.data.app_info ?? {};
215
+ } catch (err) {
216
+ this.logger.error(err, "Failed to get app info");
217
+ return null;
218
+ }
219
+ }
220
+ async use(req, res, next) {
181
221
  const { userId, tenantId, appId } = req.userContext;
182
222
  const csrfToken = req.csrfToken;
223
+ const appInfo = await this.getAppInfo(appId);
224
+ this.logger.debug(`appInfo: ${JSON.stringify(appInfo)}`);
183
225
  req.__platform_data__ = {
184
226
  csrfToken: csrfToken ?? "",
185
227
  userId: userId ?? "",
186
228
  appId: appId ?? "",
229
+ appName: appInfo?.app_name ?? "",
230
+ appAvatar: appInfo?.app_avatar ?? "",
231
+ appDescription: appInfo?.app_description ?? "",
187
232
  tenantId
188
233
  };
189
234
  res.locals = {
@@ -191,13 +236,21 @@ var ViewContextMiddleware = class {
191
236
  csrfToken: csrfToken ?? "",
192
237
  userId: userId ?? "",
193
238
  tenantId: tenantId ?? "",
194
- appId: appId ?? ""
239
+ appId: appId ?? "",
240
+ appName: appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528",
241
+ appAvatar: appInfo?.app_avatar ?? "",
242
+ appDescription: appInfo?.app_description ?? ""
195
243
  };
196
244
  next();
197
245
  }
198
246
  };
199
247
  ViewContextMiddleware = _ts_decorate3([
200
- (0, import_common3.Injectable)()
248
+ (0, import_common3.Injectable)(),
249
+ _ts_param(0, (0, import_common3.Inject)(import_nestjs_common.PLATFORM_HTTP_CLIENT)),
250
+ _ts_metadata("design:type", Function),
251
+ _ts_metadata("design:paramtypes", [
252
+ typeof PlatformHttpClient === "undefined" ? Object : PlatformHttpClient
253
+ ])
201
254
  ], ViewContextMiddleware);
202
255
 
203
256
  // src/middlewares/csrf_token/index.ts
@@ -299,7 +352,7 @@ __name(apiResponseInterceptor, "apiResponseInterceptor");
299
352
 
300
353
  // src/middlewares/request-context/index.ts
301
354
  var import_common5 = require("@nestjs/common");
302
- var import_nestjs_common = require("@lark-apaas/nestjs-common");
355
+ var import_nestjs_common2 = require("@lark-apaas/nestjs-common");
303
356
  function _ts_decorate5(decorators, target, key, desc) {
304
357
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
305
358
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -307,10 +360,10 @@ function _ts_decorate5(decorators, target, key, desc) {
307
360
  return c > 3 && r && Object.defineProperty(target, key, r), r;
308
361
  }
309
362
  __name(_ts_decorate5, "_ts_decorate");
310
- function _ts_metadata(k, v) {
363
+ function _ts_metadata2(k, v) {
311
364
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
312
365
  }
313
- __name(_ts_metadata, "_ts_metadata");
366
+ __name(_ts_metadata2, "_ts_metadata");
314
367
  var RequestContextMiddleware = class {
315
368
  static {
316
369
  __name(this, "RequestContextMiddleware");
@@ -333,12 +386,92 @@ var RequestContextMiddleware = class {
333
386
  };
334
387
  RequestContextMiddleware = _ts_decorate5([
335
388
  (0, import_common5.Injectable)(),
336
- _ts_metadata("design:type", Function),
337
- _ts_metadata("design:paramtypes", [
338
- typeof import_nestjs_common.RequestContextService === "undefined" ? Object : import_nestjs_common.RequestContextService
389
+ _ts_metadata2("design:type", Function),
390
+ _ts_metadata2("design:paramtypes", [
391
+ typeof import_nestjs_common2.RequestContextService === "undefined" ? Object : import_nestjs_common2.RequestContextService
339
392
  ])
340
393
  ], RequestContextMiddleware);
341
394
 
395
+ // src/services/http-interceptor.service.ts
396
+ var import_common6 = require("@nestjs/common");
397
+ var import_axios = require("@nestjs/axios");
398
+ var import_nestjs_logger = require("@lark-apaas/nestjs-logger");
399
+ function _ts_decorate6(decorators, target, key, desc) {
400
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
401
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
402
+ 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;
403
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
404
+ }
405
+ __name(_ts_decorate6, "_ts_decorate");
406
+ function _ts_metadata3(k, v) {
407
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
408
+ }
409
+ __name(_ts_metadata3, "_ts_metadata");
410
+ var HttpInterceptorService = class {
411
+ static {
412
+ __name(this, "HttpInterceptorService");
413
+ }
414
+ httpService;
415
+ logger;
416
+ constructor(httpService, logger) {
417
+ this.httpService = httpService;
418
+ this.logger = logger;
419
+ }
420
+ /**
421
+ * 模块初始化时配置拦截器
422
+ */
423
+ onModuleInit() {
424
+ this.setupInterceptors();
425
+ }
426
+ /**
427
+ * 配置 axios 请求/响应拦截器
428
+ */
429
+ setupInterceptors() {
430
+ const axiosInstance = this.httpService.axiosRef;
431
+ axiosInstance.interceptors.request.use((config) => {
432
+ this.logger.log("HTTP Request", {
433
+ method: config.method?.toUpperCase(),
434
+ url: config.url,
435
+ headers: config.headers,
436
+ params: config.params,
437
+ data: config.data
438
+ }, "HttpService");
439
+ return config;
440
+ }, (error) => {
441
+ this.logger.error("HTTP Request Error", error, "HttpService");
442
+ return Promise.reject(error);
443
+ });
444
+ axiosInstance.interceptors.response.use((response) => {
445
+ this.logger.log("HTTP Response", {
446
+ method: response.config.method?.toUpperCase(),
447
+ url: response.config.url,
448
+ status: response.status,
449
+ statusText: response.statusText,
450
+ data: response.data
451
+ }, "HttpService");
452
+ return response;
453
+ }, (error) => {
454
+ this.logger.error("HTTP Response Error", {
455
+ method: error.config?.method?.toUpperCase(),
456
+ url: error.config?.url,
457
+ status: error.response?.status,
458
+ statusText: error.response?.statusText,
459
+ data: error.response?.data,
460
+ message: error.message
461
+ }, "HttpService");
462
+ return Promise.reject(error);
463
+ });
464
+ }
465
+ };
466
+ HttpInterceptorService = _ts_decorate6([
467
+ (0, import_common6.Injectable)(),
468
+ _ts_metadata3("design:type", Function),
469
+ _ts_metadata3("design:paramtypes", [
470
+ typeof import_axios.HttpService === "undefined" ? Object : import_axios.HttpService,
471
+ typeof import_nestjs_logger.AppLogger === "undefined" ? Object : import_nestjs_logger.AppLogger
472
+ ])
473
+ ], HttpInterceptorService);
474
+
342
475
  // src/modules/platform/config/app.config.ts
343
476
  var import_config = require("@nestjs/config");
344
477
  var NAMESPACE = "app";
@@ -352,19 +485,19 @@ var app_config_default = (0, import_config.registerAs)(NAMESPACE, () => {
352
485
  });
353
486
 
354
487
  // src/middlewares/debug/index.ts
355
- var import_common6 = require("@nestjs/common");
488
+ var import_common7 = require("@nestjs/common");
356
489
  var import_core = require("@nestjs/core");
357
- function _ts_decorate6(decorators, target, key, desc) {
490
+ function _ts_decorate7(decorators, target, key, desc) {
358
491
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
359
492
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
360
493
  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;
361
494
  return c > 3 && r && Object.defineProperty(target, key, r), r;
362
495
  }
363
- __name(_ts_decorate6, "_ts_decorate");
364
- function _ts_metadata2(k, v) {
496
+ __name(_ts_decorate7, "_ts_decorate");
497
+ function _ts_metadata4(k, v) {
365
498
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
366
499
  }
367
- __name(_ts_metadata2, "_ts_metadata");
500
+ __name(_ts_metadata4, "_ts_metadata");
368
501
  var processStartTimestamp = Date.now();
369
502
  var FrameworkDebugMiddleware = class {
370
503
  static {
@@ -412,23 +545,187 @@ var FrameworkDebugMiddleware = class {
412
545
  };
413
546
  }
414
547
  };
415
- FrameworkDebugMiddleware = _ts_decorate6([
416
- (0, import_common6.Injectable)(),
417
- _ts_metadata2("design:type", Function),
418
- _ts_metadata2("design:paramtypes", [
548
+ FrameworkDebugMiddleware = _ts_decorate7([
549
+ (0, import_common7.Injectable)(),
550
+ _ts_metadata4("design:type", Function),
551
+ _ts_metadata4("design:paramtypes", [
419
552
  typeof import_core.HttpAdapterHost === "undefined" ? Object : import_core.HttpAdapterHost
420
553
  ])
421
554
  ], FrameworkDebugMiddleware);
422
555
 
556
+ // src/services/platform-http-client.service.ts
557
+ var import_common8 = require("@nestjs/common");
558
+ var import_http_client = require("@lark-apaas/http-client");
559
+ function _ts_decorate8(decorators, target, key, desc) {
560
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
561
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
562
+ 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;
563
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
564
+ }
565
+ __name(_ts_decorate8, "_ts_decorate");
566
+ function _ts_metadata5(k, v) {
567
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
568
+ }
569
+ __name(_ts_metadata5, "_ts_metadata");
570
+ var ProtectedHttpClient = class ProtectedHttpClient2 {
571
+ static {
572
+ __name(this, "ProtectedHttpClient");
573
+ }
574
+ client;
575
+ constructor(client) {
576
+ this.client = client;
577
+ }
578
+ request(config) {
579
+ return this.client.request(config);
580
+ }
581
+ get(url, config) {
582
+ return this.client.get(url, config);
583
+ }
584
+ post(url, data, config) {
585
+ return this.client.post(url, data, config);
586
+ }
587
+ put(url, data, config) {
588
+ return this.client.put(url, data, config);
589
+ }
590
+ patch(url, data, config) {
591
+ return this.client.patch(url, data, config);
592
+ }
593
+ delete(url, config) {
594
+ return this.client.delete(url, config);
595
+ }
596
+ };
597
+ var PlatformHttpClientService = class _PlatformHttpClientService {
598
+ static {
599
+ __name(this, "PlatformHttpClientService");
600
+ }
601
+ client;
602
+ protectedClient;
603
+ logger = new import_common8.Logger(_PlatformHttpClientService.name);
604
+ constructor() {
605
+ const baseConfig = {
606
+ timeout: 5e3
607
+ };
608
+ this.client = new import_http_client.HttpClient({
609
+ ...baseConfig,
610
+ platform: {
611
+ enabled: true
612
+ }
613
+ });
614
+ this.protectedClient = new ProtectedHttpClient(this.client);
615
+ this.registerGlobalInterceptors();
616
+ }
617
+ /**
618
+ * 获取受保护的 HttpClient 实例(推荐)
619
+ *
620
+ * 该实例不暴露 interceptors,防止业务代码修改全局拦截器
621
+ *
622
+ * @returns 受保护的 HttpClient 实例
623
+ */
624
+ get instance() {
625
+ return this.protectedClient;
626
+ }
627
+ /**
628
+ * 获取原始 HttpClient 实例(危险)
629
+ *
630
+ * ⚠️ 警告:该实例允许修改拦截器,会影响所有使用全局实例的地方
631
+ *
632
+ * 仅用于特殊场景,不应该暴露给业务代码
633
+ * 如果需要自定义拦截器,请使用 `create()` 方法创建独立实例
634
+ *
635
+ * @internal
636
+ * @returns 原始 HttpClient 实例
637
+ */
638
+ get rawInstance() {
639
+ return this.client;
640
+ }
641
+ /**
642
+ * 创建一个新的独立 HttpClient 实例
643
+ *
644
+ * 适用于需要自定义拦截器或配置的场景
645
+ * 创建的实例完全独立,不会影响全局实例
646
+ *
647
+ * @param options - 配置选项(会与全局配置合并)
648
+ * @returns 完整的 HttpClient 实例(允许修改拦截器)
649
+ *
650
+ * @example
651
+ * ```typescript
652
+ * @Injectable()
653
+ * export class FileService {
654
+ * private fileClient: HttpClient;
655
+ *
656
+ * constructor(private platformHttp: PlatformHttpClientService) {
657
+ * // 创建超时 60 秒的独立实例
658
+ * this.fileClient = this.platformHttp.create({
659
+ * config: { timeout: 60000 }
660
+ * });
661
+ *
662
+ * // 为这个实例注册拦截器(不影响全局实例)
663
+ * this.fileClient.interceptors.request.use((config) => {
664
+ * console.log('File upload starting...');
665
+ * return config;
666
+ * });
667
+ * }
668
+ *
669
+ * async uploadFile(file: Buffer) {
670
+ * return this.fileClient.post('/file/upload', file);
671
+ * }
672
+ * }
673
+ * ```
674
+ */
675
+ create(options) {
676
+ const mergedConfig = {
677
+ timeout: 5e3,
678
+ ...options?.config
679
+ };
680
+ const mergedPlatform = {
681
+ enabled: true,
682
+ ...options?.platform
683
+ };
684
+ return new import_http_client.HttpClient({
685
+ ...mergedConfig,
686
+ platform: mergedPlatform
687
+ });
688
+ }
689
+ /**
690
+ * 注册全局拦截器
691
+ */
692
+ registerGlobalInterceptors() {
693
+ this.client.interceptors.request.use((config) => {
694
+ this.logger.log(`HTTP Request: ${config.method?.toUpperCase()} ${config.url}`);
695
+ return config;
696
+ }, (error) => {
697
+ this.logger.error("HTTP Request Error", error, "HttpService");
698
+ return Promise.reject(error);
699
+ });
700
+ this.client.interceptors.response.use((response) => {
701
+ this.logger.log(`HTTP Response: ${response.status} ${response.url}`);
702
+ return response;
703
+ }, (error) => {
704
+ const errorLog = {
705
+ status: error.response?.status,
706
+ statusText: error.response?.statusText,
707
+ message: error.message
708
+ };
709
+ this.logger.error(`HTTP Response Error: ${error.config?.method?.toUpperCase()} ${error.config?.url} ${JSON.stringify(errorLog)}`);
710
+ return Promise.reject(error);
711
+ });
712
+ }
713
+ };
714
+ PlatformHttpClientService = _ts_decorate8([
715
+ (0, import_common8.Injectable)(),
716
+ _ts_metadata5("design:type", Function),
717
+ _ts_metadata5("design:paramtypes", [])
718
+ ], PlatformHttpClientService);
719
+
423
720
  // src/modules/platform/module.ts
424
- function _ts_decorate7(decorators, target, key, desc) {
721
+ function _ts_decorate9(decorators, target, key, desc) {
425
722
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
426
723
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
427
724
  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;
428
725
  return c > 3 && r && Object.defineProperty(target, key, r), r;
429
726
  }
430
- __name(_ts_decorate7, "_ts_decorate");
431
- var PLATFORM_MODULE_OPTIONS = "PLATFORM_MODULE_OPTIONS";
727
+ __name(_ts_decorate9, "_ts_decorate");
728
+ var PLATFORM_MODULE_OPTIONS = /* @__PURE__ */ Symbol("PLATFORM_MODULE_OPTIONS");
432
729
  var PlatformModule = class _PlatformModule {
433
730
  static {
434
731
  __name(this, "PlatformModule");
@@ -449,17 +746,21 @@ var PlatformModule = class _PlatformModule {
449
746
  app_config_default
450
747
  ]
451
748
  }),
452
- import_nestjs_common2.CommonModule,
749
+ import_nestjs_common3.CommonModule,
453
750
  import_nestjs_observable.NestjsObservableModule,
454
- import_nestjs_logger.LoggerModule,
751
+ import_nestjs_logger2.LoggerModule,
752
+ import_axios2.HttpModule.register({
753
+ timeout: 5e3,
754
+ maxRedirects: 5
755
+ }),
455
756
  import_nestjs_datapaas.DataPaasModule.forRootAsync({
456
757
  imports: [
457
758
  import_config2.ConfigModule,
458
- import_nestjs_logger.LoggerModule
759
+ import_nestjs_logger2.LoggerModule
459
760
  ],
460
761
  inject: [
461
762
  import_config2.ConfigService,
462
- import_nestjs_logger.AppLogger
763
+ import_nestjs_logger2.AppLogger
463
764
  ],
464
765
  useFactory: /* @__PURE__ */ __name(async (...args) => {
465
766
  const configService = args[0];
@@ -490,7 +791,7 @@ var PlatformModule = class _PlatformModule {
490
791
  },
491
792
  {
492
793
  provide: import_core2.APP_PIPE,
493
- useValue: new import_common7.ValidationPipe({
794
+ useValue: new import_common9.ValidationPipe({
494
795
  transform: true,
495
796
  transformOptions: {
496
797
  enableImplicitConversion: true
@@ -498,15 +799,29 @@ var PlatformModule = class _PlatformModule {
498
799
  })
499
800
  },
500
801
  {
501
- provide: import_nestjs_common2.OBSERVABLE_SERVICE,
802
+ provide: import_nestjs_common3.OBSERVABLE_SERVICE,
502
803
  useClass: import_nestjs_observable.Observable
804
+ },
805
+ PlatformHttpClientService,
806
+ {
807
+ provide: import_nestjs_common4.PLATFORM_HTTP_CLIENT,
808
+ useFactory: /* @__PURE__ */ __name((svc) => svc.instance, "useFactory"),
809
+ inject: [
810
+ PlatformHttpClientService
811
+ ]
812
+ },
813
+ HttpInterceptorService,
814
+ {
815
+ provide: import_core2.APP_INTERCEPTOR,
816
+ useClass: import_nestjs_observable.TraceInterceptor
503
817
  }
504
818
  ],
505
819
  exports: [
506
820
  import_config2.ConfigModule,
507
- import_nestjs_logger.LoggerModule,
508
- import_nestjs_common2.CommonModule,
509
- import_nestjs_common2.OBSERVABLE_SERVICE
821
+ import_nestjs_logger2.LoggerModule,
822
+ import_nestjs_common3.CommonModule,
823
+ import_nestjs_common3.OBSERVABLE_SERVICE,
824
+ import_nestjs_common4.PLATFORM_HTTP_CLIENT
510
825
  ]
511
826
  };
512
827
  }
@@ -519,7 +834,7 @@ var PlatformModule = class _PlatformModule {
519
834
  if (process.env.NODE_ENV === "development") {
520
835
  consumer.apply(FrameworkDebugMiddleware).forRoutes("/api/__framework__/debug");
521
836
  }
522
- consumer.apply(UserContextMiddleware, RequestContextMiddleware, import_nestjs_logger.LoggerContextMiddleware, import_nestjs_observable.ObservableTraceMiddleware, import_nestjs_datapaas.SqlExecutionContextMiddleware).forRoutes("/*");
837
+ consumer.apply(UserContextMiddleware, RequestContextMiddleware, import_nestjs_logger2.LoggerContextMiddleware, import_nestjs_observable.ObservableTraceMiddleware, import_nestjs_datapaas.SqlExecutionContextMiddleware).forRoutes("/*");
523
838
  consumer.apply(CsrfTokenMiddleware, ViewContextMiddleware).exclude("/api/(.*)").forRoutes("*");
524
839
  if (options.enableCsrf !== false) {
525
840
  const csrfRoutes = options.csrfRoutes || "/api/*";
@@ -533,20 +848,20 @@ var PlatformModule = class _PlatformModule {
533
848
  }
534
849
  }
535
850
  };
536
- PlatformModule = _ts_decorate7([
537
- (0, import_common7.Global)(),
538
- (0, import_common7.Module)({})
851
+ PlatformModule = _ts_decorate9([
852
+ (0, import_common9.Global)(),
853
+ (0, import_common9.Module)({})
539
854
  ], PlatformModule);
540
855
 
541
856
  // src/setup.ts
542
- var import_nestjs_logger2 = require("@lark-apaas/nestjs-logger");
857
+ var import_nestjs_logger3 = require("@lark-apaas/nestjs-logger");
543
858
  var import_cookie_parser = __toESM(require("cookie-parser"), 1);
544
859
  var import_nestjs_openapi_devtools = require("@lark-apaas/nestjs-openapi-devtools");
545
860
  var defaultPerms = {
546
861
  disableSwagger: false
547
862
  };
548
863
  async function configureApp(app, perms = defaultPerms) {
549
- app.useLogger(app.get(import_nestjs_logger2.AppLogger));
864
+ app.useLogger(app.get(import_nestjs_logger3.AppLogger));
550
865
  app.flushLogs();
551
866
  app.use((0, import_cookie_parser.default)());
552
867
  const globalPrefix = process.env.CLIENT_BASE_PATH ?? "";
@@ -570,8 +885,10 @@ __reExport(index_exports, require("@lark-apaas/nestjs-authnpaas"), module.export
570
885
  __reExport(index_exports, require("@lark-apaas/nestjs-datapaas"), module.exports);
571
886
  __reExport(index_exports, require("@lark-apaas/nestjs-observable"), module.exports);
572
887
  __reExport(index_exports, require("@lark-apaas/nestjs-trigger"), module.exports);
888
+ var import_nestjs_common5 = require("@lark-apaas/nestjs-common");
573
889
  // Annotate the CommonJS export names for ESM import in node:
574
890
  0 && (module.exports = {
891
+ AutoTrace,
575
892
  CsrfMiddleware,
576
893
  CsrfTokenMiddleware,
577
894
  DevToolsModule,
package/dist/index.d.cts CHANGED
@@ -1,7 +1,10 @@
1
1
  import { NestModule, DynamicModule, MiddlewareConsumer, NestMiddleware } from '@nestjs/common';
2
+ import { HttpClientConfig, PlatformPluginOptions } from '@lark-apaas/http-client';
2
3
  import { NestExpressApplication } from '@nestjs/platform-express';
3
4
  export { DevToolsModule, DevToolsOptions, DevToolsV2Module, DevToolsV2Options } from '@lark-apaas/nestjs-openapi-devtools';
4
5
  import { Request, Response, NextFunction } from 'express';
6
+ import { PlatformHttpClient } from '@lark-apaas/nestjs-common';
7
+ export { AutoTrace } from '@lark-apaas/nestjs-common';
5
8
  export * from '@lark-apaas/nestjs-authnpaas';
6
9
  export * from '@lark-apaas/nestjs-datapaas';
7
10
  export * from '@lark-apaas/nestjs-observable';
@@ -26,6 +29,7 @@ declare global {
26
29
  userName?: string; // 默认中文名
27
30
  userNameEn?: string; // 冗余一份英文名
28
31
  userNameI18n?: Record<string, string>; // 带多语的用户名
32
+ isSystemAccount?: boolean; // trigger 场景写入值为 true,user 访问场景不写入
29
33
  },
30
34
  csrfToken?: string;
31
35
  }
@@ -35,6 +39,13 @@ declare global {
35
39
  /**
36
40
  * PlatformModule 配置选项
37
41
  */
42
+
43
+ interface PlatformHttpClientOptions {
44
+ /** HttpClient 基础配置(超时、headers 等) */
45
+ config?: Omit<HttpClientConfig, 'platform'>;
46
+ /** 平台插件配置(默认启用) */
47
+ platform?: PlatformPluginOptions;
48
+ }
38
49
  interface PlatformModuleOptions {
39
50
  /**
40
51
  * 是否启用 CSRF 保护
@@ -46,6 +57,10 @@ interface PlatformModuleOptions {
46
57
  * 默认: '/api/*'
47
58
  */
48
59
  csrfRoutes?: string | string[];
60
+ /**
61
+ * 平台 HttpClient 配置
62
+ */
63
+ httpClient?: PlatformHttpClientOptions;
49
64
  }
50
65
 
51
66
  declare class PlatformModule implements NestModule {
@@ -96,7 +111,11 @@ declare class UserContextMiddleware implements NestMiddleware {
96
111
  }
97
112
 
98
113
  declare class ViewContextMiddleware implements NestMiddleware {
99
- use(req: Request, res: Response, next: NextFunction): void;
114
+ private readonly client;
115
+ private readonly logger;
116
+ constructor(client: PlatformHttpClient);
117
+ private getAppInfo;
118
+ use(req: Request, res: Response, next: NextFunction): Promise<void>;
100
119
  }
101
120
 
102
121
  /**
@@ -110,4 +129,4 @@ interface ApiNotFoundResponse {
110
129
  timestamp: string;
111
130
  }
112
131
 
113
- export { type ApiNotFoundResponse, CsrfMiddleware, CsrfTokenMiddleware, PlatformModule, type PlatformModuleOptions, UserContextMiddleware, ViewContextMiddleware, configureApp };
132
+ export { type ApiNotFoundResponse, CsrfMiddleware, CsrfTokenMiddleware, type PlatformHttpClientOptions, PlatformModule, type PlatformModuleOptions, UserContextMiddleware, ViewContextMiddleware, configureApp };