vafast 0.4.24 → 0.5.2

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 (165) hide show
  1. package/README.md +165 -2
  2. package/dist/{base-server-B7MYJNsl.mjs → base-server-CE0mfqPY.mjs} +11 -23
  3. package/dist/base-server-CE0mfqPY.mjs.map +1 -0
  4. package/dist/{base-server-DLxtulAO.d.mts → base-server-Contwrlf.d.mts} +5 -6
  5. package/dist/{base64url-C2zopQdH.mjs → base64url-Cc77f1ms.mjs} +1 -1
  6. package/dist/{base64url-C2zopQdH.mjs.map → base64url-Cc77f1ms.mjs.map} +1 -1
  7. package/dist/{base64url-Dwi2Afhc.d.mts → base64url-DNUGwekK.d.mts} +1 -1
  8. package/dist/{component-route-nrrO0iSI.d.mts → component-route-Di7R40-2.d.mts} +2 -2
  9. package/dist/{component-router-RwPL20vN.mjs → component-router-B6M5XDnp.mjs} +1 -1
  10. package/dist/{component-router-RwPL20vN.mjs.map → component-router-B6M5XDnp.mjs.map} +1 -1
  11. package/dist/{component-server-DomPJ_7S.mjs → component-server-Cya46YN3.mjs} +7 -7
  12. package/dist/component-server-Cya46YN3.mjs.map +1 -0
  13. package/dist/{component-server-JqpDC7wy.d.mts → component-server-fR4UV6Jq.d.mts} +4 -4
  14. package/dist/contract-BKqc9fFH.mjs +114 -0
  15. package/dist/contract-BKqc9fFH.mjs.map +1 -0
  16. package/dist/contract-BL3JflJ7.d.mts +71 -0
  17. package/dist/defineRoute-zjOfHyZA.d.mts +208 -0
  18. package/dist/defineRoute.d.mts +2 -60
  19. package/dist/defineRoute.mjs +160 -25
  20. package/dist/defineRoute.mjs.map +1 -1
  21. package/dist/{dependency-manager-DCmh7xFc.mjs → dependency-manager-CGMZJTer.mjs} +1 -1
  22. package/dist/{dependency-manager-DCmh7xFc.mjs.map → dependency-manager-CGMZJTer.mjs.map} +1 -1
  23. package/dist/{dependency-manager-C3_7ic4h.d.mts → dependency-manager-DIN9X0Gj.d.mts} +1 -1
  24. package/dist/{formats-Dk-DSBY4.d.mts → formats-DDDSFWP0.d.mts} +1 -1
  25. package/dist/{go-await-C4ZdEUwY.mjs → go-await-B1U27PgB.mjs} +1 -1
  26. package/dist/{go-await-C4ZdEUwY.mjs.map → go-await-B1U27PgB.mjs.map} +1 -1
  27. package/dist/{go-await-DL1A_-4X.d.mts → go-await-DPtVBug4.d.mts} +1 -1
  28. package/dist/{html-renderer-DTtJ_Yic.mjs → html-renderer-D1zzDVQM.mjs} +1 -1
  29. package/dist/{html-renderer-DTtJ_Yic.mjs.map → html-renderer-D1zzDVQM.mjs.map} +1 -1
  30. package/dist/{html-renderer-CfKK2BrP.d.mts → html-renderer-DhQxRuyi.d.mts} +1 -1
  31. package/dist/{index-Bj3SWrMU.d.mts → index-B8iPRxj1.d.mts} +6 -6
  32. package/dist/index.d.mts +22 -27
  33. package/dist/index.mjs +19 -22
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/middleware/component-router.d.mts +1 -1
  36. package/dist/middleware/component-router.mjs +1 -1
  37. package/dist/{middleware-KXEoefLX.d.mts → middleware-BR-R4p0M.d.mts} +2 -2
  38. package/dist/middleware.d.mts +1 -3
  39. package/dist/middleware.mjs +1 -1
  40. package/dist/monitoring/index.d.mts +3 -6
  41. package/dist/monitoring/native-monitor.d.mts +3 -6
  42. package/dist/node-server/index.d.mts +1 -1
  43. package/dist/node-server/index.mjs +3 -3
  44. package/dist/node-server/request.mjs +1 -1
  45. package/dist/node-server/response.mjs +1 -1
  46. package/dist/node-server/serve.d.mts +1 -1
  47. package/dist/node-server/serve.mjs +2 -2
  48. package/dist/{parsers-BerGr2_q.d.mts → parsers-8hIAx0OV.d.mts} +1 -1
  49. package/dist/{parsers-DpH_mD0H.mjs → parsers-BrG_mRLq.mjs} +1 -1
  50. package/dist/{parsers-DpH_mD0H.mjs.map → parsers-BrG_mRLq.mjs.map} +1 -1
  51. package/dist/{path-matcher-CGczAIl_.mjs → path-matcher-Dp-DRUV9.mjs} +1 -1
  52. package/dist/{path-matcher-CGczAIl_.mjs.map → path-matcher-Dp-DRUV9.mjs.map} +1 -1
  53. package/dist/{radix-tree-qqSjnVXF.mjs → radix-tree-CccjvyTP.mjs} +1 -1
  54. package/dist/{radix-tree-qqSjnVXF.mjs.map → radix-tree-CccjvyTP.mjs.map} +1 -1
  55. package/dist/{request-B-Nct5f7.mjs → request-CppAFyqX.mjs} +1 -1
  56. package/dist/{request-B-Nct5f7.mjs.map → request-CppAFyqX.mjs.map} +1 -1
  57. package/dist/{response-BMfdEcTm.d.mts → response-BNLzz4Tq.d.mts} +2 -2
  58. package/dist/{middleware-CewKbtb4.mjs → response-CQ1IgWei.mjs} +55 -55
  59. package/dist/response-CQ1IgWei.mjs.map +1 -0
  60. package/dist/{response-BnkYA4pj.mjs → response-DNdvtn-K.mjs} +1 -1
  61. package/dist/{response-BnkYA4pj.mjs.map → response-DNdvtn-K.mjs.map} +1 -1
  62. package/dist/{route-registry-CmABJA2V.d.mts → route-registry-BQKQ0qZp.d.mts} +21 -7
  63. package/dist/{route-registry-emTmRrWQ.mjs → route-registry-BzExlM2t.mjs} +23 -9
  64. package/dist/route-registry-BzExlM2t.mjs.map +1 -0
  65. package/dist/router/index.d.mts +2 -4
  66. package/dist/router/index.mjs +3 -3
  67. package/dist/router/radix-tree.d.mts +1 -3
  68. package/dist/router/radix-tree.mjs +1 -1
  69. package/dist/router.d.mts +4 -7
  70. package/dist/router.mjs +27 -2
  71. package/dist/router.mjs.map +1 -0
  72. package/dist/{serve-48LEIkPa.mjs → serve-Df3HzwZM.mjs} +3 -3
  73. package/dist/{serve-48LEIkPa.mjs.map → serve-Df3HzwZM.mjs.map} +1 -1
  74. package/dist/{serve-AG80VaIr.d.mts → serve-DlzxgOhz.d.mts} +1 -1
  75. package/dist/serve.d.mts +1 -1
  76. package/dist/serve.mjs +2 -2
  77. package/dist/server/base-server.d.mts +1 -3
  78. package/dist/server/base-server.mjs +1 -1
  79. package/dist/server/component-server.d.mts +1 -4
  80. package/dist/server/component-server.mjs +2 -2
  81. package/dist/server/index.d.mts +5 -6
  82. package/dist/server/index.mjs +6 -6
  83. package/dist/server/server-factory.d.mts +3 -6
  84. package/dist/server/server-factory.mjs +5 -5
  85. package/dist/server/server.d.mts +2 -4
  86. package/dist/server/server.mjs +2 -2
  87. package/dist/{server-OUUug5DR.mjs → server-Bm0BGm01.mjs} +19 -30
  88. package/dist/server-Bm0BGm01.mjs.map +1 -0
  89. package/dist/{server-BUom6ISO.mjs → server-CZLmrJSk.mjs} +3 -3
  90. package/dist/server-CZLmrJSk.mjs.map +1 -0
  91. package/dist/server-CpKaM0Kq.d.mts +48 -0
  92. package/dist/{sse-CBl-szg1.mjs → sse-CWNz0ky7.mjs} +3 -4
  93. package/dist/sse-CWNz0ky7.mjs.map +1 -0
  94. package/dist/{sse-BgLhEo43.d.mts → sse-CsjEeJNP.d.mts} +2 -4
  95. package/dist/types/component-route.d.mts +1 -1
  96. package/dist/types/index.d.mts +3 -6
  97. package/dist/types/index.mjs +1 -3
  98. package/dist/types/types.d.mts +2 -2
  99. package/dist/types-B8Z3cMtZ.d.mts +12 -0
  100. package/dist/utils/base64url.d.mts +1 -1
  101. package/dist/utils/base64url.mjs +1 -1
  102. package/dist/utils/contract.d.mts +2 -0
  103. package/dist/utils/contract.mjs +3 -0
  104. package/dist/utils/dependency-manager.d.mts +1 -1
  105. package/dist/utils/dependency-manager.mjs +1 -1
  106. package/dist/utils/formats.d.mts +1 -1
  107. package/dist/utils/go-await.d.mts +1 -1
  108. package/dist/utils/go-await.mjs +1 -1
  109. package/dist/utils/handle.d.mts +13 -2
  110. package/dist/utils/handle.mjs +19 -3
  111. package/dist/utils/handle.mjs.map +1 -0
  112. package/dist/utils/html-renderer.d.mts +1 -1
  113. package/dist/utils/html-renderer.mjs +1 -1
  114. package/dist/utils/index.d.mts +13 -17
  115. package/dist/utils/index.mjs +11 -13
  116. package/dist/utils/parsers.d.mts +1 -1
  117. package/dist/utils/parsers.mjs +1 -1
  118. package/dist/utils/path-matcher.mjs +1 -1
  119. package/dist/utils/response.d.mts +1 -4
  120. package/dist/utils/response.mjs +1 -1
  121. package/dist/utils/route-registry.d.mts +3 -4
  122. package/dist/utils/route-registry.mjs +2 -2
  123. package/dist/utils/sse.d.mts +2 -2
  124. package/dist/utils/sse.mjs +3 -3
  125. package/dist/utils/validators/validators.d.mts +1 -1
  126. package/dist/utils/validators/validators.mjs +1 -1
  127. package/dist/{validators-Ch71zkT8.d.mts → validators-BFC6S_fr.d.mts} +1 -1
  128. package/dist/{validators-DBkyw6BG.mjs → validators-CkfvNBbK.mjs} +1 -1
  129. package/dist/{validators-DBkyw6BG.mjs.map → validators-CkfvNBbK.mjs.map} +1 -1
  130. package/package.json +1 -1
  131. package/dist/base-server-B7MYJNsl.mjs.map +0 -1
  132. package/dist/component-server-DomPJ_7S.mjs.map +0 -1
  133. package/dist/create-handler-DKw-sQOV.d.mts +0 -87
  134. package/dist/create-handler-RconAcAB.mjs +0 -165
  135. package/dist/create-handler-RconAcAB.mjs.map +0 -1
  136. package/dist/handle-BhR3oyky.d.mts +0 -15
  137. package/dist/handle-BxJwSvV0.mjs +0 -30
  138. package/dist/handle-BxJwSvV0.mjs.map +0 -1
  139. package/dist/middleware-CewKbtb4.mjs.map +0 -1
  140. package/dist/request-validator-Bz9X48FX.mjs +0 -77
  141. package/dist/request-validator-Bz9X48FX.mjs.map +0 -1
  142. package/dist/request-validator-Coo8dI-p.d.mts +0 -67
  143. package/dist/route-6A7umH7b.d.mts +0 -44
  144. package/dist/route-Ds53PR4M.mjs +0 -11
  145. package/dist/route-Ds53PR4M.mjs.map +0 -1
  146. package/dist/route-registry-emTmRrWQ.mjs.map +0 -1
  147. package/dist/router-CgYfGB4J.mjs +0 -98
  148. package/dist/router-CgYfGB4J.mjs.map +0 -1
  149. package/dist/schema-1fwiv7cm.mjs +0 -1
  150. package/dist/schema-B6DFN5c2.d.mts +0 -81
  151. package/dist/server-BUom6ISO.mjs.map +0 -1
  152. package/dist/server-C2RPKSvC.d.mts +0 -51
  153. package/dist/server-OUUug5DR.mjs.map +0 -1
  154. package/dist/sse-CBl-szg1.mjs.map +0 -1
  155. package/dist/types/route.d.mts +0 -2
  156. package/dist/types/route.mjs +0 -3
  157. package/dist/types/schema.d.mts +0 -2
  158. package/dist/types/schema.mjs +0 -1
  159. package/dist/types-D1PUFkda.d.mts +0 -45
  160. package/dist/utils/create-handler.d.mts +0 -3
  161. package/dist/utils/create-handler.mjs +0 -6
  162. package/dist/utils/request-validator.d.mts +0 -3
  163. package/dist/utils/request-validator.mjs +0 -5
  164. /package/dist/{component-route-DNgAj6VC.mjs → component-route-BiUHBq7a.mjs} +0 -0
  165. /package/dist/{index-CREkvfw9.d.mts → index-Dflz2i1X.d.mts} +0 -0
@@ -1,98 +0,0 @@
1
- //#region src/router.ts
2
- /**
3
- * 扁平化嵌套路由
4
- *
5
- * 将嵌套路由结构转换为扁平数组,计算完整路径和中间件链
6
- *
7
- * @example
8
- * ```typescript
9
- * const routes = flattenNestedRoutes([
10
- * {
11
- * path: "/api",
12
- * middleware: [authMiddleware],
13
- * children: [
14
- * { path: "/users", method: "GET", handler: getUsers },
15
- * { path: "/users/:id", method: "GET", handler: getUser },
16
- * ],
17
- * },
18
- * ]);
19
- * // 结果:
20
- * // [
21
- * // { fullPath: "/api/users", method: "GET", ... },
22
- * // { fullPath: "/api/users/:id", method: "GET", ... },
23
- * // ]
24
- * ```
25
- */
26
- /** 标准路由属性(不继承) */
27
- const STANDARD_ROUTE_PROPS = new Set([
28
- "path",
29
- "method",
30
- "handler",
31
- "middleware",
32
- "children",
33
- "name",
34
- "description"
35
- ]);
36
- /**
37
- * 提取路由的自定义属性(用于继承)
38
- * 排除标准属性,保留 log, webhook, auth 等自定义配置
39
- */
40
- function extractCustomProps(route) {
41
- const custom = {};
42
- for (const key of Object.keys(route)) if (!STANDARD_ROUTE_PROPS.has(key)) custom[key] = route[key];
43
- return custom;
44
- }
45
- /**
46
- * 合并自定义属性(子路由覆盖父路由)
47
- */
48
- function mergeCustomProps(parentProps, childProps) {
49
- return {
50
- ...parentProps,
51
- ...childProps
52
- };
53
- }
54
- function flattenNestedRoutes(routes) {
55
- const flattened = [];
56
- function processRoute(route, parentPath = "", parentMiddleware = [], parentName, parentCustomProps = {}) {
57
- const currentPath = normalizePath(parentPath + route.path);
58
- const currentMiddleware = [...parentMiddleware, ...route.middleware || []];
59
- const currentName = route.name || parentName;
60
- const currentCustomProps = mergeCustomProps(parentCustomProps, extractCustomProps(route));
61
- if ("method" in route && "handler" in route) {
62
- const leafRoute = route;
63
- flattened.push({
64
- ...currentCustomProps,
65
- ...leafRoute,
66
- fullPath: currentPath,
67
- middlewareChain: currentMiddleware,
68
- parentName
69
- });
70
- } else if ("children" in route && route.children) for (const child of route.children) processRoute(child, currentPath, currentMiddleware, currentName, currentCustomProps);
71
- }
72
- for (const route of routes) processRoute(route);
73
- return flattened;
74
- }
75
- /**
76
- * 标准化路径
77
- *
78
- * - 解码 URL 编码字符
79
- * - 去除重复斜杠
80
- * - 处理结尾斜杠
81
- *
82
- * @example
83
- * ```typescript
84
- * normalizePath("//api//users/") // "/api/users"
85
- * normalizePath("/api/%20test") // "/api/ test"
86
- * ```
87
- */
88
- function normalizePath(path) {
89
- let normalized = decodeURIComponent(path);
90
- normalized = normalized.replace(/\/+/g, "/");
91
- if (normalized === "") return "/";
92
- if (normalized !== "/" && normalized.endsWith("/")) normalized = normalized.slice(0, -1);
93
- return normalized;
94
- }
95
-
96
- //#endregion
97
- export { normalizePath as n, flattenNestedRoutes as t };
98
- //# sourceMappingURL=router-CgYfGB4J.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router-CgYfGB4J.mjs","names":[],"sources":["../src/router.ts"],"sourcesContent":["/**\n * 路由工具函数\n *\n * 提供路由处理的基础工具\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Middleware } from \"./types\";\n\n/**\n * 扁平化嵌套路由\n *\n * 将嵌套路由结构转换为扁平数组,计算完整路径和中间件链\n *\n * @example\n * ```typescript\n * const routes = flattenNestedRoutes([\n * {\n * path: \"/api\",\n * middleware: [authMiddleware],\n * children: [\n * { path: \"/users\", method: \"GET\", handler: getUsers },\n * { path: \"/users/:id\", method: \"GET\", handler: getUser },\n * ],\n * },\n * ]);\n * // 结果:\n * // [\n * // { fullPath: \"/api/users\", method: \"GET\", ... },\n * // { fullPath: \"/api/users/:id\", method: \"GET\", ... },\n * // ]\n * ```\n */\n/** 标准路由属性(不继承) */\nconst STANDARD_ROUTE_PROPS = new Set([\n 'path', 'method', 'handler', 'middleware', 'children', 'name', 'description',\n]);\n\n/**\n * 提取路由的自定义属性(用于继承)\n * 排除标准属性,保留 log, webhook, auth 等自定义配置\n */\nfunction extractCustomProps(route: Route | NestedRoute): Record<string, unknown> {\n const custom: Record<string, unknown> = {};\n for (const key of Object.keys(route)) {\n if (!STANDARD_ROUTE_PROPS.has(key)) {\n custom[key] = (route as Record<string, unknown>)[key];\n }\n }\n return custom;\n}\n\n/**\n * 合并自定义属性(子路由覆盖父路由)\n */\nfunction mergeCustomProps(\n parentProps: Record<string, unknown>,\n childProps: Record<string, unknown>,\n): Record<string, unknown> {\n return { ...parentProps, ...childProps };\n}\n\nexport function flattenNestedRoutes(\n routes: (Route | NestedRoute)[],\n): FlattenedRoute[] {\n const flattened: FlattenedRoute[] = [];\n\n function processRoute(\n route: Route | NestedRoute,\n parentPath = \"\",\n parentMiddleware: Middleware[] = [],\n parentName?: string,\n parentCustomProps: Record<string, unknown> = {},\n ): void {\n // 计算当前完整路径\n const currentPath = normalizePath(parentPath + route.path);\n // 合并中间件链\n const currentMiddleware = [\n ...parentMiddleware,\n ...(route.middleware || []),\n ];\n // 当前路由的 name(用于传递给子路由)\n const currentName = route.name || parentName;\n // 合并自定义属性(子路由可覆盖父路由设置)\n const currentCustomProps = mergeCustomProps(parentCustomProps, extractCustomProps(route));\n\n if (\"method\" in route && \"handler\" in route) {\n // 叶子路由(有处理函数)\n const leafRoute = route as Route;\n flattened.push({\n ...currentCustomProps, // 继承的自定义属性放在前面\n ...leafRoute, // 叶子路由自身属性覆盖\n fullPath: currentPath,\n middlewareChain: currentMiddleware,\n parentName: parentName,\n });\n } else if (\"children\" in route && route.children) {\n // 分组路由,递归处理子路由\n for (const child of route.children) {\n processRoute(child, currentPath, currentMiddleware, currentName, currentCustomProps);\n }\n }\n }\n\n for (const route of routes) {\n processRoute(route);\n }\n\n return flattened;\n}\n\n/**\n * 标准化路径\n *\n * - 解码 URL 编码字符\n * - 去除重复斜杠\n * - 处理结尾斜杠\n *\n * @example\n * ```typescript\n * normalizePath(\"//api//users/\") // \"/api/users\"\n * normalizePath(\"/api/%20test\") // \"/api/ test\"\n * ```\n */\nexport function normalizePath(path: string): string {\n // 解码 URL 编码\n let normalized = decodeURIComponent(path);\n\n // 去除重复斜杠\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // 空路径转为根路径\n if (normalized === \"\") return \"/\";\n\n // 去除结尾斜杠(根路径除外)\n if (normalized !== \"/\" && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,MAAM,uBAAuB,IAAI,IAAI;CACnC;CAAQ;CAAU;CAAW;CAAc;CAAY;CAAQ;CAChE,CAAC;;;;;AAMF,SAAS,mBAAmB,OAAqD;CAC/E,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,OAAO,OAAO,KAAK,MAAM,CAClC,KAAI,CAAC,qBAAqB,IAAI,IAAI,CAChC,QAAO,OAAQ,MAAkC;AAGrD,QAAO;;;;;AAMT,SAAS,iBACP,aACA,YACyB;AACzB,QAAO;EAAE,GAAG;EAAa,GAAG;EAAY;;AAG1C,SAAgB,oBACd,QACkB;CAClB,MAAM,YAA8B,EAAE;CAEtC,SAAS,aACP,OACA,aAAa,IACb,mBAAiC,EAAE,EACnC,YACA,oBAA6C,EAAE,EACzC;EAEN,MAAM,cAAc,cAAc,aAAa,MAAM,KAAK;EAE1D,MAAM,oBAAoB,CACxB,GAAG,kBACH,GAAI,MAAM,cAAc,EAAE,CAC3B;EAED,MAAM,cAAc,MAAM,QAAQ;EAElC,MAAM,qBAAqB,iBAAiB,mBAAmB,mBAAmB,MAAM,CAAC;AAEzF,MAAI,YAAY,SAAS,aAAa,OAAO;GAE3C,MAAM,YAAY;AAClB,aAAU,KAAK;IACb,GAAG;IACH,GAAG;IACH,UAAU;IACV,iBAAiB;IACL;IACb,CAAC;aACO,cAAc,SAAS,MAAM,SAEtC,MAAK,MAAM,SAAS,MAAM,SACxB,cAAa,OAAO,aAAa,mBAAmB,aAAa,mBAAmB;;AAK1F,MAAK,MAAM,SAAS,OAClB,cAAa,MAAM;AAGrB,QAAO;;;;;;;;;;;;;;;AAgBT,SAAgB,cAAc,MAAsB;CAElD,IAAI,aAAa,mBAAmB,KAAK;AAGzC,cAAa,WAAW,QAAQ,QAAQ,IAAI;AAG5C,KAAI,eAAe,GAAI,QAAO;AAG9B,KAAI,eAAe,OAAO,WAAW,SAAS,IAAI,CAChD,cAAa,WAAW,MAAM,GAAG,GAAG;AAGtC,QAAO"}
@@ -1 +0,0 @@
1
- export { };
@@ -1,81 +0,0 @@
1
- import { Static, TSchema } from "@sinclair/typebox";
2
-
3
- //#region src/types/schema.d.ts
4
- /**
5
- * Schema 类型定义
6
- *
7
- * 使用 TSchema 约束替代 any,提供完整的类型安全
8
- *
9
- * @author Framework Team
10
- * @version 1.0.0
11
- * @license MIT
12
- */
13
-
14
- /**
15
- * 路由 Schema 配置
16
- * 所有 schema 字段使用 TSchema 约束
17
- */
18
- interface RouteSchema {
19
- body?: TSchema;
20
- query?: TSchema;
21
- params?: TSchema;
22
- headers?: TSchema;
23
- cookies?: TSchema;
24
- }
25
- /**
26
- * 从 Schema 配置推导出具体类型
27
- */
28
- type InferSchema<T extends RouteSchema> = {
29
- body: T["body"] extends TSchema ? Static<T["body"]> : unknown;
30
- query: T["query"] extends TSchema ? Static<T["query"]> : Record<string, string>;
31
- params: T["params"] extends TSchema ? Static<T["params"]> : Record<string, string>;
32
- headers: T["headers"] extends TSchema ? Static<T["headers"]> : Record<string, string>;
33
- cookies: T["cookies"] extends TSchema ? Static<T["cookies"]> : Record<string, string>;
34
- };
35
- /**
36
- * Handler 上下文类型
37
- */
38
- interface HandlerContext<T extends RouteSchema = RouteSchema> {
39
- /** 原始请求对象 */
40
- req: Request;
41
- /** 请求体 (经过 schema 验证) */
42
- body: InferSchema<T>["body"];
43
- /** 查询参数 (经过 schema 验证) */
44
- query: InferSchema<T>["query"];
45
- /** 路径参数 (经过 schema 验证) */
46
- params: InferSchema<T>["params"];
47
- /** 请求头 (经过 schema 验证) */
48
- headers: InferSchema<T>["headers"];
49
- /** Cookie (经过 schema 验证) */
50
- cookies: InferSchema<T>["cookies"];
51
- }
52
- /**
53
- * 带额外上下文的 Handler 上下文类型
54
- * 用于中间件注入额外数据
55
- */
56
- type HandlerContextWithExtra<T extends RouteSchema = RouteSchema, TExtra extends Record<string, unknown> = Record<string, never>> = HandlerContext<T> & TExtra;
57
- /**
58
- * Handler 函数类型
59
- */
60
- type TypedHandler<T extends RouteSchema = RouteSchema, TExtra extends Record<string, unknown> = Record<string, never>, TReturn = unknown> = (ctx: HandlerContextWithExtra<T, TExtra>) => TReturn | Promise<TReturn>;
61
- /**
62
- * 扩展的路由配置 (包含 schema)
63
- */
64
- interface TypedRouteConfig<T extends RouteSchema = RouteSchema> {
65
- method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD";
66
- path: string;
67
- schema?: T;
68
- handler: (req: Request) => Response | Promise<Response>;
69
- middleware?: Array<(req: Request, next: () => Promise<Response>) => Promise<Response>>;
70
- docs?: {
71
- description?: string;
72
- tags?: string[];
73
- security?: unknown[];
74
- responses?: Record<string, unknown>;
75
- };
76
- timeout?: number;
77
- maxBodySize?: string;
78
- }
79
- //#endregion
80
- export { TypedHandler as a, RouteSchema as i, HandlerContextWithExtra as n, TypedRouteConfig as o, InferSchema as r, HandlerContext as t };
81
- //# sourceMappingURL=schema-B6DFN5c2.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-BUom6ISO.mjs","names":[],"sources":["../src/server/server-factory.ts"],"sourcesContent":["import type { Route, NestedRoute } from \"../types\";\nimport type {\n ComponentRoute,\n NestedComponentRoute,\n} from \"../types/component-route\";\nimport { Server } from \"../server\";\nimport { ComponentServer } from \"./component-server\";\n\n/**\n * 服务器工厂类\n * 用于创建和管理不同类型的服务器\n */\nexport class ServerFactory {\n private servers: Map<string, Server | ComponentServer> = new Map();\n\n /**\n * 创建标准REST API服务器\n */\n createRestServer(routes: (Route | NestedRoute)[]): Server {\n const server = new Server(routes);\n this.servers.set(\"rest\", server);\n return server;\n }\n\n /**\n * 创建组件服务器\n */\n createComponentServer(\n routes: (ComponentRoute | NestedComponentRoute)[],\n ): ComponentServer {\n const server = new ComponentServer(routes);\n this.servers.set(\"component\", server);\n return server;\n }\n\n /**\n * 获取指定类型的服务器\n */\n getServer(type: \"rest\" | \"component\"): Server | ComponentServer | undefined {\n return this.servers.get(type);\n }\n\n /**\n * 获取所有服务器\n */\n getAllServers(): Map<string, Server | ComponentServer> {\n return this.servers;\n }\n\n /**\n * 移除指定类型的服务器\n */\n removeServer(type: string): boolean {\n return this.servers.delete(type);\n }\n\n /**\n * 清除所有服务器\n */\n clearServers(): void {\n this.servers.clear();\n }\n\n /**\n * 获取服务器状态信息\n */\n getServerStatus(): Record<string, { type: string; routes: number }> {\n const status: Record<string, { type: string; routes: number }> = {};\n\n for (const [name, server] of this.servers) {\n if (server instanceof Server) {\n status[name] = {\n type: \"REST API\",\n routes: (server as any).routes?.length || 0,\n };\n } else if (server instanceof ComponentServer) {\n status[name] = {\n type: \"Component\",\n routes: (server as any).routes?.length || 0,\n };\n }\n }\n\n return status;\n }\n}\n"],"mappings":";;;;;;;;AAYA,IAAa,gBAAb,MAA2B;CACzB,AAAQ,0BAAiD,IAAI,KAAK;;;;CAKlE,iBAAiB,QAAyC;EACxD,MAAM,SAAS,IAAI,OAAO,OAAO;AACjC,OAAK,QAAQ,IAAI,QAAQ,OAAO;AAChC,SAAO;;;;;CAMT,sBACE,QACiB;EACjB,MAAM,SAAS,IAAI,gBAAgB,OAAO;AAC1C,OAAK,QAAQ,IAAI,aAAa,OAAO;AACrC,SAAO;;;;;CAMT,UAAU,MAAkE;AAC1E,SAAO,KAAK,QAAQ,IAAI,KAAK;;;;;CAM/B,gBAAuD;AACrD,SAAO,KAAK;;;;;CAMd,aAAa,MAAuB;AAClC,SAAO,KAAK,QAAQ,OAAO,KAAK;;;;;CAMlC,eAAqB;AACnB,OAAK,QAAQ,OAAO;;;;;CAMtB,kBAAoE;EAClE,MAAM,SAA2D,EAAE;AAEnE,OAAK,MAAM,CAAC,MAAM,WAAW,KAAK,QAChC,KAAI,kBAAkB,OACpB,QAAO,QAAQ;GACb,MAAM;GACN,QAAS,OAAe,QAAQ,UAAU;GAC3C;WACQ,kBAAkB,gBAC3B,QAAO,QAAQ;GACb,MAAM;GACN,QAAS,OAAe,QAAQ,UAAU;GAC3C;AAIL,SAAO"}
@@ -1,51 +0,0 @@
1
- import { a as Method, l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-D1PUFkda.mjs";
2
- import { t as BaseServer } from "./base-server-DLxtulAO.mjs";
3
-
4
- //#region src/server/server.d.ts
5
-
6
- /**
7
- * Vafast 服务器
8
- *
9
- * @example
10
- * ```typescript
11
- * const server = new Server([
12
- * { method: "GET", path: "/", handler: () => new Response("Hello") },
13
- * ]);
14
- * export default { fetch: server.fetch };
15
- * ```
16
- */
17
- declare class Server extends BaseServer {
18
- private router;
19
- private routes;
20
- constructor(routes?: readonly (Route | NestedRoute)[]);
21
- private registerRoutes;
22
- /** 快速提取 pathname */
23
- private extractPathname;
24
- /** 生成 404/405 响应 */
25
- private createErrorResponse;
26
- /** 处理请求 */
27
- fetch: (req: Request) => Promise<Response>;
28
- addRoute(route: Route): void;
29
- addRoutes(routes: readonly (Route | NestedRoute)[]): void;
30
- getRoutes(): Array<{
31
- method: Method;
32
- path: string;
33
- }>;
34
- /**
35
- * 获取完整的路由元信息(不含 handler 和 middleware)
36
- *
37
- * 用于 API 文档生成、Webhook 事件注册、权限检查等场景
38
- *
39
- * @example
40
- * ```typescript
41
- * const routes = server.getRoutesWithMeta()
42
- * for (const route of routes) {
43
- * console.log(route.fullPath, route.name, route.description)
44
- * }
45
- * ```
46
- */
47
- getRoutesWithMeta(): FlattenedRoute[];
48
- }
49
- //#endregion
50
- export { Server as t };
51
- //# sourceMappingURL=server-C2RPKSvC.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-OUUug5DR.mjs","names":[],"sources":["../src/server/server.ts"],"sourcesContent":["/**\n * Vafast 核心服务器\n *\n * 基于 Radix Tree 的高性能路由匹配\n * 时间复杂度: O(k),k 为路径段数\n */\n\nimport type { Route, NestedRoute, FlattenedRoute, Method } from \"../types\";\nimport { flattenNestedRoutes } from \"../router\";\nimport { composeMiddleware } from \"../middleware\";\nimport { json } from \"../utils/response\";\nimport { BaseServer } from \"./base-server\";\nimport { RadixRouter } from \"../router/radix-tree\";\nimport { RouteRegistry, setGlobalRegistry } from \"../utils/route-registry\";\n\n/**\n * Vafast 服务器\n *\n * @example\n * ```typescript\n * const server = new Server([\n * { method: \"GET\", path: \"/\", handler: () => new Response(\"Hello\") },\n * ]);\n * export default { fetch: server.fetch };\n * ```\n */\nexport class Server extends BaseServer {\n private router: RadixRouter;\n private routes: FlattenedRoute[];\n\n constructor(routes: readonly (Route | NestedRoute)[] = []) {\n super();\n this.router = new RadixRouter();\n this.routes = [];\n\n if (routes.length > 0) {\n this.registerRoutes([...routes]);\n }\n }\n\n private registerRoutes(routes: (Route | NestedRoute)[]): void {\n const flattened = flattenNestedRoutes(routes);\n this.routes.push(...flattened);\n\n for (const route of flattened) {\n this.router.register(\n route.method as Method,\n route.fullPath,\n route.handler,\n route.middlewareChain || [],\n );\n }\n\n this.detectRouteConflicts(flattened);\n this.logFlattenedRoutes(flattened);\n\n // 自动设置全局 RouteRegistry(支持在任意位置通过 getRouteRegistry() 访问)\n setGlobalRegistry(new RouteRegistry(this.routes));\n }\n\n /** 快速提取 pathname */\n private extractPathname(url: string): string {\n let start = url.indexOf(\"://\");\n start = start === -1 ? 0 : start + 3;\n\n const pathStart = url.indexOf(\"/\", start);\n if (pathStart === -1) return \"/\";\n\n let end = url.indexOf(\"?\", pathStart);\n if (end === -1) end = url.indexOf(\"#\", pathStart);\n if (end === -1) end = url.length;\n\n return url.substring(pathStart, end) || \"/\";\n }\n\n /** 生成 404/405 响应 */\n private createErrorResponse(method: string, pathname: string): Response {\n const allowedMethods = this.router.getAllowedMethods(pathname);\n if (allowedMethods.length > 0) {\n return json(\n {\n success: false,\n error: \"Method Not Allowed\",\n message: `Method ${method} not allowed for this endpoint`,\n allowedMethods,\n },\n 405,\n { Allow: allowedMethods.join(\", \") },\n );\n }\n return json({ success: false, error: \"Not Found\" }, 404);\n }\n\n /** 处理请求 */\n fetch = async (req: Request): Promise<Response> => {\n const pathname = this.extractPathname(req.url);\n const method = req.method as Method;\n\n const match = this.router.match(method, pathname);\n\n if (match) {\n (req as unknown as Record<string, unknown>).params = match.params;\n\n // 运行时组合中间件\n const allMiddleware = [...this.globalMiddleware, ...match.middleware];\n const handler = composeMiddleware(allMiddleware, match.handler);\n\n return handler(req);\n }\n\n // OPTIONS 预检请求特殊处理:查找同路径其他方法的路由,使用其中间件\n // 这允许路由级 CORS 中间件正常工作\n if (method === \"OPTIONS\") {\n const allowedMethods = this.router.getAllowedMethods(pathname);\n if (allowedMethods.length > 0) {\n // 尝试获取该路径任意方法的路由中间件\n const anyMatch = this.router.match(\n allowedMethods[0] as Method,\n pathname,\n );\n const routeMiddleware = anyMatch?.middleware || [];\n const allMiddleware = [...this.globalMiddleware, ...routeMiddleware];\n\n // OPTIONS 请求默认返回 204(中间件如 CORS 可能会提前响应)\n const optionsHandler = () =>\n new Response(null, {\n status: 204,\n headers: { Allow: allowedMethods.join(\", \") },\n });\n\n const handler = composeMiddleware(allMiddleware, optionsHandler);\n return handler(req);\n }\n }\n\n // 未匹配路由时,仍执行全局中间件(如 CORS 处理 OPTIONS 预检)\n if (this.globalMiddleware.length > 0) {\n const handler = composeMiddleware(this.globalMiddleware, () =>\n this.createErrorResponse(method, pathname),\n );\n return handler(req);\n }\n\n return this.createErrorResponse(method, pathname);\n };\n\n addRoute(route: Route): void {\n const flattenedRoute: FlattenedRoute = {\n ...route,\n fullPath: route.path,\n middlewareChain: route.middleware || [],\n };\n\n this.routes.push(flattenedRoute);\n this.router.register(\n route.method as Method,\n route.path,\n route.handler,\n route.middleware || [],\n );\n }\n\n addRoutes(routes: readonly (Route | NestedRoute)[]): void {\n this.registerRoutes([...routes]);\n }\n\n getRoutes(): Array<{ method: Method; path: string }> {\n return this.router.getRoutes();\n }\n\n /**\n * 获取完整的路由元信息(不含 handler 和 middleware)\n *\n * 用于 API 文档生成、Webhook 事件注册、权限检查等场景\n *\n * @example\n * ```typescript\n * const routes = server.getRoutesWithMeta()\n * for (const route of routes) {\n * console.log(route.fullPath, route.name, route.description)\n * }\n * ```\n */\n getRoutesWithMeta(): FlattenedRoute[] {\n return this.routes;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sse-CBl-szg1.mjs","names":[],"sources":["../src/utils/sse.ts"],"sourcesContent":["/**\n * Server-Sent Events (SSE) 支持\n *\n * 用于实现流式响应,如 AI 聊天、实时通知等\n *\n * @example\n * ```typescript\n * import { createSSEHandler, Type } from 'vafast'\n *\n * const streamHandler = createSSEHandler(\n * { query: Type.Object({ prompt: Type.String() }) },\n * async function* ({ query }) {\n * yield { event: 'start', data: { message: 'Starting...' } }\n *\n * for await (const chunk of aiStream(query.prompt)) {\n * yield { data: chunk }\n * }\n *\n * yield { event: 'end', data: { message: 'Done!' } }\n * }\n * )\n * ```\n */\n\nimport type { RouteSchema, HandlerContext } from \"../types/schema\";\nimport { parseQuery, parseHeaders, parseCookies } from \"./parsers\";\nimport { precompileSchemas, validateAllSchemas } from \"./validators/validators\";\n\n/**\n * SSE 事件类型\n */\nexport interface SSEEvent<T = unknown> {\n /** 事件名称(可选,默认为 message) */\n event?: string;\n /** 事件数据 */\n data: T;\n /** 事件 ID(可选) */\n id?: string;\n /** 重试间隔(毫秒,可选) */\n retry?: number;\n}\n\n/**\n * SSE 生成器函数类型\n */\nexport type SSEGenerator<T extends RouteSchema = RouteSchema> = (\n ctx: HandlerContext<T>\n) => AsyncGenerator<SSEEvent<unknown>, void, unknown>;\n\n/**\n * 格式化 SSE 事件为字符串\n */\nfunction formatSSEEvent(event: SSEEvent): string {\n const lines: string[] = [];\n\n if (event.id !== undefined) {\n lines.push(`id: ${event.id}`);\n }\n\n if (event.event !== undefined) {\n lines.push(`event: ${event.event}`);\n }\n\n if (event.retry !== undefined) {\n lines.push(`retry: ${event.retry}`);\n }\n\n // 数据可能是多行的,需要分行处理\n const dataStr = typeof event.data === 'string'\n ? event.data\n : JSON.stringify(event.data);\n\n const dataLines = dataStr.split('\\n');\n for (const line of dataLines) {\n lines.push(`data: ${line}`);\n }\n\n return lines.join('\\n') + '\\n\\n';\n}\n\n/**\n * SSE 标记类型 - 使用字面量品牌类型\n */\nexport type SSEMarker = { readonly __brand: 'SSE' }\n\n/**\n * SSE Handler 类型标记\n */\nexport interface SSEHandler<TSchema extends RouteSchema = RouteSchema> {\n (req: Request): Promise<Response>;\n /** 返回类型标记 - SSE 流的数据类型 */\n readonly __returnType: unknown;\n /** Schema 类型标记 */\n readonly __schema: TSchema;\n /** SSE 标记 - 使用品牌类型确保不被扩展 */\n readonly __sse: SSEMarker;\n}\n\n/**\n * 创建 SSE 流式响应处理器\n *\n * @example\n * ```typescript\n * // 基础用法\n * const streamChat = createSSEHandler(\n * { query: Type.Object({ message: Type.String() }) },\n * async function* ({ query }) {\n * const response = await ai.chat(query.message);\n *\n * for await (const chunk of response) {\n * yield { data: { text: chunk } };\n * }\n * }\n * );\n *\n * // 使用路由\n * route('GET', '/chat/stream', streamChat)\n * ```\n */\nexport function createSSEHandler<const T extends RouteSchema>(\n schema: T,\n generator: SSEGenerator<T>\n): SSEHandler<T>;\n\nexport function createSSEHandler(\n generator: SSEGenerator<RouteSchema>\n): SSEHandler<RouteSchema>;\n\nexport function createSSEHandler<const T extends RouteSchema>(\n schemaOrGenerator: T | SSEGenerator<T>,\n maybeGenerator?: SSEGenerator<T>\n): SSEHandler<T> {\n // 判断调用方式\n const hasSchema = typeof schemaOrGenerator !== 'function';\n const schema = hasSchema ? (schemaOrGenerator as T) : ({} as T);\n const generator = hasSchema\n ? maybeGenerator!\n : (schemaOrGenerator as SSEGenerator<T>);\n\n // 预编译 schema\n if (schema.body || schema.query || schema.params || schema.headers || schema.cookies) {\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 = ((req as unknown as Record<string, unknown>).params as Record<string, string>) || {};\n\n // 验证 schema\n const data = { body: undefined, query, params, headers, cookies };\n if (schema.body || schema.query || schema.params || schema.headers || schema.cookies) {\n validateAllSchemas(schema, data);\n }\n\n // 创建 SSE 流\n const stream = new ReadableStream({\n async start(controller) {\n const encoder = new TextEncoder();\n\n try {\n const gen = generator({\n req,\n body: undefined 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 for await (const event of gen) {\n const formatted = formatSSEEvent(event);\n controller.enqueue(encoder.encode(formatted));\n }\n } catch (error) {\n // 发送错误事件\n const errorEvent = formatSSEEvent({\n event: 'error',\n data: {\n message: error instanceof Error ? error.message : 'Unknown error'\n }\n });\n controller.enqueue(encoder.encode(errorEvent));\n } finally {\n controller.close();\n }\n }\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no', // Nginx 禁用缓冲\n }\n });\n } catch (error) {\n // 验证错误等\n return new Response(\n JSON.stringify({\n success: false,\n error: 'Validation Error',\n message: error instanceof Error ? error.message : 'Unknown error'\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' }\n }\n );\n }\n };\n\n // 添加类型标记\n const handler = handlerFn as SSEHandler<T>;\n (handler as unknown as { __sse: SSEMarker }).__sse = { __brand: 'SSE' } as const;\n (handler as unknown as { __schema: T }).__schema = schema;\n (handler as unknown as { __returnType: unknown }).__returnType = undefined;\n return handler;\n}\n\n\n"],"mappings":";;;;;;;AAoDA,SAAS,eAAe,OAAyB;CAC/C,MAAM,QAAkB,EAAE;AAE1B,KAAI,MAAM,OAAO,OACf,OAAM,KAAK,OAAO,MAAM,KAAK;AAG/B,KAAI,MAAM,UAAU,OAClB,OAAM,KAAK,UAAU,MAAM,QAAQ;AAGrC,KAAI,MAAM,UAAU,OAClB,OAAM,KAAK,UAAU,MAAM,QAAQ;CAQrC,MAAM,aAJU,OAAO,MAAM,SAAS,WAClC,MAAM,OACN,KAAK,UAAU,MAAM,KAAK,EAEJ,MAAM,KAAK;AACrC,MAAK,MAAM,QAAQ,UACjB,OAAM,KAAK,SAAS,OAAO;AAG7B,QAAO,MAAM,KAAK,KAAK,GAAG;;AAmD5B,SAAgB,iBACd,mBACA,gBACe;CAEf,MAAM,YAAY,OAAO,sBAAsB;CAC/C,MAAM,SAAS,YAAa,oBAA2B,EAAE;CACzD,MAAM,YAAY,YACd,iBACC;AAGL,KAAI,OAAO,QAAQ,OAAO,SAAS,OAAO,UAAU,OAAO,WAAW,OAAO,QAC3E,mBAAkB,OAAO;CAG3B,MAAM,YAAY,OAAO,QAAoC;AAC3D,MAAI;GAEF,MAAM,QAAQ,WAAW,IAAI;GAC7B,MAAM,UAAU,aAAa,IAAI;GACjC,MAAM,UAAU,aAAa,IAAI;GACjC,MAAM,SAAW,IAA2C,UAAqC,EAAE;GAGnG,MAAM,OAAO;IAAE,MAAM;IAAW;IAAO;IAAQ;IAAS;IAAS;AACjE,OAAI,OAAO,QAAQ,OAAO,SAAS,OAAO,UAAU,OAAO,WAAW,OAAO,QAC3E,oBAAmB,QAAQ,KAAK;GAIlC,MAAM,SAAS,IAAI,eAAe,EAChC,MAAM,MAAM,YAAY;IACtB,MAAM,UAAU,IAAI,aAAa;AAEjC,QAAI;KACF,MAAM,MAAM,UAAU;MACpB;MACA,MAAM;MACC;MACC;MACC;MACA;MACV,CAAC;AAEF,gBAAW,MAAM,SAAS,KAAK;MAC7B,MAAM,YAAY,eAAe,MAAM;AACvC,iBAAW,QAAQ,QAAQ,OAAO,UAAU,CAAC;;aAExC,OAAO;KAEd,MAAM,aAAa,eAAe;MAChC,OAAO;MACP,MAAM,EACJ,SAAS,iBAAiB,QAAQ,MAAM,UAAU,iBACnD;MACF,CAAC;AACF,gBAAW,QAAQ,QAAQ,OAAO,WAAW,CAAC;cACtC;AACR,gBAAW,OAAO;;MAGvB,CAAC;AAEF,UAAO,IAAI,SAAS,QAAQ,EAC1B,SAAS;IACP,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,qBAAqB;IACtB,EACF,CAAC;WACK,OAAO;AAEd,UAAO,IAAI,SACT,KAAK,UAAU;IACb,SAAS;IACT,OAAO;IACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;IACnD,CAAC,EACF;IACE,QAAQ;IACR,SAAS,EAAE,gBAAgB,oBAAoB;IAChD,CACF;;;CAKL,MAAM,UAAU;AAChB,CAAC,QAA4C,QAAQ,EAAE,SAAS,OAAO;AACvE,CAAC,QAAuC,WAAW;AACnD,CAAC,QAAiD,eAAe;AACjE,QAAO"}
@@ -1,2 +0,0 @@
1
- import { a as Middleware, c as createTypedRoute, i as FlattenedRoute, l as isTypedRoute, n as CompatibleRoute, o as NestedRouteConfig, r as ExtendedRouteConfig, s as TypedRoute, t as BaseRouteConfig } from "../route-6A7umH7b.mjs";
2
- export { BaseRouteConfig, CompatibleRoute, ExtendedRouteConfig, FlattenedRoute, Middleware, NestedRouteConfig, TypedRoute, createTypedRoute, isTypedRoute };
@@ -1,3 +0,0 @@
1
- import { n as isTypedRoute, t as createTypedRoute } from "../route-Ds53PR4M.mjs";
2
-
3
- export { createTypedRoute, isTypedRoute };
@@ -1,2 +0,0 @@
1
- import { a as TypedHandler, i as RouteSchema, n as HandlerContextWithExtra, o as TypedRouteConfig, r as InferSchema, t as HandlerContext } from "../schema-B6DFN5c2.mjs";
2
- export { HandlerContext, HandlerContextWithExtra, InferSchema, RouteSchema, TypedHandler, TypedRouteConfig };
@@ -1 +0,0 @@
1
- export { };
@@ -1,45 +0,0 @@
1
- //#region src/types/types.d.ts
2
- type Method = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD";
3
- /** 支持的响应类型 - 由 mapResponse 自动转换 */
4
- type ResponseBody = Response | string | number | boolean | object | null | undefined | ReadableStream | Blob | ArrayBuffer;
5
- /** Handler 返回值(支持同步/异步,任意类型) */
6
- /** 传统 Handler 类型 */
7
- type LegacyHandler = (req: Request, params?: Record<string, string>, user?: Record<string, any>) => ResponseBody | Promise<ResponseBody>;
8
- /** createHandler 返回的类型 */
9
- type FactoryHandler = (req: Request) => Promise<Response>;
10
- /** Handler 联合类型(支持两种风格) */
11
- type Handler = LegacyHandler | FactoryHandler;
12
- /** 中间件(返回值必须是 Response 或 Promise<Response>) */
13
- type Middleware = (req: Request, next: () => Promise<Response>) => Response | Promise<Response>;
14
- interface Route {
15
- method: Method;
16
- path: string;
17
- handler: Handler;
18
- middleware?: Middleware[];
19
- /** 路由名称(用于文档、事件等) */
20
- name?: string;
21
- /** 路由描述 */
22
- description?: string;
23
- /** 允许任意扩展(支持 Webhook、权限等插件) */
24
- [key: string]: unknown;
25
- }
26
- interface NestedRoute {
27
- path: string;
28
- middleware?: Middleware[];
29
- children?: (NestedRoute | Route)[];
30
- /** 路由组名称 */
31
- name?: string;
32
- /** 路由组描述 */
33
- description?: string;
34
- /** 允许任意扩展 */
35
- [key: string]: unknown;
36
- }
37
- interface FlattenedRoute extends Route {
38
- fullPath: string;
39
- middlewareChain: Middleware[];
40
- /** 父级路由的名称(用于分类显示) */
41
- parentName?: string;
42
- }
43
- //#endregion
44
- export { Method as a, ResponseBody as c, LegacyHandler as i, Route as l, FlattenedRoute as n, Middleware as o, Handler as r, NestedRoute as s, FactoryHandler as t };
45
- //# sourceMappingURL=types-D1PUFkda.d.mts.map
@@ -1,3 +0,0 @@
1
- import "../schema-B6DFN5c2.mjs";
2
- import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "../create-handler-DKw-sQOV.mjs";
3
- export { InferableHandler, createHandler, createHandlerWithExtra, simpleHandler };
@@ -1,6 +0,0 @@
1
- import "../middleware-CewKbtb4.mjs";
2
- import "../parsers-DpH_mD0H.mjs";
3
- import "../validators-DBkyw6BG.mjs";
4
- import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "../create-handler-RconAcAB.mjs";
5
-
6
- export { createHandler, createHandlerWithExtra, simpleHandler };
@@ -1,3 +0,0 @@
1
- import "../validators-Ch71zkT8.mjs";
2
- import { a as parseAndValidateRequest, i as createRequestValidator, n as ValidatedRequestData, o as parseRequest, r as ValidationResult, s as validateRequest, t as RequestData } from "../request-validator-Coo8dI-p.mjs";
3
- export { RequestData, ValidatedRequestData, ValidationResult, createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest };
@@ -1,5 +0,0 @@
1
- import "../parsers-DpH_mD0H.mjs";
2
- import "../validators-DBkyw6BG.mjs";
3
- import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "../request-validator-Bz9X48FX.mjs";
4
-
5
- export { createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest };