@lark-apaas/fullstack-nestjs-core 1.0.15-alpha.16 → 1.0.15-alpha.18

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.js CHANGED
@@ -4,10 +4,15 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
4
4
  // src/modules/platform/module.ts
5
5
  import { Global, Module, ValidationPipe } from "@nestjs/common";
6
6
  import { APP_PIPE } from "@nestjs/core";
7
+ import { CommonModule, OBSERVABLE_SERVICE } from "@lark-apaas/nestjs-common";
7
8
  import { ConfigModule, ConfigService } from "@nestjs/config";
8
- import { LoggerModule, AppLogger, LoggerContextMiddleware } from "@lark-apaas/nestjs-logger";
9
+ import { NestjsObservableModule as ObservableModule, Observable } from "@lark-apaas/nestjs-observable";
10
+ import { HttpModule } from "@nestjs/axios";
11
+ import { LoggerModule, AppLogger as AppLogger2, LoggerContextMiddleware } from "@lark-apaas/nestjs-logger";
9
12
  import { DataPaasModule, SqlExecutionContextMiddleware } from "@lark-apaas/nestjs-datapaas";
10
13
  import { AuthNPaasModule } from "@lark-apaas/nestjs-authnpaas";
14
+ import { AutomationModule } from "@lark-apaas/nestjs-trigger";
15
+ import { PLATFORM_HTTP_CLIENT as PLATFORM_HTTP_CLIENT2 } from "@lark-apaas/nestjs-common";
11
16
 
12
17
  // src/middlewares/user-context/index.ts
13
18
  import { Injectable } from "@nestjs/common";
@@ -120,7 +125,8 @@ CsrfMiddleware = _ts_decorate2([
120
125
  ], CsrfMiddleware);
121
126
 
122
127
  // src/middlewares/view-context/index.ts
123
- import { Injectable as Injectable3 } from "@nestjs/common";
128
+ import { Inject, Injectable as Injectable3, Logger } from "@nestjs/common";
129
+ import { PLATFORM_HTTP_CLIENT } from "@lark-apaas/nestjs-common";
124
130
  function _ts_decorate3(decorators, target, key, desc) {
125
131
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
126
132
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -128,17 +134,57 @@ function _ts_decorate3(decorators, target, key, desc) {
128
134
  return c > 3 && r && Object.defineProperty(target, key, r), r;
129
135
  }
130
136
  __name(_ts_decorate3, "_ts_decorate");
131
- var ViewContextMiddleware = class {
137
+ function _ts_metadata(k, v) {
138
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
139
+ }
140
+ __name(_ts_metadata, "_ts_metadata");
141
+ function _ts_param(paramIndex, decorator) {
142
+ return function(target, key) {
143
+ decorator(target, key, paramIndex);
144
+ };
145
+ }
146
+ __name(_ts_param, "_ts_param");
147
+ var ViewContextMiddleware = class _ViewContextMiddleware {
132
148
  static {
133
149
  __name(this, "ViewContextMiddleware");
134
150
  }
135
- use(req, res, next) {
151
+ client;
152
+ logger = new Logger(_ViewContextMiddleware.name);
153
+ constructor(client) {
154
+ this.client = client;
155
+ }
156
+ async getAppInfo(appId) {
157
+ if (!appId) {
158
+ this.logger.warn(`appId is empty, skip get app info`);
159
+ return null;
160
+ }
161
+ try {
162
+ const resp = await this.client.get(`/b/${appId}/get_published_v2`);
163
+ if (resp.status !== 200) {
164
+ throw new Error(`Failed to get app info, status: ${resp.status}`);
165
+ }
166
+ const data = await resp.json();
167
+ if (data.status_code !== "0") {
168
+ throw new Error(`Failed to get app info, status_code: ${data.status_code}`);
169
+ }
170
+ return data.data.app_info ?? {};
171
+ } catch (err) {
172
+ this.logger.error(err, "Failed to get app info");
173
+ return null;
174
+ }
175
+ }
176
+ async use(req, res, next) {
136
177
  const { userId, tenantId, appId, loginUrl, userType } = req.userContext;
137
178
  const csrfToken = req.csrfToken;
179
+ const appInfo = await this.getAppInfo(appId);
180
+ this.logger.debug(`appInfo: ${JSON.stringify(appInfo)}`);
138
181
  req.__platform_data__ = {
139
182
  csrfToken: csrfToken ?? "",
140
183
  userId: userId ?? "",
141
184
  appId: appId ?? "",
185
+ appName: appInfo?.app_name ?? "",
186
+ appAvatar: appInfo?.app_avatar ?? "",
187
+ appDescription: appInfo?.app_description ?? "",
142
188
  loginUrl: loginUrl ?? "",
143
189
  userType: userType ?? "",
144
190
  tenantId
@@ -150,13 +196,21 @@ var ViewContextMiddleware = class {
150
196
  tenantId: tenantId ?? "",
151
197
  loginUrl: loginUrl ?? "",
152
198
  userType: userType ?? "",
153
- appId: appId ?? ""
199
+ appId: appId ?? "",
200
+ appName: appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528",
201
+ appAvatar: appInfo?.app_avatar ?? "",
202
+ appDescription: appInfo?.app_description ?? ""
154
203
  };
155
204
  next();
156
205
  }
157
206
  };
158
207
  ViewContextMiddleware = _ts_decorate3([
159
- Injectable3()
208
+ Injectable3(),
209
+ _ts_param(0, Inject(PLATFORM_HTTP_CLIENT)),
210
+ _ts_metadata("design:type", Function),
211
+ _ts_metadata("design:paramtypes", [
212
+ typeof PlatformHttpClient === "undefined" ? Object : PlatformHttpClient
213
+ ])
160
214
  ], ViewContextMiddleware);
161
215
 
162
216
  // src/middlewares/csrf_token/index.ts
@@ -256,6 +310,128 @@ function apiResponseInterceptor(req, res, next) {
256
310
  }
257
311
  __name(apiResponseInterceptor, "apiResponseInterceptor");
258
312
 
313
+ // src/middlewares/request-context/index.ts
314
+ import { Injectable as Injectable5 } from "@nestjs/common";
315
+ import { RequestContextService } from "@lark-apaas/nestjs-common";
316
+ function _ts_decorate5(decorators, target, key, desc) {
317
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
318
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
319
+ 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;
320
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
321
+ }
322
+ __name(_ts_decorate5, "_ts_decorate");
323
+ function _ts_metadata2(k, v) {
324
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
325
+ }
326
+ __name(_ts_metadata2, "_ts_metadata");
327
+ var RequestContextMiddleware = class {
328
+ static {
329
+ __name(this, "RequestContextMiddleware");
330
+ }
331
+ requestContext;
332
+ constructor(requestContext) {
333
+ this.requestContext = requestContext;
334
+ }
335
+ use(req, _res, next) {
336
+ const path = req.originalUrl ?? req.url;
337
+ const userContext = req.userContext ?? {};
338
+ this.requestContext.run({
339
+ path,
340
+ method: req.method,
341
+ userId: userContext.userId,
342
+ tenantId: userContext.tenantId,
343
+ appId: userContext.appId
344
+ }, () => next());
345
+ }
346
+ };
347
+ RequestContextMiddleware = _ts_decorate5([
348
+ Injectable5(),
349
+ _ts_metadata2("design:type", Function),
350
+ _ts_metadata2("design:paramtypes", [
351
+ typeof RequestContextService === "undefined" ? Object : RequestContextService
352
+ ])
353
+ ], RequestContextMiddleware);
354
+
355
+ // src/services/http-interceptor.service.ts
356
+ import { Injectable as Injectable6 } from "@nestjs/common";
357
+ import { HttpService } from "@nestjs/axios";
358
+ import { AppLogger } from "@lark-apaas/nestjs-logger";
359
+ function _ts_decorate6(decorators, target, key, desc) {
360
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
361
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
362
+ 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;
363
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
364
+ }
365
+ __name(_ts_decorate6, "_ts_decorate");
366
+ function _ts_metadata3(k, v) {
367
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
368
+ }
369
+ __name(_ts_metadata3, "_ts_metadata");
370
+ var HttpInterceptorService = class {
371
+ static {
372
+ __name(this, "HttpInterceptorService");
373
+ }
374
+ httpService;
375
+ logger;
376
+ constructor(httpService, logger) {
377
+ this.httpService = httpService;
378
+ this.logger = logger;
379
+ }
380
+ /**
381
+ * 模块初始化时配置拦截器
382
+ */
383
+ onModuleInit() {
384
+ this.setupInterceptors();
385
+ }
386
+ /**
387
+ * 配置 axios 请求/响应拦截器
388
+ */
389
+ setupInterceptors() {
390
+ const axiosInstance = this.httpService.axiosRef;
391
+ axiosInstance.interceptors.request.use((config) => {
392
+ this.logger.log("HTTP Request", {
393
+ method: config.method?.toUpperCase(),
394
+ url: config.url,
395
+ headers: config.headers,
396
+ params: config.params,
397
+ data: config.data
398
+ }, "HttpService");
399
+ return config;
400
+ }, (error) => {
401
+ this.logger.error("HTTP Request Error", error, "HttpService");
402
+ return Promise.reject(error);
403
+ });
404
+ axiosInstance.interceptors.response.use((response) => {
405
+ this.logger.log("HTTP Response", {
406
+ method: response.config.method?.toUpperCase(),
407
+ url: response.config.url,
408
+ status: response.status,
409
+ statusText: response.statusText,
410
+ data: response.data
411
+ }, "HttpService");
412
+ return response;
413
+ }, (error) => {
414
+ this.logger.error("HTTP Response Error", {
415
+ method: error.config?.method?.toUpperCase(),
416
+ url: error.config?.url,
417
+ status: error.response?.status,
418
+ statusText: error.response?.statusText,
419
+ data: error.response?.data,
420
+ message: error.message
421
+ }, "HttpService");
422
+ return Promise.reject(error);
423
+ });
424
+ }
425
+ };
426
+ HttpInterceptorService = _ts_decorate6([
427
+ Injectable6(),
428
+ _ts_metadata3("design:type", Function),
429
+ _ts_metadata3("design:paramtypes", [
430
+ typeof HttpService === "undefined" ? Object : HttpService,
431
+ typeof AppLogger === "undefined" ? Object : AppLogger
432
+ ])
433
+ ], HttpInterceptorService);
434
+
259
435
  // src/modules/platform/config/app.config.ts
260
436
  import { registerAs } from "@nestjs/config";
261
437
  var NAMESPACE = "app";
@@ -268,16 +444,249 @@ var app_config_default = registerAs(NAMESPACE, () => {
268
444
  };
269
445
  });
270
446
 
447
+ // src/middlewares/debug/index.ts
448
+ import { Injectable as Injectable7 } from "@nestjs/common";
449
+ import { HttpAdapterHost } from "@nestjs/core";
450
+ function _ts_decorate7(decorators, target, key, desc) {
451
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
452
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
453
+ 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;
454
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
455
+ }
456
+ __name(_ts_decorate7, "_ts_decorate");
457
+ function _ts_metadata4(k, v) {
458
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
459
+ }
460
+ __name(_ts_metadata4, "_ts_metadata");
461
+ var processStartTimestamp = Date.now();
462
+ var FrameworkDebugMiddleware = class {
463
+ static {
464
+ __name(this, "FrameworkDebugMiddleware");
465
+ }
466
+ httpAdapterHost;
467
+ constructor(httpAdapterHost) {
468
+ this.httpAdapterHost = httpAdapterHost;
469
+ }
470
+ use(_req, res) {
471
+ res.json(this.getDebugInfo());
472
+ }
473
+ getDebugInfo() {
474
+ const routes = this.getRoutes();
475
+ const uptimeSeconds = Math.floor(process.uptime());
476
+ return {
477
+ ["\u8DEF\u7531\u914D\u7F6E"]: routes,
478
+ ["\u8FDB\u7A0B\u5B58\u6D3B\u65F6\u95F4\uFF08\u79D2\uFF09"]: uptimeSeconds,
479
+ ["\u8FDB\u7A0B\u542F\u52A8\u65F6\u95F4\uFF08\u79D2\uFF09"]: new Date(processStartTimestamp).toISOString(),
480
+ ["\u8FD0\u884C\u65F6\u7248\u672C"]: process.versions
481
+ };
482
+ }
483
+ getRoutes() {
484
+ const server = this.httpAdapterHost.httpAdapter;
485
+ const router = server.getInstance()._router;
486
+ if (!router) {
487
+ return {
488
+ error: "Router \u4E0D\u53EF\u7528"
489
+ };
490
+ }
491
+ const routes = [];
492
+ router.stack.forEach((middleware, index) => {
493
+ if (middleware.route) {
494
+ routes.push({
495
+ order: String(index),
496
+ path: middleware.route.path,
497
+ method: middleware.method,
498
+ regexp: middleware.regexp?.toString()
499
+ });
500
+ }
501
+ });
502
+ return {
503
+ total: routes.length,
504
+ routes
505
+ };
506
+ }
507
+ };
508
+ FrameworkDebugMiddleware = _ts_decorate7([
509
+ Injectable7(),
510
+ _ts_metadata4("design:type", Function),
511
+ _ts_metadata4("design:paramtypes", [
512
+ typeof HttpAdapterHost === "undefined" ? Object : HttpAdapterHost
513
+ ])
514
+ ], FrameworkDebugMiddleware);
515
+
516
+ // src/services/platform-http-client.service.ts
517
+ import { Injectable as Injectable8, Logger as Logger2 } from "@nestjs/common";
518
+ import { HttpClient } from "@lark-apaas/http-client";
519
+ function _ts_decorate8(decorators, target, key, desc) {
520
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
521
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
522
+ 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;
523
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
524
+ }
525
+ __name(_ts_decorate8, "_ts_decorate");
526
+ function _ts_metadata5(k, v) {
527
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
528
+ }
529
+ __name(_ts_metadata5, "_ts_metadata");
530
+ var ProtectedHttpClient = class ProtectedHttpClient2 {
531
+ static {
532
+ __name(this, "ProtectedHttpClient");
533
+ }
534
+ client;
535
+ constructor(client) {
536
+ this.client = client;
537
+ }
538
+ request(config) {
539
+ return this.client.request(config);
540
+ }
541
+ get(url, config) {
542
+ return this.client.get(url, config);
543
+ }
544
+ post(url, data, config) {
545
+ return this.client.post(url, data, config);
546
+ }
547
+ put(url, data, config) {
548
+ return this.client.put(url, data, config);
549
+ }
550
+ patch(url, data, config) {
551
+ return this.client.patch(url, data, config);
552
+ }
553
+ delete(url, config) {
554
+ return this.client.delete(url, config);
555
+ }
556
+ };
557
+ var PlatformHttpClientService = class _PlatformHttpClientService {
558
+ static {
559
+ __name(this, "PlatformHttpClientService");
560
+ }
561
+ client;
562
+ protectedClient;
563
+ logger = new Logger2(_PlatformHttpClientService.name);
564
+ constructor() {
565
+ const baseConfig = {
566
+ timeout: 5e3
567
+ };
568
+ this.client = new HttpClient({
569
+ ...baseConfig,
570
+ platform: {
571
+ enabled: true
572
+ }
573
+ });
574
+ this.protectedClient = new ProtectedHttpClient(this.client);
575
+ this.registerGlobalInterceptors();
576
+ }
577
+ /**
578
+ * 获取受保护的 HttpClient 实例(推荐)
579
+ *
580
+ * 该实例不暴露 interceptors,防止业务代码修改全局拦截器
581
+ *
582
+ * @returns 受保护的 HttpClient 实例
583
+ */
584
+ get instance() {
585
+ return this.protectedClient;
586
+ }
587
+ /**
588
+ * 获取原始 HttpClient 实例(危险)
589
+ *
590
+ * ⚠️ 警告:该实例允许修改拦截器,会影响所有使用全局实例的地方
591
+ *
592
+ * 仅用于特殊场景,不应该暴露给业务代码
593
+ * 如果需要自定义拦截器,请使用 `create()` 方法创建独立实例
594
+ *
595
+ * @internal
596
+ * @returns 原始 HttpClient 实例
597
+ */
598
+ get rawInstance() {
599
+ return this.client;
600
+ }
601
+ /**
602
+ * 创建一个新的独立 HttpClient 实例
603
+ *
604
+ * 适用于需要自定义拦截器或配置的场景
605
+ * 创建的实例完全独立,不会影响全局实例
606
+ *
607
+ * @param options - 配置选项(会与全局配置合并)
608
+ * @returns 完整的 HttpClient 实例(允许修改拦截器)
609
+ *
610
+ * @example
611
+ * ```typescript
612
+ * @Injectable()
613
+ * export class FileService {
614
+ * private fileClient: HttpClient;
615
+ *
616
+ * constructor(private platformHttp: PlatformHttpClientService) {
617
+ * // 创建超时 60 秒的独立实例
618
+ * this.fileClient = this.platformHttp.create({
619
+ * config: { timeout: 60000 }
620
+ * });
621
+ *
622
+ * // 为这个实例注册拦截器(不影响全局实例)
623
+ * this.fileClient.interceptors.request.use((config) => {
624
+ * console.log('File upload starting...');
625
+ * return config;
626
+ * });
627
+ * }
628
+ *
629
+ * async uploadFile(file: Buffer) {
630
+ * return this.fileClient.post('/file/upload', file);
631
+ * }
632
+ * }
633
+ * ```
634
+ */
635
+ create(options) {
636
+ const mergedConfig = {
637
+ timeout: 5e3,
638
+ ...options?.config
639
+ };
640
+ const mergedPlatform = {
641
+ enabled: true,
642
+ ...options?.platform
643
+ };
644
+ return new HttpClient({
645
+ ...mergedConfig,
646
+ platform: mergedPlatform
647
+ });
648
+ }
649
+ /**
650
+ * 注册全局拦截器
651
+ */
652
+ registerGlobalInterceptors() {
653
+ this.client.interceptors.request.use((config) => {
654
+ this.logger.log(`HTTP Request: ${config.method?.toUpperCase()} ${config.url}`);
655
+ return config;
656
+ }, (error) => {
657
+ this.logger.error("HTTP Request Error", error, "HttpService");
658
+ return Promise.reject(error);
659
+ });
660
+ this.client.interceptors.response.use((response) => {
661
+ this.logger.log(`HTTP Response: ${response.status} ${response.url}`);
662
+ return response;
663
+ }, (error) => {
664
+ const errorLog = {
665
+ status: error.response?.status,
666
+ statusText: error.response?.statusText,
667
+ message: error.message
668
+ };
669
+ this.logger.error(`HTTP Response Error: ${error.config?.method?.toUpperCase()} ${error.config?.url} ${JSON.stringify(errorLog)}`);
670
+ return Promise.reject(error);
671
+ });
672
+ }
673
+ };
674
+ PlatformHttpClientService = _ts_decorate8([
675
+ Injectable8(),
676
+ _ts_metadata5("design:type", Function),
677
+ _ts_metadata5("design:paramtypes", [])
678
+ ], PlatformHttpClientService);
679
+
271
680
  // src/modules/platform/module.ts
272
681
  import { AuthZPaasModule } from "@lark-apaas/nestjs-authzpaas";
273
- function _ts_decorate5(decorators, target, key, desc) {
682
+ function _ts_decorate9(decorators, target, key, desc) {
274
683
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
275
684
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
276
685
  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;
277
686
  return c > 3 && r && Object.defineProperty(target, key, r), r;
278
687
  }
279
- __name(_ts_decorate5, "_ts_decorate");
280
- var PLATFORM_MODULE_OPTIONS = "PLATFORM_MODULE_OPTIONS";
688
+ __name(_ts_decorate9, "_ts_decorate");
689
+ var PLATFORM_MODULE_OPTIONS = /* @__PURE__ */ Symbol("PLATFORM_MODULE_OPTIONS");
281
690
  var PlatformModule = class _PlatformModule {
282
691
  static {
283
692
  __name(this, "PlatformModule");
@@ -298,7 +707,13 @@ var PlatformModule = class _PlatformModule {
298
707
  app_config_default
299
708
  ]
300
709
  }),
710
+ CommonModule,
711
+ ObservableModule,
301
712
  LoggerModule,
713
+ HttpModule.register({
714
+ timeout: 5e3,
715
+ maxRedirects: 5
716
+ }),
302
717
  DataPaasModule.forRootAsync({
303
718
  imports: [
304
719
  ConfigModule,
@@ -306,17 +721,17 @@ var PlatformModule = class _PlatformModule {
306
721
  ],
307
722
  inject: [
308
723
  ConfigService,
309
- AppLogger
724
+ AppLogger2
310
725
  ],
311
726
  useFactory: /* @__PURE__ */ __name(async (...args) => {
312
727
  const configService = args[0];
313
728
  const appLogger = args[1];
314
729
  const drizzleLogger = {
315
730
  logQuery(query, params) {
316
- appLogger.log?.("SQL Query", {
731
+ appLogger.log?.("SQL Query " + JSON.stringify({
317
732
  query,
318
733
  params
319
- }, "Database");
734
+ }), "Database");
320
735
  }
321
736
  };
322
737
  return {
@@ -326,6 +741,7 @@ var PlatformModule = class _PlatformModule {
326
741
  }, "useFactory")
327
742
  }),
328
743
  AuthNPaasModule.forRoot(),
744
+ AutomationModule.forRoot(),
329
745
  AuthZPaasModule.forRoot()
330
746
  ],
331
747
  providers: [
@@ -341,11 +757,27 @@ var PlatformModule = class _PlatformModule {
341
757
  enableImplicitConversion: true
342
758
  }
343
759
  })
344
- }
760
+ },
761
+ {
762
+ provide: OBSERVABLE_SERVICE,
763
+ useClass: Observable
764
+ },
765
+ PlatformHttpClientService,
766
+ {
767
+ provide: PLATFORM_HTTP_CLIENT2,
768
+ useFactory: /* @__PURE__ */ __name((svc) => svc.instance, "useFactory"),
769
+ inject: [
770
+ PlatformHttpClientService
771
+ ]
772
+ },
773
+ HttpInterceptorService
345
774
  ],
346
775
  exports: [
347
776
  ConfigModule,
348
- LoggerModule
777
+ LoggerModule,
778
+ CommonModule,
779
+ OBSERVABLE_SERVICE,
780
+ PLATFORM_HTTP_CLIENT2
349
781
  ]
350
782
  };
351
783
  }
@@ -355,7 +787,10 @@ var PlatformModule = class _PlatformModule {
355
787
  configure(consumer) {
356
788
  const options = _PlatformModule.moduleOptions;
357
789
  consumer.apply(apiResponseInterceptor).forRoutes("/api/*");
358
- consumer.apply(UserContextMiddleware, LoggerContextMiddleware, SqlExecutionContextMiddleware).forRoutes("/*");
790
+ if (process.env.NODE_ENV === "development") {
791
+ consumer.apply(FrameworkDebugMiddleware).forRoutes("/api/__framework__/debug");
792
+ }
793
+ consumer.apply(UserContextMiddleware, RequestContextMiddleware, LoggerContextMiddleware, SqlExecutionContextMiddleware).forRoutes("/*");
359
794
  consumer.apply(CsrfTokenMiddleware, ViewContextMiddleware).exclude("/api/(.*)").forRoutes("*");
360
795
  if (options.enableCsrf !== false) {
361
796
  const csrfRoutes = options.csrfRoutes || "/api/*";
@@ -369,20 +804,20 @@ var PlatformModule = class _PlatformModule {
369
804
  }
370
805
  }
371
806
  };
372
- PlatformModule = _ts_decorate5([
807
+ PlatformModule = _ts_decorate9([
373
808
  Global(),
374
809
  Module({})
375
810
  ], PlatformModule);
376
811
 
377
812
  // src/setup.ts
378
- import { AppLogger as AppLogger2 } from "@lark-apaas/nestjs-logger";
813
+ import { AppLogger as AppLogger3 } from "@lark-apaas/nestjs-logger";
379
814
  import cookieParser from "cookie-parser";
380
815
  import { DevToolsV2Module } from "@lark-apaas/nestjs-openapi-devtools";
381
816
  var defaultPerms = {
382
817
  disableSwagger: false
383
818
  };
384
819
  async function configureApp(app, perms = defaultPerms) {
385
- app.useLogger(app.get(AppLogger2));
820
+ app.useLogger(app.get(AppLogger3));
386
821
  app.flushLogs();
387
822
  app.use(cookieParser());
388
823
  const globalPrefix = process.env.CLIENT_BASE_PATH ?? "";
@@ -403,9 +838,12 @@ __name(configureApp, "configureApp");
403
838
  // src/index.ts
404
839
  import { DevToolsModule, DevToolsV2Module as DevToolsV2Module2 } from "@lark-apaas/nestjs-openapi-devtools";
405
840
  export * from "@lark-apaas/nestjs-authnpaas";
406
- export * from "@lark-apaas/nestjs-authzpaas";
407
841
  export * from "@lark-apaas/nestjs-datapaas";
842
+ export * from "@lark-apaas/nestjs-observable";
843
+ export * from "@lark-apaas/nestjs-trigger";
844
+ import { CanRole } from "@lark-apaas/nestjs-authzpaas";
408
845
  export {
846
+ CanRole,
409
847
  CsrfMiddleware,
410
848
  CsrfTokenMiddleware,
411
849
  DevToolsModule,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/fullstack-nestjs-core",
3
- "version": "1.0.15-alpha.16",
3
+ "version": "1.0.15-alpha.18",
4
4
  "description": "FullStack Nestjs Core",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -39,11 +39,17 @@
39
39
  "prepublishOnly": "npm run build"
40
40
  },
41
41
  "dependencies": {
42
- "@lark-apaas/nestjs-authnpaas": "^1.0.0",
43
- "@lark-apaas/nestjs-authzpaas": "0.1.0-alpha.14",
44
- "@lark-apaas/nestjs-datapaas": "1.0.6-alpha.13",
45
- "@lark-apaas/nestjs-logger": "^1.0.2",
42
+ "@lark-apaas/http-client": "0.1.2",
43
+ "@lark-apaas/nestjs-authnpaas": "^1.0.2",
44
+ "@lark-apaas/nestjs-authzpaas": "0.1.0-alpha.16",
45
+ "@lark-apaas/nestjs-common": "^0.1.0",
46
+ "@lark-apaas/nestjs-datapaas": "1.0.6-alpha.15",
47
+ "@lark-apaas/nestjs-logger": "^1.0.3",
48
+ "@lark-apaas/nestjs-observable": "^0.0.1",
46
49
  "@lark-apaas/nestjs-openapi-devtools": "^1.0.9",
50
+ "@lark-apaas/nestjs-trigger": "^0.0.1",
51
+ "@nestjs/axios": "^4.0.1",
52
+ "axios": "^1.13.2",
47
53
  "cookie-parser": "^1.4.7"
48
54
  },
49
55
  "devDependencies": {
@@ -60,6 +66,7 @@
60
66
  },
61
67
  "peerDependencies": {
62
68
  "@nestjs/common": "^10.4.20",
69
+ "@nestjs/core": "^10.4.20",
63
70
  "@nestjs/platform-express": "^10.4.20",
64
71
  "@nestjs/swagger": "^7.4.2",
65
72
  "class-transformer": "^0.5.1",