@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/README.md +165 -0
- package/dist/index.cjs +358 -41
- package/dist/index.d.cts +21 -2
- package/dist/index.d.ts +21 -2
- package/dist/index.js +346 -30
- package/package.json +8 -5
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
|
|
48
|
+
var import_common9 = require("@nestjs/common");
|
|
48
49
|
var import_core2 = require("@nestjs/core");
|
|
49
|
-
var
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
typeof
|
|
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
|
|
488
|
+
var import_common7 = require("@nestjs/common");
|
|
356
489
|
var import_core = require("@nestjs/core");
|
|
357
|
-
function
|
|
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(
|
|
364
|
-
function
|
|
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(
|
|
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 =
|
|
416
|
-
(0,
|
|
417
|
-
|
|
418
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
749
|
+
import_nestjs_common3.CommonModule,
|
|
453
750
|
import_nestjs_observable.NestjsObservableModule,
|
|
454
|
-
|
|
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
|
-
|
|
759
|
+
import_nestjs_logger2.LoggerModule
|
|
459
760
|
],
|
|
460
761
|
inject: [
|
|
461
762
|
import_config2.ConfigService,
|
|
462
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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,
|
|
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 =
|
|
537
|
-
(0,
|
|
538
|
-
(0,
|
|
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
|
|
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(
|
|
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
|
-
|
|
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 };
|