@lark-apaas/devtool-kits 1.2.17-alpha.19 → 1.2.17-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 +43 -0
- package/dist/index.cjs +114 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +37 -1
- package/dist/index.d.ts +37 -1
- package/dist/index.js +108 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -92,6 +92,17 @@ import {
|
|
|
92
92
|
} from '@apaas/fullstack-toolkits';
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
+
### 兼容工具函数 (Compat)
|
|
96
|
+
```typescript
|
|
97
|
+
import {
|
|
98
|
+
sendJson, // 发送 JSON 响应(兼容 Express/Connect)
|
|
99
|
+
sendError, // 发送错误响应
|
|
100
|
+
sendSuccess, // 发送成功响应
|
|
101
|
+
getQuery, // 获取所有查询参数
|
|
102
|
+
getQueryParam, // 获取单个查询参数
|
|
103
|
+
} from '@apaas/fullstack-toolkits';
|
|
104
|
+
```
|
|
105
|
+
|
|
95
106
|
### 类型定义 (Types)
|
|
96
107
|
```typescript
|
|
97
108
|
import type {
|
|
@@ -171,6 +182,38 @@ export default {
|
|
|
171
182
|
- 全局中间件应放在路由中间件之前
|
|
172
183
|
- 路由中间件仅处理匹配其挂载路径的请求
|
|
173
184
|
|
|
185
|
+
### Vite/Connect 兼容性
|
|
186
|
+
|
|
187
|
+
本工具包原生支持 Vite 开发服务器。`registerMiddlewares` 会自动检测 Vite/Connect 环境,并添加必要的 Express API 兼容层:
|
|
188
|
+
|
|
189
|
+
- `res.status()` - 设置响应状态码
|
|
190
|
+
- `res.json()` - 发送 JSON 响应
|
|
191
|
+
- `res.send()` - 发送响应
|
|
192
|
+
- `req.query` - 解析后的查询参数
|
|
193
|
+
|
|
194
|
+
这意味着您可以直接在 Vite 中使用本工具包,无需额外配置。
|
|
195
|
+
|
|
196
|
+
**兼容工具函数(可选):**
|
|
197
|
+
|
|
198
|
+
如果您正在编写自定义中间件并希望同时支持 Express 和 Vite,可以使用导出的兼容工具函数:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
import { sendJson, sendError, sendSuccess, getQuery, getQueryParam } from '@lark-apaas/devtool-kits';
|
|
202
|
+
|
|
203
|
+
// 发送 JSON 响应(自动检测 Express/Connect)
|
|
204
|
+
sendJson(res, { data: 'value' }, 200);
|
|
205
|
+
|
|
206
|
+
// 发送错误响应
|
|
207
|
+
sendError(res, 'Not found', error, 404);
|
|
208
|
+
|
|
209
|
+
// 发送成功响应
|
|
210
|
+
sendSuccess(res, { id: 123 });
|
|
211
|
+
|
|
212
|
+
// 获取查询参数(自动解析 URL 或使用 req.query)
|
|
213
|
+
const query = getQuery(req);
|
|
214
|
+
const page = getQueryParam(req, 'page');
|
|
215
|
+
```
|
|
216
|
+
|
|
174
217
|
## 中间件详细说明
|
|
175
218
|
### Dev Logs 中间件
|
|
176
219
|
|
package/dist/index.cjs
CHANGED
|
@@ -35,11 +35,16 @@ __export(index_exports, {
|
|
|
35
35
|
createCollectLogsMiddleware: () => createCollectLogsMiddleware,
|
|
36
36
|
createDevLogsMiddleware: () => createDevLogsMiddleware,
|
|
37
37
|
createOpenapiMiddleware: () => createOpenapiMiddleware,
|
|
38
|
+
getQuery: () => getQuery,
|
|
39
|
+
getQueryParam: () => getQueryParam,
|
|
38
40
|
handleDevProxyError: () => handleDevProxyError,
|
|
39
41
|
normalizeBasePath: () => normalizeBasePath,
|
|
40
42
|
parseAndGenerateNestResourceTemplate: () => parseAndGenerateNestResourceTemplate,
|
|
41
43
|
postprocessDrizzleSchema: () => postprocessDrizzleSchema,
|
|
42
|
-
registerMiddlewares: () => registerMiddlewares
|
|
44
|
+
registerMiddlewares: () => registerMiddlewares,
|
|
45
|
+
sendError: () => sendError,
|
|
46
|
+
sendJson: () => sendJson,
|
|
47
|
+
sendSuccess: () => sendSuccess
|
|
43
48
|
});
|
|
44
49
|
module.exports = __toCommonJS(index_exports);
|
|
45
50
|
|
|
@@ -3355,7 +3360,8 @@ async function fetchRoutesFromBackend(basePath) {
|
|
|
3355
3360
|
}
|
|
3356
3361
|
const data = await response.json();
|
|
3357
3362
|
const routeConfig = data["\u8DEF\u7531\u914D\u7F6E"];
|
|
3358
|
-
if (!routeConfig || !routeConfig.routes) {
|
|
3363
|
+
if (!routeConfig || !routeConfig.routes || !Array.isArray(routeConfig.routes)) {
|
|
3364
|
+
console.warn("[api-list] Invalid routes data:", routeConfig);
|
|
3359
3365
|
return [];
|
|
3360
3366
|
}
|
|
3361
3367
|
const debugRoutes = routeConfig.routes;
|
|
@@ -3402,15 +3408,6 @@ __name(createApiListHandler, "createApiListHandler");
|
|
|
3402
3408
|
function createDevLogRouter(options = {}) {
|
|
3403
3409
|
const logDir = resolveLogDir(options.logDir);
|
|
3404
3410
|
const router = import_express2.default.Router();
|
|
3405
|
-
router.use((_req, res, next) => {
|
|
3406
|
-
res.header("Access-Control-Allow-Origin", "*");
|
|
3407
|
-
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
3408
|
-
res.header("Access-Control-Allow-Headers", "Content-Type, Accept");
|
|
3409
|
-
next();
|
|
3410
|
-
});
|
|
3411
|
-
router.options("*", (_req, res) => {
|
|
3412
|
-
res.status(204).end();
|
|
3413
|
-
});
|
|
3414
3411
|
router.get("/app/trace/:traceId", createGetTraceEntriesHandler(logDir));
|
|
3415
3412
|
router.get("/trace/recent", createGetRecentTracesHandler(logDir));
|
|
3416
3413
|
router.get("/files/:fileName", createGetLogFileHandler(logDir));
|
|
@@ -3611,6 +3608,64 @@ function createCollectLogsMiddleware(options = {}) {
|
|
|
3611
3608
|
}
|
|
3612
3609
|
__name(createCollectLogsMiddleware, "createCollectLogsMiddleware");
|
|
3613
3610
|
|
|
3611
|
+
// src/middlewares/compat.ts
|
|
3612
|
+
function sendJson(res, data, statusCode = 200) {
|
|
3613
|
+
const statusFn = res.status;
|
|
3614
|
+
const jsonFn = res.json;
|
|
3615
|
+
if (typeof statusFn === "function" && typeof jsonFn === "function") {
|
|
3616
|
+
statusFn.call(res, statusCode);
|
|
3617
|
+
jsonFn.call(res, data);
|
|
3618
|
+
} else {
|
|
3619
|
+
res.statusCode = statusCode;
|
|
3620
|
+
res.setHeader("Content-Type", "application/json");
|
|
3621
|
+
res.end(JSON.stringify(data));
|
|
3622
|
+
}
|
|
3623
|
+
}
|
|
3624
|
+
__name(sendJson, "sendJson");
|
|
3625
|
+
function sendError(res, message, error, statusCode = 500) {
|
|
3626
|
+
const errorData = {
|
|
3627
|
+
message,
|
|
3628
|
+
...error ? {
|
|
3629
|
+
error: serializeError3(error)
|
|
3630
|
+
} : {}
|
|
3631
|
+
};
|
|
3632
|
+
sendJson(res, errorData, statusCode);
|
|
3633
|
+
}
|
|
3634
|
+
__name(sendError, "sendError");
|
|
3635
|
+
function sendSuccess(res, data) {
|
|
3636
|
+
sendJson(res, {
|
|
3637
|
+
success: true,
|
|
3638
|
+
...data
|
|
3639
|
+
}, 200);
|
|
3640
|
+
}
|
|
3641
|
+
__name(sendSuccess, "sendSuccess");
|
|
3642
|
+
function getQuery(req) {
|
|
3643
|
+
if (req.query) {
|
|
3644
|
+
return req.query;
|
|
3645
|
+
}
|
|
3646
|
+
const url = new URL(req.url || "", `http://${req.headers.host}`);
|
|
3647
|
+
return Object.fromEntries(url.searchParams.entries());
|
|
3648
|
+
}
|
|
3649
|
+
__name(getQuery, "getQuery");
|
|
3650
|
+
function getQueryParam(req, key) {
|
|
3651
|
+
const query = getQuery(req);
|
|
3652
|
+
return query[key];
|
|
3653
|
+
}
|
|
3654
|
+
__name(getQueryParam, "getQueryParam");
|
|
3655
|
+
function serializeError3(error) {
|
|
3656
|
+
if (error instanceof Error) {
|
|
3657
|
+
return {
|
|
3658
|
+
name: error.name,
|
|
3659
|
+
message: error.message,
|
|
3660
|
+
stack: error.stack
|
|
3661
|
+
};
|
|
3662
|
+
}
|
|
3663
|
+
return {
|
|
3664
|
+
message: String(error)
|
|
3665
|
+
};
|
|
3666
|
+
}
|
|
3667
|
+
__name(serializeError3, "serializeError");
|
|
3668
|
+
|
|
3614
3669
|
// src/middlewares/api-routes/router.ts
|
|
3615
3670
|
var import_express4 = __toESM(require("express"), 1);
|
|
3616
3671
|
function extractModuleFromPath2(path7) {
|
|
@@ -3753,6 +3808,41 @@ function createApiRoutesMiddleware() {
|
|
|
3753
3808
|
__name(createApiRoutesMiddleware, "createApiRoutesMiddleware");
|
|
3754
3809
|
|
|
3755
3810
|
// src/middlewares/index.ts
|
|
3811
|
+
function enhanceForCompat(req, res) {
|
|
3812
|
+
if (!res.status) {
|
|
3813
|
+
res.status = function(code) {
|
|
3814
|
+
res.statusCode = code;
|
|
3815
|
+
return res;
|
|
3816
|
+
};
|
|
3817
|
+
}
|
|
3818
|
+
if (!res.json) {
|
|
3819
|
+
res.json = function(data) {
|
|
3820
|
+
res.setHeader("Content-Type", "application/json");
|
|
3821
|
+
res.end(JSON.stringify(data));
|
|
3822
|
+
return res;
|
|
3823
|
+
};
|
|
3824
|
+
}
|
|
3825
|
+
if (!res.send) {
|
|
3826
|
+
res.send = function(data) {
|
|
3827
|
+
if (typeof data === "object" && data !== null) {
|
|
3828
|
+
res.setHeader("Content-Type", "application/json");
|
|
3829
|
+
res.end(JSON.stringify(data));
|
|
3830
|
+
} else {
|
|
3831
|
+
res.end(String(data));
|
|
3832
|
+
}
|
|
3833
|
+
return res;
|
|
3834
|
+
};
|
|
3835
|
+
}
|
|
3836
|
+
if (!req.query) {
|
|
3837
|
+
const url = new URL(req.url || "", `http://${req.headers.host || "localhost"}`);
|
|
3838
|
+
req.query = Object.fromEntries(url.searchParams.entries());
|
|
3839
|
+
}
|
|
3840
|
+
}
|
|
3841
|
+
__name(enhanceForCompat, "enhanceForCompat");
|
|
3842
|
+
function isConnectServer(server) {
|
|
3843
|
+
return typeof server === "function" && !("set" in server) && !("engine" in server);
|
|
3844
|
+
}
|
|
3845
|
+
__name(isConnectServer, "isConnectServer");
|
|
3756
3846
|
function isRouteMiddleware(middleware) {
|
|
3757
3847
|
return "createRouter" in middleware && middleware.createRouter !== void 0;
|
|
3758
3848
|
}
|
|
@@ -3805,6 +3895,13 @@ async function registerMiddlewares(server, middlewares, options) {
|
|
|
3805
3895
|
rootDir: process.cwd(),
|
|
3806
3896
|
...options
|
|
3807
3897
|
};
|
|
3898
|
+
if (isConnectServer(server)) {
|
|
3899
|
+
server.use((req, res, next) => {
|
|
3900
|
+
enhanceForCompat(req, res);
|
|
3901
|
+
next();
|
|
3902
|
+
});
|
|
3903
|
+
console.log("[Middleware] Registered Express compatibility layer for Connect/Vite");
|
|
3904
|
+
}
|
|
3808
3905
|
const allMiddlewares = [
|
|
3809
3906
|
...middlewares
|
|
3810
3907
|
];
|
|
@@ -3837,10 +3934,15 @@ __name(registerMiddlewares, "registerMiddlewares");
|
|
|
3837
3934
|
createCollectLogsMiddleware,
|
|
3838
3935
|
createDevLogsMiddleware,
|
|
3839
3936
|
createOpenapiMiddleware,
|
|
3937
|
+
getQuery,
|
|
3938
|
+
getQueryParam,
|
|
3840
3939
|
handleDevProxyError,
|
|
3841
3940
|
normalizeBasePath,
|
|
3842
3941
|
parseAndGenerateNestResourceTemplate,
|
|
3843
3942
|
postprocessDrizzleSchema,
|
|
3844
|
-
registerMiddlewares
|
|
3943
|
+
registerMiddlewares,
|
|
3944
|
+
sendError,
|
|
3945
|
+
sendJson,
|
|
3946
|
+
sendSuccess
|
|
3845
3947
|
});
|
|
3846
3948
|
//# sourceMappingURL=index.cjs.map
|