vafast 0.4.2 → 0.4.4
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 +6 -10
- package/dist/base-server-CSkyjEaY.mjs +113 -0
- package/dist/base-server-CSkyjEaY.mjs.map +1 -0
- package/dist/base-server-DvGS6ATg.d.mts +40 -0
- package/dist/base64url-0N9uQPjZ.d.mts +6 -0
- package/dist/base64url-CwQnvZyp.mjs +13 -0
- package/dist/base64url-CwQnvZyp.mjs.map +1 -0
- package/dist/chunk-DW4-Jl94.mjs +37 -0
- package/dist/component-route-CYxLOnci.mjs +1 -0
- package/dist/component-route-CZawYn61.d.mts +31 -0
- package/dist/component-router-CErbGh2A.mjs +33 -0
- package/dist/component-router-CErbGh2A.mjs.map +1 -0
- package/dist/component-server-CGzU4bss.d.mts +38 -0
- package/dist/component-server-DAbIyIPI.mjs +124 -0
- package/dist/component-server-DAbIyIPI.mjs.map +1 -0
- package/dist/create-handler-B_pfxh3m.mjs +166 -0
- package/dist/create-handler-B_pfxh3m.mjs.map +1 -0
- package/dist/{utils/create-handler.d.ts → create-handler-Bo-hvWp-.d.mts} +24 -24
- package/dist/{defineRoute.d.ts → defineRoute.d.mts} +20 -17
- package/dist/defineRoute.mjs +93 -0
- package/dist/defineRoute.mjs.map +1 -0
- package/dist/dependency-manager-C6vFWP2L.d.mts +27 -0
- package/dist/dependency-manager-Czg7Po2j.mjs +61 -0
- package/dist/dependency-manager-Czg7Po2j.mjs.map +1 -0
- package/dist/formats-CYLwo9GJ.d.mts +42 -0
- package/dist/go-await-BGAGJfrB.mjs +33 -0
- package/dist/go-await-BGAGJfrB.mjs.map +1 -0
- package/dist/{utils/go-await.d.ts → go-await-DRItVwwh.d.mts} +4 -2
- package/dist/handle-Csjtywdc.mjs +30 -0
- package/dist/handle-Csjtywdc.mjs.map +1 -0
- package/dist/{utils/handle.d.ts → handle-D0TFoOiX.d.mts} +8 -6
- package/dist/html-renderer-CMGKJoIy.d.mts +22 -0
- package/dist/{utils/html-renderer.js → html-renderer-CczE8mwC.mjs} +34 -29
- package/dist/html-renderer-CczE8mwC.mjs.map +1 -0
- package/dist/index-Ci52vt55.d.mts +48 -0
- package/dist/index-CzItj62a.d.mts +1 -0
- package/dist/index.d.mts +30 -0
- package/dist/index.mjs +37 -0
- package/dist/index.mjs.map +1 -0
- package/dist/middleware/{component-renderer.d.ts → component-renderer.d.mts} +3 -1
- package/dist/middleware/component-renderer.mjs +119 -0
- package/dist/middleware/component-renderer.mjs.map +1 -0
- package/dist/middleware/{component-router.d.ts → component-router.d.mts} +5 -4
- package/dist/middleware/component-router.mjs +4 -0
- package/dist/middleware-Byp3Hjae.mjs +59 -0
- package/dist/middleware-Byp3Hjae.mjs.map +1 -0
- package/dist/middleware.d.mts +25 -0
- package/dist/middleware.mjs +4 -0
- package/dist/monitoring/index.d.mts +33 -0
- package/dist/monitoring/index.mjs +27 -0
- package/dist/monitoring/index.mjs.map +1 -0
- package/dist/monitoring/native-monitor.d.mts +48 -0
- package/dist/monitoring/native-monitor.mjs +154 -0
- package/dist/monitoring/native-monitor.mjs.map +1 -0
- package/dist/monitoring/types.d.mts +150 -0
- package/dist/monitoring/types.mjs +1 -0
- package/dist/node-server/index.d.mts +4 -0
- package/dist/node-server/index.mjs +5 -0
- package/dist/node-server/{request.d.ts → request.d.mts} +4 -6
- package/dist/node-server/request.mjs +3 -0
- package/dist/node-server/{response.d.ts → response.d.mts} +4 -6
- package/dist/node-server/response.mjs +3 -0
- package/dist/node-server/serve.d.mts +2 -0
- package/dist/node-server/serve.mjs +4 -0
- package/dist/{utils/parsers.d.ts → parsers-7lvt3Oss.d.mts} +10 -8
- package/dist/parsers-CI_TZ7pO.mjs +168 -0
- package/dist/parsers-CI_TZ7pO.mjs.map +1 -0
- package/dist/path-matcher-73cJd5Y7.mjs +62 -0
- package/dist/path-matcher-73cJd5Y7.mjs.map +1 -0
- package/dist/radix-tree-D0XYaJKb.mjs +157 -0
- package/dist/radix-tree-D0XYaJKb.mjs.map +1 -0
- package/dist/request-CKC3Ox6M.mjs +133 -0
- package/dist/request-CKC3Ox6M.mjs.map +1 -0
- package/dist/request-validator-42lY21gn.d.mts +67 -0
- package/dist/request-validator-_J5HloRq.mjs +77 -0
- package/dist/request-validator-_J5HloRq.mjs.map +1 -0
- package/dist/{utils/response.d.ts → response-A-sZZiJ7.d.mts} +4 -2
- package/dist/response-Cf5FgtmE.mjs +72 -0
- package/dist/response-Cf5FgtmE.mjs.map +1 -0
- package/dist/response-DXg4i_yh.mjs +97 -0
- package/dist/response-DXg4i_yh.mjs.map +1 -0
- package/dist/route-9pAVP1GC.mjs +11 -0
- package/dist/route-9pAVP1GC.mjs.map +1 -0
- package/dist/route-BJ-40LNI.d.mts +44 -0
- package/dist/route-registry--tx1PNui.d.mts +176 -0
- package/dist/route-registry-mcTG0M-t.mjs +225 -0
- package/dist/route-registry-mcTG0M-t.mjs.map +1 -0
- package/dist/router/index.d.mts +5 -0
- package/dist/router/index.mjs +10 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/router/radix-tree.d.mts +60 -0
- package/dist/router/radix-tree.mjs +4 -0
- package/dist/router-B9HUUCkR.mjs +71 -0
- package/dist/router-B9HUUCkR.mjs.map +1 -0
- package/dist/{router.d.ts → router.d.mts} +6 -7
- package/dist/router.mjs +4 -0
- package/dist/schema-CPQudJpE.d.mts +81 -0
- package/dist/schema-CtVBNfnQ.mjs +1 -0
- package/dist/serve-B5WmhK6m.d.mts +69 -0
- package/dist/serve-Be6NvuQk.mjs +107 -0
- package/dist/serve-Be6NvuQk.mjs.map +1 -0
- package/dist/serve.d.mts +2 -0
- package/dist/serve.mjs +4 -0
- package/dist/server/base-server.d.mts +4 -0
- package/dist/server/base-server.mjs +4 -0
- package/dist/server/component-server.d.mts +5 -0
- package/dist/server/component-server.mjs +5 -0
- package/dist/server/index.d.mts +7 -0
- package/dist/server/index.mjs +8 -0
- package/dist/server/server-factory.d.mts +7 -0
- package/dist/server/server-factory.mjs +6 -0
- package/dist/server/server.d.mts +5 -0
- package/dist/server/server.mjs +4 -0
- package/dist/server-BmPKs8oM.mjs +137 -0
- package/dist/server-BmPKs8oM.mjs.map +1 -0
- package/dist/server-Cbd3Ia51.mjs +88 -0
- package/dist/server-Cbd3Ia51.mjs.map +1 -0
- package/dist/server-D9gjszHe.d.mts +60 -0
- package/dist/sse-BMM6KTfy.d.mts +65 -0
- package/dist/sse-BT5yyLgX.mjs +87 -0
- package/dist/sse-BT5yyLgX.mjs.map +1 -0
- package/dist/types/component-route.d.mts +2 -0
- package/dist/types/component-route.mjs +1 -0
- package/dist/types/index.d.mts +6 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types/route.d.mts +2 -0
- package/dist/types/route.mjs +3 -0
- package/dist/types/schema.d.mts +2 -0
- package/dist/types/schema.mjs +1 -0
- package/dist/types/types.d.mts +2 -0
- package/dist/types/types.mjs +1 -0
- package/dist/{types/types.d.ts → types-DuTa8AVN.d.mts} +27 -25
- package/dist/utils/base64url.d.mts +2 -0
- package/dist/utils/base64url.mjs +3 -0
- package/dist/utils/create-handler.d.mts +3 -0
- package/dist/utils/create-handler.mjs +5 -0
- package/dist/utils/dependency-manager.d.mts +2 -0
- package/dist/utils/dependency-manager.mjs +4 -0
- package/dist/utils/formats.d.mts +2 -0
- package/dist/utils/formats.mjs +129 -0
- package/dist/utils/formats.mjs.map +1 -0
- package/dist/utils/go-await.d.mts +2 -0
- package/dist/utils/go-await.mjs +3 -0
- package/dist/utils/handle.d.mts +2 -0
- package/dist/utils/handle.mjs +4 -0
- package/dist/utils/html-renderer.d.mts +2 -0
- package/dist/utils/html-renderer.mjs +4 -0
- package/dist/utils/index.d.mts +16 -0
- package/dist/utils/index.mjs +23 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/parsers.d.mts +2 -0
- package/dist/utils/parsers.mjs +3 -0
- package/dist/utils/path-matcher.d.mts +27 -0
- package/dist/utils/path-matcher.mjs +4 -0
- package/dist/utils/request-validator.d.mts +3 -0
- package/dist/utils/request-validator.mjs +5 -0
- package/dist/utils/response.d.mts +2 -0
- package/dist/utils/response.mjs +4 -0
- package/dist/utils/route-registry.d.mts +4 -0
- package/dist/utils/route-registry.mjs +4 -0
- package/dist/utils/sse.d.mts +3 -0
- package/dist/utils/sse.mjs +5 -0
- package/dist/utils/validators/validators.d.mts +2 -0
- package/dist/utils/validators/validators.mjs +3 -0
- package/dist/validators-BBrGePBr.mjs +112 -0
- package/dist/validators-BBrGePBr.mjs.map +1 -0
- package/dist/validators-CPmnj_y9.d.mts +67 -0
- package/package.json +16 -18
- package/dist/auth/token.d.ts +0 -42
- package/dist/auth/token.js +0 -131
- package/dist/auth/token.js.map +0 -1
- package/dist/defineRoute.js +0 -37
- package/dist/defineRoute.js.map +0 -1
- package/dist/index.d.ts +0 -32
- package/dist/index.js +0 -2578
- package/dist/index.js.map +0 -1
- package/dist/middleware/auth.d.ts +0 -16
- package/dist/middleware/auth.js +0 -205
- package/dist/middleware/auth.js.map +0 -1
- package/dist/middleware/authMiddleware.d.ts +0 -5
- package/dist/middleware/authMiddleware.js +0 -57
- package/dist/middleware/authMiddleware.js.map +0 -1
- package/dist/middleware/component-renderer.js +0 -139
- package/dist/middleware/component-renderer.js.map +0 -1
- package/dist/middleware/component-router.js +0 -36
- package/dist/middleware/component-router.js.map +0 -1
- package/dist/middleware/cors.d.ts +0 -12
- package/dist/middleware/cors.js +0 -43
- package/dist/middleware/cors.js.map +0 -1
- package/dist/middleware/rateLimit.d.ts +0 -10
- package/dist/middleware/rateLimit.js +0 -49
- package/dist/middleware/rateLimit.js.map +0 -1
- package/dist/middleware.d.ts +0 -21
- package/dist/middleware.js +0 -102
- package/dist/middleware.js.map +0 -1
- package/dist/monitoring/index.d.ts +0 -36
- package/dist/monitoring/index.js +0 -1487
- package/dist/monitoring/index.js.map +0 -1
- package/dist/monitoring/native-monitor.d.ts +0 -44
- package/dist/monitoring/native-monitor.js +0 -1454
- package/dist/monitoring/native-monitor.js.map +0 -1
- package/dist/monitoring/types.d.ts +0 -148
- package/dist/monitoring/types.js +0 -8
- package/dist/monitoring/types.js.map +0 -1
- package/dist/node-server/index.d.ts +0 -4
- package/dist/node-server/index.js +0 -298
- package/dist/node-server/index.js.map +0 -1
- package/dist/node-server/request.js +0 -125
- package/dist/node-server/request.js.map +0 -1
- package/dist/node-server/response.js +0 -76
- package/dist/node-server/response.js.map +0 -1
- package/dist/node-server/serve.d.ts +0 -71
- package/dist/node-server/serve.js +0 -281
- package/dist/node-server/serve.js.map +0 -1
- package/dist/router/index.d.ts +0 -3
- package/dist/router/index.js +0 -232
- package/dist/router/index.js.map +0 -1
- package/dist/router/radix-tree.d.ts +0 -66
- package/dist/router/radix-tree.js +0 -190
- package/dist/router/radix-tree.js.map +0 -1
- package/dist/router.js +0 -44
- package/dist/router.js.map +0 -1
- package/dist/serve.d.ts +0 -2
- package/dist/serve.js +0 -281
- package/dist/serve.js.map +0 -1
- package/dist/server/base-server.d.ts +0 -37
- package/dist/server/base-server.js +0 -134
- package/dist/server/base-server.js.map +0 -1
- package/dist/server/component-server.d.ts +0 -37
- package/dist/server/component-server.js +0 -488
- package/dist/server/component-server.js.map +0 -1
- package/dist/server/index.d.ts +0 -8
- package/dist/server/index.js +0 -1159
- package/dist/server/index.js.map +0 -1
- package/dist/server/server-factory.d.ts +0 -48
- package/dist/server/server-factory.js +0 -1156
- package/dist/server/server-factory.js.map +0 -1
- package/dist/server/server.d.ts +0 -64
- package/dist/server/server.js +0 -737
- package/dist/server/server.js.map +0 -1
- package/dist/types/component-route.d.ts +0 -29
- package/dist/types/component-route.js +0 -1
- package/dist/types/component-route.js.map +0 -1
- package/dist/types/index.d.ts +0 -5
- package/dist/types/index.js +0 -21
- package/dist/types/index.js.map +0 -1
- package/dist/types/route.d.ts +0 -42
- package/dist/types/route.js +0 -12
- package/dist/types/route.js.map +0 -1
- package/dist/types/schema.d.ts +0 -79
- package/dist/types/schema.js +0 -10
- package/dist/types/schema.js.map +0 -1
- package/dist/types/types.js +0 -1
- package/dist/types/types.js.map +0 -1
- package/dist/utils/base64url.d.ts +0 -4
- package/dist/utils/base64url.js +0 -14
- package/dist/utils/base64url.js.map +0 -1
- package/dist/utils/create-handler.js +0 -299
- package/dist/utils/create-handler.js.map +0 -1
- package/dist/utils/dependency-manager.d.ts +0 -25
- package/dist/utils/dependency-manager.js +0 -71
- package/dist/utils/dependency-manager.js.map +0 -1
- package/dist/utils/formats.d.ts +0 -40
- package/dist/utils/formats.js +0 -116
- package/dist/utils/formats.js.map +0 -1
- package/dist/utils/go-await.js +0 -16
- package/dist/utils/go-await.js.map +0 -1
- package/dist/utils/handle.js +0 -48
- package/dist/utils/handle.js.map +0 -1
- package/dist/utils/html-renderer.d.ts +0 -20
- package/dist/utils/html-renderer.js.map +0 -1
- package/dist/utils/index.d.ts +0 -16
- package/dist/utils/index.js +0 -1038
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/parsers.js +0 -160
- package/dist/utils/parsers.js.map +0 -1
- package/dist/utils/path-matcher.d.ts +0 -25
- package/dist/utils/path-matcher.js +0 -73
- package/dist/utils/path-matcher.js.map +0 -1
- package/dist/utils/request-validator.d.ts +0 -66
- package/dist/utils/request-validator.js +0 -158
- package/dist/utils/request-validator.js.map +0 -1
- package/dist/utils/response.js +0 -102
- package/dist/utils/response.js.map +0 -1
- package/dist/utils/route-registry.d.ts +0 -195
- package/dist/utils/route-registry.js +0 -152
- package/dist/utils/route-registry.js.map +0 -1
- package/dist/utils/sse.d.ts +0 -87
- package/dist/utils/sse.js +0 -181
- package/dist/utils/sse.js.map +0 -1
- package/dist/utils/validators/validators.d.ts +0 -76
- package/dist/utils/validators/validators.js +0 -97
- package/dist/utils/validators/validators.js.map +0 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { i as json, r as init_response } from "./response-DXg4i_yh.mjs";
|
|
2
|
+
import { a as parseCookies, l as parseHeaders, r as parseBody, u as parseQuery } from "./parsers-CI_TZ7pO.mjs";
|
|
3
|
+
import { t as goAwait } from "./go-await-BGAGJfrB.mjs";
|
|
4
|
+
import { a as validateAllSchemas, i as precompileSchemas } from "./validators-BBrGePBr.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/utils/create-handler.ts
|
|
7
|
+
init_response();
|
|
8
|
+
/**
|
|
9
|
+
* 自动响应转换
|
|
10
|
+
* 将各种返回值类型转换为 Response 对象
|
|
11
|
+
*/
|
|
12
|
+
function autoResponse(result) {
|
|
13
|
+
if (result instanceof Response) return result;
|
|
14
|
+
if (result === null || result === void 0) return new Response(null, { status: 204 });
|
|
15
|
+
if (typeof result === "string") return new Response(result, { headers: { "Content-Type": "text/plain; charset=utf-8" } });
|
|
16
|
+
if (typeof result === "number" || typeof result === "boolean") return new Response(String(result), { headers: { "Content-Type": "text/plain; charset=utf-8" } });
|
|
17
|
+
if (typeof result === "object") {
|
|
18
|
+
const obj = result;
|
|
19
|
+
if ("data" in obj && ("status" in obj || "headers" in obj)) {
|
|
20
|
+
const { data, status = 200, headers = {} } = obj;
|
|
21
|
+
if (data === null || data === void 0) return new Response(null, {
|
|
22
|
+
status: status === 200 ? 204 : status,
|
|
23
|
+
headers
|
|
24
|
+
});
|
|
25
|
+
if (typeof data === "string" || typeof data === "number" || typeof data === "boolean") return new Response(String(data), {
|
|
26
|
+
status,
|
|
27
|
+
headers: {
|
|
28
|
+
"Content-Type": "text/plain; charset=utf-8",
|
|
29
|
+
...headers
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return json(data, status, headers);
|
|
33
|
+
}
|
|
34
|
+
return json(result);
|
|
35
|
+
}
|
|
36
|
+
return new Response(null, { status: 204 });
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 处理验证错误
|
|
40
|
+
*/
|
|
41
|
+
function handleValidationError(error) {
|
|
42
|
+
return json({
|
|
43
|
+
success: false,
|
|
44
|
+
error: "Validation Error",
|
|
45
|
+
message: error.message,
|
|
46
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
47
|
+
}, 400);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 处理内部错误
|
|
51
|
+
*/
|
|
52
|
+
function handleInternalError(error) {
|
|
53
|
+
return json({
|
|
54
|
+
success: false,
|
|
55
|
+
error: "Internal Error",
|
|
56
|
+
message: error instanceof Error ? error.message : "未知错误"
|
|
57
|
+
}, 500);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 判断是否为 handler 函数
|
|
61
|
+
*/
|
|
62
|
+
function isHandler(value) {
|
|
63
|
+
return typeof value === "function";
|
|
64
|
+
}
|
|
65
|
+
function createHandler(schemaOrHandler, maybeHandler) {
|
|
66
|
+
const hasSchema = !isHandler(schemaOrHandler);
|
|
67
|
+
const schema = hasSchema ? schemaOrHandler : {};
|
|
68
|
+
const handler = hasSchema ? maybeHandler : schemaOrHandler;
|
|
69
|
+
if (schema.body || schema.query || schema.params || schema.headers || schema.cookies) precompileSchemas(schema);
|
|
70
|
+
const handlerFn = async (req) => {
|
|
71
|
+
try {
|
|
72
|
+
const query = parseQuery(req);
|
|
73
|
+
const headers = parseHeaders(req);
|
|
74
|
+
const cookies = parseCookies(req);
|
|
75
|
+
const params = req.params || {};
|
|
76
|
+
let body = void 0;
|
|
77
|
+
if (req.method !== "GET" && req.method !== "HEAD") {
|
|
78
|
+
const [, parsedBody] = await goAwait(parseBody(req));
|
|
79
|
+
body = parsedBody;
|
|
80
|
+
}
|
|
81
|
+
const data = {
|
|
82
|
+
body,
|
|
83
|
+
query,
|
|
84
|
+
params,
|
|
85
|
+
headers,
|
|
86
|
+
cookies
|
|
87
|
+
};
|
|
88
|
+
if (schema.body || schema.query || schema.params || schema.headers || schema.cookies) validateAllSchemas(schema, data);
|
|
89
|
+
return autoResponse(await handler({
|
|
90
|
+
req,
|
|
91
|
+
body,
|
|
92
|
+
query,
|
|
93
|
+
params,
|
|
94
|
+
headers,
|
|
95
|
+
cookies
|
|
96
|
+
}));
|
|
97
|
+
} catch (error) {
|
|
98
|
+
if (error instanceof Error && error.message.includes("验证失败")) return handleValidationError(error);
|
|
99
|
+
return handleInternalError(error);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
return handlerFn;
|
|
103
|
+
}
|
|
104
|
+
function createHandlerWithExtra(schemaOrHandler, maybeHandler) {
|
|
105
|
+
const hasSchema = !isHandler(schemaOrHandler);
|
|
106
|
+
const schema = hasSchema ? schemaOrHandler : {};
|
|
107
|
+
const handler = hasSchema ? maybeHandler : schemaOrHandler;
|
|
108
|
+
if (schema.body || schema.query || schema.params || schema.headers || schema.cookies) precompileSchemas(schema);
|
|
109
|
+
return async (req) => {
|
|
110
|
+
try {
|
|
111
|
+
const query = parseQuery(req);
|
|
112
|
+
const headers = parseHeaders(req);
|
|
113
|
+
const cookies = parseCookies(req);
|
|
114
|
+
const params = req.params || {};
|
|
115
|
+
let body = void 0;
|
|
116
|
+
if (req.method !== "GET" && req.method !== "HEAD") {
|
|
117
|
+
const [, parsedBody] = await goAwait(parseBody(req));
|
|
118
|
+
body = parsedBody;
|
|
119
|
+
}
|
|
120
|
+
const data = {
|
|
121
|
+
body,
|
|
122
|
+
query,
|
|
123
|
+
params,
|
|
124
|
+
headers,
|
|
125
|
+
cookies
|
|
126
|
+
};
|
|
127
|
+
if (schema.body || schema.query || schema.params || schema.headers || schema.cookies) validateAllSchemas(schema, data);
|
|
128
|
+
const extras = req.__locals ?? {};
|
|
129
|
+
return autoResponse(await handler({
|
|
130
|
+
req,
|
|
131
|
+
body,
|
|
132
|
+
query,
|
|
133
|
+
params,
|
|
134
|
+
headers,
|
|
135
|
+
cookies,
|
|
136
|
+
...extras
|
|
137
|
+
}));
|
|
138
|
+
} catch (error) {
|
|
139
|
+
if (error instanceof Error && error.message.includes("验证失败")) return handleValidationError(error);
|
|
140
|
+
return handleInternalError(error);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 简单的路由处理器 (无 schema 验证,只有 req)
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* simpleHandler(({ req }) => {
|
|
150
|
+
* return { message: "Hello World" };
|
|
151
|
+
* })
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
function simpleHandler(handler) {
|
|
155
|
+
return async (req) => {
|
|
156
|
+
try {
|
|
157
|
+
return autoResponse(await handler({ req }));
|
|
158
|
+
} catch (error) {
|
|
159
|
+
return handleInternalError(error);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
//#endregion
|
|
165
|
+
export { createHandlerWithExtra as n, simpleHandler as r, createHandler as t };
|
|
166
|
+
//# sourceMappingURL=create-handler-B_pfxh3m.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-handler-B_pfxh3m.mjs","names":[],"sources":["../src/utils/create-handler.ts"],"sourcesContent":["/**\n * 类型安全的路由处理器工厂\n *\n * 非柯里化设计,API 更简洁\n *\n * @author Framework Team\n * @version 3.0.0\n * @license MIT\n */\n\nimport type {\n RouteSchema,\n HandlerContext,\n HandlerContextWithExtra,\n} from \"../types/schema\";\nimport { parseBody, parseQuery, parseHeaders, parseCookies } from \"./parsers\";\nimport { goAwait } from \"./go-await\";\nimport { json } from \"./response\";\nimport {\n validateAllSchemas,\n precompileSchemas,\n} from \"./validators/validators\";\n\n/**\n * 自动响应转换\n * 将各种返回值类型转换为 Response 对象\n */\nfunction autoResponse(result: unknown): Response {\n // 已经是 Response\n if (result instanceof Response) {\n return result;\n }\n\n // null/undefined -> 204\n if (result === null || result === undefined) {\n return new Response(null, { status: 204 });\n }\n\n // 字符串 -> text/plain\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 数字/布尔 -> text/plain\n if (typeof result === \"number\" || typeof result === \"boolean\") {\n return new Response(String(result), {\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n\n // 对象 -> 检查是否是 { data, status, headers } 格式\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (\"data\" in obj && (\"status\" in obj || \"headers\" in obj)) {\n const { data, status = 200, headers = {} } = obj;\n\n if (data === null || data === undefined) {\n return new Response(null, {\n status: status === 200 ? 204 : (status as number),\n headers: headers as HeadersInit,\n });\n }\n\n if (\n typeof data === \"string\" ||\n typeof data === \"number\" ||\n typeof data === \"boolean\"\n ) {\n return new Response(String(data), {\n status: status as number,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...(headers as Record<string, string>),\n },\n });\n }\n\n return json(data, status as number, headers as Record<string, string>);\n }\n\n // 普通对象 -> JSON\n return json(result);\n }\n\n // 其他类型 -> 204\n return new Response(null, { status: 204 });\n}\n\n/**\n * 处理验证错误\n */\nfunction handleValidationError(error: Error): Response {\n return json(\n {\n success: false,\n error: \"Validation Error\",\n message: error.message,\n timestamp: new Date().toISOString(),\n },\n 400,\n );\n}\n\n/**\n * 处理内部错误\n */\nfunction handleInternalError(error: unknown): Response {\n return json(\n {\n success: false,\n error: \"Internal Error\",\n message: error instanceof Error ? error.message : \"未知错误\",\n },\n 500,\n );\n}\n\n/** 空 schema 的上下文类型 */\ntype EmptySchemaContext = {\n req: Request;\n body: unknown;\n query: Record<string, string>;\n params: Record<string, string>;\n headers: Record<string, string>;\n cookies: Record<string, string>;\n};\n\n/**\n * 判断是否为 handler 函数\n */\nfunction isHandler(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\n/**\n * 创建类型安全的路由处理器\n *\n * @example\n * ```typescript\n * // 无 schema - 直接传入 handler\n * createHandler(({ params }) => `User: ${params.id}`)\n *\n * // 有 schema - 传入 schema 和 handler\n * createHandler(\n * { body: Type.Object({ name: Type.String() }) },\n * ({ body }) => ({ hello: body.name })\n * )\n * ```\n */\n/**\n * 带类型推断的 Handler - 保留返回类型信息用于客户端类型推断\n */\nexport type InferableHandler<TReturn, TSchema extends RouteSchema = RouteSchema> = ((req: Request) => Promise<Response>) & {\n /** 返回类型标记(仅用于类型推断,运行时不存在) */\n __returnType: TReturn;\n /** Schema 类型标记 */\n __schema: TSchema;\n};\n\n\n// 重载 1: 无 schema\nexport function createHandler<R>(\n handler: (ctx: EmptySchemaContext) => R | Promise<R>,\n): InferableHandler<R>;\n\n// 重载 2: 有 schema\nexport function createHandler<const T extends RouteSchema, R>(\n schema: T,\n handler: (ctx: HandlerContext<T>) => R | Promise<R>,\n): InferableHandler<R, T>;\n\n// 实现\nexport function createHandler<const T extends RouteSchema, R>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContext<T>) => R | Promise<R>,\n): InferableHandler<R, T> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (ctx: HandlerContext<T>) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemas(schema);\n }\n\n const handlerFn = async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemas(schema, data);\n }\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n });\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n\n // 类型断言:这些属性只在编译时用于类型推断,运行时不存在\n return handlerFn as InferableHandler<R, T>;\n}\n\n/**\n * 创建带额外上下文的路由处理器\n *\n * 用于中间件注入额外数据的场景\n *\n * @example\n * ```typescript\n * // 定义中间件注入的类型\n * type AuthContext = { user: { id: string; role: string } };\n *\n * // 无 schema\n * createHandlerWithExtra<AuthContext>(({ user }) => {\n * return { userId: user.id };\n * })\n *\n * // 有 schema\n * createHandlerWithExtra<AuthContext>(\n * { body: Type.Object({ action: Type.String() }) },\n * ({ body, user }) => ({ success: true, userId: user.id })\n * )\n * ```\n */\n// 重载 1: 无 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n R = unknown,\n>(\n handler: (ctx: EmptySchemaContext & TExtra) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 重载 2: 有 schema\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schema: T,\n handler: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response>;\n\n// 实现\nexport function createHandlerWithExtra<\n TExtra extends Record<string, unknown> = Record<string, never>,\n const T extends RouteSchema = RouteSchema,\n R = unknown,\n>(\n schemaOrHandler: T | ((ctx: EmptySchemaContext & TExtra) => R | Promise<R>),\n maybeHandler?: (ctx: HandlerContextWithExtra<T, TExtra>) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n // 判断调用方式\n const hasSchema = !isHandler(schemaOrHandler);\n const schema = hasSchema ? (schemaOrHandler as T) : ({} as T);\n const handler = hasSchema\n ? maybeHandler!\n : (schemaOrHandler as (\n ctx: HandlerContextWithExtra<T, TExtra>,\n ) => R | Promise<R>);\n\n // 预编译 schema\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n precompileSchemas(schema);\n }\n\n return async (req: Request): Promise<Response> => {\n try {\n // 解析请求数据\n const query = parseQuery(req);\n const headers = parseHeaders(req);\n const cookies = parseCookies(req);\n const params =\n ((req as unknown as Record<string, unknown>).params as Record<\n string,\n string\n >) || {};\n\n // 解析请求体\n let body: unknown = undefined;\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n const [, parsedBody] = await goAwait(parseBody(req));\n body = parsedBody;\n }\n\n // 验证 schema\n const data = { body, query, params, headers, cookies };\n if (\n schema.body ||\n schema.query ||\n schema.params ||\n schema.headers ||\n schema.cookies\n ) {\n validateAllSchemas(schema, data);\n }\n\n // 获取中间件注入的额外数据\n const extras = ((req as unknown as Record<string, unknown>).__locals ??\n {}) as TExtra;\n\n // 调用 handler\n const result = await handler({\n req,\n body: body as HandlerContext<T>[\"body\"],\n query: query as HandlerContext<T>[\"query\"],\n params: params as HandlerContext<T>[\"params\"],\n headers: headers as HandlerContext<T>[\"headers\"],\n cookies: cookies as HandlerContext<T>[\"cookies\"],\n ...extras,\n } as HandlerContextWithExtra<T, TExtra>);\n\n return autoResponse(result);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"验证失败\")) {\n return handleValidationError(error);\n }\n return handleInternalError(error);\n }\n };\n}\n\n/**\n * 简单的路由处理器 (无 schema 验证,只有 req)\n *\n * @example\n * ```typescript\n * simpleHandler(({ req }) => {\n * return { message: \"Hello World\" };\n * })\n * ```\n */\nexport function simpleHandler<R>(\n handler: (ctx: { req: Request }) => R | Promise<R>,\n): (req: Request) => Promise<Response> {\n return async (req: Request): Promise<Response> => {\n try {\n const result = await handler({ req });\n return autoResponse(result);\n } catch (error) {\n return handleInternalError(error);\n }\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import { RouteSchema,
|
|
2
|
-
import '@sinclair/typebox';
|
|
1
|
+
import { i as RouteSchema, n as HandlerContextWithExtra, t as HandlerContext } from "./schema-CPQudJpE.mjs";
|
|
3
2
|
|
|
3
|
+
//#region src/utils/create-handler.d.ts
|
|
4
4
|
/**
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
* 类型安全的路由处理器工厂
|
|
6
|
+
*
|
|
7
|
+
* 非柯里化设计,API 更简洁
|
|
8
|
+
*
|
|
9
|
+
* @author Framework Team
|
|
10
|
+
* @version 3.0.0
|
|
11
|
+
* @license MIT
|
|
12
|
+
*/
|
|
14
13
|
/** 空 schema 的上下文类型 */
|
|
15
14
|
type EmptySchemaContext = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
req: Request;
|
|
16
|
+
body: unknown;
|
|
17
|
+
query: Record<string, string>;
|
|
18
|
+
params: Record<string, string>;
|
|
19
|
+
headers: Record<string, string>;
|
|
20
|
+
cookies: Record<string, string>;
|
|
22
21
|
};
|
|
23
22
|
/**
|
|
24
23
|
* 创建类型安全的路由处理器
|
|
@@ -39,10 +38,10 @@ type EmptySchemaContext = {
|
|
|
39
38
|
* 带类型推断的 Handler - 保留返回类型信息用于客户端类型推断
|
|
40
39
|
*/
|
|
41
40
|
type InferableHandler<TReturn, TSchema extends RouteSchema = RouteSchema> = ((req: Request) => Promise<Response>) & {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
/** 返回类型标记(仅用于类型推断,运行时不存在) */
|
|
42
|
+
__returnType: TReturn;
|
|
43
|
+
/** Schema 类型标记 */
|
|
44
|
+
__schema: TSchema;
|
|
46
45
|
};
|
|
47
46
|
declare function createHandler<R>(handler: (ctx: EmptySchemaContext) => R | Promise<R>): InferableHandler<R>;
|
|
48
47
|
declare function createHandler<const T extends RouteSchema, R>(schema: T, handler: (ctx: HandlerContext<T>) => R | Promise<R>): InferableHandler<R, T>;
|
|
@@ -81,7 +80,8 @@ declare function createHandlerWithExtra<TExtra extends Record<string, unknown> =
|
|
|
81
80
|
* ```
|
|
82
81
|
*/
|
|
83
82
|
declare function simpleHandler<R>(handler: (ctx: {
|
|
84
|
-
|
|
83
|
+
req: Request;
|
|
85
84
|
}) => R | Promise<R>): (req: Request) => Promise<Response>;
|
|
86
|
-
|
|
87
|
-
export {
|
|
85
|
+
//#endregion
|
|
86
|
+
export { simpleHandler as i, createHandler as n, createHandlerWithExtra as r, InferableHandler as t };
|
|
87
|
+
//# sourceMappingURL=create-handler-Bo-hvWp-.d.mts.map
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { RouteSchema } from
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { i as RouteSchema } from "./schema-CPQudJpE.mjs";
|
|
2
|
+
import "./index-CzItj62a.mjs";
|
|
3
|
+
import { t as InferableHandler } from "./create-handler-Bo-hvWp-.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/defineRoute.d.ts
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* 可推断的路由类型(用于类型推断)
|
|
7
9
|
* 供 vafast-api-client 使用,保留完整的类型信息
|
|
8
10
|
*/
|
|
9
11
|
type InferableRoute<TMethod extends string = string, TPath extends string = string, TReturn = unknown, TSchema extends RouteSchema = RouteSchema> = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
readonly method: TMethod;
|
|
13
|
+
readonly path: TPath;
|
|
14
|
+
readonly handler: InferableHandler<TReturn, TSchema>;
|
|
15
|
+
readonly middleware?: ReadonlyArray<(req: Request, next: () => Promise<Response>) => Promise<Response>>;
|
|
14
16
|
};
|
|
15
17
|
/**
|
|
16
18
|
* 中间件类型
|
|
@@ -20,10 +22,10 @@ type Middleware = (req: Request, next: () => Promise<Response>) => Promise<Respo
|
|
|
20
22
|
* 路由定义类型(保留完整 handler 类型)
|
|
21
23
|
*/
|
|
22
24
|
type RouteDefinition<TMethod extends string = string, TPath extends string = string, THandler = unknown> = {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
readonly method: TMethod;
|
|
26
|
+
readonly path: TPath;
|
|
27
|
+
readonly handler: THandler;
|
|
28
|
+
readonly middleware?: ReadonlyArray<Middleware>;
|
|
27
29
|
};
|
|
28
30
|
/**
|
|
29
31
|
* 创建单个路由定义(自动保留字面量类型,无需 as const)
|
|
@@ -94,10 +96,11 @@ declare function patch<TPath extends string, THandler>(path: TPath, handler: THa
|
|
|
94
96
|
* ```
|
|
95
97
|
*/
|
|
96
98
|
declare function defineRoutes<const T extends readonly {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
readonly method: string;
|
|
100
|
+
readonly path: string;
|
|
101
|
+
readonly handler: unknown;
|
|
102
|
+
readonly middleware?: ReadonlyArray<Middleware>;
|
|
101
103
|
}[]>(routes: T): T;
|
|
102
|
-
|
|
103
|
-
export {
|
|
104
|
+
//#endregion
|
|
105
|
+
export { InferableRoute, RouteDefinition, defineRoutes, del, get, patch, post, put, route };
|
|
106
|
+
//# sourceMappingURL=defineRoute.d.mts.map
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
//#region src/defineRoute.ts
|
|
2
|
+
/**
|
|
3
|
+
* 创建单个路由定义(自动保留字面量类型,无需 as const)
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* import { route, defineRoutes, createHandler, Type } from 'vafast'
|
|
8
|
+
*
|
|
9
|
+
* const routes = defineRoutes([
|
|
10
|
+
* route('GET', '/users', createHandler(
|
|
11
|
+
* { query: Type.Object({ page: Type.Number() }) },
|
|
12
|
+
* async ({ query }) => ({ users: [], total: 0 })
|
|
13
|
+
* )),
|
|
14
|
+
* route('POST', '/users', createHandler(
|
|
15
|
+
* { body: Type.Object({ name: Type.String() }) },
|
|
16
|
+
* async ({ body }) => ({ id: '1', name: body.name })
|
|
17
|
+
* )),
|
|
18
|
+
* route('GET', '/users/:id', createHandler(
|
|
19
|
+
* { params: Type.Object({ id: Type.String() }) },
|
|
20
|
+
* async ({ params }) => ({ id: params.id, name: 'User' })
|
|
21
|
+
* ))
|
|
22
|
+
* ])
|
|
23
|
+
*
|
|
24
|
+
* // 无需 as const!类型自动推断
|
|
25
|
+
* type Api = InferEden<typeof routes>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
function route(method, path, handler, middleware) {
|
|
29
|
+
return {
|
|
30
|
+
method,
|
|
31
|
+
path,
|
|
32
|
+
handler,
|
|
33
|
+
middleware
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* GET 路由快捷方法
|
|
38
|
+
*/
|
|
39
|
+
function get(path, handler, middleware) {
|
|
40
|
+
return route("GET", path, handler, middleware);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* POST 路由快捷方法
|
|
44
|
+
*/
|
|
45
|
+
function post(path, handler, middleware) {
|
|
46
|
+
return route("POST", path, handler, middleware);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* PUT 路由快捷方法
|
|
50
|
+
*/
|
|
51
|
+
function put(path, handler, middleware) {
|
|
52
|
+
return route("PUT", path, handler, middleware);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* DELETE 路由快捷方法
|
|
56
|
+
*/
|
|
57
|
+
function del(path, handler, middleware) {
|
|
58
|
+
return route("DELETE", path, handler, middleware);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* PATCH 路由快捷方法
|
|
62
|
+
*/
|
|
63
|
+
function patch(path, handler, middleware) {
|
|
64
|
+
return route("PATCH", path, handler, middleware);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 定义路由数组(保留完整类型信息)
|
|
68
|
+
*
|
|
69
|
+
* 推荐配合 route() 函数使用,无需 as const
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* import { defineRoutes, route, createHandler, Type } from 'vafast'
|
|
74
|
+
*
|
|
75
|
+
* // ✨ 新方式:使用 route() 函数,无需 as const
|
|
76
|
+
* const routes = defineRoutes([
|
|
77
|
+
* route('GET', '/users', createHandler(...)),
|
|
78
|
+
* route('POST', '/users', createHandler(...))
|
|
79
|
+
* ])
|
|
80
|
+
*
|
|
81
|
+
* // 🔙 旧方式:需要 as const(仍然支持)
|
|
82
|
+
* const routes = defineRoutes([
|
|
83
|
+
* { method: 'GET', path: '/users', handler: createHandler(...) }
|
|
84
|
+
* ] as const)
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
function defineRoutes(routes) {
|
|
88
|
+
return routes;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
export { defineRoutes, del, get, patch, post, put, route };
|
|
93
|
+
//# sourceMappingURL=defineRoute.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineRoute.mjs","names":[],"sources":["../src/defineRoute.ts"],"sourcesContent":["import type { RouteSchema } from \"./types\";\nimport type { InferableHandler } from \"./utils/create-handler\";\n\n/**\n * 可推断的路由类型(用于类型推断)\n * 供 vafast-api-client 使用,保留完整的类型信息\n */\nexport type InferableRoute<\n TMethod extends string = string,\n TPath extends string = string,\n TReturn = unknown,\n TSchema extends RouteSchema = RouteSchema\n> = {\n readonly method: TMethod;\n readonly path: TPath;\n readonly handler: InferableHandler<TReturn, TSchema>;\n readonly middleware?: ReadonlyArray<(req: Request, next: () => Promise<Response>) => Promise<Response>>;\n}\n\n/**\n * 中间件类型\n */\ntype Middleware = (req: Request, next: () => Promise<Response>) => Promise<Response>;\n\n/**\n * 路由定义类型(保留完整 handler 类型)\n */\nexport type RouteDefinition<\n TMethod extends string = string,\n TPath extends string = string,\n THandler = unknown\n> = {\n readonly method: TMethod;\n readonly path: TPath;\n readonly handler: THandler;\n readonly middleware?: ReadonlyArray<Middleware>;\n}\n\n/**\n * 创建单个路由定义(自动保留字面量类型,无需 as const)\n * \n * @example\n * ```typescript\n * import { route, defineRoutes, createHandler, Type } from 'vafast'\n * \n * const routes = defineRoutes([\n * route('GET', '/users', createHandler(\n * { query: Type.Object({ page: Type.Number() }) },\n * async ({ query }) => ({ users: [], total: 0 })\n * )),\n * route('POST', '/users', createHandler(\n * { body: Type.Object({ name: Type.String() }) },\n * async ({ body }) => ({ id: '1', name: body.name })\n * )),\n * route('GET', '/users/:id', createHandler(\n * { params: Type.Object({ id: Type.String() }) },\n * async ({ params }) => ({ id: params.id, name: 'User' })\n * ))\n * ])\n * \n * // 无需 as const!类型自动推断\n * type Api = InferEden<typeof routes>\n * ```\n */\nexport function route<\n TMethod extends string,\n TPath extends string,\n THandler\n>(\n method: TMethod,\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<TMethod, TPath, THandler> {\n return {\n method,\n path,\n handler,\n middleware\n };\n}\n\n/**\n * GET 路由快捷方法\n */\nexport function get<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'GET', TPath, THandler> {\n return route('GET', path, handler, middleware);\n}\n\n/**\n * POST 路由快捷方法\n */\nexport function post<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'POST', TPath, THandler> {\n return route('POST', path, handler, middleware);\n}\n\n/**\n * PUT 路由快捷方法\n */\nexport function put<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'PUT', TPath, THandler> {\n return route('PUT', path, handler, middleware);\n}\n\n/**\n * DELETE 路由快捷方法\n */\nexport function del<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'DELETE', TPath, THandler> {\n return route('DELETE', path, handler, middleware);\n}\n\n/**\n * PATCH 路由快捷方法\n */\nexport function patch<TPath extends string, THandler>(\n path: TPath,\n handler: THandler,\n middleware?: Middleware[]\n): RouteDefinition<'PATCH', TPath, THandler> {\n return route('PATCH', path, handler, middleware);\n}\n\n/**\n * 定义路由数组(保留完整类型信息)\n * \n * 推荐配合 route() 函数使用,无需 as const\n * \n * @example\n * ```typescript\n * import { defineRoutes, route, createHandler, Type } from 'vafast'\n * \n * // ✨ 新方式:使用 route() 函数,无需 as const\n * const routes = defineRoutes([\n * route('GET', '/users', createHandler(...)),\n * route('POST', '/users', createHandler(...))\n * ])\n * \n * // 🔙 旧方式:需要 as const(仍然支持)\n * const routes = defineRoutes([\n * { method: 'GET', path: '/users', handler: createHandler(...) }\n * ] as const)\n * ```\n */\nexport function defineRoutes<\n const T extends readonly {\n readonly method: string\n readonly path: string\n readonly handler: unknown\n readonly middleware?: ReadonlyArray<Middleware>\n }[]\n>(routes: T): T {\n return routes;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,SAAgB,MAKd,QACA,MACA,SACA,YAC2C;AAC3C,QAAO;EACL;EACA;EACA;EACA;EACD;;;;;AAMH,SAAgB,IACd,MACA,SACA,YACyC;AACzC,QAAO,MAAM,OAAO,MAAM,SAAS,WAAW;;;;;AAMhD,SAAgB,KACd,MACA,SACA,YAC0C;AAC1C,QAAO,MAAM,QAAQ,MAAM,SAAS,WAAW;;;;;AAMjD,SAAgB,IACd,MACA,SACA,YACyC;AACzC,QAAO,MAAM,OAAO,MAAM,SAAS,WAAW;;;;;AAMhD,SAAgB,IACd,MACA,SACA,YAC4C;AAC5C,QAAO,MAAM,UAAU,MAAM,SAAS,WAAW;;;;;AAMnD,SAAgB,MACd,MACA,SACA,YAC2C;AAC3C,QAAO,MAAM,SAAS,MAAM,SAAS,WAAW;;;;;;;;;;;;;;;;;;;;;;;AAwBlD,SAAgB,aAOd,QAAc;AACd,QAAO"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/utils/dependency-manager.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 依赖管理器
|
|
4
|
+
* 负责按需加载和管理框架依赖
|
|
5
|
+
*/
|
|
6
|
+
declare class DependencyManager {
|
|
7
|
+
private dependencyCache;
|
|
8
|
+
/**
|
|
9
|
+
* 按需获取框架依赖
|
|
10
|
+
*/
|
|
11
|
+
getFrameworkDeps(framework: "vue" | "react"): Promise<any>;
|
|
12
|
+
/**
|
|
13
|
+
* 检测组件类型
|
|
14
|
+
*/
|
|
15
|
+
detectComponentType(component: any): "vue" | "react";
|
|
16
|
+
/**
|
|
17
|
+
* 清除缓存
|
|
18
|
+
*/
|
|
19
|
+
clearCache(): void;
|
|
20
|
+
/**
|
|
21
|
+
* 获取缓存状态
|
|
22
|
+
*/
|
|
23
|
+
getCacheStatus(): Record<string, boolean>;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { DependencyManager as t };
|
|
27
|
+
//# sourceMappingURL=dependency-manager-C6vFWP2L.d.mts.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/dependency-manager.ts
|
|
4
|
+
var DependencyManager;
|
|
5
|
+
var init_dependency_manager = __esmMin((() => {
|
|
6
|
+
DependencyManager = class {
|
|
7
|
+
dependencyCache = /* @__PURE__ */ new Map();
|
|
8
|
+
/**
|
|
9
|
+
* 按需获取框架依赖
|
|
10
|
+
*/
|
|
11
|
+
async getFrameworkDeps(framework) {
|
|
12
|
+
if (this.dependencyCache.has(framework)) return this.dependencyCache.get(framework);
|
|
13
|
+
console.log(`📦 按需加载 ${framework} 依赖...`);
|
|
14
|
+
try {
|
|
15
|
+
let deps;
|
|
16
|
+
switch (framework) {
|
|
17
|
+
case "vue":
|
|
18
|
+
deps = await Promise.all([import("vue"), import("@vue/server-renderer")]);
|
|
19
|
+
break;
|
|
20
|
+
case "react":
|
|
21
|
+
deps = await Promise.all([import("react"), import("react-dom/server")]);
|
|
22
|
+
break;
|
|
23
|
+
default: throw new Error(`不支持的框架: ${framework}`);
|
|
24
|
+
}
|
|
25
|
+
this.dependencyCache.set(framework, deps);
|
|
26
|
+
console.log(`✅ ${framework} 依赖加载完成`);
|
|
27
|
+
return deps;
|
|
28
|
+
} catch (error) {
|
|
29
|
+
console.error(`❌ ${framework} 依赖加载失败:`, error);
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 检测组件类型
|
|
35
|
+
*/
|
|
36
|
+
detectComponentType(component) {
|
|
37
|
+
if (component.render && typeof component.render === "function") return "vue";
|
|
38
|
+
if (component.$$typeof) return "react";
|
|
39
|
+
return "vue";
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 清除缓存
|
|
43
|
+
*/
|
|
44
|
+
clearCache() {
|
|
45
|
+
this.dependencyCache.clear();
|
|
46
|
+
console.log("🧹 依赖缓存已清除");
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 获取缓存状态
|
|
50
|
+
*/
|
|
51
|
+
getCacheStatus() {
|
|
52
|
+
const status = {};
|
|
53
|
+
for (const [framework] of this.dependencyCache) status[framework] = true;
|
|
54
|
+
return status;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}));
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
export { init_dependency_manager as n, DependencyManager as t };
|
|
61
|
+
//# sourceMappingURL=dependency-manager-Czg7Po2j.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-manager-Czg7Po2j.mjs","names":[],"sources":["../src/utils/dependency-manager.ts"],"sourcesContent":["/**\n * 依赖管理器\n * 负责按需加载和管理框架依赖\n */\nexport class DependencyManager {\n private dependencyCache = new Map<string, any>();\n\n /**\n * 按需获取框架依赖\n */\n async getFrameworkDeps(framework: \"vue\" | \"react\") {\n if (this.dependencyCache.has(framework)) {\n return this.dependencyCache.get(framework);\n }\n\n console.log(`📦 按需加载 ${framework} 依赖...`);\n\n try {\n let deps;\n switch (framework) {\n case \"vue\":\n deps = await Promise.all([\n import(\"vue\"),\n import(\"@vue/server-renderer\"),\n ]);\n break;\n case \"react\":\n deps = await Promise.all([\n import(\"react\"),\n import(\"react-dom/server\"),\n ]);\n break;\n default:\n throw new Error(`不支持的框架: ${framework}`);\n }\n\n this.dependencyCache.set(framework, deps);\n console.log(`✅ ${framework} 依赖加载完成`);\n return deps;\n } catch (error) {\n console.error(`❌ ${framework} 依赖加载失败:`, error);\n throw error;\n }\n }\n\n /**\n * 检测组件类型\n */\n detectComponentType(component: any): \"vue\" | \"react\" {\n // 简单的组件类型检测\n if (component.render && typeof component.render === \"function\") {\n return \"vue\";\n }\n if (component.$$typeof) {\n return \"react\";\n }\n // 默认使用 Vue\n return \"vue\";\n }\n\n /**\n * 清除缓存\n */\n clearCache(): void {\n this.dependencyCache.clear();\n console.log(\"🧹 依赖缓存已清除\");\n }\n\n /**\n * 获取缓存状态\n */\n getCacheStatus(): Record<string, boolean> {\n const status: Record<string, boolean> = {};\n for (const [framework] of this.dependencyCache) {\n status[framework] = true;\n }\n return status;\n }\n}\n"],"mappings":";;;;;CAIa,oBAAb,MAA+B;EAC7B,AAAQ,kCAAkB,IAAI,KAAkB;;;;EAKhD,MAAM,iBAAiB,WAA4B;AACjD,OAAI,KAAK,gBAAgB,IAAI,UAAU,CACrC,QAAO,KAAK,gBAAgB,IAAI,UAAU;AAG5C,WAAQ,IAAI,WAAW,UAAU,QAAQ;AAEzC,OAAI;IACF,IAAI;AACJ,YAAQ,WAAR;KACE,KAAK;AACH,aAAO,MAAM,QAAQ,IAAI,CACvB,OAAO,QACP,OAAO,wBACR,CAAC;AACF;KACF,KAAK;AACH,aAAO,MAAM,QAAQ,IAAI,CACvB,OAAO,UACP,OAAO,oBACR,CAAC;AACF;KACF,QACE,OAAM,IAAI,MAAM,WAAW,YAAY;;AAG3C,SAAK,gBAAgB,IAAI,WAAW,KAAK;AACzC,YAAQ,IAAI,KAAK,UAAU,SAAS;AACpC,WAAO;YACA,OAAO;AACd,YAAQ,MAAM,KAAK,UAAU,WAAW,MAAM;AAC9C,UAAM;;;;;;EAOV,oBAAoB,WAAiC;AAEnD,OAAI,UAAU,UAAU,OAAO,UAAU,WAAW,WAClD,QAAO;AAET,OAAI,UAAU,SACZ,QAAO;AAGT,UAAO;;;;;EAMT,aAAmB;AACjB,QAAK,gBAAgB,OAAO;AAC5B,WAAQ,IAAI,aAAa;;;;;EAM3B,iBAA0C;GACxC,MAAM,SAAkC,EAAE;AAC1C,QAAK,MAAM,CAAC,cAAc,KAAK,gBAC7B,QAAO,aAAa;AAEtB,UAAO"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//#region src/utils/formats.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* TypeBox Format 验证器
|
|
4
|
+
*
|
|
5
|
+
* 内置常用的 format 验证,对标 Zod 的内置验证
|
|
6
|
+
* 框架启动时自动注册
|
|
7
|
+
*
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 注册所有内置 format 验证器
|
|
12
|
+
* 框架自动调用,也可手动调用
|
|
13
|
+
*/
|
|
14
|
+
declare function registerFormats(): void;
|
|
15
|
+
/**
|
|
16
|
+
* 自定义注册 format
|
|
17
|
+
*/
|
|
18
|
+
declare function registerFormat(name: string, validator: (value: string) => boolean): void;
|
|
19
|
+
/**
|
|
20
|
+
* 检查 format 是否已注册
|
|
21
|
+
*/
|
|
22
|
+
declare function hasFormat(name: string): boolean;
|
|
23
|
+
declare const Patterns: {
|
|
24
|
+
readonly EMAIL: RegExp;
|
|
25
|
+
readonly UUID: RegExp;
|
|
26
|
+
readonly URL: RegExp;
|
|
27
|
+
readonly IPV4: RegExp;
|
|
28
|
+
readonly IPV6: RegExp;
|
|
29
|
+
readonly DATE: RegExp;
|
|
30
|
+
readonly TIME: RegExp;
|
|
31
|
+
readonly DATE_TIME: RegExp;
|
|
32
|
+
readonly PHONE_CN: RegExp;
|
|
33
|
+
readonly PHONE_E164: RegExp;
|
|
34
|
+
readonly OBJECTID: RegExp;
|
|
35
|
+
readonly HEX_COLOR: RegExp;
|
|
36
|
+
readonly SLUG: RegExp;
|
|
37
|
+
readonly SEMVER: RegExp;
|
|
38
|
+
readonly JWT: RegExp;
|
|
39
|
+
};
|
|
40
|
+
//#endregion
|
|
41
|
+
export { registerFormats as i, hasFormat as n, registerFormat as r, Patterns as t };
|
|
42
|
+
//# sourceMappingURL=formats-CYLwo9GJ.d.mts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region src/utils/go-await.ts
|
|
2
|
+
/**
|
|
3
|
+
* Go 风格的错误处理工具
|
|
4
|
+
* 将 Promise 转换为 [Error | null, T | undefined] 格式
|
|
5
|
+
*
|
|
6
|
+
* @author Framework Team
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @license MIT
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Go 风格的错误处理工具
|
|
12
|
+
* 将 Promise 转换为 [Error | null, T | undefined] 格式
|
|
13
|
+
*
|
|
14
|
+
* @param promise 要处理的 Promise
|
|
15
|
+
* @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const [error, result] = await goAwait(someAsyncFunction());
|
|
20
|
+
* if (error) {
|
|
21
|
+
* console.error("操作失败:", error);
|
|
22
|
+
* } else {
|
|
23
|
+
* console.log("操作成功:", result);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function goAwait(promise) {
|
|
28
|
+
return promise.then((data) => [null, data]).catch((err) => [err instanceof Error ? err : new Error(String(err)), void 0]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { goAwait as t };
|
|
33
|
+
//# sourceMappingURL=go-await-BGAGJfrB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-await-BGAGJfrB.mjs","names":[],"sources":["../src/utils/go-await.ts"],"sourcesContent":["/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @author Framework Team\n * @version 1.0.0\n * @license MIT\n */\n\n/**\n * Go 风格的错误处理工具\n * 将 Promise 转换为 [Error | null, T | undefined] 格式\n *\n * @param promise 要处理的 Promise\n * @returns [Error | null, T | undefined] 元组,第一个元素是错误,第二个是结果\n *\n * @example\n * ```typescript\n * const [error, result] = await goAwait(someAsyncFunction());\n * if (error) {\n * console.error(\"操作失败:\", error);\n * } else {\n * console.log(\"操作成功:\", result);\n * }\n * ```\n */\nexport function goAwait<T>(\n promise: Promise<T>,\n): Promise<[Error | null, T | undefined]> {\n return promise\n .then<[null, T]>((data) => [null, data])\n .catch<\n [Error, undefined]\n >((err) => [err instanceof Error ? err : new Error(String(err)), undefined]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,QACd,SACwC;AACxC,QAAO,QACJ,MAAiB,SAAS,CAAC,MAAM,KAAK,CAAC,CACvC,OAEE,QAAQ,CAAC,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,EAAE,OAAU,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//#region src/utils/go-await.d.ts
|
|
1
2
|
/**
|
|
2
3
|
* Go 风格的错误处理工具
|
|
3
4
|
* 将 Promise 转换为 [Error | null, T | undefined] 格式
|
|
@@ -24,5 +25,6 @@
|
|
|
24
25
|
* ```
|
|
25
26
|
*/
|
|
26
27
|
declare function goAwait<T>(promise: Promise<T>): Promise<[Error | null, T | undefined]>;
|
|
27
|
-
|
|
28
|
-
export { goAwait };
|
|
28
|
+
//#endregion
|
|
29
|
+
export { goAwait as t };
|
|
30
|
+
//# sourceMappingURL=go-await-DRItVwwh.d.mts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { a as parseCookies } from "./parsers-CI_TZ7pO.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/handle.ts
|
|
4
|
+
/** 获取单个 Cookie 值 */
|
|
5
|
+
function getCookie(req, key) {
|
|
6
|
+
return parseCookies(req)[key] || null;
|
|
7
|
+
}
|
|
8
|
+
/** 生成 Set-Cookie 头 */
|
|
9
|
+
function setCookie(key, value, options = {}) {
|
|
10
|
+
let cookie = `${key}=${encodeURIComponent(value)}`;
|
|
11
|
+
if (options.path) cookie += `; Path=${options.path}`;
|
|
12
|
+
if (options.httpOnly) cookie += `; HttpOnly`;
|
|
13
|
+
if (options.secure) cookie += `; Secure`;
|
|
14
|
+
if (options.maxAge) cookie += `; Max-Age=${options.maxAge}`;
|
|
15
|
+
return cookie;
|
|
16
|
+
}
|
|
17
|
+
function setLocals(req, extras) {
|
|
18
|
+
const target = req;
|
|
19
|
+
target.__locals = {
|
|
20
|
+
...target.__locals ?? {},
|
|
21
|
+
...extras
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function getLocals(req) {
|
|
25
|
+
return req.__locals ?? {};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { setLocals as i, getLocals as n, setCookie as r, getCookie as t };
|
|
30
|
+
//# sourceMappingURL=handle-Csjtywdc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-Csjtywdc.mjs","names":[],"sources":["../src/utils/handle.ts"],"sourcesContent":["import { parseCookies } from \"./parsers\";\n\n/** 获取单个 Cookie 值 */\nexport function getCookie(req: Request, key: string): string | null {\n const cookies = parseCookies(req);\n return cookies[key] || null;\n}\n\n/** 生成 Set-Cookie 头 */\nexport function setCookie(\n key: string,\n value: string,\n options: {\n path?: string;\n httpOnly?: boolean;\n maxAge?: number;\n secure?: boolean;\n } = {},\n): string {\n let cookie = `${key}=${encodeURIComponent(value)}`;\n\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.httpOnly) cookie += `; HttpOnly`;\n if (options.secure) cookie += `; Secure`;\n if (options.maxAge) cookie += `; Max-Age=${options.maxAge}`;\n\n return cookie;\n}\n\n// 提供给中间件写入\"局部上下文\"的工具函数\nexport function setLocals<T extends object>(req: Request, extras: T) {\n const target = req as unknown as Record<string, unknown>;\n target.__locals = { ...((target.__locals as object) ?? {}), ...extras };\n}\n\n// 获取中间件注入的局部上下文\nexport function getLocals<T extends object>(req: Request): T {\n const target = req as unknown as Record<string, unknown>;\n return (target.__locals ?? {}) as T;\n}\n"],"mappings":";;;;AAGA,SAAgB,UAAU,KAAc,KAA4B;AAElE,QADgB,aAAa,IAAI,CAClB,QAAQ;;;AAIzB,SAAgB,UACd,KACA,OACA,UAKI,EAAE,EACE;CACR,IAAI,SAAS,GAAG,IAAI,GAAG,mBAAmB,MAAM;AAEhD,KAAI,QAAQ,KAAM,WAAU,UAAU,QAAQ;AAC9C,KAAI,QAAQ,SAAU,WAAU;AAChC,KAAI,QAAQ,OAAQ,WAAU;AAC9B,KAAI,QAAQ,OAAQ,WAAU,aAAa,QAAQ;AAEnD,QAAO;;AAIT,SAAgB,UAA4B,KAAc,QAAW;CACnE,MAAM,SAAS;AACf,QAAO,WAAW;EAAE,GAAK,OAAO,YAAuB,EAAE;EAAG,GAAG;EAAQ;;AAIzE,SAAgB,UAA4B,KAAiB;AAE3D,QADe,IACA,YAAY,EAAE"}
|