vafast 0.4.1 → 0.4.3

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 (306) hide show
  1. package/README.md +6 -10
  2. package/dist/auth/{token.d.ts → token.d.mts} +21 -19
  3. package/dist/auth/token.mjs +105 -0
  4. package/dist/auth/token.mjs.map +1 -0
  5. package/dist/base-server-Bq4_lJWK.mjs +113 -0
  6. package/dist/base-server-Bq4_lJWK.mjs.map +1 -0
  7. package/dist/base-server-Gakrozqk.d.mts +40 -0
  8. package/dist/base64url-BY-HBSpL.d.mts +6 -0
  9. package/dist/base64url-DLDOeXsk.mjs +13 -0
  10. package/dist/base64url-DLDOeXsk.mjs.map +1 -0
  11. package/dist/chunk-67U6L5Jh.mjs +37 -0
  12. package/dist/component-route-BYV_X1rA.d.mts +31 -0
  13. package/dist/component-route-Do2yyYTi.mjs +1 -0
  14. package/dist/component-router-DXUXLp1R.mjs +33 -0
  15. package/dist/component-router-DXUXLp1R.mjs.map +1 -0
  16. package/dist/component-server-ARXvZJUQ.mjs +124 -0
  17. package/dist/component-server-ARXvZJUQ.mjs.map +1 -0
  18. package/dist/component-server-BOz4Q-Qt.d.mts +38 -0
  19. package/dist/create-handler-CbSoroA1.mjs +166 -0
  20. package/dist/create-handler-CbSoroA1.mjs.map +1 -0
  21. package/dist/{utils/create-handler.d.ts → create-handler-Dtt0xv6g.d.mts} +24 -24
  22. package/dist/{defineRoute.d.ts → defineRoute.d.mts} +20 -17
  23. package/dist/defineRoute.mjs +93 -0
  24. package/dist/defineRoute.mjs.map +1 -0
  25. package/dist/dependency-manager-CPkwMI7J.mjs +61 -0
  26. package/dist/dependency-manager-CPkwMI7J.mjs.map +1 -0
  27. package/dist/dependency-manager-Dbug5INp.d.mts +27 -0
  28. package/dist/formats-BSqJWCsG.d.mts +42 -0
  29. package/dist/go-await-B-KP-K8x.mjs +33 -0
  30. package/dist/go-await-B-KP-K8x.mjs.map +1 -0
  31. package/dist/{utils/go-await.d.ts → go-await-CqPx9dVQ.d.mts} +4 -2
  32. package/dist/handle-BhpqNgGf.mjs +30 -0
  33. package/dist/handle-BhpqNgGf.mjs.map +1 -0
  34. package/dist/{utils/handle.d.ts → handle-DOidKTI-.d.mts} +8 -6
  35. package/dist/html-renderer-C3LKTLme.d.mts +22 -0
  36. package/dist/{utils/html-renderer.js → html-renderer-CJ3B2Hft.mjs} +34 -29
  37. package/dist/html-renderer-CJ3B2Hft.mjs.map +1 -0
  38. package/dist/index-DFsQyT61.d.mts +48 -0
  39. package/dist/index-DXJd7-2Z.d.mts +1 -0
  40. package/dist/index.d.mts +35 -0
  41. package/dist/index.mjs +42 -0
  42. package/dist/index.mjs.map +1 -0
  43. package/dist/middleware/{auth.d.ts → auth.d.mts} +12 -8
  44. package/dist/middleware/auth.mjs +98 -0
  45. package/dist/middleware/auth.mjs.map +1 -0
  46. package/dist/middleware/authMiddleware.d.mts +9 -0
  47. package/dist/middleware/authMiddleware.mjs +19 -0
  48. package/dist/middleware/authMiddleware.mjs.map +1 -0
  49. package/dist/middleware/{component-renderer.d.ts → component-renderer.d.mts} +3 -1
  50. package/dist/middleware/component-renderer.mjs +119 -0
  51. package/dist/middleware/component-renderer.mjs.map +1 -0
  52. package/dist/middleware/{component-router.d.ts → component-router.d.mts} +5 -4
  53. package/dist/middleware/component-router.mjs +4 -0
  54. package/dist/middleware/cors.d.mts +16 -0
  55. package/dist/middleware/cors.mjs +38 -0
  56. package/dist/middleware/cors.mjs.map +1 -0
  57. package/dist/middleware/rateLimit.d.mts +14 -0
  58. package/dist/middleware/rateLimit.mjs +34 -0
  59. package/dist/middleware/rateLimit.mjs.map +1 -0
  60. package/dist/middleware-3ShRJyd1.mjs +59 -0
  61. package/dist/middleware-3ShRJyd1.mjs.map +1 -0
  62. package/dist/middleware.d.mts +25 -0
  63. package/dist/middleware.mjs +4 -0
  64. package/dist/monitoring/index.d.mts +33 -0
  65. package/dist/monitoring/index.mjs +27 -0
  66. package/dist/monitoring/index.mjs.map +1 -0
  67. package/dist/monitoring/native-monitor.d.mts +48 -0
  68. package/dist/monitoring/native-monitor.mjs +154 -0
  69. package/dist/monitoring/native-monitor.mjs.map +1 -0
  70. package/dist/monitoring/types.d.mts +150 -0
  71. package/dist/monitoring/types.mjs +1 -0
  72. package/dist/node-server/index.d.mts +4 -0
  73. package/dist/node-server/index.mjs +5 -0
  74. package/dist/node-server/{request.d.ts → request.d.mts} +4 -6
  75. package/dist/node-server/request.mjs +3 -0
  76. package/dist/node-server/{response.d.ts → response.d.mts} +4 -6
  77. package/dist/node-server/response.mjs +3 -0
  78. package/dist/node-server/serve.d.mts +2 -0
  79. package/dist/node-server/serve.mjs +4 -0
  80. package/dist/{utils/parsers.d.ts → parsers-CodQFP1Z.d.mts} +10 -8
  81. package/dist/parsers-ROIZWSGI.mjs +168 -0
  82. package/dist/parsers-ROIZWSGI.mjs.map +1 -0
  83. package/dist/path-matcher-CXMJ-IrG.mjs +62 -0
  84. package/dist/path-matcher-CXMJ-IrG.mjs.map +1 -0
  85. package/dist/radix-tree-BWmhTLhT.mjs +157 -0
  86. package/dist/radix-tree-BWmhTLhT.mjs.map +1 -0
  87. package/dist/request-B2BkUecT.mjs +133 -0
  88. package/dist/request-B2BkUecT.mjs.map +1 -0
  89. package/dist/request-validator-Dyqng-H_.mjs +77 -0
  90. package/dist/request-validator-Dyqng-H_.mjs.map +1 -0
  91. package/dist/request-validator-u2Ccj3_x.d.mts +67 -0
  92. package/dist/response-BhFKEphr.mjs +72 -0
  93. package/dist/response-BhFKEphr.mjs.map +1 -0
  94. package/dist/response-CSKW5hsS.mjs +97 -0
  95. package/dist/response-CSKW5hsS.mjs.map +1 -0
  96. package/dist/{utils/response.d.ts → response-CUyV5FIm.d.mts} +4 -2
  97. package/dist/route-BRR15b-p.mjs +11 -0
  98. package/dist/route-BRR15b-p.mjs.map +1 -0
  99. package/dist/route-BqmWCG4e.d.mts +44 -0
  100. package/dist/route-registry-AlkDgbcE.mjs +225 -0
  101. package/dist/route-registry-AlkDgbcE.mjs.map +1 -0
  102. package/dist/route-registry-ykzRmaHB.d.mts +176 -0
  103. package/dist/router/index.d.mts +5 -0
  104. package/dist/router/index.mjs +10 -0
  105. package/dist/router/index.mjs.map +1 -0
  106. package/dist/router/radix-tree.d.mts +60 -0
  107. package/dist/router/radix-tree.mjs +4 -0
  108. package/dist/router-BOeVQrjz.mjs +71 -0
  109. package/dist/router-BOeVQrjz.mjs.map +1 -0
  110. package/dist/{router.d.ts → router.d.mts} +6 -7
  111. package/dist/router.mjs +4 -0
  112. package/dist/schema-CVuttFSw.d.mts +81 -0
  113. package/dist/schema-CbAaktsZ.mjs +1 -0
  114. package/dist/serve-BQQ2JzIH.d.mts +69 -0
  115. package/dist/serve-MRGGK7-q.mjs +107 -0
  116. package/dist/serve-MRGGK7-q.mjs.map +1 -0
  117. package/dist/serve.d.mts +2 -0
  118. package/dist/serve.mjs +4 -0
  119. package/dist/server/base-server.d.mts +4 -0
  120. package/dist/server/base-server.mjs +4 -0
  121. package/dist/server/component-server.d.mts +5 -0
  122. package/dist/server/component-server.mjs +5 -0
  123. package/dist/server/index.d.mts +7 -0
  124. package/dist/server/index.mjs +8 -0
  125. package/dist/server/server-factory.d.mts +7 -0
  126. package/dist/server/server-factory.mjs +6 -0
  127. package/dist/server/server.d.mts +5 -0
  128. package/dist/server/server.mjs +4 -0
  129. package/dist/server-B0nzGCG5.mjs +88 -0
  130. package/dist/server-B0nzGCG5.mjs.map +1 -0
  131. package/dist/server-C8WCshmG.mjs +137 -0
  132. package/dist/server-C8WCshmG.mjs.map +1 -0
  133. package/dist/server-Drc2kSxp.d.mts +60 -0
  134. package/dist/sse-BOd2pvUK.d.mts +65 -0
  135. package/dist/sse-US5D9mgE.mjs +87 -0
  136. package/dist/sse-US5D9mgE.mjs.map +1 -0
  137. package/dist/types/component-route.d.mts +2 -0
  138. package/dist/types/component-route.mjs +1 -0
  139. package/dist/types/index.d.mts +6 -0
  140. package/dist/types/index.mjs +3 -0
  141. package/dist/types/route.d.mts +2 -0
  142. package/dist/types/route.mjs +3 -0
  143. package/dist/types/schema.d.mts +2 -0
  144. package/dist/types/schema.mjs +1 -0
  145. package/dist/types/types.d.mts +2 -0
  146. package/dist/types/types.mjs +1 -0
  147. package/dist/{types/types.d.ts → types-Cb7_2VSt.d.mts} +27 -23
  148. package/dist/utils/base64url.d.mts +2 -0
  149. package/dist/utils/base64url.mjs +3 -0
  150. package/dist/utils/create-handler.d.mts +3 -0
  151. package/dist/utils/create-handler.mjs +5 -0
  152. package/dist/utils/dependency-manager.d.mts +2 -0
  153. package/dist/utils/dependency-manager.mjs +4 -0
  154. package/dist/utils/formats.d.mts +2 -0
  155. package/dist/utils/formats.mjs +129 -0
  156. package/dist/utils/formats.mjs.map +1 -0
  157. package/dist/utils/go-await.d.mts +2 -0
  158. package/dist/utils/go-await.mjs +3 -0
  159. package/dist/utils/handle.d.mts +2 -0
  160. package/dist/utils/handle.mjs +4 -0
  161. package/dist/utils/html-renderer.d.mts +2 -0
  162. package/dist/utils/html-renderer.mjs +4 -0
  163. package/dist/utils/index.d.mts +16 -0
  164. package/dist/utils/index.mjs +23 -0
  165. package/dist/utils/index.mjs.map +1 -0
  166. package/dist/utils/parsers.d.mts +2 -0
  167. package/dist/utils/parsers.mjs +3 -0
  168. package/dist/utils/path-matcher.d.mts +27 -0
  169. package/dist/utils/path-matcher.mjs +4 -0
  170. package/dist/utils/request-validator.d.mts +3 -0
  171. package/dist/utils/request-validator.mjs +5 -0
  172. package/dist/utils/response.d.mts +2 -0
  173. package/dist/utils/response.mjs +4 -0
  174. package/dist/utils/route-registry.d.mts +4 -0
  175. package/dist/utils/route-registry.mjs +4 -0
  176. package/dist/utils/sse.d.mts +3 -0
  177. package/dist/utils/sse.mjs +5 -0
  178. package/dist/utils/validators/validators.d.mts +2 -0
  179. package/dist/utils/validators/validators.mjs +3 -0
  180. package/dist/validators-C0eZyxPh.d.mts +67 -0
  181. package/dist/validators-CbCLj0Rc.mjs +112 -0
  182. package/dist/validators-CbCLj0Rc.mjs.map +1 -0
  183. package/package.json +16 -18
  184. package/dist/auth/token.js +0 -131
  185. package/dist/auth/token.js.map +0 -1
  186. package/dist/defineRoute.js +0 -37
  187. package/dist/defineRoute.js.map +0 -1
  188. package/dist/index.d.ts +0 -32
  189. package/dist/index.js +0 -2575
  190. package/dist/index.js.map +0 -1
  191. package/dist/middleware/auth.js +0 -205
  192. package/dist/middleware/auth.js.map +0 -1
  193. package/dist/middleware/authMiddleware.d.ts +0 -5
  194. package/dist/middleware/authMiddleware.js +0 -57
  195. package/dist/middleware/authMiddleware.js.map +0 -1
  196. package/dist/middleware/component-renderer.js +0 -139
  197. package/dist/middleware/component-renderer.js.map +0 -1
  198. package/dist/middleware/component-router.js +0 -36
  199. package/dist/middleware/component-router.js.map +0 -1
  200. package/dist/middleware/cors.d.ts +0 -12
  201. package/dist/middleware/cors.js +0 -43
  202. package/dist/middleware/cors.js.map +0 -1
  203. package/dist/middleware/rateLimit.d.ts +0 -10
  204. package/dist/middleware/rateLimit.js +0 -49
  205. package/dist/middleware/rateLimit.js.map +0 -1
  206. package/dist/middleware.d.ts +0 -21
  207. package/dist/middleware.js +0 -102
  208. package/dist/middleware.js.map +0 -1
  209. package/dist/monitoring/index.d.ts +0 -36
  210. package/dist/monitoring/index.js +0 -1484
  211. package/dist/monitoring/index.js.map +0 -1
  212. package/dist/monitoring/native-monitor.d.ts +0 -44
  213. package/dist/monitoring/native-monitor.js +0 -1451
  214. package/dist/monitoring/native-monitor.js.map +0 -1
  215. package/dist/monitoring/types.d.ts +0 -148
  216. package/dist/monitoring/types.js +0 -8
  217. package/dist/monitoring/types.js.map +0 -1
  218. package/dist/node-server/index.d.ts +0 -4
  219. package/dist/node-server/index.js +0 -298
  220. package/dist/node-server/index.js.map +0 -1
  221. package/dist/node-server/request.js +0 -125
  222. package/dist/node-server/request.js.map +0 -1
  223. package/dist/node-server/response.js +0 -76
  224. package/dist/node-server/response.js.map +0 -1
  225. package/dist/node-server/serve.d.ts +0 -71
  226. package/dist/node-server/serve.js +0 -281
  227. package/dist/node-server/serve.js.map +0 -1
  228. package/dist/router/index.d.ts +0 -3
  229. package/dist/router/index.js +0 -229
  230. package/dist/router/index.js.map +0 -1
  231. package/dist/router/radix-tree.d.ts +0 -66
  232. package/dist/router/radix-tree.js +0 -190
  233. package/dist/router/radix-tree.js.map +0 -1
  234. package/dist/router.js +0 -41
  235. package/dist/router.js.map +0 -1
  236. package/dist/serve.d.ts +0 -2
  237. package/dist/serve.js +0 -281
  238. package/dist/serve.js.map +0 -1
  239. package/dist/server/base-server.d.ts +0 -37
  240. package/dist/server/base-server.js +0 -134
  241. package/dist/server/base-server.js.map +0 -1
  242. package/dist/server/component-server.d.ts +0 -37
  243. package/dist/server/component-server.js +0 -488
  244. package/dist/server/component-server.js.map +0 -1
  245. package/dist/server/index.d.ts +0 -8
  246. package/dist/server/index.js +0 -1156
  247. package/dist/server/index.js.map +0 -1
  248. package/dist/server/server-factory.d.ts +0 -48
  249. package/dist/server/server-factory.js +0 -1153
  250. package/dist/server/server-factory.js.map +0 -1
  251. package/dist/server/server.d.ts +0 -64
  252. package/dist/server/server.js +0 -734
  253. package/dist/server/server.js.map +0 -1
  254. package/dist/types/component-route.d.ts +0 -29
  255. package/dist/types/component-route.js +0 -1
  256. package/dist/types/component-route.js.map +0 -1
  257. package/dist/types/index.d.ts +0 -5
  258. package/dist/types/index.js +0 -21
  259. package/dist/types/index.js.map +0 -1
  260. package/dist/types/route.d.ts +0 -42
  261. package/dist/types/route.js +0 -12
  262. package/dist/types/route.js.map +0 -1
  263. package/dist/types/schema.d.ts +0 -79
  264. package/dist/types/schema.js +0 -10
  265. package/dist/types/schema.js.map +0 -1
  266. package/dist/types/types.js +0 -1
  267. package/dist/types/types.js.map +0 -1
  268. package/dist/utils/base64url.d.ts +0 -4
  269. package/dist/utils/base64url.js +0 -14
  270. package/dist/utils/base64url.js.map +0 -1
  271. package/dist/utils/create-handler.js +0 -299
  272. package/dist/utils/create-handler.js.map +0 -1
  273. package/dist/utils/dependency-manager.d.ts +0 -25
  274. package/dist/utils/dependency-manager.js +0 -71
  275. package/dist/utils/dependency-manager.js.map +0 -1
  276. package/dist/utils/formats.d.ts +0 -40
  277. package/dist/utils/formats.js +0 -116
  278. package/dist/utils/formats.js.map +0 -1
  279. package/dist/utils/go-await.js +0 -16
  280. package/dist/utils/go-await.js.map +0 -1
  281. package/dist/utils/handle.js +0 -48
  282. package/dist/utils/handle.js.map +0 -1
  283. package/dist/utils/html-renderer.d.ts +0 -20
  284. package/dist/utils/html-renderer.js.map +0 -1
  285. package/dist/utils/index.d.ts +0 -16
  286. package/dist/utils/index.js +0 -1038
  287. package/dist/utils/index.js.map +0 -1
  288. package/dist/utils/parsers.js +0 -160
  289. package/dist/utils/parsers.js.map +0 -1
  290. package/dist/utils/path-matcher.d.ts +0 -25
  291. package/dist/utils/path-matcher.js +0 -73
  292. package/dist/utils/path-matcher.js.map +0 -1
  293. package/dist/utils/request-validator.d.ts +0 -66
  294. package/dist/utils/request-validator.js +0 -158
  295. package/dist/utils/request-validator.js.map +0 -1
  296. package/dist/utils/response.js +0 -102
  297. package/dist/utils/response.js.map +0 -1
  298. package/dist/utils/route-registry.d.ts +0 -195
  299. package/dist/utils/route-registry.js +0 -152
  300. package/dist/utils/route-registry.js.map +0 -1
  301. package/dist/utils/sse.d.ts +0 -87
  302. package/dist/utils/sse.js +0 -181
  303. package/dist/utils/sse.js.map +0 -1
  304. package/dist/utils/validators/validators.d.ts +0 -76
  305. package/dist/utils/validators/validators.js +0 -97
  306. package/dist/utils/validators/validators.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-CSKW5hsS.mjs","names":["stream"],"sources":["../src/utils/response.ts"],"sourcesContent":["// src/response.ts\n\n/** 生成 JSON 响应 */\nexport function json(\n data: unknown,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const body = JSON.stringify(data);\n\n // 优化:只在有自定义 headers 时才创建 Headers 对象\n if (Object.keys(headers).length === 0) {\n return new Response(body, {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // 有自定义 headers 时才创建 Headers 对象\n const h = new Headers({\n \"Content-Type\": \"application/json\",\n ...headers,\n });\n\n return new Response(body, {\n status,\n headers: h,\n });\n}\n\n// JSON 响应的预创建 headers(避免每次创建)\nconst JSON_HEADERS = { \"Content-Type\": \"application/json\" };\nconst TEXT_HEADERS = { \"Content-Type\": \"text/plain\" };\n\n/**\n * 类型特化的响应映射\n * 根据返回值类型直接生成 Response,避免不必要的检查\n */\nexport function mapResponse(response: unknown): Response {\n // 快速路径:已经是 Response\n if (response instanceof Response) return response;\n\n // 使用 constructor.name 进行类型判断(比 instanceof 更快)\n switch (response?.constructor?.name) {\n case \"String\":\n return new Response(response as string, { headers: TEXT_HEADERS });\n\n case \"Object\":\n case \"Array\":\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n\n case \"Number\":\n case \"Boolean\":\n return new Response(String(response), { headers: TEXT_HEADERS });\n\n case undefined:\n // null 或 undefined\n return new Response(null, { status: 204 });\n\n case \"ReadableStream\":\n return new Response(response as ReadableStream);\n\n case \"Blob\":\n return new Response(response as Blob);\n\n case \"ArrayBuffer\":\n return new Response(response as ArrayBuffer);\n\n case \"Uint8Array\":\n return new Response(response as unknown as BodyInit);\n\n default:\n // Promise 处理\n if (response instanceof Promise) {\n return response.then(mapResponse) as unknown as Response;\n }\n // 其他情况使用 JSON 序列化\n return new Response(JSON.stringify(response), { headers: JSON_HEADERS });\n }\n}\n\n/** 生成重定向响应 */\nexport function redirect(location: string, status: 301 | 302 = 302): Response {\n return new Response(null, {\n status,\n headers: {\n Location: location,\n },\n });\n}\n\n/** 生成纯文本响应 */\nexport function text(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成HTML响应 */\nexport function html(\n content: string,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...headers,\n });\n\n return new Response(content, {\n status,\n headers: h,\n });\n}\n\n/** 生成空响应(204 No Content) */\nexport function empty(status = 204, headers: HeadersInit = {}): Response {\n return new Response(null, {\n status,\n headers,\n });\n}\n\n/** 生成流式响应 */\nexport function stream(\n stream: ReadableStream,\n status = 200,\n headers: HeadersInit = {},\n): Response {\n const h = new Headers({\n \"Content-Type\": \"application/octet-stream\",\n ...headers,\n });\n\n return new Response(stream, {\n status,\n headers: h,\n });\n}\n"],"mappings":";;;;AAGA,SAAgB,KACd,MACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,OAAO,KAAK,UAAU,KAAK;AAGjC,KAAI,OAAO,KAAK,QAAQ,CAAC,WAAW,EAClC,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS,EAAE,gBAAgB,oBAAoB;EAChD,CAAC;CAIJ,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS;EACV,CAAC;;;;;;AAWJ,SAAgB,YAAY,UAA6B;AAEvD,KAAI,oBAAoB,SAAU,QAAO;AAGzC,SAAQ,UAAU,aAAa,MAA/B;EACE,KAAK,SACH,QAAO,IAAI,SAAS,UAAoB,EAAE,SAAS,cAAc,CAAC;EAEpE,KAAK;EACL,KAAK,QACH,QAAO,IAAI,SAAS,KAAK,UAAU,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;EAE1E,KAAK;EACL,KAAK,UACH,QAAO,IAAI,SAAS,OAAO,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;EAElE,KAAK,OAEH,QAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,CAAC;EAE5C,KAAK,iBACH,QAAO,IAAI,SAAS,SAA2B;EAEjD,KAAK,OACH,QAAO,IAAI,SAAS,SAAiB;EAEvC,KAAK,cACH,QAAO,IAAI,SAAS,SAAwB;EAE9C,KAAK,aACH,QAAO,IAAI,SAAS,SAAgC;EAEtD;AAEE,OAAI,oBAAoB,QACtB,QAAO,SAAS,KAAK,YAAY;AAGnC,UAAO,IAAI,SAAS,KAAK,UAAU,SAAS,EAAE,EAAE,SAAS,cAAc,CAAC;;;;AAK9E,SAAgB,SAAS,UAAkB,SAAoB,KAAe;AAC5E,QAAO,IAAI,SAAS,MAAM;EACxB;EACA,SAAS,EACP,UAAU,UACX;EACF,CAAC;;;AAIJ,SAAgB,KACd,SACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,SAAS;EAC3B;EACA,SAAS;EACV,CAAC;;;AAIJ,SAAgB,KACd,SACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAAS,SAAS;EAC3B;EACA,SAAS;EACV,CAAC;;;AAIJ,SAAgB,MAAM,SAAS,KAAK,UAAuB,EAAE,EAAY;AACvE,QAAO,IAAI,SAAS,MAAM;EACxB;EACA;EACD,CAAC;;;AAIJ,SAAgB,OACd,UACA,SAAS,KACT,UAAuB,EAAE,EACf;CACV,MAAM,IAAI,IAAI,QAAQ;EACpB,gBAAgB;EAChB,GAAG;EACJ,CAAC;AAEF,QAAO,IAAI,SAASA,UAAQ;EAC1B;EACA,SAAS;EACV,CAAC;;;;CApHE,eAAe,EAAE,gBAAgB,oBAAoB;CACrD,eAAe,EAAE,gBAAgB,cAAc"}
@@ -1,3 +1,4 @@
1
+ //#region src/utils/response.d.ts
1
2
  /** 生成 JSON 响应 */
2
3
  declare function json(data: unknown, status?: number, headers?: HeadersInit): Response;
3
4
  /**
@@ -15,5 +16,6 @@ declare function html(content: string, status?: number, headers?: HeadersInit):
15
16
  declare function empty(status?: number, headers?: HeadersInit): Response;
16
17
  /** 生成流式响应 */
17
18
  declare function stream(stream: ReadableStream, status?: number, headers?: HeadersInit): Response;
18
-
19
- export { empty, html, json, mapResponse, redirect, stream, text };
19
+ //#endregion
20
+ export { redirect as a, mapResponse as i, html as n, stream as o, json as r, text as s, empty as t };
21
+ //# sourceMappingURL=response-CUyV5FIm.d.mts.map
@@ -0,0 +1,11 @@
1
+ //#region src/types/route.ts
2
+ function createTypedRoute(config) {
3
+ return config;
4
+ }
5
+ function isTypedRoute(route) {
6
+ return route && typeof route === "object" && "method" in route && "path" in route && "handler" in route;
7
+ }
8
+
9
+ //#endregion
10
+ export { isTypedRoute as n, createTypedRoute as t };
11
+ //# sourceMappingURL=route-BRR15b-p.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-BRR15b-p.mjs","names":[],"sources":["../src/types/route.ts"],"sourcesContent":["import { Route, ResponseBody } from \"./types\";\n\n// 定义中间件类型\nexport interface Middleware {\n (req: Request, next: () => Promise<Response>): Promise<Response>;\n}\n\n// 基础路由配置\nexport interface BaseRouteConfig {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\" | \"HEAD\";\n path: string;\n handler: (req: Request) => ResponseBody | Promise<ResponseBody>;\n}\n\n// 扩展的路由配置 - 只保留Schema验证和中间件\nexport interface ExtendedRouteConfig extends BaseRouteConfig {\n // Tirne 中间件系统\n middleware?: Middleware[];\n\n // Schema验证配置\n body?: any;\n query?: any;\n params?: any;\n headers?: any;\n cookies?: any;\n\n // 其他配置\n docs?: {\n description?: string;\n tags?: string[];\n security?: any[];\n responses?: Record<string, any>;\n };\n timeout?: number;\n maxBodySize?: string;\n\n // 允许任意扩展\n [key: string]: any;\n}\n\n// 嵌套路由配置\nexport interface NestedRouteConfig {\n path: string;\n middleware?: Middleware[];\n children?: (NestedRouteConfig | ExtendedRouteConfig)[];\n}\n\n// 类型安全的路由\nexport type TypedRoute = ExtendedRouteConfig;\n\n// 兼容类型:可以接受Route或TypedRoute\nexport type CompatibleRoute = Route | TypedRoute;\n\n// 扁平化后的路由,包含完整的中间件链\nexport interface FlattenedRoute extends ExtendedRouteConfig {\n fullPath: string;\n middlewareChain: Middleware[];\n}\n\n// 导出一些实际的函数,确保 JavaScript 代码生成\nexport function createTypedRoute(\n config: ExtendedRouteConfig,\n): ExtendedRouteConfig {\n return config;\n}\n\nexport function isTypedRoute(route: any): route is TypedRoute {\n return (\n route &&\n typeof route === \"object\" &&\n \"method\" in route &&\n \"path\" in route &&\n \"handler\" in route\n );\n}\n"],"mappings":";AA4DA,SAAgB,iBACd,QACqB;AACrB,QAAO;;AAGT,SAAgB,aAAa,OAAiC;AAC5D,QACE,SACA,OAAO,UAAU,YACjB,YAAY,SACZ,UAAU,SACV,aAAa"}
@@ -0,0 +1,44 @@
1
+ import { c as ResponseBody, l as Route } from "./types-Cb7_2VSt.mjs";
2
+
3
+ //#region src/types/route.d.ts
4
+ interface Middleware {
5
+ (req: Request, next: () => Promise<Response>): Promise<Response>;
6
+ }
7
+ interface BaseRouteConfig {
8
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD";
9
+ path: string;
10
+ handler: (req: Request) => ResponseBody | Promise<ResponseBody>;
11
+ }
12
+ interface ExtendedRouteConfig extends BaseRouteConfig {
13
+ middleware?: Middleware[];
14
+ body?: any;
15
+ query?: any;
16
+ params?: any;
17
+ headers?: any;
18
+ cookies?: any;
19
+ docs?: {
20
+ description?: string;
21
+ tags?: string[];
22
+ security?: any[];
23
+ responses?: Record<string, any>;
24
+ };
25
+ timeout?: number;
26
+ maxBodySize?: string;
27
+ [key: string]: any;
28
+ }
29
+ interface NestedRouteConfig {
30
+ path: string;
31
+ middleware?: Middleware[];
32
+ children?: (NestedRouteConfig | ExtendedRouteConfig)[];
33
+ }
34
+ type TypedRoute = ExtendedRouteConfig;
35
+ type CompatibleRoute = Route | TypedRoute;
36
+ interface FlattenedRoute extends ExtendedRouteConfig {
37
+ fullPath: string;
38
+ middlewareChain: Middleware[];
39
+ }
40
+ declare function createTypedRoute(config: ExtendedRouteConfig): ExtendedRouteConfig;
41
+ declare function isTypedRoute(route: any): route is TypedRoute;
42
+ //#endregion
43
+ export { Middleware as a, createTypedRoute as c, FlattenedRoute as i, isTypedRoute as l, CompatibleRoute as n, NestedRouteConfig as o, ExtendedRouteConfig as r, TypedRoute as s, BaseRouteConfig as t };
44
+ //# sourceMappingURL=route-BqmWCG4e.d.mts.map
@@ -0,0 +1,225 @@
1
+ import { t as __esmMin } from "./chunk-67U6L5Jh.mjs";
2
+
3
+ //#region src/utils/route-registry.ts
4
+ /**
5
+ * 创建路由注册表
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // 定义扩展字段类型
10
+ * interface MyRouteMeta {
11
+ * webhook?: { eventKey: string }
12
+ * permission?: string
13
+ * }
14
+ *
15
+ * // 创建带类型的注册表
16
+ * const registry = createRouteRegistry<MyRouteMeta>(server.getRoutes())
17
+ *
18
+ * // 类型安全的查询
19
+ * const route = registry.get('POST', '/auth/signIn')
20
+ * if (route?.webhook) {
21
+ * console.log(route.webhook.eventKey)
22
+ * }
23
+ * ```
24
+ */
25
+ function createRouteRegistry(routes) {
26
+ return new RouteRegistry(routes);
27
+ }
28
+ /**
29
+ * 设置全局 registry(框架内部使用)
30
+ * @internal
31
+ */
32
+ function setGlobalRegistry(registry) {
33
+ globalRegistry = registry;
34
+ }
35
+ /**
36
+ * 获取全局路由注册表
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * // 在任意文件中
41
+ * import { getRouteRegistry } from 'vafast'
42
+ *
43
+ * const registry = getRouteRegistry()
44
+ * const webhookRoutes = registry.filter('webhook')
45
+ * ```
46
+ *
47
+ * @throws 如果 Server 尚未创建
48
+ */
49
+ function getRouteRegistry() {
50
+ if (!globalRegistry) throw new Error("RouteRegistry not initialized. Make sure Server is created first.");
51
+ return globalRegistry;
52
+ }
53
+ /**
54
+ * 按 method + path 获取单个路由
55
+ *
56
+ * 便捷函数,无需先获取 registry
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * // 在中间件或接口中
61
+ * import { getRoute } from 'vafast'
62
+ *
63
+ * const route = getRoute('POST', '/auth/signIn')
64
+ * if (route?.webhook) {
65
+ * console.log('This route has webhook:', route.webhook)
66
+ * }
67
+ * ```
68
+ */
69
+ function getRoute(method, path) {
70
+ return getRouteRegistry().get(method, path);
71
+ }
72
+ /**
73
+ * 获取所有路由
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * import { getAllRoutes } from 'vafast'
78
+ *
79
+ * const routes = getAllRoutes()
80
+ * console.log(`Total ${routes.length} routes`)
81
+ * ```
82
+ */
83
+ function getAllRoutes() {
84
+ return getRouteRegistry().getAll();
85
+ }
86
+ /**
87
+ * 筛选有特定字段的路由
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * import { filterRoutes } from 'vafast'
92
+ *
93
+ * // 获取所有配置了 webhook 的路由
94
+ * const webhookRoutes = filterRoutes('webhook')
95
+ * ```
96
+ */
97
+ function filterRoutes(field) {
98
+ return getRouteRegistry().filter(field);
99
+ }
100
+ var RouteRegistry, globalRegistry;
101
+ var init_route_registry = __esmMin((() => {
102
+ RouteRegistry = class {
103
+ /** 所有路由元信息 */
104
+ routes = [];
105
+ /** 路由映射表:METHOD:fullPath -> RouteMeta */
106
+ routeMap = /* @__PURE__ */ new Map();
107
+ /** 分类映射表:category -> RouteMeta[] */
108
+ categoryMap = /* @__PURE__ */ new Map();
109
+ constructor(routes) {
110
+ this.buildRegistry(routes);
111
+ }
112
+ /**
113
+ * 构建注册表
114
+ */
115
+ buildRegistry(routes) {
116
+ for (const route of routes) {
117
+ const meta = {
118
+ method: route.method,
119
+ path: route.path,
120
+ fullPath: route.fullPath,
121
+ name: route.name,
122
+ description: route.description
123
+ };
124
+ for (const key of Object.keys(route)) if (![
125
+ "method",
126
+ "path",
127
+ "fullPath",
128
+ "name",
129
+ "description",
130
+ "handler",
131
+ "middleware",
132
+ "middlewareChain"
133
+ ].includes(key)) meta[key] = route[key];
134
+ this.routes.push(meta);
135
+ this.routeMap.set(`${route.method}:${route.fullPath}`, meta);
136
+ const category = this.extractCategory(route.fullPath);
137
+ if (!this.categoryMap.has(category)) this.categoryMap.set(category, []);
138
+ this.categoryMap.get(category).push(meta);
139
+ }
140
+ }
141
+ /**
142
+ * 提取分类(第一段路径)
143
+ */
144
+ extractCategory(path) {
145
+ return path.split("/").filter(Boolean)[0] || "root";
146
+ }
147
+ /**
148
+ * 获取所有路由元信息
149
+ */
150
+ getAll() {
151
+ return [...this.routes];
152
+ }
153
+ /**
154
+ * 按 method + path 查询路由
155
+ */
156
+ get(method, path) {
157
+ return this.routeMap.get(`${method}:${path}`);
158
+ }
159
+ /**
160
+ * 检查路由是否存在
161
+ */
162
+ has(method, path) {
163
+ return this.routeMap.has(`${method}:${path}`);
164
+ }
165
+ /**
166
+ * 按分类获取路由
167
+ */
168
+ getByCategory(category) {
169
+ return this.categoryMap.get(category) || [];
170
+ }
171
+ /**
172
+ * 获取所有分类
173
+ */
174
+ getCategories() {
175
+ return Array.from(this.categoryMap.keys()).sort();
176
+ }
177
+ /**
178
+ * 筛选有特定字段的路由
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * // 获取所有配置了 webhook 的路由
183
+ * const webhookRoutes = registry.filter('webhook')
184
+ * ```
185
+ */
186
+ filter(field) {
187
+ return this.routes.filter((r) => field in r && r[field] !== void 0);
188
+ }
189
+ /**
190
+ * 按条件筛选路由
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * // 获取所有 POST 请求
195
+ * const postRoutes = registry.filterBy(r => r.method === 'POST')
196
+ * ```
197
+ */
198
+ filterBy(predicate) {
199
+ return this.routes.filter(predicate);
200
+ }
201
+ /**
202
+ * 获取路由数量
203
+ */
204
+ get size() {
205
+ return this.routes.length;
206
+ }
207
+ /**
208
+ * 遍历所有路由
209
+ */
210
+ forEach(callback) {
211
+ this.routes.forEach(callback);
212
+ }
213
+ /**
214
+ * 映射所有路由
215
+ */
216
+ map(callback) {
217
+ return this.routes.map(callback);
218
+ }
219
+ };
220
+ globalRegistry = null;
221
+ }));
222
+
223
+ //#endregion
224
+ export { getRoute as a, setGlobalRegistry as c, getAllRoutes as i, createRouteRegistry as n, getRouteRegistry as o, filterRoutes as r, init_route_registry as s, RouteRegistry as t };
225
+ //# sourceMappingURL=route-registry-AlkDgbcE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-registry-AlkDgbcE.mjs","names":[],"sources":["../src/utils/route-registry.ts"],"sourcesContent":["/**\n * 路由注册表\n *\n * 提供路由元信息的收集和查询能力\n * 可用于:API 文档生成、Webhook 事件注册、权限检查、审计日志等\n *\n * @example\n * ```typescript\n * // 创建注册表\n * const registry = createRouteRegistry(server.getRoutes())\n *\n * // 查询路由\n * const route = registry.get('POST', '/auth/signIn')\n *\n * // 筛选有 webhook 配置的路由\n * const webhookRoutes = registry.filter('webhook')\n *\n * // 按分类获取\n * const authRoutes = registry.getByCategory('auth')\n * ```\n */\n\nimport type { FlattenedRoute, Method } from '../types'\n\n/**\n * 路由元信息(不含 handler 和 middleware)\n */\nexport interface RouteMeta {\n method: Method\n path: string\n fullPath: string\n name?: string\n description?: string\n /** 扩展字段 */\n [key: string]: unknown\n}\n\n/**\n * 路由注册表\n *\n * 泛型 T 用于定义扩展字段的类型\n */\nexport class RouteRegistry<T extends Record<string, unknown> = Record<string, unknown>> {\n /** 所有路由元信息 */\n private routes: RouteMeta[] = []\n\n /** 路由映射表:METHOD:fullPath -> RouteMeta */\n private routeMap = new Map<string, RouteMeta>()\n\n /** 分类映射表:category -> RouteMeta[] */\n private categoryMap = new Map<string, RouteMeta[]>()\n\n constructor(routes: FlattenedRoute[]) {\n this.buildRegistry(routes)\n }\n\n /**\n * 构建注册表\n */\n private buildRegistry(routes: FlattenedRoute[]): void {\n for (const route of routes) {\n // 提取元信息(排除 handler 和 middleware)\n const meta: RouteMeta = {\n method: route.method,\n path: route.path,\n fullPath: route.fullPath,\n name: route.name,\n description: route.description,\n }\n\n // 复制扩展字段\n for (const key of Object.keys(route)) {\n if (!['method', 'path', 'fullPath', 'name', 'description', 'handler', 'middleware', 'middlewareChain'].includes(key)) {\n meta[key] = route[key as keyof FlattenedRoute]\n }\n }\n\n this.routes.push(meta)\n this.routeMap.set(`${route.method}:${route.fullPath}`, meta)\n\n // 按分类索引\n const category = this.extractCategory(route.fullPath)\n if (!this.categoryMap.has(category)) {\n this.categoryMap.set(category, [])\n }\n this.categoryMap.get(category)!.push(meta)\n }\n }\n\n /**\n * 提取分类(第一段路径)\n */\n private extractCategory(path: string): string {\n const segments = path.split('/').filter(Boolean)\n return segments[0] || 'root'\n }\n\n // ============================================\n // 查询接口\n // ============================================\n\n /**\n * 获取所有路由元信息\n */\n getAll(): RouteMeta[] {\n return [...this.routes]\n }\n\n /**\n * 按 method + path 查询路由\n */\n get(method: string, path: string): (RouteMeta & T) | undefined {\n return this.routeMap.get(`${method}:${path}`) as (RouteMeta & T) | undefined\n }\n\n /**\n * 检查路由是否存在\n */\n has(method: string, path: string): boolean {\n return this.routeMap.has(`${method}:${path}`)\n }\n\n /**\n * 按分类获取路由\n */\n getByCategory(category: string): RouteMeta[] {\n return this.categoryMap.get(category) || []\n }\n\n /**\n * 获取所有分类\n */\n getCategories(): string[] {\n return Array.from(this.categoryMap.keys()).sort()\n }\n\n /**\n * 筛选有特定字段的路由\n *\n * @example\n * ```typescript\n * // 获取所有配置了 webhook 的路由\n * const webhookRoutes = registry.filter('webhook')\n * ```\n */\n filter<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[] {\n return this.routes.filter((r) => field in r && r[field] !== undefined) as (RouteMeta & Record<K, unknown>)[]\n }\n\n /**\n * 按条件筛选路由\n *\n * @example\n * ```typescript\n * // 获取所有 POST 请求\n * const postRoutes = registry.filterBy(r => r.method === 'POST')\n * ```\n */\n filterBy(predicate: (route: RouteMeta) => boolean): RouteMeta[] {\n return this.routes.filter(predicate)\n }\n\n /**\n * 获取路由数量\n */\n get size(): number {\n return this.routes.length\n }\n\n /**\n * 遍历所有路由\n */\n forEach(callback: (route: RouteMeta, index: number) => void): void {\n this.routes.forEach(callback)\n }\n\n /**\n * 映射所有路由\n */\n map<R>(callback: (route: RouteMeta, index: number) => R): R[] {\n return this.routes.map(callback)\n }\n}\n\n/**\n * 创建路由注册表\n *\n * @example\n * ```typescript\n * // 定义扩展字段类型\n * interface MyRouteMeta {\n * webhook?: { eventKey: string }\n * permission?: string\n * }\n *\n * // 创建带类型的注册表\n * const registry = createRouteRegistry<MyRouteMeta>(server.getRoutes())\n *\n * // 类型安全的查询\n * const route = registry.get('POST', '/auth/signIn')\n * if (route?.webhook) {\n * console.log(route.webhook.eventKey)\n * }\n * ```\n */\nexport function createRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(\n routes: FlattenedRoute[]\n): RouteRegistry<T> {\n return new RouteRegistry<T>(routes)\n}\n\n// ============================================\n// 全局 Registry(单例模式)\n// ============================================\n\n/** 全局 registry 实例 */\nlet globalRegistry: RouteRegistry | null = null\n\n/**\n * 设置全局 registry(框架内部使用)\n * @internal\n */\nexport function setGlobalRegistry(registry: RouteRegistry): void {\n globalRegistry = registry\n}\n\n/**\n * 获取全局路由注册表\n *\n * @example\n * ```typescript\n * // 在任意文件中\n * import { getRouteRegistry } from 'vafast'\n *\n * const registry = getRouteRegistry()\n * const webhookRoutes = registry.filter('webhook')\n * ```\n *\n * @throws 如果 Server 尚未创建\n */\nexport function getRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(): RouteRegistry<T> {\n if (!globalRegistry) {\n throw new Error('RouteRegistry not initialized. Make sure Server is created first.')\n }\n return globalRegistry as RouteRegistry<T>\n}\n\n/**\n * 按 method + path 获取单个路由\n *\n * 便捷函数,无需先获取 registry\n *\n * @example\n * ```typescript\n * // 在中间件或接口中\n * import { getRoute } from 'vafast'\n *\n * const route = getRoute('POST', '/auth/signIn')\n * if (route?.webhook) {\n * console.log('This route has webhook:', route.webhook)\n * }\n * ```\n */\nexport function getRoute<T extends Record<string, unknown> = Record<string, unknown>>(\n method: string,\n path: string\n): (RouteMeta & T) | undefined {\n return getRouteRegistry<T>().get(method, path)\n}\n\n/**\n * 获取所有路由\n *\n * @example\n * ```typescript\n * import { getAllRoutes } from 'vafast'\n *\n * const routes = getAllRoutes()\n * console.log(`Total ${routes.length} routes`)\n * ```\n */\nexport function getAllRoutes(): RouteMeta[] {\n return getRouteRegistry().getAll()\n}\n\n/**\n * 筛选有特定字段的路由\n *\n * @example\n * ```typescript\n * import { filterRoutes } from 'vafast'\n *\n * // 获取所有配置了 webhook 的路由\n * const webhookRoutes = filterRoutes('webhook')\n * ```\n */\nexport function filterRoutes<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[] {\n return getRouteRegistry().filter(field)\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6MA,SAAgB,oBACd,QACkB;AAClB,QAAO,IAAI,cAAiB,OAAO;;;;;;AAcrC,SAAgB,kBAAkB,UAA+B;AAC/D,kBAAiB;;;;;;;;;;;;;;;;AAiBnB,SAAgB,mBAAkG;AAChH,KAAI,CAAC,eACH,OAAM,IAAI,MAAM,oEAAoE;AAEtF,QAAO;;;;;;;;;;;;;;;;;;AAmBT,SAAgB,SACd,QACA,MAC6B;AAC7B,QAAO,kBAAqB,CAAC,IAAI,QAAQ,KAAK;;;;;;;;;;;;;AAchD,SAAgB,eAA4B;AAC1C,QAAO,kBAAkB,CAAC,QAAQ;;;;;;;;;;;;;AAcpC,SAAgB,aAA+B,OAA8C;AAC3F,QAAO,kBAAkB,CAAC,OAAO,MAAM;;;;CA/P5B,gBAAb,MAAwF;;EAEtF,AAAQ,SAAsB,EAAE;;EAGhC,AAAQ,2BAAW,IAAI,KAAwB;;EAG/C,AAAQ,8BAAc,IAAI,KAA0B;EAEpD,YAAY,QAA0B;AACpC,QAAK,cAAc,OAAO;;;;;EAM5B,AAAQ,cAAc,QAAgC;AACpD,QAAK,MAAM,SAAS,QAAQ;IAE1B,MAAM,OAAkB;KACtB,QAAQ,MAAM;KACd,MAAM,MAAM;KACZ,UAAU,MAAM;KAChB,MAAM,MAAM;KACZ,aAAa,MAAM;KACpB;AAGD,SAAK,MAAM,OAAO,OAAO,KAAK,MAAM,CAClC,KAAI,CAAC;KAAC;KAAU;KAAQ;KAAY;KAAQ;KAAe;KAAW;KAAc;KAAkB,CAAC,SAAS,IAAI,CAClH,MAAK,OAAO,MAAM;AAItB,SAAK,OAAO,KAAK,KAAK;AACtB,SAAK,SAAS,IAAI,GAAG,MAAM,OAAO,GAAG,MAAM,YAAY,KAAK;IAG5D,MAAM,WAAW,KAAK,gBAAgB,MAAM,SAAS;AACrD,QAAI,CAAC,KAAK,YAAY,IAAI,SAAS,CACjC,MAAK,YAAY,IAAI,UAAU,EAAE,CAAC;AAEpC,SAAK,YAAY,IAAI,SAAS,CAAE,KAAK,KAAK;;;;;;EAO9C,AAAQ,gBAAgB,MAAsB;AAE5C,UADiB,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAChC,MAAM;;;;;EAUxB,SAAsB;AACpB,UAAO,CAAC,GAAG,KAAK,OAAO;;;;;EAMzB,IAAI,QAAgB,MAA2C;AAC7D,UAAO,KAAK,SAAS,IAAI,GAAG,OAAO,GAAG,OAAO;;;;;EAM/C,IAAI,QAAgB,MAAuB;AACzC,UAAO,KAAK,SAAS,IAAI,GAAG,OAAO,GAAG,OAAO;;;;;EAM/C,cAAc,UAA+B;AAC3C,UAAO,KAAK,YAAY,IAAI,SAAS,IAAI,EAAE;;;;;EAM7C,gBAA0B;AACxB,UAAO,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC,CAAC,MAAM;;;;;;;;;;;EAYnD,OAAyB,OAA8C;AACrE,UAAO,KAAK,OAAO,QAAQ,MAAM,SAAS,KAAK,EAAE,WAAW,OAAU;;;;;;;;;;;EAYxE,SAAS,WAAuD;AAC9D,UAAO,KAAK,OAAO,OAAO,UAAU;;;;;EAMtC,IAAI,OAAe;AACjB,UAAO,KAAK,OAAO;;;;;EAMrB,QAAQ,UAA2D;AACjE,QAAK,OAAO,QAAQ,SAAS;;;;;EAM/B,IAAO,UAAuD;AAC5D,UAAO,KAAK,OAAO,IAAI,SAAS;;;CAoChC,iBAAuC"}
@@ -0,0 +1,176 @@
1
+ import { a as Method, n as FlattenedRoute } from "./types-Cb7_2VSt.mjs";
2
+
3
+ //#region src/utils/route-registry.d.ts
4
+
5
+ /**
6
+ * 路由元信息(不含 handler 和 middleware)
7
+ */
8
+ interface RouteMeta {
9
+ method: Method;
10
+ path: string;
11
+ fullPath: string;
12
+ name?: string;
13
+ description?: string;
14
+ /** 扩展字段 */
15
+ [key: string]: unknown;
16
+ }
17
+ /**
18
+ * 路由注册表
19
+ *
20
+ * 泛型 T 用于定义扩展字段的类型
21
+ */
22
+ declare class RouteRegistry<T extends Record<string, unknown> = Record<string, unknown>> {
23
+ /** 所有路由元信息 */
24
+ private routes;
25
+ /** 路由映射表:METHOD:fullPath -> RouteMeta */
26
+ private routeMap;
27
+ /** 分类映射表:category -> RouteMeta[] */
28
+ private categoryMap;
29
+ constructor(routes: FlattenedRoute[]);
30
+ /**
31
+ * 构建注册表
32
+ */
33
+ private buildRegistry;
34
+ /**
35
+ * 提取分类(第一段路径)
36
+ */
37
+ private extractCategory;
38
+ /**
39
+ * 获取所有路由元信息
40
+ */
41
+ getAll(): RouteMeta[];
42
+ /**
43
+ * 按 method + path 查询路由
44
+ */
45
+ get(method: string, path: string): (RouteMeta & T) | undefined;
46
+ /**
47
+ * 检查路由是否存在
48
+ */
49
+ has(method: string, path: string): boolean;
50
+ /**
51
+ * 按分类获取路由
52
+ */
53
+ getByCategory(category: string): RouteMeta[];
54
+ /**
55
+ * 获取所有分类
56
+ */
57
+ getCategories(): string[];
58
+ /**
59
+ * 筛选有特定字段的路由
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * // 获取所有配置了 webhook 的路由
64
+ * const webhookRoutes = registry.filter('webhook')
65
+ * ```
66
+ */
67
+ filter<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[];
68
+ /**
69
+ * 按条件筛选路由
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * // 获取所有 POST 请求
74
+ * const postRoutes = registry.filterBy(r => r.method === 'POST')
75
+ * ```
76
+ */
77
+ filterBy(predicate: (route: RouteMeta) => boolean): RouteMeta[];
78
+ /**
79
+ * 获取路由数量
80
+ */
81
+ get size(): number;
82
+ /**
83
+ * 遍历所有路由
84
+ */
85
+ forEach(callback: (route: RouteMeta, index: number) => void): void;
86
+ /**
87
+ * 映射所有路由
88
+ */
89
+ map<R>(callback: (route: RouteMeta, index: number) => R): R[];
90
+ }
91
+ /**
92
+ * 创建路由注册表
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * // 定义扩展字段类型
97
+ * interface MyRouteMeta {
98
+ * webhook?: { eventKey: string }
99
+ * permission?: string
100
+ * }
101
+ *
102
+ * // 创建带类型的注册表
103
+ * const registry = createRouteRegistry<MyRouteMeta>(server.getRoutes())
104
+ *
105
+ * // 类型安全的查询
106
+ * const route = registry.get('POST', '/auth/signIn')
107
+ * if (route?.webhook) {
108
+ * console.log(route.webhook.eventKey)
109
+ * }
110
+ * ```
111
+ */
112
+ declare function createRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(routes: FlattenedRoute[]): RouteRegistry<T>;
113
+ /**
114
+ * 设置全局 registry(框架内部使用)
115
+ * @internal
116
+ */
117
+ declare function setGlobalRegistry(registry: RouteRegistry): void;
118
+ /**
119
+ * 获取全局路由注册表
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * // 在任意文件中
124
+ * import { getRouteRegistry } from 'vafast'
125
+ *
126
+ * const registry = getRouteRegistry()
127
+ * const webhookRoutes = registry.filter('webhook')
128
+ * ```
129
+ *
130
+ * @throws 如果 Server 尚未创建
131
+ */
132
+ declare function getRouteRegistry<T extends Record<string, unknown> = Record<string, unknown>>(): RouteRegistry<T>;
133
+ /**
134
+ * 按 method + path 获取单个路由
135
+ *
136
+ * 便捷函数,无需先获取 registry
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * // 在中间件或接口中
141
+ * import { getRoute } from 'vafast'
142
+ *
143
+ * const route = getRoute('POST', '/auth/signIn')
144
+ * if (route?.webhook) {
145
+ * console.log('This route has webhook:', route.webhook)
146
+ * }
147
+ * ```
148
+ */
149
+ declare function getRoute<T extends Record<string, unknown> = Record<string, unknown>>(method: string, path: string): (RouteMeta & T) | undefined;
150
+ /**
151
+ * 获取所有路由
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * import { getAllRoutes } from 'vafast'
156
+ *
157
+ * const routes = getAllRoutes()
158
+ * console.log(`Total ${routes.length} routes`)
159
+ * ```
160
+ */
161
+ declare function getAllRoutes(): RouteMeta[];
162
+ /**
163
+ * 筛选有特定字段的路由
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * import { filterRoutes } from 'vafast'
168
+ *
169
+ * // 获取所有配置了 webhook 的路由
170
+ * const webhookRoutes = filterRoutes('webhook')
171
+ * ```
172
+ */
173
+ declare function filterRoutes<K extends string>(field: K): (RouteMeta & Record<K, unknown>)[];
174
+ //#endregion
175
+ export { getAllRoutes as a, setGlobalRegistry as c, filterRoutes as i, RouteRegistry as n, getRoute as o, createRouteRegistry as r, getRouteRegistry as s, RouteMeta as t };
176
+ //# sourceMappingURL=route-registry-ykzRmaHB.d.mts.map
@@ -0,0 +1,5 @@
1
+ import "../schema-CVuttFSw.mjs";
2
+ import "../index-DXJd7-2Z.mjs";
3
+ import { flattenNestedRoutes, normalizePath } from "../router.mjs";
4
+ import { RadixRouter } from "./radix-tree.mjs";
5
+ export { RadixRouter, flattenNestedRoutes, normalizePath };
@@ -0,0 +1,10 @@
1
+ import { n as init_router, r as normalizePath, t as flattenNestedRoutes } from "../router-BOeVQrjz.mjs";
2
+ import { n as init_radix_tree, t as RadixRouter } from "../radix-tree-BWmhTLhT.mjs";
3
+
4
+ //#region src/router/index.ts
5
+ init_radix_tree();
6
+ init_router();
7
+
8
+ //#endregion
9
+ export { RadixRouter, flattenNestedRoutes, normalizePath };
10
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/router/index.ts"],"sourcesContent":["/**\n * 路由模块导出\n */\n\n// Radix Tree 路由器\nexport { RadixRouter } from \"./radix-tree\";\n\n// 路由工具函数\nexport { flattenNestedRoutes, normalizePath } from \"../router\";\n"],"mappings":";;;;iBAK2C;aAGoB"}
@@ -0,0 +1,60 @@
1
+ import { a as Method, o as Middleware, r as Handler } from "../types-Cb7_2VSt.mjs";
2
+ import "../schema-CVuttFSw.mjs";
3
+ import "../index-DXJd7-2Z.mjs";
4
+
5
+ //#region src/router/radix-tree.d.ts
6
+
7
+ /** 预编译的处理器类型 */
8
+ type CompiledHandler = (req: Request) => Promise<Response>;
9
+ /** 路由匹配结果 */
10
+ interface MatchResult {
11
+ handler: Handler;
12
+ middleware: Middleware[];
13
+ params: Record<string, string>;
14
+ /** 预编译后的完整处理链 */
15
+ compiled?: CompiledHandler;
16
+ }
17
+ /**
18
+ * Radix Tree 路由器
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const router = new RadixRouter();
23
+ * router.register("GET", "/users/:id", handler);
24
+ * const result = router.match("GET", "/users/123");
25
+ * // result.params = { id: "123" }
26
+ * ```
27
+ */
28
+ declare class RadixRouter {
29
+ private root;
30
+ constructor();
31
+ private createNode;
32
+ /** 分割路径 */
33
+ private splitPath;
34
+ /** 编译器函数 - 用于预编译中间件链 */
35
+ private compiler?;
36
+ /** 设置中间件编译器 */
37
+ setCompiler(compiler: (middleware: Middleware[], handler: Handler) => CompiledHandler): void;
38
+ /** 注册路由 */
39
+ register(method: Method, pattern: string, handler: Handler, middleware?: Middleware[]): void;
40
+ /** 预编译所有路由(在添加全局中间件后调用) */
41
+ precompileAll(globalMiddleware: Middleware[]): void;
42
+ private precompileNode;
43
+ /** 匹配路由 */
44
+ match(method: Method, path: string): MatchResult | null;
45
+ /** 递归匹配节点 (优先级: 静态 > 动态参数 > 通配符) */
46
+ private matchNode;
47
+ /** 获取路径允许的 HTTP 方法 */
48
+ getAllowedMethods(path: string): Method[];
49
+ /** 查找节点(不提取参数) */
50
+ private findNode;
51
+ /** 获取所有已注册的路由 */
52
+ getRoutes(): Array<{
53
+ method: Method;
54
+ path: string;
55
+ }>;
56
+ private collectRoutes;
57
+ }
58
+ //#endregion
59
+ export { MatchResult, RadixRouter };
60
+ //# sourceMappingURL=radix-tree.d.mts.map
@@ -0,0 +1,4 @@
1
+ import { n as init_radix_tree, t as RadixRouter } from "../radix-tree-BWmhTLhT.mjs";
2
+
3
+ init_radix_tree();
4
+ export { RadixRouter };
@@ -0,0 +1,71 @@
1
+ import { t as __esmMin } from "./chunk-67U6L5Jh.mjs";
2
+
3
+ //#region src/router.ts
4
+ /**
5
+ * 扁平化嵌套路由
6
+ *
7
+ * 将嵌套路由结构转换为扁平数组,计算完整路径和中间件链
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const routes = flattenNestedRoutes([
12
+ * {
13
+ * path: "/api",
14
+ * middleware: [authMiddleware],
15
+ * children: [
16
+ * { path: "/users", method: "GET", handler: getUsers },
17
+ * { path: "/users/:id", method: "GET", handler: getUser },
18
+ * ],
19
+ * },
20
+ * ]);
21
+ * // 结果:
22
+ * // [
23
+ * // { fullPath: "/api/users", method: "GET", ... },
24
+ * // { fullPath: "/api/users/:id", method: "GET", ... },
25
+ * // ]
26
+ * ```
27
+ */
28
+ function flattenNestedRoutes(routes) {
29
+ const flattened = [];
30
+ function processRoute(route, parentPath = "", parentMiddleware = [], parentName) {
31
+ const currentPath = normalizePath(parentPath + route.path);
32
+ const currentMiddleware = [...parentMiddleware, ...route.middleware || []];
33
+ const currentName = route.name || parentName;
34
+ if ("method" in route && "handler" in route) {
35
+ const leafRoute = route;
36
+ flattened.push({
37
+ ...leafRoute,
38
+ fullPath: currentPath,
39
+ middlewareChain: currentMiddleware,
40
+ parentName
41
+ });
42
+ } else if ("children" in route && route.children) for (const child of route.children) processRoute(child, currentPath, currentMiddleware, currentName);
43
+ }
44
+ for (const route of routes) processRoute(route);
45
+ return flattened;
46
+ }
47
+ /**
48
+ * 标准化路径
49
+ *
50
+ * - 解码 URL 编码字符
51
+ * - 去除重复斜杠
52
+ * - 处理结尾斜杠
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * normalizePath("//api//users/") // "/api/users"
57
+ * normalizePath("/api/%20test") // "/api/ test"
58
+ * ```
59
+ */
60
+ function normalizePath(path) {
61
+ let normalized = decodeURIComponent(path);
62
+ normalized = normalized.replace(/\/+/g, "/");
63
+ if (normalized === "") return "/";
64
+ if (normalized !== "/" && normalized.endsWith("/")) normalized = normalized.slice(0, -1);
65
+ return normalized;
66
+ }
67
+ var init_router = __esmMin((() => {}));
68
+
69
+ //#endregion
70
+ export { init_router as n, normalizePath as r, flattenNestedRoutes as t };
71
+ //# sourceMappingURL=router-BOeVQrjz.mjs.map