@lark-apaas/fullstack-nestjs-core 1.0.15-alpha.2 → 1.0.15-alpha.21
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 +512 -30
- package/dist/index.d.cts +48 -4
- package/dist/index.d.ts +48 -4
- package/dist/index.js +501 -22
- package/package.json +15 -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
|
+
CanRole: () => import_nestjs_authzpaas2.CanRole,
|
|
35
36
|
CsrfMiddleware: () => CsrfMiddleware,
|
|
36
37
|
CsrfTokenMiddleware: () => CsrfTokenMiddleware,
|
|
37
38
|
DevToolsModule: () => import_nestjs_openapi_devtools2.DevToolsModule,
|
|
@@ -44,12 +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
|
|
48
|
+
var import_common9 = require("@nestjs/common");
|
|
49
|
+
var import_core2 = require("@nestjs/core");
|
|
50
|
+
var import_nestjs_common3 = require("@lark-apaas/nestjs-common");
|
|
49
51
|
var import_config2 = require("@nestjs/config");
|
|
50
|
-
var
|
|
52
|
+
var import_nestjs_observable = require("@lark-apaas/nestjs-observable");
|
|
53
|
+
var import_axios2 = require("@nestjs/axios");
|
|
54
|
+
var import_nestjs_logger2 = require("@lark-apaas/nestjs-logger");
|
|
51
55
|
var import_nestjs_datapaas = require("@lark-apaas/nestjs-datapaas");
|
|
52
56
|
var import_nestjs_authnpaas = require("@lark-apaas/nestjs-authnpaas");
|
|
57
|
+
var import_nestjs_trigger = require("@lark-apaas/nestjs-trigger");
|
|
58
|
+
var import_nestjs_common4 = require("@lark-apaas/nestjs-common");
|
|
53
59
|
|
|
54
60
|
// src/middlewares/user-context/index.ts
|
|
55
61
|
var import_common = require("@nestjs/common");
|
|
@@ -92,7 +98,11 @@ var UserContextMiddleware = class {
|
|
|
92
98
|
tenantId: webUser?.tenant_id,
|
|
93
99
|
appId: webUser?.app_id ?? "",
|
|
94
100
|
loginUrl: webUser?.login_url ?? "",
|
|
95
|
-
userType: webUser?.user_type ?? ""
|
|
101
|
+
userType: webUser?.user_type ?? "",
|
|
102
|
+
env: webUser?.env ?? "runtime",
|
|
103
|
+
userName: webUser?.user_name?.zh_cn ?? "",
|
|
104
|
+
userNameEn: webUser?.user_name?.en_us ?? "",
|
|
105
|
+
userNameI18n: webUser?.user_name ?? {}
|
|
96
106
|
};
|
|
97
107
|
next();
|
|
98
108
|
}
|
|
@@ -159,6 +169,7 @@ CsrfMiddleware = _ts_decorate2([
|
|
|
159
169
|
|
|
160
170
|
// src/middlewares/view-context/index.ts
|
|
161
171
|
var import_common3 = require("@nestjs/common");
|
|
172
|
+
var import_nestjs_common = require("@lark-apaas/nestjs-common");
|
|
162
173
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
163
174
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
164
175
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -166,17 +177,57 @@ function _ts_decorate3(decorators, target, key, desc) {
|
|
|
166
177
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
167
178
|
}
|
|
168
179
|
__name(_ts_decorate3, "_ts_decorate");
|
|
169
|
-
|
|
180
|
+
function _ts_metadata(k, v) {
|
|
181
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
182
|
+
}
|
|
183
|
+
__name(_ts_metadata, "_ts_metadata");
|
|
184
|
+
function _ts_param(paramIndex, decorator) {
|
|
185
|
+
return function(target, key) {
|
|
186
|
+
decorator(target, key, paramIndex);
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
__name(_ts_param, "_ts_param");
|
|
190
|
+
var ViewContextMiddleware = class _ViewContextMiddleware {
|
|
170
191
|
static {
|
|
171
192
|
__name(this, "ViewContextMiddleware");
|
|
172
193
|
}
|
|
173
|
-
|
|
194
|
+
client;
|
|
195
|
+
logger = new import_common3.Logger(_ViewContextMiddleware.name);
|
|
196
|
+
constructor(client) {
|
|
197
|
+
this.client = client;
|
|
198
|
+
}
|
|
199
|
+
async getAppInfo(appId) {
|
|
200
|
+
if (!appId) {
|
|
201
|
+
this.logger.warn(`appId is empty, skip get app info`);
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const resp = await this.client.get(`/b/${appId}/get_published_v2`);
|
|
206
|
+
if (resp.status !== 200) {
|
|
207
|
+
throw new Error(`Failed to get app info, status: ${resp.status}`);
|
|
208
|
+
}
|
|
209
|
+
const data = await resp.json();
|
|
210
|
+
if (data.status_code !== "0") {
|
|
211
|
+
throw new Error(`Failed to get app info, status_code: ${data.status_code}`);
|
|
212
|
+
}
|
|
213
|
+
return data.data.app_info ?? {};
|
|
214
|
+
} catch (err) {
|
|
215
|
+
this.logger.error(err, "Failed to get app info");
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async use(req, res, next) {
|
|
174
220
|
const { userId, tenantId, appId, loginUrl, userType } = req.userContext;
|
|
175
221
|
const csrfToken = req.csrfToken;
|
|
222
|
+
const appInfo = await this.getAppInfo(appId);
|
|
223
|
+
this.logger.debug(`appInfo: ${JSON.stringify(appInfo)}`);
|
|
176
224
|
req.__platform_data__ = {
|
|
177
225
|
csrfToken: csrfToken ?? "",
|
|
178
226
|
userId: userId ?? "",
|
|
179
227
|
appId: appId ?? "",
|
|
228
|
+
appName: appInfo?.app_name ?? "",
|
|
229
|
+
appAvatar: appInfo?.app_avatar ?? "",
|
|
230
|
+
appDescription: appInfo?.app_description ?? "",
|
|
180
231
|
loginUrl: loginUrl ?? "",
|
|
181
232
|
userType: userType ?? "",
|
|
182
233
|
tenantId
|
|
@@ -188,13 +239,21 @@ var ViewContextMiddleware = class {
|
|
|
188
239
|
tenantId: tenantId ?? "",
|
|
189
240
|
loginUrl: loginUrl ?? "",
|
|
190
241
|
userType: userType ?? "",
|
|
191
|
-
appId: appId ?? ""
|
|
242
|
+
appId: appId ?? "",
|
|
243
|
+
appName: appInfo?.app_name ?? "\u5999\u642D\u5E94\u7528",
|
|
244
|
+
appAvatar: appInfo?.app_avatar ?? "",
|
|
245
|
+
appDescription: appInfo?.app_description ?? ""
|
|
192
246
|
};
|
|
193
247
|
next();
|
|
194
248
|
}
|
|
195
249
|
};
|
|
196
250
|
ViewContextMiddleware = _ts_decorate3([
|
|
197
|
-
(0, import_common3.Injectable)()
|
|
251
|
+
(0, import_common3.Injectable)(),
|
|
252
|
+
_ts_param(0, (0, import_common3.Inject)(import_nestjs_common.PLATFORM_HTTP_CLIENT)),
|
|
253
|
+
_ts_metadata("design:type", Function),
|
|
254
|
+
_ts_metadata("design:paramtypes", [
|
|
255
|
+
typeof PlatformHttpClient === "undefined" ? Object : PlatformHttpClient
|
|
256
|
+
])
|
|
198
257
|
], ViewContextMiddleware);
|
|
199
258
|
|
|
200
259
|
// src/middlewares/csrf_token/index.ts
|
|
@@ -249,7 +308,7 @@ var CsrfTokenMiddleware = class _CsrfTokenMiddleware {
|
|
|
249
308
|
res.cookie(cookieKey, token, {
|
|
250
309
|
maxAge: cookieMaxAge,
|
|
251
310
|
path: cookiePath,
|
|
252
|
-
httpOnly:
|
|
311
|
+
httpOnly: false,
|
|
253
312
|
secure: true,
|
|
254
313
|
sameSite: "none",
|
|
255
314
|
partitioned: true
|
|
@@ -262,6 +321,160 @@ CsrfTokenMiddleware = _ts_decorate4([
|
|
|
262
321
|
(0, import_common4.Injectable)()
|
|
263
322
|
], CsrfTokenMiddleware);
|
|
264
323
|
|
|
324
|
+
// src/middlewares/api-fallback/index.ts
|
|
325
|
+
function createApiNotFoundResponse(req) {
|
|
326
|
+
return {
|
|
327
|
+
code: 404,
|
|
328
|
+
message: `Cannot ${req.method} ${req.path}`,
|
|
329
|
+
error: "Not Found",
|
|
330
|
+
path: req.path,
|
|
331
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
__name(createApiNotFoundResponse, "createApiNotFoundResponse");
|
|
335
|
+
function getApiPathPrefix() {
|
|
336
|
+
const globalPrefix = process.env.CLIENT_BASE_PATH ?? "";
|
|
337
|
+
if (!globalPrefix) {
|
|
338
|
+
return "/api/";
|
|
339
|
+
}
|
|
340
|
+
const normalizedPrefix = globalPrefix.replace(/\/+$/, "");
|
|
341
|
+
return `${normalizedPrefix}/api/`;
|
|
342
|
+
}
|
|
343
|
+
__name(getApiPathPrefix, "getApiPathPrefix");
|
|
344
|
+
function apiResponseInterceptor(req, res, next) {
|
|
345
|
+
const apiPrefix = getApiPathPrefix();
|
|
346
|
+
if (!req.baseUrl.startsWith(apiPrefix)) {
|
|
347
|
+
return next();
|
|
348
|
+
}
|
|
349
|
+
res.render = function() {
|
|
350
|
+
return res.status(404).json(createApiNotFoundResponse(req));
|
|
351
|
+
};
|
|
352
|
+
next();
|
|
353
|
+
}
|
|
354
|
+
__name(apiResponseInterceptor, "apiResponseInterceptor");
|
|
355
|
+
|
|
356
|
+
// src/middlewares/request-context/index.ts
|
|
357
|
+
var import_common5 = require("@nestjs/common");
|
|
358
|
+
var import_nestjs_common2 = require("@lark-apaas/nestjs-common");
|
|
359
|
+
function _ts_decorate5(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_decorate5, "_ts_decorate");
|
|
366
|
+
function _ts_metadata2(k, v) {
|
|
367
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
368
|
+
}
|
|
369
|
+
__name(_ts_metadata2, "_ts_metadata");
|
|
370
|
+
var RequestContextMiddleware = class {
|
|
371
|
+
static {
|
|
372
|
+
__name(this, "RequestContextMiddleware");
|
|
373
|
+
}
|
|
374
|
+
requestContext;
|
|
375
|
+
constructor(requestContext) {
|
|
376
|
+
this.requestContext = requestContext;
|
|
377
|
+
}
|
|
378
|
+
use(req, _res, next) {
|
|
379
|
+
const path = req.originalUrl ?? req.url;
|
|
380
|
+
const userContext = req.userContext ?? {};
|
|
381
|
+
this.requestContext.run({
|
|
382
|
+
path,
|
|
383
|
+
method: req.method,
|
|
384
|
+
userId: userContext.userId,
|
|
385
|
+
tenantId: userContext.tenantId,
|
|
386
|
+
appId: userContext.appId
|
|
387
|
+
}, () => next());
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
RequestContextMiddleware = _ts_decorate5([
|
|
391
|
+
(0, import_common5.Injectable)(),
|
|
392
|
+
_ts_metadata2("design:type", Function),
|
|
393
|
+
_ts_metadata2("design:paramtypes", [
|
|
394
|
+
typeof import_nestjs_common2.RequestContextService === "undefined" ? Object : import_nestjs_common2.RequestContextService
|
|
395
|
+
])
|
|
396
|
+
], RequestContextMiddleware);
|
|
397
|
+
|
|
398
|
+
// src/services/http-interceptor.service.ts
|
|
399
|
+
var import_common6 = require("@nestjs/common");
|
|
400
|
+
var import_axios = require("@nestjs/axios");
|
|
401
|
+
var import_nestjs_logger = require("@lark-apaas/nestjs-logger");
|
|
402
|
+
function _ts_decorate6(decorators, target, key, desc) {
|
|
403
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
404
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
405
|
+
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;
|
|
406
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
407
|
+
}
|
|
408
|
+
__name(_ts_decorate6, "_ts_decorate");
|
|
409
|
+
function _ts_metadata3(k, v) {
|
|
410
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
411
|
+
}
|
|
412
|
+
__name(_ts_metadata3, "_ts_metadata");
|
|
413
|
+
var HttpInterceptorService = class {
|
|
414
|
+
static {
|
|
415
|
+
__name(this, "HttpInterceptorService");
|
|
416
|
+
}
|
|
417
|
+
httpService;
|
|
418
|
+
logger;
|
|
419
|
+
constructor(httpService, logger) {
|
|
420
|
+
this.httpService = httpService;
|
|
421
|
+
this.logger = logger;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* 模块初始化时配置拦截器
|
|
425
|
+
*/
|
|
426
|
+
onModuleInit() {
|
|
427
|
+
this.setupInterceptors();
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* 配置 axios 请求/响应拦截器
|
|
431
|
+
*/
|
|
432
|
+
setupInterceptors() {
|
|
433
|
+
const axiosInstance = this.httpService.axiosRef;
|
|
434
|
+
axiosInstance.interceptors.request.use((config) => {
|
|
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
|
+
return config;
|
|
443
|
+
}, (error) => {
|
|
444
|
+
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
445
|
+
return Promise.reject(error);
|
|
446
|
+
});
|
|
447
|
+
axiosInstance.interceptors.response.use((response) => {
|
|
448
|
+
this.logger.log("HTTP Response", {
|
|
449
|
+
method: response.config.method?.toUpperCase(),
|
|
450
|
+
url: response.config.url,
|
|
451
|
+
status: response.status,
|
|
452
|
+
statusText: response.statusText,
|
|
453
|
+
data: response.data
|
|
454
|
+
}, "HttpService");
|
|
455
|
+
return response;
|
|
456
|
+
}, (error) => {
|
|
457
|
+
this.logger.error("HTTP Response Error", {
|
|
458
|
+
method: error.config?.method?.toUpperCase(),
|
|
459
|
+
url: error.config?.url,
|
|
460
|
+
status: error.response?.status,
|
|
461
|
+
statusText: error.response?.statusText,
|
|
462
|
+
data: error.response?.data,
|
|
463
|
+
message: error.message
|
|
464
|
+
}, "HttpService");
|
|
465
|
+
return Promise.reject(error);
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
HttpInterceptorService = _ts_decorate6([
|
|
470
|
+
(0, import_common6.Injectable)(),
|
|
471
|
+
_ts_metadata3("design:type", Function),
|
|
472
|
+
_ts_metadata3("design:paramtypes", [
|
|
473
|
+
typeof import_axios.HttpService === "undefined" ? Object : import_axios.HttpService,
|
|
474
|
+
typeof import_nestjs_logger.AppLogger === "undefined" ? Object : import_nestjs_logger.AppLogger
|
|
475
|
+
])
|
|
476
|
+
], HttpInterceptorService);
|
|
477
|
+
|
|
265
478
|
// src/modules/platform/config/app.config.ts
|
|
266
479
|
var import_config = require("@nestjs/config");
|
|
267
480
|
var NAMESPACE = "app";
|
|
@@ -274,16 +487,249 @@ var app_config_default = (0, import_config.registerAs)(NAMESPACE, () => {
|
|
|
274
487
|
};
|
|
275
488
|
});
|
|
276
489
|
|
|
490
|
+
// src/middlewares/debug/index.ts
|
|
491
|
+
var import_common7 = require("@nestjs/common");
|
|
492
|
+
var import_core = require("@nestjs/core");
|
|
493
|
+
function _ts_decorate7(decorators, target, key, desc) {
|
|
494
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
495
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
496
|
+
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;
|
|
497
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
498
|
+
}
|
|
499
|
+
__name(_ts_decorate7, "_ts_decorate");
|
|
500
|
+
function _ts_metadata4(k, v) {
|
|
501
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
502
|
+
}
|
|
503
|
+
__name(_ts_metadata4, "_ts_metadata");
|
|
504
|
+
var processStartTimestamp = Date.now();
|
|
505
|
+
var FrameworkDebugMiddleware = class {
|
|
506
|
+
static {
|
|
507
|
+
__name(this, "FrameworkDebugMiddleware");
|
|
508
|
+
}
|
|
509
|
+
httpAdapterHost;
|
|
510
|
+
constructor(httpAdapterHost) {
|
|
511
|
+
this.httpAdapterHost = httpAdapterHost;
|
|
512
|
+
}
|
|
513
|
+
use(_req, res) {
|
|
514
|
+
res.json(this.getDebugInfo());
|
|
515
|
+
}
|
|
516
|
+
getDebugInfo() {
|
|
517
|
+
const routes = this.getRoutes();
|
|
518
|
+
const uptimeSeconds = Math.floor(process.uptime());
|
|
519
|
+
return {
|
|
520
|
+
["\u8DEF\u7531\u914D\u7F6E"]: routes,
|
|
521
|
+
["\u8FDB\u7A0B\u5B58\u6D3B\u65F6\u95F4\uFF08\u79D2\uFF09"]: uptimeSeconds,
|
|
522
|
+
["\u8FDB\u7A0B\u542F\u52A8\u65F6\u95F4\uFF08\u79D2\uFF09"]: new Date(processStartTimestamp).toISOString(),
|
|
523
|
+
["\u8FD0\u884C\u65F6\u7248\u672C"]: process.versions
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
getRoutes() {
|
|
527
|
+
const server = this.httpAdapterHost.httpAdapter;
|
|
528
|
+
const router = server.getInstance()._router;
|
|
529
|
+
if (!router) {
|
|
530
|
+
return {
|
|
531
|
+
error: "Router \u4E0D\u53EF\u7528"
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
const routes = [];
|
|
535
|
+
router.stack.forEach((middleware, index) => {
|
|
536
|
+
if (middleware.route) {
|
|
537
|
+
routes.push({
|
|
538
|
+
order: String(index),
|
|
539
|
+
path: middleware.route.path,
|
|
540
|
+
method: middleware.method,
|
|
541
|
+
regexp: middleware.regexp?.toString()
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
return {
|
|
546
|
+
total: routes.length,
|
|
547
|
+
routes
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
FrameworkDebugMiddleware = _ts_decorate7([
|
|
552
|
+
(0, import_common7.Injectable)(),
|
|
553
|
+
_ts_metadata4("design:type", Function),
|
|
554
|
+
_ts_metadata4("design:paramtypes", [
|
|
555
|
+
typeof import_core.HttpAdapterHost === "undefined" ? Object : import_core.HttpAdapterHost
|
|
556
|
+
])
|
|
557
|
+
], FrameworkDebugMiddleware);
|
|
558
|
+
|
|
559
|
+
// src/services/platform-http-client.service.ts
|
|
560
|
+
var import_common8 = require("@nestjs/common");
|
|
561
|
+
var import_http_client = require("@lark-apaas/http-client");
|
|
562
|
+
function _ts_decorate8(decorators, target, key, desc) {
|
|
563
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
564
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
565
|
+
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;
|
|
566
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
567
|
+
}
|
|
568
|
+
__name(_ts_decorate8, "_ts_decorate");
|
|
569
|
+
function _ts_metadata5(k, v) {
|
|
570
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
571
|
+
}
|
|
572
|
+
__name(_ts_metadata5, "_ts_metadata");
|
|
573
|
+
var ProtectedHttpClient = class ProtectedHttpClient2 {
|
|
574
|
+
static {
|
|
575
|
+
__name(this, "ProtectedHttpClient");
|
|
576
|
+
}
|
|
577
|
+
client;
|
|
578
|
+
constructor(client) {
|
|
579
|
+
this.client = client;
|
|
580
|
+
}
|
|
581
|
+
request(config) {
|
|
582
|
+
return this.client.request(config);
|
|
583
|
+
}
|
|
584
|
+
get(url, config) {
|
|
585
|
+
return this.client.get(url, config);
|
|
586
|
+
}
|
|
587
|
+
post(url, data, config) {
|
|
588
|
+
return this.client.post(url, data, config);
|
|
589
|
+
}
|
|
590
|
+
put(url, data, config) {
|
|
591
|
+
return this.client.put(url, data, config);
|
|
592
|
+
}
|
|
593
|
+
patch(url, data, config) {
|
|
594
|
+
return this.client.patch(url, data, config);
|
|
595
|
+
}
|
|
596
|
+
delete(url, config) {
|
|
597
|
+
return this.client.delete(url, config);
|
|
598
|
+
}
|
|
599
|
+
};
|
|
600
|
+
var PlatformHttpClientService = class _PlatformHttpClientService {
|
|
601
|
+
static {
|
|
602
|
+
__name(this, "PlatformHttpClientService");
|
|
603
|
+
}
|
|
604
|
+
client;
|
|
605
|
+
protectedClient;
|
|
606
|
+
logger = new import_common8.Logger(_PlatformHttpClientService.name);
|
|
607
|
+
constructor() {
|
|
608
|
+
const baseConfig = {
|
|
609
|
+
timeout: 5e3
|
|
610
|
+
};
|
|
611
|
+
this.client = new import_http_client.HttpClient({
|
|
612
|
+
...baseConfig,
|
|
613
|
+
platform: {
|
|
614
|
+
enabled: true
|
|
615
|
+
}
|
|
616
|
+
});
|
|
617
|
+
this.protectedClient = new ProtectedHttpClient(this.client);
|
|
618
|
+
this.registerGlobalInterceptors();
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* 获取受保护的 HttpClient 实例(推荐)
|
|
622
|
+
*
|
|
623
|
+
* 该实例不暴露 interceptors,防止业务代码修改全局拦截器
|
|
624
|
+
*
|
|
625
|
+
* @returns 受保护的 HttpClient 实例
|
|
626
|
+
*/
|
|
627
|
+
get instance() {
|
|
628
|
+
return this.protectedClient;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* 获取原始 HttpClient 实例(危险)
|
|
632
|
+
*
|
|
633
|
+
* ⚠️ 警告:该实例允许修改拦截器,会影响所有使用全局实例的地方
|
|
634
|
+
*
|
|
635
|
+
* 仅用于特殊场景,不应该暴露给业务代码
|
|
636
|
+
* 如果需要自定义拦截器,请使用 `create()` 方法创建独立实例
|
|
637
|
+
*
|
|
638
|
+
* @internal
|
|
639
|
+
* @returns 原始 HttpClient 实例
|
|
640
|
+
*/
|
|
641
|
+
get rawInstance() {
|
|
642
|
+
return this.client;
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* 创建一个新的独立 HttpClient 实例
|
|
646
|
+
*
|
|
647
|
+
* 适用于需要自定义拦截器或配置的场景
|
|
648
|
+
* 创建的实例完全独立,不会影响全局实例
|
|
649
|
+
*
|
|
650
|
+
* @param options - 配置选项(会与全局配置合并)
|
|
651
|
+
* @returns 完整的 HttpClient 实例(允许修改拦截器)
|
|
652
|
+
*
|
|
653
|
+
* @example
|
|
654
|
+
* ```typescript
|
|
655
|
+
* @Injectable()
|
|
656
|
+
* export class FileService {
|
|
657
|
+
* private fileClient: HttpClient;
|
|
658
|
+
*
|
|
659
|
+
* constructor(private platformHttp: PlatformHttpClientService) {
|
|
660
|
+
* // 创建超时 60 秒的独立实例
|
|
661
|
+
* this.fileClient = this.platformHttp.create({
|
|
662
|
+
* config: { timeout: 60000 }
|
|
663
|
+
* });
|
|
664
|
+
*
|
|
665
|
+
* // 为这个实例注册拦截器(不影响全局实例)
|
|
666
|
+
* this.fileClient.interceptors.request.use((config) => {
|
|
667
|
+
* console.log('File upload starting...');
|
|
668
|
+
* return config;
|
|
669
|
+
* });
|
|
670
|
+
* }
|
|
671
|
+
*
|
|
672
|
+
* async uploadFile(file: Buffer) {
|
|
673
|
+
* return this.fileClient.post('/file/upload', file);
|
|
674
|
+
* }
|
|
675
|
+
* }
|
|
676
|
+
* ```
|
|
677
|
+
*/
|
|
678
|
+
create(options) {
|
|
679
|
+
const mergedConfig = {
|
|
680
|
+
timeout: 5e3,
|
|
681
|
+
...options?.config
|
|
682
|
+
};
|
|
683
|
+
const mergedPlatform = {
|
|
684
|
+
enabled: true,
|
|
685
|
+
...options?.platform
|
|
686
|
+
};
|
|
687
|
+
return new import_http_client.HttpClient({
|
|
688
|
+
...mergedConfig,
|
|
689
|
+
platform: mergedPlatform
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* 注册全局拦截器
|
|
694
|
+
*/
|
|
695
|
+
registerGlobalInterceptors() {
|
|
696
|
+
this.client.interceptors.request.use((config) => {
|
|
697
|
+
this.logger.log(`HTTP Request: ${config.method?.toUpperCase()} ${config.url}`);
|
|
698
|
+
return config;
|
|
699
|
+
}, (error) => {
|
|
700
|
+
this.logger.error("HTTP Request Error", error, "HttpService");
|
|
701
|
+
return Promise.reject(error);
|
|
702
|
+
});
|
|
703
|
+
this.client.interceptors.response.use((response) => {
|
|
704
|
+
this.logger.log(`HTTP Response: ${response.status} ${response.url}`);
|
|
705
|
+
return response;
|
|
706
|
+
}, (error) => {
|
|
707
|
+
const errorLog = {
|
|
708
|
+
status: error.response?.status,
|
|
709
|
+
statusText: error.response?.statusText,
|
|
710
|
+
message: error.message
|
|
711
|
+
};
|
|
712
|
+
this.logger.error(`HTTP Response Error: ${error.config?.method?.toUpperCase()} ${error.config?.url} ${JSON.stringify(errorLog)}`);
|
|
713
|
+
return Promise.reject(error);
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
PlatformHttpClientService = _ts_decorate8([
|
|
718
|
+
(0, import_common8.Injectable)(),
|
|
719
|
+
_ts_metadata5("design:type", Function),
|
|
720
|
+
_ts_metadata5("design:paramtypes", [])
|
|
721
|
+
], PlatformHttpClientService);
|
|
722
|
+
|
|
277
723
|
// src/modules/platform/module.ts
|
|
278
724
|
var import_nestjs_authzpaas = require("@lark-apaas/nestjs-authzpaas");
|
|
279
|
-
function
|
|
725
|
+
function _ts_decorate9(decorators, target, key, desc) {
|
|
280
726
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
281
727
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
282
728
|
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;
|
|
283
729
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
284
730
|
}
|
|
285
|
-
__name(
|
|
286
|
-
var PLATFORM_MODULE_OPTIONS = "PLATFORM_MODULE_OPTIONS";
|
|
731
|
+
__name(_ts_decorate9, "_ts_decorate");
|
|
732
|
+
var PLATFORM_MODULE_OPTIONS = /* @__PURE__ */ Symbol("PLATFORM_MODULE_OPTIONS");
|
|
287
733
|
var PlatformModule = class _PlatformModule {
|
|
288
734
|
static {
|
|
289
735
|
__name(this, "PlatformModule");
|
|
@@ -304,25 +750,31 @@ var PlatformModule = class _PlatformModule {
|
|
|
304
750
|
app_config_default
|
|
305
751
|
]
|
|
306
752
|
}),
|
|
307
|
-
|
|
753
|
+
import_nestjs_common3.CommonModule,
|
|
754
|
+
import_nestjs_observable.NestjsObservableModule,
|
|
755
|
+
import_nestjs_logger2.LoggerModule,
|
|
756
|
+
import_axios2.HttpModule.register({
|
|
757
|
+
timeout: 5e3,
|
|
758
|
+
maxRedirects: 5
|
|
759
|
+
}),
|
|
308
760
|
import_nestjs_datapaas.DataPaasModule.forRootAsync({
|
|
309
761
|
imports: [
|
|
310
762
|
import_config2.ConfigModule,
|
|
311
|
-
|
|
763
|
+
import_nestjs_logger2.LoggerModule
|
|
312
764
|
],
|
|
313
765
|
inject: [
|
|
314
766
|
import_config2.ConfigService,
|
|
315
|
-
|
|
767
|
+
import_nestjs_logger2.AppLogger
|
|
316
768
|
],
|
|
317
769
|
useFactory: /* @__PURE__ */ __name(async (...args) => {
|
|
318
770
|
const configService = args[0];
|
|
319
771
|
const appLogger = args[1];
|
|
320
772
|
const drizzleLogger = {
|
|
321
773
|
logQuery(query, params) {
|
|
322
|
-
appLogger.log?.("SQL Query"
|
|
774
|
+
appLogger.log?.("SQL Query " + JSON.stringify({
|
|
323
775
|
query,
|
|
324
776
|
params
|
|
325
|
-
}, "Database");
|
|
777
|
+
}), "Database");
|
|
326
778
|
}
|
|
327
779
|
};
|
|
328
780
|
return {
|
|
@@ -332,6 +784,7 @@ var PlatformModule = class _PlatformModule {
|
|
|
332
784
|
}, "useFactory")
|
|
333
785
|
}),
|
|
334
786
|
import_nestjs_authnpaas.AuthNPaasModule.forRoot(),
|
|
787
|
+
import_nestjs_trigger.AutomationModule.forRoot(),
|
|
335
788
|
import_nestjs_authzpaas.AuthZPaasModule.forRoot()
|
|
336
789
|
],
|
|
337
790
|
providers: [
|
|
@@ -340,18 +793,34 @@ var PlatformModule = class _PlatformModule {
|
|
|
340
793
|
useValue: options
|
|
341
794
|
},
|
|
342
795
|
{
|
|
343
|
-
provide:
|
|
344
|
-
useValue: new
|
|
796
|
+
provide: import_core2.APP_PIPE,
|
|
797
|
+
useValue: new import_common9.ValidationPipe({
|
|
345
798
|
transform: true,
|
|
346
799
|
transformOptions: {
|
|
347
800
|
enableImplicitConversion: true
|
|
348
801
|
}
|
|
349
802
|
})
|
|
350
|
-
}
|
|
803
|
+
},
|
|
804
|
+
{
|
|
805
|
+
provide: import_nestjs_common3.OBSERVABLE_SERVICE,
|
|
806
|
+
useClass: import_nestjs_observable.Observable
|
|
807
|
+
},
|
|
808
|
+
PlatformHttpClientService,
|
|
809
|
+
{
|
|
810
|
+
provide: import_nestjs_common4.PLATFORM_HTTP_CLIENT,
|
|
811
|
+
useFactory: /* @__PURE__ */ __name((svc) => svc.instance, "useFactory"),
|
|
812
|
+
inject: [
|
|
813
|
+
PlatformHttpClientService
|
|
814
|
+
]
|
|
815
|
+
},
|
|
816
|
+
HttpInterceptorService
|
|
351
817
|
],
|
|
352
818
|
exports: [
|
|
353
819
|
import_config2.ConfigModule,
|
|
354
|
-
|
|
820
|
+
import_nestjs_logger2.LoggerModule,
|
|
821
|
+
import_nestjs_common3.CommonModule,
|
|
822
|
+
import_nestjs_common3.OBSERVABLE_SERVICE,
|
|
823
|
+
import_nestjs_common4.PLATFORM_HTTP_CLIENT
|
|
355
824
|
]
|
|
356
825
|
};
|
|
357
826
|
}
|
|
@@ -360,7 +829,11 @@ var PlatformModule = class _PlatformModule {
|
|
|
360
829
|
*/
|
|
361
830
|
configure(consumer) {
|
|
362
831
|
const options = _PlatformModule.moduleOptions;
|
|
363
|
-
consumer.apply(
|
|
832
|
+
consumer.apply(apiResponseInterceptor).forRoutes("/api/*");
|
|
833
|
+
if (process.env.NODE_ENV === "development") {
|
|
834
|
+
consumer.apply(FrameworkDebugMiddleware).forRoutes("/api/__framework__/debug");
|
|
835
|
+
}
|
|
836
|
+
consumer.apply(UserContextMiddleware, RequestContextMiddleware, import_nestjs_logger2.LoggerContextMiddleware, import_nestjs_datapaas.SqlExecutionContextMiddleware).forRoutes("/*");
|
|
364
837
|
consumer.apply(CsrfTokenMiddleware, ViewContextMiddleware).exclude("/api/(.*)").forRoutes("*");
|
|
365
838
|
if (options.enableCsrf !== false) {
|
|
366
839
|
const csrfRoutes = options.csrfRoutes || "/api/*";
|
|
@@ -374,22 +847,25 @@ var PlatformModule = class _PlatformModule {
|
|
|
374
847
|
}
|
|
375
848
|
}
|
|
376
849
|
};
|
|
377
|
-
PlatformModule =
|
|
378
|
-
(0,
|
|
379
|
-
(0,
|
|
850
|
+
PlatformModule = _ts_decorate9([
|
|
851
|
+
(0, import_common9.Global)(),
|
|
852
|
+
(0, import_common9.Module)({})
|
|
380
853
|
], PlatformModule);
|
|
381
854
|
|
|
382
855
|
// src/setup.ts
|
|
383
|
-
var
|
|
856
|
+
var import_nestjs_logger3 = require("@lark-apaas/nestjs-logger");
|
|
384
857
|
var import_cookie_parser = __toESM(require("cookie-parser"), 1);
|
|
385
858
|
var import_nestjs_openapi_devtools = require("@lark-apaas/nestjs-openapi-devtools");
|
|
386
|
-
|
|
387
|
-
|
|
859
|
+
var defaultPerms = {
|
|
860
|
+
disableSwagger: false
|
|
861
|
+
};
|
|
862
|
+
async function configureApp(app, perms = defaultPerms) {
|
|
863
|
+
app.useLogger(app.get(import_nestjs_logger3.AppLogger));
|
|
388
864
|
app.flushLogs();
|
|
389
865
|
app.use((0, import_cookie_parser.default)());
|
|
390
866
|
const globalPrefix = process.env.CLIENT_BASE_PATH ?? "";
|
|
391
867
|
app.setGlobalPrefix(globalPrefix);
|
|
392
|
-
if (process.env.NODE_ENV !== "production") {
|
|
868
|
+
if (process.env.NODE_ENV !== "production" && perms.disableSwagger !== true) {
|
|
393
869
|
try {
|
|
394
870
|
await import_nestjs_openapi_devtools.DevToolsV2Module.mount(app, {
|
|
395
871
|
basePath: process.env.CLIENT_BASE_PATH,
|
|
@@ -406,8 +882,12 @@ __name(configureApp, "configureApp");
|
|
|
406
882
|
var import_nestjs_openapi_devtools2 = require("@lark-apaas/nestjs-openapi-devtools");
|
|
407
883
|
__reExport(index_exports, require("@lark-apaas/nestjs-authnpaas"), module.exports);
|
|
408
884
|
__reExport(index_exports, require("@lark-apaas/nestjs-datapaas"), module.exports);
|
|
885
|
+
__reExport(index_exports, require("@lark-apaas/nestjs-observable"), module.exports);
|
|
886
|
+
__reExport(index_exports, require("@lark-apaas/nestjs-trigger"), module.exports);
|
|
887
|
+
var import_nestjs_authzpaas2 = require("@lark-apaas/nestjs-authzpaas");
|
|
409
888
|
// Annotate the CommonJS export names for ESM import in node:
|
|
410
889
|
0 && (module.exports = {
|
|
890
|
+
CanRole,
|
|
411
891
|
CsrfMiddleware,
|
|
412
892
|
CsrfTokenMiddleware,
|
|
413
893
|
DevToolsModule,
|
|
@@ -417,5 +897,7 @@ __reExport(index_exports, require("@lark-apaas/nestjs-datapaas"), module.exports
|
|
|
417
897
|
ViewContextMiddleware,
|
|
418
898
|
configureApp,
|
|
419
899
|
...require("@lark-apaas/nestjs-authnpaas"),
|
|
420
|
-
...require("@lark-apaas/nestjs-datapaas")
|
|
900
|
+
...require("@lark-apaas/nestjs-datapaas"),
|
|
901
|
+
...require("@lark-apaas/nestjs-observable"),
|
|
902
|
+
...require("@lark-apaas/nestjs-trigger")
|
|
421
903
|
});
|