@lark-apaas/fullstack-nestjs-core 1.1.8-alpha.16 → 1.1.8-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.cjs +119 -52
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +120 -54
- package/package.json +7 -7
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,
|
|
@@ -102,7 +103,8 @@ var UserContextMiddleware = class {
|
|
|
102
103
|
env: webUser?.env ?? "runtime",
|
|
103
104
|
userName: webUser?.user_name?.zh_cn ?? "",
|
|
104
105
|
userNameEn: webUser?.user_name?.en_us ?? "",
|
|
105
|
-
userNameI18n: webUser?.user_name ?? {}
|
|
106
|
+
userNameI18n: webUser?.user_name ?? {},
|
|
107
|
+
isSystemAccount: webUser?.is_system_account ?? false
|
|
106
108
|
};
|
|
107
109
|
next();
|
|
108
110
|
}
|
|
@@ -170,6 +172,51 @@ CsrfMiddleware = _ts_decorate2([
|
|
|
170
172
|
// src/middlewares/view-context/index.ts
|
|
171
173
|
var import_common3 = require("@nestjs/common");
|
|
172
174
|
var import_nestjs_common = require("@lark-apaas/nestjs-common");
|
|
175
|
+
|
|
176
|
+
// src/utils/safe-stringify.ts
|
|
177
|
+
function safeEscape(s) {
|
|
178
|
+
return s.replace(/[<>&='"\n\r\u2028\u2029]/g, function(c) {
|
|
179
|
+
switch (c.charCodeAt(0)) {
|
|
180
|
+
case 60:
|
|
181
|
+
return "\\u003c";
|
|
182
|
+
// <
|
|
183
|
+
case 62:
|
|
184
|
+
return "\\u003e";
|
|
185
|
+
// >
|
|
186
|
+
case 38:
|
|
187
|
+
return "\\u0026";
|
|
188
|
+
// &
|
|
189
|
+
case 61:
|
|
190
|
+
return "\\u003d";
|
|
191
|
+
// =
|
|
192
|
+
case 39:
|
|
193
|
+
return "\\u0027";
|
|
194
|
+
// '
|
|
195
|
+
case 34:
|
|
196
|
+
return "\\u0022";
|
|
197
|
+
// "
|
|
198
|
+
case 10:
|
|
199
|
+
return "\\u000a";
|
|
200
|
+
// \n
|
|
201
|
+
case 13:
|
|
202
|
+
return "\\u000d";
|
|
203
|
+
// \r
|
|
204
|
+
// 正常来说用户无法输入这几个字符, 现代浏览器也修复了这个问题
|
|
205
|
+
// https://zhuanlan.zhihu.com/p/29958439
|
|
206
|
+
case 8232:
|
|
207
|
+
return "\\u2028";
|
|
208
|
+
// 行分隔符
|
|
209
|
+
case 8233:
|
|
210
|
+
return "\\u2029";
|
|
211
|
+
// 段落分隔符
|
|
212
|
+
default:
|
|
213
|
+
return c;
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
__name(safeEscape, "safeEscape");
|
|
218
|
+
|
|
219
|
+
// src/middlewares/view-context/index.ts
|
|
173
220
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
174
221
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
175
222
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -220,14 +267,13 @@ var ViewContextMiddleware = class _ViewContextMiddleware {
|
|
|
220
267
|
const { userId, tenantId, appId } = req.userContext;
|
|
221
268
|
const csrfToken = req.csrfToken;
|
|
222
269
|
const appInfo = await this.getAppInfo(appId);
|
|
223
|
-
this.logger.debug(`appInfo: ${JSON.stringify(appInfo)}`);
|
|
224
270
|
req.__platform_data__ = {
|
|
225
271
|
csrfToken: csrfToken ?? "",
|
|
226
272
|
userId: userId ?? "",
|
|
227
273
|
appId: appId ?? "",
|
|
228
|
-
appName: appInfo?.app_name ?? "",
|
|
274
|
+
appName: safeEscape(appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528"),
|
|
229
275
|
appAvatar: appInfo?.app_avatar ?? "",
|
|
230
|
-
appDescription: appInfo?.app_description ?? "",
|
|
276
|
+
appDescription: safeEscape(appInfo?.app_description ?? ""),
|
|
231
277
|
tenantId
|
|
232
278
|
};
|
|
233
279
|
res.locals = {
|
|
@@ -236,9 +282,9 @@ var ViewContextMiddleware = class _ViewContextMiddleware {
|
|
|
236
282
|
userId: userId ?? "",
|
|
237
283
|
tenantId: tenantId ?? "",
|
|
238
284
|
appId: appId ?? "",
|
|
239
|
-
appName: appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528",
|
|
285
|
+
appName: safeEscape(appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528"),
|
|
240
286
|
appAvatar: appInfo?.app_avatar ?? "",
|
|
241
|
-
appDescription: appInfo?.app_description ?? ""
|
|
287
|
+
appDescription: safeEscape(appInfo?.app_description ?? "")
|
|
242
288
|
};
|
|
243
289
|
next();
|
|
244
290
|
}
|
|
@@ -428,26 +474,30 @@ var HttpInterceptorService = class {
|
|
|
428
474
|
setupInterceptors() {
|
|
429
475
|
const axiosInstance = this.httpService.axiosRef;
|
|
430
476
|
axiosInstance.interceptors.request.use((config) => {
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
477
|
+
if (process.env.NODE_ENV === "development") {
|
|
478
|
+
this.logger.log("HTTP Request", {
|
|
479
|
+
method: config.method?.toUpperCase(),
|
|
480
|
+
url: config.url,
|
|
481
|
+
headers: config.headers,
|
|
482
|
+
params: config.params,
|
|
483
|
+
data: config.data
|
|
484
|
+
}, "HttpService");
|
|
485
|
+
}
|
|
438
486
|
return config;
|
|
439
487
|
}, (error) => {
|
|
440
488
|
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
441
489
|
return Promise.reject(error);
|
|
442
490
|
});
|
|
443
491
|
axiosInstance.interceptors.response.use((response) => {
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
492
|
+
if (process.env.NODE_ENV === "development") {
|
|
493
|
+
this.logger.log("HTTP Response", {
|
|
494
|
+
method: response.config.method?.toUpperCase(),
|
|
495
|
+
url: response.config.url,
|
|
496
|
+
status: response.status,
|
|
497
|
+
statusText: response.statusText,
|
|
498
|
+
data: response.data
|
|
499
|
+
}, "HttpService");
|
|
500
|
+
}
|
|
451
501
|
return response;
|
|
452
502
|
}, (error) => {
|
|
453
503
|
this.logger.error("HTTP Response Error", {
|
|
@@ -690,14 +740,14 @@ var PlatformHttpClientService = class _PlatformHttpClientService {
|
|
|
690
740
|
*/
|
|
691
741
|
registerGlobalInterceptors() {
|
|
692
742
|
this.client.interceptors.request.use((config) => {
|
|
693
|
-
this.logger.
|
|
743
|
+
this.logger.debug(`Server SDK HTTP Request: ${config.method?.toUpperCase()} ${config.url}`);
|
|
694
744
|
return config;
|
|
695
745
|
}, (error) => {
|
|
696
|
-
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
746
|
+
this.logger.error("Server SDK HTTP Request Error", error, "HttpService");
|
|
697
747
|
return Promise.reject(error);
|
|
698
748
|
});
|
|
699
749
|
this.client.interceptors.response.use((response) => {
|
|
700
|
-
this.logger.
|
|
750
|
+
this.logger.debug(`Server SDK HTTP Response: ${response.status} ${response.url}`);
|
|
701
751
|
return response;
|
|
702
752
|
}, (error) => {
|
|
703
753
|
const errorLog = {
|
|
@@ -705,7 +755,7 @@ var PlatformHttpClientService = class _PlatformHttpClientService {
|
|
|
705
755
|
statusText: error.response?.statusText,
|
|
706
756
|
message: error.message
|
|
707
757
|
};
|
|
708
|
-
this.logger.error(`HTTP Response Error: ${error.config?.method?.toUpperCase()} ${error.config?.url} ${JSON.stringify(errorLog)}`);
|
|
758
|
+
this.logger.error(`Server SDK HTTP Response Error: ${error.config?.method?.toUpperCase()} ${error.config?.url} ${JSON.stringify(errorLog)}`);
|
|
709
759
|
return Promise.reject(error);
|
|
710
760
|
});
|
|
711
761
|
}
|
|
@@ -716,6 +766,9 @@ PlatformHttpClientService = _ts_decorate8([
|
|
|
716
766
|
_ts_metadata5("design:paramtypes", [])
|
|
717
767
|
], PlatformHttpClientService);
|
|
718
768
|
|
|
769
|
+
// src/modules/platform/config/feature-switch.ts
|
|
770
|
+
var DISABLE_DATAPASS = process.env.FORCE_FRAMEWORK_DISABLE_DATAPASS === "true";
|
|
771
|
+
|
|
719
772
|
// src/modules/platform/module.ts
|
|
720
773
|
function _ts_decorate9(decorators, target, key, desc) {
|
|
721
774
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -752,32 +805,37 @@ var PlatformModule = class _PlatformModule {
|
|
|
752
805
|
timeout: 5e3,
|
|
753
806
|
maxRedirects: 5
|
|
754
807
|
}),
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
808
|
+
// 读取环境变量判断是否启用 DataPaasModule
|
|
809
|
+
...DISABLE_DATAPASS ? [] : [
|
|
810
|
+
import_nestjs_datapaas.DataPaasModule.forRootAsync({
|
|
811
|
+
imports: [
|
|
812
|
+
import_config2.ConfigModule,
|
|
813
|
+
import_nestjs_logger2.LoggerModule
|
|
814
|
+
],
|
|
815
|
+
inject: [
|
|
816
|
+
import_config2.ConfigService,
|
|
817
|
+
import_nestjs_logger2.AppLogger
|
|
818
|
+
],
|
|
819
|
+
useFactory: /* @__PURE__ */ __name(async (...args) => {
|
|
820
|
+
const configService = args[0];
|
|
821
|
+
const appLogger = args[1];
|
|
822
|
+
const drizzleLogger = {
|
|
823
|
+
logQuery(query, params) {
|
|
824
|
+
if (process.env.NODE_ENV === "development") {
|
|
825
|
+
appLogger.log?.("SQL Query " + JSON.stringify({
|
|
826
|
+
query,
|
|
827
|
+
params
|
|
828
|
+
}), "Database");
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
};
|
|
832
|
+
return {
|
|
833
|
+
connectionString: configService.get("app.databaseUrl") ?? "",
|
|
834
|
+
logger: drizzleLogger
|
|
835
|
+
};
|
|
836
|
+
}, "useFactory")
|
|
837
|
+
})
|
|
838
|
+
],
|
|
781
839
|
import_nestjs_authnpaas.AuthNPaasModule.forRoot(),
|
|
782
840
|
import_nestjs_trigger.AutomationModule.forRoot(),
|
|
783
841
|
import_nestjs_capability.CapabilityModule.forRoot({
|
|
@@ -811,7 +869,11 @@ var PlatformModule = class _PlatformModule {
|
|
|
811
869
|
PlatformHttpClientService
|
|
812
870
|
]
|
|
813
871
|
},
|
|
814
|
-
HttpInterceptorService
|
|
872
|
+
HttpInterceptorService,
|
|
873
|
+
{
|
|
874
|
+
provide: import_core2.APP_INTERCEPTOR,
|
|
875
|
+
useClass: import_nestjs_observable.TraceInterceptor
|
|
876
|
+
}
|
|
815
877
|
],
|
|
816
878
|
exports: [
|
|
817
879
|
import_config2.ConfigModule,
|
|
@@ -832,7 +894,7 @@ var PlatformModule = class _PlatformModule {
|
|
|
832
894
|
if (process.env.NODE_ENV === "development") {
|
|
833
895
|
consumer.apply(FrameworkDebugMiddleware).forRoutes("/api/__framework__/debug");
|
|
834
896
|
}
|
|
835
|
-
consumer.apply(UserContextMiddleware, RequestContextMiddleware, import_nestjs_logger2.LoggerContextMiddleware, import_nestjs_datapaas.SqlExecutionContextMiddleware).forRoutes("/*");
|
|
897
|
+
consumer.apply(UserContextMiddleware, RequestContextMiddleware, import_nestjs_logger2.LoggerContextMiddleware, import_nestjs_observable.ObservableTraceMiddleware, import_nestjs_datapaas.SqlExecutionContextMiddleware).forRoutes("/*");
|
|
836
898
|
consumer.apply(CsrfTokenMiddleware, ViewContextMiddleware).exclude("/api/(.*)").forRoutes("*");
|
|
837
899
|
if (options.enableCsrf !== false) {
|
|
838
900
|
const csrfRoutes = options.csrfRoutes || "/api/*";
|
|
@@ -864,16 +926,19 @@ async function configureApp(app, perms = defaultPerms) {
|
|
|
864
926
|
app.use((0, import_cookie_parser.default)());
|
|
865
927
|
const globalPrefix = process.env.CLIENT_BASE_PATH ?? "";
|
|
866
928
|
app.setGlobalPrefix(globalPrefix);
|
|
929
|
+
app.set("trust proxy", true);
|
|
867
930
|
if (process.env.NODE_ENV !== "production" && perms.disableSwagger !== true) {
|
|
868
931
|
try {
|
|
869
932
|
await import_nestjs_openapi_devtools.DevToolsV2Module.mount(app, {
|
|
870
933
|
basePath: process.env.CLIENT_BASE_PATH,
|
|
871
934
|
docsPath: "/api_docs"
|
|
872
935
|
});
|
|
936
|
+
console.log("App Started Successfully.");
|
|
873
937
|
} catch (err) {
|
|
874
938
|
console.error("[OpenAPI] OpenAPI \u751F\u6210\u5931\u8D25:", err);
|
|
875
939
|
}
|
|
876
940
|
}
|
|
941
|
+
console.log("App Started Successfully.");
|
|
877
942
|
}
|
|
878
943
|
__name(configureApp, "configureApp");
|
|
879
944
|
|
|
@@ -884,8 +949,10 @@ __reExport(index_exports, require("@lark-apaas/nestjs-capability"), module.expor
|
|
|
884
949
|
__reExport(index_exports, require("@lark-apaas/nestjs-datapaas"), module.exports);
|
|
885
950
|
__reExport(index_exports, require("@lark-apaas/nestjs-observable"), module.exports);
|
|
886
951
|
__reExport(index_exports, require("@lark-apaas/nestjs-trigger"), module.exports);
|
|
952
|
+
var import_nestjs_common5 = require("@lark-apaas/nestjs-common");
|
|
887
953
|
// Annotate the CommonJS export names for ESM import in node:
|
|
888
954
|
0 && (module.exports = {
|
|
955
|
+
AutoTrace,
|
|
889
956
|
CsrfMiddleware,
|
|
890
957
|
CsrfTokenMiddleware,
|
|
891
958
|
DevToolsModule,
|
package/dist/index.d.cts
CHANGED
|
@@ -4,6 +4,7 @@ import { NestExpressApplication } from '@nestjs/platform-express';
|
|
|
4
4
|
export { DevToolsModule, DevToolsOptions, DevToolsV2Module, DevToolsV2Options } from '@lark-apaas/nestjs-openapi-devtools';
|
|
5
5
|
import { Request, Response, NextFunction } from 'express';
|
|
6
6
|
import { PlatformHttpClient } from '@lark-apaas/nestjs-common';
|
|
7
|
+
export { AutoTrace } from '@lark-apaas/nestjs-common';
|
|
7
8
|
export * from '@lark-apaas/nestjs-authnpaas';
|
|
8
9
|
export * from '@lark-apaas/nestjs-capability';
|
|
9
10
|
export * from '@lark-apaas/nestjs-datapaas';
|
|
@@ -29,6 +30,7 @@ declare global {
|
|
|
29
30
|
userName?: string; // 默认中文名
|
|
30
31
|
userNameEn?: string; // 冗余一份英文名
|
|
31
32
|
userNameI18n?: Record<string, string>; // 带多语的用户名
|
|
33
|
+
isSystemAccount?: boolean; // trigger 场景写入值为 true,user 访问场景不写入
|
|
32
34
|
},
|
|
33
35
|
csrfToken?: string;
|
|
34
36
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { NestExpressApplication } from '@nestjs/platform-express';
|
|
|
4
4
|
export { DevToolsModule, DevToolsOptions, DevToolsV2Module, DevToolsV2Options } from '@lark-apaas/nestjs-openapi-devtools';
|
|
5
5
|
import { Request, Response, NextFunction } from 'express';
|
|
6
6
|
import { PlatformHttpClient } from '@lark-apaas/nestjs-common';
|
|
7
|
+
export { AutoTrace } from '@lark-apaas/nestjs-common';
|
|
7
8
|
export * from '@lark-apaas/nestjs-authnpaas';
|
|
8
9
|
export * from '@lark-apaas/nestjs-capability';
|
|
9
10
|
export * from '@lark-apaas/nestjs-datapaas';
|
|
@@ -29,6 +30,7 @@ declare global {
|
|
|
29
30
|
userName?: string; // 默认中文名
|
|
30
31
|
userNameEn?: string; // 冗余一份英文名
|
|
31
32
|
userNameI18n?: Record<string, string>; // 带多语的用户名
|
|
33
|
+
isSystemAccount?: boolean; // trigger 场景写入值为 true,user 访问场景不写入
|
|
32
34
|
},
|
|
33
35
|
csrfToken?: string;
|
|
34
36
|
}
|
package/dist/index.js
CHANGED
|
@@ -3,10 +3,10 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
3
3
|
|
|
4
4
|
// src/modules/platform/module.ts
|
|
5
5
|
import { Global, Module, ValidationPipe } from "@nestjs/common";
|
|
6
|
-
import { APP_PIPE } from "@nestjs/core";
|
|
6
|
+
import { APP_INTERCEPTOR, APP_PIPE } from "@nestjs/core";
|
|
7
7
|
import { CommonModule, OBSERVABLE_SERVICE } from "@lark-apaas/nestjs-common";
|
|
8
8
|
import { ConfigModule, ConfigService } from "@nestjs/config";
|
|
9
|
-
import { NestjsObservableModule as ObservableModule, Observable } from "@lark-apaas/nestjs-observable";
|
|
9
|
+
import { NestjsObservableModule as ObservableModule, Observable, ObservableTraceMiddleware, TraceInterceptor } from "@lark-apaas/nestjs-observable";
|
|
10
10
|
import { HttpModule } from "@nestjs/axios";
|
|
11
11
|
import { LoggerModule, AppLogger as AppLogger2, LoggerContextMiddleware } from "@lark-apaas/nestjs-logger";
|
|
12
12
|
import { DataPaasModule, SqlExecutionContextMiddleware } from "@lark-apaas/nestjs-datapaas";
|
|
@@ -60,7 +60,8 @@ var UserContextMiddleware = class {
|
|
|
60
60
|
env: webUser?.env ?? "runtime",
|
|
61
61
|
userName: webUser?.user_name?.zh_cn ?? "",
|
|
62
62
|
userNameEn: webUser?.user_name?.en_us ?? "",
|
|
63
|
-
userNameI18n: webUser?.user_name ?? {}
|
|
63
|
+
userNameI18n: webUser?.user_name ?? {},
|
|
64
|
+
isSystemAccount: webUser?.is_system_account ?? false
|
|
64
65
|
};
|
|
65
66
|
next();
|
|
66
67
|
}
|
|
@@ -128,6 +129,51 @@ CsrfMiddleware = _ts_decorate2([
|
|
|
128
129
|
// src/middlewares/view-context/index.ts
|
|
129
130
|
import { Inject, Injectable as Injectable3, Logger } from "@nestjs/common";
|
|
130
131
|
import { PLATFORM_HTTP_CLIENT } from "@lark-apaas/nestjs-common";
|
|
132
|
+
|
|
133
|
+
// src/utils/safe-stringify.ts
|
|
134
|
+
function safeEscape(s) {
|
|
135
|
+
return s.replace(/[<>&='"\n\r\u2028\u2029]/g, function(c) {
|
|
136
|
+
switch (c.charCodeAt(0)) {
|
|
137
|
+
case 60:
|
|
138
|
+
return "\\u003c";
|
|
139
|
+
// <
|
|
140
|
+
case 62:
|
|
141
|
+
return "\\u003e";
|
|
142
|
+
// >
|
|
143
|
+
case 38:
|
|
144
|
+
return "\\u0026";
|
|
145
|
+
// &
|
|
146
|
+
case 61:
|
|
147
|
+
return "\\u003d";
|
|
148
|
+
// =
|
|
149
|
+
case 39:
|
|
150
|
+
return "\\u0027";
|
|
151
|
+
// '
|
|
152
|
+
case 34:
|
|
153
|
+
return "\\u0022";
|
|
154
|
+
// "
|
|
155
|
+
case 10:
|
|
156
|
+
return "\\u000a";
|
|
157
|
+
// \n
|
|
158
|
+
case 13:
|
|
159
|
+
return "\\u000d";
|
|
160
|
+
// \r
|
|
161
|
+
// 正常来说用户无法输入这几个字符, 现代浏览器也修复了这个问题
|
|
162
|
+
// https://zhuanlan.zhihu.com/p/29958439
|
|
163
|
+
case 8232:
|
|
164
|
+
return "\\u2028";
|
|
165
|
+
// 行分隔符
|
|
166
|
+
case 8233:
|
|
167
|
+
return "\\u2029";
|
|
168
|
+
// 段落分隔符
|
|
169
|
+
default:
|
|
170
|
+
return c;
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
__name(safeEscape, "safeEscape");
|
|
175
|
+
|
|
176
|
+
// src/middlewares/view-context/index.ts
|
|
131
177
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
132
178
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
133
179
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -178,14 +224,13 @@ var ViewContextMiddleware = class _ViewContextMiddleware {
|
|
|
178
224
|
const { userId, tenantId, appId } = req.userContext;
|
|
179
225
|
const csrfToken = req.csrfToken;
|
|
180
226
|
const appInfo = await this.getAppInfo(appId);
|
|
181
|
-
this.logger.debug(`appInfo: ${JSON.stringify(appInfo)}`);
|
|
182
227
|
req.__platform_data__ = {
|
|
183
228
|
csrfToken: csrfToken ?? "",
|
|
184
229
|
userId: userId ?? "",
|
|
185
230
|
appId: appId ?? "",
|
|
186
|
-
appName: appInfo?.app_name ?? "",
|
|
231
|
+
appName: safeEscape(appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528"),
|
|
187
232
|
appAvatar: appInfo?.app_avatar ?? "",
|
|
188
|
-
appDescription: appInfo?.app_description ?? "",
|
|
233
|
+
appDescription: safeEscape(appInfo?.app_description ?? ""),
|
|
189
234
|
tenantId
|
|
190
235
|
};
|
|
191
236
|
res.locals = {
|
|
@@ -194,9 +239,9 @@ var ViewContextMiddleware = class _ViewContextMiddleware {
|
|
|
194
239
|
userId: userId ?? "",
|
|
195
240
|
tenantId: tenantId ?? "",
|
|
196
241
|
appId: appId ?? "",
|
|
197
|
-
appName: appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528",
|
|
242
|
+
appName: safeEscape(appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528"),
|
|
198
243
|
appAvatar: appInfo?.app_avatar ?? "",
|
|
199
|
-
appDescription: appInfo?.app_description ?? ""
|
|
244
|
+
appDescription: safeEscape(appInfo?.app_description ?? "")
|
|
200
245
|
};
|
|
201
246
|
next();
|
|
202
247
|
}
|
|
@@ -386,26 +431,30 @@ var HttpInterceptorService = class {
|
|
|
386
431
|
setupInterceptors() {
|
|
387
432
|
const axiosInstance = this.httpService.axiosRef;
|
|
388
433
|
axiosInstance.interceptors.request.use((config) => {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
434
|
+
if (process.env.NODE_ENV === "development") {
|
|
435
|
+
this.logger.log("HTTP Request", {
|
|
436
|
+
method: config.method?.toUpperCase(),
|
|
437
|
+
url: config.url,
|
|
438
|
+
headers: config.headers,
|
|
439
|
+
params: config.params,
|
|
440
|
+
data: config.data
|
|
441
|
+
}, "HttpService");
|
|
442
|
+
}
|
|
396
443
|
return config;
|
|
397
444
|
}, (error) => {
|
|
398
445
|
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
399
446
|
return Promise.reject(error);
|
|
400
447
|
});
|
|
401
448
|
axiosInstance.interceptors.response.use((response) => {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
449
|
+
if (process.env.NODE_ENV === "development") {
|
|
450
|
+
this.logger.log("HTTP Response", {
|
|
451
|
+
method: response.config.method?.toUpperCase(),
|
|
452
|
+
url: response.config.url,
|
|
453
|
+
status: response.status,
|
|
454
|
+
statusText: response.statusText,
|
|
455
|
+
data: response.data
|
|
456
|
+
}, "HttpService");
|
|
457
|
+
}
|
|
409
458
|
return response;
|
|
410
459
|
}, (error) => {
|
|
411
460
|
this.logger.error("HTTP Response Error", {
|
|
@@ -648,14 +697,14 @@ var PlatformHttpClientService = class _PlatformHttpClientService {
|
|
|
648
697
|
*/
|
|
649
698
|
registerGlobalInterceptors() {
|
|
650
699
|
this.client.interceptors.request.use((config) => {
|
|
651
|
-
this.logger.
|
|
700
|
+
this.logger.debug(`Server SDK HTTP Request: ${config.method?.toUpperCase()} ${config.url}`);
|
|
652
701
|
return config;
|
|
653
702
|
}, (error) => {
|
|
654
|
-
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
703
|
+
this.logger.error("Server SDK HTTP Request Error", error, "HttpService");
|
|
655
704
|
return Promise.reject(error);
|
|
656
705
|
});
|
|
657
706
|
this.client.interceptors.response.use((response) => {
|
|
658
|
-
this.logger.
|
|
707
|
+
this.logger.debug(`Server SDK HTTP Response: ${response.status} ${response.url}`);
|
|
659
708
|
return response;
|
|
660
709
|
}, (error) => {
|
|
661
710
|
const errorLog = {
|
|
@@ -663,7 +712,7 @@ var PlatformHttpClientService = class _PlatformHttpClientService {
|
|
|
663
712
|
statusText: error.response?.statusText,
|
|
664
713
|
message: error.message
|
|
665
714
|
};
|
|
666
|
-
this.logger.error(`HTTP Response Error: ${error.config?.method?.toUpperCase()} ${error.config?.url} ${JSON.stringify(errorLog)}`);
|
|
715
|
+
this.logger.error(`Server SDK HTTP Response Error: ${error.config?.method?.toUpperCase()} ${error.config?.url} ${JSON.stringify(errorLog)}`);
|
|
667
716
|
return Promise.reject(error);
|
|
668
717
|
});
|
|
669
718
|
}
|
|
@@ -674,6 +723,9 @@ PlatformHttpClientService = _ts_decorate8([
|
|
|
674
723
|
_ts_metadata5("design:paramtypes", [])
|
|
675
724
|
], PlatformHttpClientService);
|
|
676
725
|
|
|
726
|
+
// src/modules/platform/config/feature-switch.ts
|
|
727
|
+
var DISABLE_DATAPASS = process.env.FORCE_FRAMEWORK_DISABLE_DATAPASS === "true";
|
|
728
|
+
|
|
677
729
|
// src/modules/platform/module.ts
|
|
678
730
|
function _ts_decorate9(decorators, target, key, desc) {
|
|
679
731
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -710,32 +762,37 @@ var PlatformModule = class _PlatformModule {
|
|
|
710
762
|
timeout: 5e3,
|
|
711
763
|
maxRedirects: 5
|
|
712
764
|
}),
|
|
713
|
-
DataPaasModule
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
765
|
+
// 读取环境变量判断是否启用 DataPaasModule
|
|
766
|
+
...DISABLE_DATAPASS ? [] : [
|
|
767
|
+
DataPaasModule.forRootAsync({
|
|
768
|
+
imports: [
|
|
769
|
+
ConfigModule,
|
|
770
|
+
LoggerModule
|
|
771
|
+
],
|
|
772
|
+
inject: [
|
|
773
|
+
ConfigService,
|
|
774
|
+
AppLogger2
|
|
775
|
+
],
|
|
776
|
+
useFactory: /* @__PURE__ */ __name(async (...args) => {
|
|
777
|
+
const configService = args[0];
|
|
778
|
+
const appLogger = args[1];
|
|
779
|
+
const drizzleLogger = {
|
|
780
|
+
logQuery(query, params) {
|
|
781
|
+
if (process.env.NODE_ENV === "development") {
|
|
782
|
+
appLogger.log?.("SQL Query " + JSON.stringify({
|
|
783
|
+
query,
|
|
784
|
+
params
|
|
785
|
+
}), "Database");
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
};
|
|
789
|
+
return {
|
|
790
|
+
connectionString: configService.get("app.databaseUrl") ?? "",
|
|
791
|
+
logger: drizzleLogger
|
|
792
|
+
};
|
|
793
|
+
}, "useFactory")
|
|
794
|
+
})
|
|
795
|
+
],
|
|
739
796
|
AuthNPaasModule.forRoot(),
|
|
740
797
|
AutomationModule.forRoot(),
|
|
741
798
|
CapabilityModule.forRoot({
|
|
@@ -769,7 +826,11 @@ var PlatformModule = class _PlatformModule {
|
|
|
769
826
|
PlatformHttpClientService
|
|
770
827
|
]
|
|
771
828
|
},
|
|
772
|
-
HttpInterceptorService
|
|
829
|
+
HttpInterceptorService,
|
|
830
|
+
{
|
|
831
|
+
provide: APP_INTERCEPTOR,
|
|
832
|
+
useClass: TraceInterceptor
|
|
833
|
+
}
|
|
773
834
|
],
|
|
774
835
|
exports: [
|
|
775
836
|
ConfigModule,
|
|
@@ -790,7 +851,7 @@ var PlatformModule = class _PlatformModule {
|
|
|
790
851
|
if (process.env.NODE_ENV === "development") {
|
|
791
852
|
consumer.apply(FrameworkDebugMiddleware).forRoutes("/api/__framework__/debug");
|
|
792
853
|
}
|
|
793
|
-
consumer.apply(UserContextMiddleware, RequestContextMiddleware, LoggerContextMiddleware, SqlExecutionContextMiddleware).forRoutes("/*");
|
|
854
|
+
consumer.apply(UserContextMiddleware, RequestContextMiddleware, LoggerContextMiddleware, ObservableTraceMiddleware, SqlExecutionContextMiddleware).forRoutes("/*");
|
|
794
855
|
consumer.apply(CsrfTokenMiddleware, ViewContextMiddleware).exclude("/api/(.*)").forRoutes("*");
|
|
795
856
|
if (options.enableCsrf !== false) {
|
|
796
857
|
const csrfRoutes = options.csrfRoutes || "/api/*";
|
|
@@ -822,16 +883,19 @@ async function configureApp(app, perms = defaultPerms) {
|
|
|
822
883
|
app.use(cookieParser());
|
|
823
884
|
const globalPrefix = process.env.CLIENT_BASE_PATH ?? "";
|
|
824
885
|
app.setGlobalPrefix(globalPrefix);
|
|
886
|
+
app.set("trust proxy", true);
|
|
825
887
|
if (process.env.NODE_ENV !== "production" && perms.disableSwagger !== true) {
|
|
826
888
|
try {
|
|
827
889
|
await DevToolsV2Module.mount(app, {
|
|
828
890
|
basePath: process.env.CLIENT_BASE_PATH,
|
|
829
891
|
docsPath: "/api_docs"
|
|
830
892
|
});
|
|
893
|
+
console.log("App Started Successfully.");
|
|
831
894
|
} catch (err) {
|
|
832
895
|
console.error("[OpenAPI] OpenAPI \u751F\u6210\u5931\u8D25:", err);
|
|
833
896
|
}
|
|
834
897
|
}
|
|
898
|
+
console.log("App Started Successfully.");
|
|
835
899
|
}
|
|
836
900
|
__name(configureApp, "configureApp");
|
|
837
901
|
|
|
@@ -842,7 +906,9 @@ export * from "@lark-apaas/nestjs-capability";
|
|
|
842
906
|
export * from "@lark-apaas/nestjs-datapaas";
|
|
843
907
|
export * from "@lark-apaas/nestjs-observable";
|
|
844
908
|
export * from "@lark-apaas/nestjs-trigger";
|
|
909
|
+
import { AutoTrace } from "@lark-apaas/nestjs-common";
|
|
845
910
|
export {
|
|
911
|
+
AutoTrace,
|
|
846
912
|
CsrfMiddleware,
|
|
847
913
|
CsrfTokenMiddleware,
|
|
848
914
|
DevToolsModule,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/fullstack-nestjs-core",
|
|
3
|
-
"version": "1.1.8-alpha.
|
|
3
|
+
"version": "1.1.8-alpha.18",
|
|
4
4
|
"description": "FullStack Nestjs Core",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,13 +39,13 @@
|
|
|
39
39
|
"prepublishOnly": "npm run build"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@lark-apaas/http-client": "0.1.2",
|
|
42
|
+
"@lark-apaas/http-client": "^0.1.2",
|
|
43
43
|
"@lark-apaas/nestjs-authnpaas": "^1.0.2",
|
|
44
|
-
"@lark-apaas/nestjs-capability": "0.0.1-alpha.
|
|
45
|
-
"@lark-apaas/nestjs-common": "^0.1.
|
|
46
|
-
"@lark-apaas/nestjs-datapaas": "^1.0.
|
|
47
|
-
"@lark-apaas/nestjs-logger": "^1.0.
|
|
48
|
-
"@lark-apaas/nestjs-observable": "^0.0.
|
|
44
|
+
"@lark-apaas/nestjs-capability": "0.0.1-alpha.14",
|
|
45
|
+
"@lark-apaas/nestjs-common": "^0.1.1",
|
|
46
|
+
"@lark-apaas/nestjs-datapaas": "^1.0.7",
|
|
47
|
+
"@lark-apaas/nestjs-logger": "^1.0.5",
|
|
48
|
+
"@lark-apaas/nestjs-observable": "^0.0.2",
|
|
49
49
|
"@lark-apaas/nestjs-openapi-devtools": "^1.0.9",
|
|
50
50
|
"@lark-apaas/nestjs-trigger": "^0.0.1",
|
|
51
51
|
"@nestjs/axios": "^4.0.1",
|