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.
Files changed (293) hide show
  1. package/README.md +6 -10
  2. package/dist/base-server-CSkyjEaY.mjs +113 -0
  3. package/dist/base-server-CSkyjEaY.mjs.map +1 -0
  4. package/dist/base-server-DvGS6ATg.d.mts +40 -0
  5. package/dist/base64url-0N9uQPjZ.d.mts +6 -0
  6. package/dist/base64url-CwQnvZyp.mjs +13 -0
  7. package/dist/base64url-CwQnvZyp.mjs.map +1 -0
  8. package/dist/chunk-DW4-Jl94.mjs +37 -0
  9. package/dist/component-route-CYxLOnci.mjs +1 -0
  10. package/dist/component-route-CZawYn61.d.mts +31 -0
  11. package/dist/component-router-CErbGh2A.mjs +33 -0
  12. package/dist/component-router-CErbGh2A.mjs.map +1 -0
  13. package/dist/component-server-CGzU4bss.d.mts +38 -0
  14. package/dist/component-server-DAbIyIPI.mjs +124 -0
  15. package/dist/component-server-DAbIyIPI.mjs.map +1 -0
  16. package/dist/create-handler-B_pfxh3m.mjs +166 -0
  17. package/dist/create-handler-B_pfxh3m.mjs.map +1 -0
  18. package/dist/{utils/create-handler.d.ts → create-handler-Bo-hvWp-.d.mts} +24 -24
  19. package/dist/{defineRoute.d.ts → defineRoute.d.mts} +20 -17
  20. package/dist/defineRoute.mjs +93 -0
  21. package/dist/defineRoute.mjs.map +1 -0
  22. package/dist/dependency-manager-C6vFWP2L.d.mts +27 -0
  23. package/dist/dependency-manager-Czg7Po2j.mjs +61 -0
  24. package/dist/dependency-manager-Czg7Po2j.mjs.map +1 -0
  25. package/dist/formats-CYLwo9GJ.d.mts +42 -0
  26. package/dist/go-await-BGAGJfrB.mjs +33 -0
  27. package/dist/go-await-BGAGJfrB.mjs.map +1 -0
  28. package/dist/{utils/go-await.d.ts → go-await-DRItVwwh.d.mts} +4 -2
  29. package/dist/handle-Csjtywdc.mjs +30 -0
  30. package/dist/handle-Csjtywdc.mjs.map +1 -0
  31. package/dist/{utils/handle.d.ts → handle-D0TFoOiX.d.mts} +8 -6
  32. package/dist/html-renderer-CMGKJoIy.d.mts +22 -0
  33. package/dist/{utils/html-renderer.js → html-renderer-CczE8mwC.mjs} +34 -29
  34. package/dist/html-renderer-CczE8mwC.mjs.map +1 -0
  35. package/dist/index-Ci52vt55.d.mts +48 -0
  36. package/dist/index-CzItj62a.d.mts +1 -0
  37. package/dist/index.d.mts +30 -0
  38. package/dist/index.mjs +37 -0
  39. package/dist/index.mjs.map +1 -0
  40. package/dist/middleware/{component-renderer.d.ts → component-renderer.d.mts} +3 -1
  41. package/dist/middleware/component-renderer.mjs +119 -0
  42. package/dist/middleware/component-renderer.mjs.map +1 -0
  43. package/dist/middleware/{component-router.d.ts → component-router.d.mts} +5 -4
  44. package/dist/middleware/component-router.mjs +4 -0
  45. package/dist/middleware-Byp3Hjae.mjs +59 -0
  46. package/dist/middleware-Byp3Hjae.mjs.map +1 -0
  47. package/dist/middleware.d.mts +25 -0
  48. package/dist/middleware.mjs +4 -0
  49. package/dist/monitoring/index.d.mts +33 -0
  50. package/dist/monitoring/index.mjs +27 -0
  51. package/dist/monitoring/index.mjs.map +1 -0
  52. package/dist/monitoring/native-monitor.d.mts +48 -0
  53. package/dist/monitoring/native-monitor.mjs +154 -0
  54. package/dist/monitoring/native-monitor.mjs.map +1 -0
  55. package/dist/monitoring/types.d.mts +150 -0
  56. package/dist/monitoring/types.mjs +1 -0
  57. package/dist/node-server/index.d.mts +4 -0
  58. package/dist/node-server/index.mjs +5 -0
  59. package/dist/node-server/{request.d.ts → request.d.mts} +4 -6
  60. package/dist/node-server/request.mjs +3 -0
  61. package/dist/node-server/{response.d.ts → response.d.mts} +4 -6
  62. package/dist/node-server/response.mjs +3 -0
  63. package/dist/node-server/serve.d.mts +2 -0
  64. package/dist/node-server/serve.mjs +4 -0
  65. package/dist/{utils/parsers.d.ts → parsers-7lvt3Oss.d.mts} +10 -8
  66. package/dist/parsers-CI_TZ7pO.mjs +168 -0
  67. package/dist/parsers-CI_TZ7pO.mjs.map +1 -0
  68. package/dist/path-matcher-73cJd5Y7.mjs +62 -0
  69. package/dist/path-matcher-73cJd5Y7.mjs.map +1 -0
  70. package/dist/radix-tree-D0XYaJKb.mjs +157 -0
  71. package/dist/radix-tree-D0XYaJKb.mjs.map +1 -0
  72. package/dist/request-CKC3Ox6M.mjs +133 -0
  73. package/dist/request-CKC3Ox6M.mjs.map +1 -0
  74. package/dist/request-validator-42lY21gn.d.mts +67 -0
  75. package/dist/request-validator-_J5HloRq.mjs +77 -0
  76. package/dist/request-validator-_J5HloRq.mjs.map +1 -0
  77. package/dist/{utils/response.d.ts → response-A-sZZiJ7.d.mts} +4 -2
  78. package/dist/response-Cf5FgtmE.mjs +72 -0
  79. package/dist/response-Cf5FgtmE.mjs.map +1 -0
  80. package/dist/response-DXg4i_yh.mjs +97 -0
  81. package/dist/response-DXg4i_yh.mjs.map +1 -0
  82. package/dist/route-9pAVP1GC.mjs +11 -0
  83. package/dist/route-9pAVP1GC.mjs.map +1 -0
  84. package/dist/route-BJ-40LNI.d.mts +44 -0
  85. package/dist/route-registry--tx1PNui.d.mts +176 -0
  86. package/dist/route-registry-mcTG0M-t.mjs +225 -0
  87. package/dist/route-registry-mcTG0M-t.mjs.map +1 -0
  88. package/dist/router/index.d.mts +5 -0
  89. package/dist/router/index.mjs +10 -0
  90. package/dist/router/index.mjs.map +1 -0
  91. package/dist/router/radix-tree.d.mts +60 -0
  92. package/dist/router/radix-tree.mjs +4 -0
  93. package/dist/router-B9HUUCkR.mjs +71 -0
  94. package/dist/router-B9HUUCkR.mjs.map +1 -0
  95. package/dist/{router.d.ts → router.d.mts} +6 -7
  96. package/dist/router.mjs +4 -0
  97. package/dist/schema-CPQudJpE.d.mts +81 -0
  98. package/dist/schema-CtVBNfnQ.mjs +1 -0
  99. package/dist/serve-B5WmhK6m.d.mts +69 -0
  100. package/dist/serve-Be6NvuQk.mjs +107 -0
  101. package/dist/serve-Be6NvuQk.mjs.map +1 -0
  102. package/dist/serve.d.mts +2 -0
  103. package/dist/serve.mjs +4 -0
  104. package/dist/server/base-server.d.mts +4 -0
  105. package/dist/server/base-server.mjs +4 -0
  106. package/dist/server/component-server.d.mts +5 -0
  107. package/dist/server/component-server.mjs +5 -0
  108. package/dist/server/index.d.mts +7 -0
  109. package/dist/server/index.mjs +8 -0
  110. package/dist/server/server-factory.d.mts +7 -0
  111. package/dist/server/server-factory.mjs +6 -0
  112. package/dist/server/server.d.mts +5 -0
  113. package/dist/server/server.mjs +4 -0
  114. package/dist/server-BmPKs8oM.mjs +137 -0
  115. package/dist/server-BmPKs8oM.mjs.map +1 -0
  116. package/dist/server-Cbd3Ia51.mjs +88 -0
  117. package/dist/server-Cbd3Ia51.mjs.map +1 -0
  118. package/dist/server-D9gjszHe.d.mts +60 -0
  119. package/dist/sse-BMM6KTfy.d.mts +65 -0
  120. package/dist/sse-BT5yyLgX.mjs +87 -0
  121. package/dist/sse-BT5yyLgX.mjs.map +1 -0
  122. package/dist/types/component-route.d.mts +2 -0
  123. package/dist/types/component-route.mjs +1 -0
  124. package/dist/types/index.d.mts +6 -0
  125. package/dist/types/index.mjs +3 -0
  126. package/dist/types/route.d.mts +2 -0
  127. package/dist/types/route.mjs +3 -0
  128. package/dist/types/schema.d.mts +2 -0
  129. package/dist/types/schema.mjs +1 -0
  130. package/dist/types/types.d.mts +2 -0
  131. package/dist/types/types.mjs +1 -0
  132. package/dist/{types/types.d.ts → types-DuTa8AVN.d.mts} +27 -25
  133. package/dist/utils/base64url.d.mts +2 -0
  134. package/dist/utils/base64url.mjs +3 -0
  135. package/dist/utils/create-handler.d.mts +3 -0
  136. package/dist/utils/create-handler.mjs +5 -0
  137. package/dist/utils/dependency-manager.d.mts +2 -0
  138. package/dist/utils/dependency-manager.mjs +4 -0
  139. package/dist/utils/formats.d.mts +2 -0
  140. package/dist/utils/formats.mjs +129 -0
  141. package/dist/utils/formats.mjs.map +1 -0
  142. package/dist/utils/go-await.d.mts +2 -0
  143. package/dist/utils/go-await.mjs +3 -0
  144. package/dist/utils/handle.d.mts +2 -0
  145. package/dist/utils/handle.mjs +4 -0
  146. package/dist/utils/html-renderer.d.mts +2 -0
  147. package/dist/utils/html-renderer.mjs +4 -0
  148. package/dist/utils/index.d.mts +16 -0
  149. package/dist/utils/index.mjs +23 -0
  150. package/dist/utils/index.mjs.map +1 -0
  151. package/dist/utils/parsers.d.mts +2 -0
  152. package/dist/utils/parsers.mjs +3 -0
  153. package/dist/utils/path-matcher.d.mts +27 -0
  154. package/dist/utils/path-matcher.mjs +4 -0
  155. package/dist/utils/request-validator.d.mts +3 -0
  156. package/dist/utils/request-validator.mjs +5 -0
  157. package/dist/utils/response.d.mts +2 -0
  158. package/dist/utils/response.mjs +4 -0
  159. package/dist/utils/route-registry.d.mts +4 -0
  160. package/dist/utils/route-registry.mjs +4 -0
  161. package/dist/utils/sse.d.mts +3 -0
  162. package/dist/utils/sse.mjs +5 -0
  163. package/dist/utils/validators/validators.d.mts +2 -0
  164. package/dist/utils/validators/validators.mjs +3 -0
  165. package/dist/validators-BBrGePBr.mjs +112 -0
  166. package/dist/validators-BBrGePBr.mjs.map +1 -0
  167. package/dist/validators-CPmnj_y9.d.mts +67 -0
  168. package/package.json +16 -18
  169. package/dist/auth/token.d.ts +0 -42
  170. package/dist/auth/token.js +0 -131
  171. package/dist/auth/token.js.map +0 -1
  172. package/dist/defineRoute.js +0 -37
  173. package/dist/defineRoute.js.map +0 -1
  174. package/dist/index.d.ts +0 -32
  175. package/dist/index.js +0 -2578
  176. package/dist/index.js.map +0 -1
  177. package/dist/middleware/auth.d.ts +0 -16
  178. package/dist/middleware/auth.js +0 -205
  179. package/dist/middleware/auth.js.map +0 -1
  180. package/dist/middleware/authMiddleware.d.ts +0 -5
  181. package/dist/middleware/authMiddleware.js +0 -57
  182. package/dist/middleware/authMiddleware.js.map +0 -1
  183. package/dist/middleware/component-renderer.js +0 -139
  184. package/dist/middleware/component-renderer.js.map +0 -1
  185. package/dist/middleware/component-router.js +0 -36
  186. package/dist/middleware/component-router.js.map +0 -1
  187. package/dist/middleware/cors.d.ts +0 -12
  188. package/dist/middleware/cors.js +0 -43
  189. package/dist/middleware/cors.js.map +0 -1
  190. package/dist/middleware/rateLimit.d.ts +0 -10
  191. package/dist/middleware/rateLimit.js +0 -49
  192. package/dist/middleware/rateLimit.js.map +0 -1
  193. package/dist/middleware.d.ts +0 -21
  194. package/dist/middleware.js +0 -102
  195. package/dist/middleware.js.map +0 -1
  196. package/dist/monitoring/index.d.ts +0 -36
  197. package/dist/monitoring/index.js +0 -1487
  198. package/dist/monitoring/index.js.map +0 -1
  199. package/dist/monitoring/native-monitor.d.ts +0 -44
  200. package/dist/monitoring/native-monitor.js +0 -1454
  201. package/dist/monitoring/native-monitor.js.map +0 -1
  202. package/dist/monitoring/types.d.ts +0 -148
  203. package/dist/monitoring/types.js +0 -8
  204. package/dist/monitoring/types.js.map +0 -1
  205. package/dist/node-server/index.d.ts +0 -4
  206. package/dist/node-server/index.js +0 -298
  207. package/dist/node-server/index.js.map +0 -1
  208. package/dist/node-server/request.js +0 -125
  209. package/dist/node-server/request.js.map +0 -1
  210. package/dist/node-server/response.js +0 -76
  211. package/dist/node-server/response.js.map +0 -1
  212. package/dist/node-server/serve.d.ts +0 -71
  213. package/dist/node-server/serve.js +0 -281
  214. package/dist/node-server/serve.js.map +0 -1
  215. package/dist/router/index.d.ts +0 -3
  216. package/dist/router/index.js +0 -232
  217. package/dist/router/index.js.map +0 -1
  218. package/dist/router/radix-tree.d.ts +0 -66
  219. package/dist/router/radix-tree.js +0 -190
  220. package/dist/router/radix-tree.js.map +0 -1
  221. package/dist/router.js +0 -44
  222. package/dist/router.js.map +0 -1
  223. package/dist/serve.d.ts +0 -2
  224. package/dist/serve.js +0 -281
  225. package/dist/serve.js.map +0 -1
  226. package/dist/server/base-server.d.ts +0 -37
  227. package/dist/server/base-server.js +0 -134
  228. package/dist/server/base-server.js.map +0 -1
  229. package/dist/server/component-server.d.ts +0 -37
  230. package/dist/server/component-server.js +0 -488
  231. package/dist/server/component-server.js.map +0 -1
  232. package/dist/server/index.d.ts +0 -8
  233. package/dist/server/index.js +0 -1159
  234. package/dist/server/index.js.map +0 -1
  235. package/dist/server/server-factory.d.ts +0 -48
  236. package/dist/server/server-factory.js +0 -1156
  237. package/dist/server/server-factory.js.map +0 -1
  238. package/dist/server/server.d.ts +0 -64
  239. package/dist/server/server.js +0 -737
  240. package/dist/server/server.js.map +0 -1
  241. package/dist/types/component-route.d.ts +0 -29
  242. package/dist/types/component-route.js +0 -1
  243. package/dist/types/component-route.js.map +0 -1
  244. package/dist/types/index.d.ts +0 -5
  245. package/dist/types/index.js +0 -21
  246. package/dist/types/index.js.map +0 -1
  247. package/dist/types/route.d.ts +0 -42
  248. package/dist/types/route.js +0 -12
  249. package/dist/types/route.js.map +0 -1
  250. package/dist/types/schema.d.ts +0 -79
  251. package/dist/types/schema.js +0 -10
  252. package/dist/types/schema.js.map +0 -1
  253. package/dist/types/types.js +0 -1
  254. package/dist/types/types.js.map +0 -1
  255. package/dist/utils/base64url.d.ts +0 -4
  256. package/dist/utils/base64url.js +0 -14
  257. package/dist/utils/base64url.js.map +0 -1
  258. package/dist/utils/create-handler.js +0 -299
  259. package/dist/utils/create-handler.js.map +0 -1
  260. package/dist/utils/dependency-manager.d.ts +0 -25
  261. package/dist/utils/dependency-manager.js +0 -71
  262. package/dist/utils/dependency-manager.js.map +0 -1
  263. package/dist/utils/formats.d.ts +0 -40
  264. package/dist/utils/formats.js +0 -116
  265. package/dist/utils/formats.js.map +0 -1
  266. package/dist/utils/go-await.js +0 -16
  267. package/dist/utils/go-await.js.map +0 -1
  268. package/dist/utils/handle.js +0 -48
  269. package/dist/utils/handle.js.map +0 -1
  270. package/dist/utils/html-renderer.d.ts +0 -20
  271. package/dist/utils/html-renderer.js.map +0 -1
  272. package/dist/utils/index.d.ts +0 -16
  273. package/dist/utils/index.js +0 -1038
  274. package/dist/utils/index.js.map +0 -1
  275. package/dist/utils/parsers.js +0 -160
  276. package/dist/utils/parsers.js.map +0 -1
  277. package/dist/utils/path-matcher.d.ts +0 -25
  278. package/dist/utils/path-matcher.js +0 -73
  279. package/dist/utils/path-matcher.js.map +0 -1
  280. package/dist/utils/request-validator.d.ts +0 -66
  281. package/dist/utils/request-validator.js +0 -158
  282. package/dist/utils/request-validator.js.map +0 -1
  283. package/dist/utils/response.js +0 -102
  284. package/dist/utils/response.js.map +0 -1
  285. package/dist/utils/route-registry.d.ts +0 -195
  286. package/dist/utils/route-registry.js +0 -152
  287. package/dist/utils/route-registry.js.map +0 -1
  288. package/dist/utils/sse.d.ts +0 -87
  289. package/dist/utils/sse.js +0 -181
  290. package/dist/utils/sse.js.map +0 -1
  291. package/dist/utils/validators/validators.d.ts +0 -76
  292. package/dist/utils/validators/validators.js +0 -97
  293. 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, HandlerContext, HandlerContextWithExtra } from '../types/schema.js';
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
- * 非柯里化设计,API 更简洁
8
- *
9
- * @author Framework Team
10
- * @version 3.0.0
11
- * @license MIT
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
- req: Request;
17
- body: unknown;
18
- query: Record<string, string>;
19
- params: Record<string, string>;
20
- headers: Record<string, string>;
21
- cookies: Record<string, string>;
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
- __returnType: TReturn;
44
- /** Schema 类型标记 */
45
- __schema: TSchema;
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
- req: Request;
83
+ req: Request;
85
84
  }) => R | Promise<R>): (req: Request) => Promise<Response>;
86
-
87
- export { type InferableHandler, createHandler, createHandlerWithExtra, simpleHandler };
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 './types/schema.js';
2
- import { InferableHandler } from './utils/create-handler.js';
3
- import '@sinclair/typebox';
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
- readonly method: TMethod;
11
- readonly path: TPath;
12
- readonly handler: InferableHandler<TReturn, TSchema>;
13
- readonly middleware?: ReadonlyArray<(req: Request, next: () => Promise<Response>) => Promise<Response>>;
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
- readonly method: TMethod;
24
- readonly path: TPath;
25
- readonly handler: THandler;
26
- readonly middleware?: ReadonlyArray<Middleware>;
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
- readonly method: string;
98
- readonly path: string;
99
- readonly handler: unknown;
100
- readonly middleware?: ReadonlyArray<Middleware>;
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 { type InferableRoute, type RouteDefinition, defineRoutes, del, get, patch, post, put, route };
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"}