vafast 0.4.4 → 0.4.6

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 (131) hide show
  1. package/dist/{base-server-DvGS6ATg.d.mts → base-server-CtA1bZSg.d.mts} +2 -2
  2. package/dist/{base-server-CSkyjEaY.mjs → base-server-DMhpmq5v.mjs} +1 -1
  3. package/dist/{base-server-CSkyjEaY.mjs.map → base-server-DMhpmq5v.mjs.map} +1 -1
  4. package/dist/{base64url-CwQnvZyp.mjs → base64url-DUtluDF0.mjs} +1 -1
  5. package/dist/{base64url-CwQnvZyp.mjs.map → base64url-DUtluDF0.mjs.map} +1 -1
  6. package/dist/{component-route-CZawYn61.d.mts → component-route-DF5feXJI.d.mts} +2 -2
  7. package/dist/{component-router-CErbGh2A.mjs → component-router-uSylkByf.mjs} +1 -1
  8. package/dist/{component-router-CErbGh2A.mjs.map → component-router-uSylkByf.mjs.map} +1 -1
  9. package/dist/{component-server-DAbIyIPI.mjs → component-server-DIgykV0F.mjs} +6 -6
  10. package/dist/{component-server-DAbIyIPI.mjs.map → component-server-DIgykV0F.mjs.map} +1 -1
  11. package/dist/{component-server-CGzU4bss.d.mts → component-server-DvcPVnL4.d.mts} +4 -4
  12. package/dist/{create-handler-Bo-hvWp-.d.mts → create-handler-DRcJRkx9.d.mts} +2 -2
  13. package/dist/{create-handler-B_pfxh3m.mjs → create-handler-IzOE24L5.mjs} +5 -5
  14. package/dist/{create-handler-B_pfxh3m.mjs.map → create-handler-IzOE24L5.mjs.map} +1 -1
  15. package/dist/defineRoute.d.mts +3 -3
  16. package/dist/{dependency-manager-Czg7Po2j.mjs → dependency-manager-BpN2YufZ.mjs} +1 -1
  17. package/dist/{dependency-manager-Czg7Po2j.mjs.map → dependency-manager-BpN2YufZ.mjs.map} +1 -1
  18. package/dist/{dependency-manager-C6vFWP2L.d.mts → dependency-manager-C_qZvkaw.d.mts} +1 -1
  19. package/dist/{go-await-BGAGJfrB.mjs → go-await-2Pzj4snS.mjs} +1 -1
  20. package/dist/{go-await-BGAGJfrB.mjs.map → go-await-2Pzj4snS.mjs.map} +1 -1
  21. package/dist/{handle-Csjtywdc.mjs → handle-s4V-E2RE.mjs} +2 -2
  22. package/dist/{handle-Csjtywdc.mjs.map → handle-s4V-E2RE.mjs.map} +1 -1
  23. package/dist/{html-renderer-CczE8mwC.mjs → html-renderer-CuakkPIt.mjs} +1 -1
  24. package/dist/{html-renderer-CczE8mwC.mjs.map → html-renderer-CuakkPIt.mjs.map} +1 -1
  25. package/dist/{index-Ci52vt55.d.mts → index-CdOYxwDQ.d.mts} +5 -5
  26. package/dist/index.d.mts +16 -16
  27. package/dist/index.mjs +20 -21
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/middleware/component-router.d.mts +1 -1
  30. package/dist/middleware/component-router.mjs +1 -1
  31. package/dist/middleware-5PjaxPMA.d.mts +23 -0
  32. package/dist/middleware-CV5o-4wk.mjs +189 -0
  33. package/dist/middleware-CV5o-4wk.mjs.map +1 -0
  34. package/dist/middleware.d.mts +4 -25
  35. package/dist/middleware.mjs +1 -1
  36. package/dist/monitoring/index.d.mts +6 -6
  37. package/dist/monitoring/index.mjs +5 -3
  38. package/dist/monitoring/index.mjs.map +1 -1
  39. package/dist/monitoring/native-monitor.d.mts +6 -6
  40. package/dist/monitoring/native-monitor.mjs +5 -3
  41. package/dist/monitoring/native-monitor.mjs.map +1 -1
  42. package/dist/node-server/index.mjs +3 -3
  43. package/dist/node-server/request.mjs +1 -1
  44. package/dist/node-server/response.mjs +1 -1
  45. package/dist/node-server/serve.mjs +2 -2
  46. package/dist/{parsers-CI_TZ7pO.mjs → parsers-BQ63b0YE.mjs} +1 -1
  47. package/dist/{parsers-CI_TZ7pO.mjs.map → parsers-BQ63b0YE.mjs.map} +1 -1
  48. package/dist/{path-matcher-73cJd5Y7.mjs → path-matcher-BNaaJgI3.mjs} +1 -1
  49. package/dist/{path-matcher-73cJd5Y7.mjs.map → path-matcher-BNaaJgI3.mjs.map} +1 -1
  50. package/dist/{radix-tree-D0XYaJKb.mjs → radix-tree-Qxr-QpCx.mjs} +1 -1
  51. package/dist/{radix-tree-D0XYaJKb.mjs.map → radix-tree-Qxr-QpCx.mjs.map} +1 -1
  52. package/dist/{request-CKC3Ox6M.mjs → request-B886yCvG.mjs} +1 -1
  53. package/dist/{request-CKC3Ox6M.mjs.map → request-B886yCvG.mjs.map} +1 -1
  54. package/dist/{request-validator-_J5HloRq.mjs → request-validator-DLFtm4uV.mjs} +3 -3
  55. package/dist/{request-validator-_J5HloRq.mjs.map → request-validator-DLFtm4uV.mjs.map} +1 -1
  56. package/dist/{response-Cf5FgtmE.mjs → response-30WnzABq.mjs} +1 -1
  57. package/dist/{response-Cf5FgtmE.mjs.map → response-30WnzABq.mjs.map} +1 -1
  58. package/dist/response-CxYf6Ep3.d.mts +48 -0
  59. package/dist/{route-9pAVP1GC.mjs → route-B3ONOzxQ.mjs} +1 -1
  60. package/dist/{route-9pAVP1GC.mjs.map → route-B3ONOzxQ.mjs.map} +1 -1
  61. package/dist/{route-BJ-40LNI.d.mts → route-CUbNpSwz.d.mts} +2 -2
  62. package/dist/{route-registry-mcTG0M-t.mjs → route-registry-BVvbghgH.mjs} +1 -1
  63. package/dist/{route-registry-mcTG0M-t.mjs.map → route-registry-BVvbghgH.mjs.map} +1 -1
  64. package/dist/{route-registry--tx1PNui.d.mts → route-registry-CYD7m6QP.d.mts} +2 -2
  65. package/dist/router/index.d.mts +2 -2
  66. package/dist/router/index.mjs +1 -1
  67. package/dist/router/radix-tree.d.mts +3 -3
  68. package/dist/router/radix-tree.mjs +1 -1
  69. package/dist/router.d.mts +3 -3
  70. package/dist/{schema-CPQudJpE.d.mts → schema-DOKg31ZX.d.mts} +1 -1
  71. package/dist/{serve-Be6NvuQk.mjs → serve-DgWBnexE.mjs} +3 -3
  72. package/dist/{serve-Be6NvuQk.mjs.map → serve-DgWBnexE.mjs.map} +1 -1
  73. package/dist/serve.mjs +2 -2
  74. package/dist/server/base-server.d.mts +3 -3
  75. package/dist/server/base-server.mjs +1 -1
  76. package/dist/server/component-server.d.mts +4 -4
  77. package/dist/server/component-server.mjs +2 -2
  78. package/dist/server/index.d.mts +6 -6
  79. package/dist/server/index.mjs +6 -5
  80. package/dist/server/server-factory.d.mts +6 -6
  81. package/dist/server/server-factory.mjs +5 -3
  82. package/dist/server/server.d.mts +4 -4
  83. package/dist/server/server.mjs +2 -1
  84. package/dist/{server-Cbd3Ia51.mjs → server-BttM6Ssc.mjs} +4 -4
  85. package/dist/{server-Cbd3Ia51.mjs.map → server-BttM6Ssc.mjs.map} +1 -1
  86. package/dist/{server-BmPKs8oM.mjs → server-C3yoZXNs.mjs} +5 -6
  87. package/dist/{server-BmPKs8oM.mjs.map → server-C3yoZXNs.mjs.map} +1 -1
  88. package/dist/{server-D9gjszHe.d.mts → server-CWIZP6nb.d.mts} +3 -3
  89. package/dist/{sse-BMM6KTfy.d.mts → sse-BDIptC85.d.mts} +2 -2
  90. package/dist/{sse-BT5yyLgX.mjs → sse-CCVfFW6s.mjs} +3 -3
  91. package/dist/{sse-BT5yyLgX.mjs.map → sse-CCVfFW6s.mjs.map} +1 -1
  92. package/dist/types/component-route.d.mts +1 -1
  93. package/dist/types/index.d.mts +5 -5
  94. package/dist/types/index.mjs +1 -1
  95. package/dist/types/route.d.mts +1 -1
  96. package/dist/types/route.mjs +1 -1
  97. package/dist/types/schema.d.mts +1 -1
  98. package/dist/types/types.d.mts +1 -1
  99. package/dist/{types-DuTa8AVN.d.mts → types-mpeSaHdI.d.mts} +1 -1
  100. package/dist/utils/base64url.mjs +1 -1
  101. package/dist/utils/create-handler.d.mts +2 -2
  102. package/dist/utils/create-handler.mjs +4 -3
  103. package/dist/utils/dependency-manager.d.mts +1 -1
  104. package/dist/utils/dependency-manager.mjs +1 -1
  105. package/dist/utils/go-await.mjs +1 -1
  106. package/dist/utils/handle.mjs +2 -2
  107. package/dist/utils/html-renderer.mjs +1 -1
  108. package/dist/utils/index.d.mts +9 -8
  109. package/dist/utils/index.mjs +13 -13
  110. package/dist/utils/index.mjs.map +1 -1
  111. package/dist/utils/parsers.mjs +1 -1
  112. package/dist/utils/path-matcher.mjs +1 -1
  113. package/dist/utils/request-validator.mjs +3 -3
  114. package/dist/utils/response.d.mts +5 -2
  115. package/dist/utils/response.mjs +2 -2
  116. package/dist/utils/route-registry.d.mts +3 -3
  117. package/dist/utils/route-registry.mjs +1 -1
  118. package/dist/utils/sse.d.mts +2 -2
  119. package/dist/utils/sse.mjs +3 -3
  120. package/dist/utils/validators/validators.mjs +1 -1
  121. package/dist/{validators-BBrGePBr.mjs → validators-WXQ49LcR.mjs} +1 -1
  122. package/dist/{validators-BBrGePBr.mjs.map → validators-WXQ49LcR.mjs.map} +1 -1
  123. package/package.json +1 -1
  124. package/dist/middleware-Byp3Hjae.mjs +0 -59
  125. package/dist/middleware-Byp3Hjae.mjs.map +0 -1
  126. package/dist/response-A-sZZiJ7.d.mts +0 -21
  127. package/dist/response-DXg4i_yh.mjs +0 -97
  128. package/dist/response-DXg4i_yh.mjs.map +0 -1
  129. /package/dist/{component-route-CYxLOnci.mjs → component-route-BKUFoJ5P.mjs} +0 -0
  130. /package/dist/{index-CzItj62a.d.mts → index-CTHojwxd.d.mts} +0 -0
  131. /package/dist/{schema-CtVBNfnQ.mjs → schema-CflsMJuG.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server-BmPKs8oM.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 private isCompiled = false;\n /** 预编译时的全局中间件数量 */\n private compiledWithMiddlewareCount = 0;\n\n constructor(routes: readonly (Route | NestedRoute)[] = []) {\n super();\n this.router = new RadixRouter();\n this.routes = [];\n\n // 设置中间件编译器\n this.router.setCompiler((middleware, handler) =>\n composeMiddleware(middleware, handler),\n );\n\n if (routes.length > 0) {\n this.registerRoutes([...routes]);\n }\n }\n\n /**\n * 预编译所有路由处理链\n * 在添加所有路由和全局中间件后调用,可提升运行时性能\n */\n compile(): this {\n this.router.precompileAll(this.globalMiddleware);\n this.isCompiled = true;\n this.compiledWithMiddlewareCount = this.globalMiddleware.length;\n return this;\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 // 自动预编译(如果没有全局中间件)\n if (this.globalMiddleware.length === 0 && !this.isCompiled) {\n this.compile();\n }\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 if (\n match.compiled &&\n this.globalMiddleware.length === this.compiledWithMiddlewareCount\n ) {\n return match.compiled(req);\n }\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
+ {"version":3,"file":"server-C3yoZXNs.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 private isCompiled = false;\n /** 预编译时的全局中间件数量 */\n private compiledWithMiddlewareCount = 0;\n\n constructor(routes: readonly (Route | NestedRoute)[] = []) {\n super();\n this.router = new RadixRouter();\n this.routes = [];\n\n // 设置中间件编译器\n this.router.setCompiler((middleware, handler) =>\n composeMiddleware(middleware, handler),\n );\n\n if (routes.length > 0) {\n this.registerRoutes([...routes]);\n }\n }\n\n /**\n * 预编译所有路由处理链\n * 在添加所有路由和全局中间件后调用,可提升运行时性能\n */\n compile(): this {\n this.router.precompileAll(this.globalMiddleware);\n this.isCompiled = true;\n this.compiledWithMiddlewareCount = this.globalMiddleware.length;\n return this;\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 // 自动预编译(如果没有全局中间件)\n if (this.globalMiddleware.length === 0 && !this.isCompiled) {\n this.compile();\n }\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 if (\n match.compiled &&\n this.globalMiddleware.length === this.compiledWithMiddlewareCount\n ) {\n return match.compiled(req);\n }\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,5 +1,5 @@
1
- import { a as Method, l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-DuTa8AVN.mjs";
2
- import { t as BaseServer } from "./base-server-DvGS6ATg.mjs";
1
+ import { a as Method, l as Route, n as FlattenedRoute, s as NestedRoute } from "./types-mpeSaHdI.mjs";
2
+ import { t as BaseServer } from "./base-server-CtA1bZSg.mjs";
3
3
 
4
4
  //#region src/server/server.d.ts
5
5
 
@@ -57,4 +57,4 @@ declare class Server extends BaseServer {
57
57
  }
58
58
  //#endregion
59
59
  export { Server as t };
60
- //# sourceMappingURL=server-D9gjszHe.d.mts.map
60
+ //# sourceMappingURL=server-CWIZP6nb.d.mts.map
@@ -1,4 +1,4 @@
1
- import { i as RouteSchema, t as HandlerContext } from "./schema-CPQudJpE.mjs";
1
+ import { i as RouteSchema, t as HandlerContext } from "./schema-DOKg31ZX.mjs";
2
2
 
3
3
  //#region src/utils/sse.d.ts
4
4
 
@@ -62,4 +62,4 @@ declare function createSSEHandler<const T extends RouteSchema>(schema: T, genera
62
62
  declare function createSSEHandler(generator: SSEGenerator<RouteSchema>): SSEHandler<RouteSchema>;
63
63
  //#endregion
64
64
  export { createSSEHandler as a, SSEMarker as i, SSEGenerator as n, SSEHandler as r, SSEEvent as t };
65
- //# sourceMappingURL=sse-BMM6KTfy.d.mts.map
65
+ //# sourceMappingURL=sse-BDIptC85.d.mts.map
@@ -1,5 +1,5 @@
1
- import { a as parseCookies, l as parseHeaders, u as parseQuery } from "./parsers-CI_TZ7pO.mjs";
2
- import { a as validateAllSchemas, i as precompileSchemas } from "./validators-BBrGePBr.mjs";
1
+ import { a as parseCookies, l as parseHeaders, u as parseQuery } from "./parsers-BQ63b0YE.mjs";
2
+ import { a as validateAllSchemas, i as precompileSchemas } from "./validators-WXQ49LcR.mjs";
3
3
 
4
4
  //#region src/utils/sse.ts
5
5
  /**
@@ -84,4 +84,4 @@ function createSSEHandler(schemaOrGenerator, maybeGenerator) {
84
84
 
85
85
  //#endregion
86
86
  export { createSSEHandler as t };
87
- //# sourceMappingURL=sse-BT5yyLgX.mjs.map
87
+ //# sourceMappingURL=sse-CCVfFW6s.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sse-BT5yyLgX.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
+ {"version":3,"file":"sse-CCVfFW6s.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 +1,2 @@
1
- import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "../component-route-CZawYn61.mjs";
1
+ import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "../component-route-DF5feXJI.mjs";
2
2
  export { ComponentRoute, FlattenedComponentRoute, NestedComponentRoute };
@@ -1,6 +1,6 @@
1
- import { a as Method, c as ResponseBody, l as Route, n as FlattenedRoute, o as Middleware, r as Handler, s as NestedRoute } from "../types-DuTa8AVN.mjs";
2
- import { c as createTypedRoute, l as isTypedRoute, n as CompatibleRoute, o as NestedRouteConfig, r as ExtendedRouteConfig, s as TypedRoute, t as BaseRouteConfig } from "../route-BJ-40LNI.mjs";
3
- import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "../component-route-CZawYn61.mjs";
4
- import { a as TypedHandler, i as RouteSchema, n as HandlerContextWithExtra, o as TypedRouteConfig, r as InferSchema, t as HandlerContext } from "../schema-CPQudJpE.mjs";
5
- import "../index-CzItj62a.mjs";
1
+ import { a as Method, c as ResponseBody, l as Route, n as FlattenedRoute, o as Middleware, r as Handler, s as NestedRoute } from "../types-mpeSaHdI.mjs";
2
+ import { c as createTypedRoute, l as isTypedRoute, n as CompatibleRoute, o as NestedRouteConfig, r as ExtendedRouteConfig, s as TypedRoute, t as BaseRouteConfig } from "../route-CUbNpSwz.mjs";
3
+ import { n as FlattenedComponentRoute, r as NestedComponentRoute, t as ComponentRoute } from "../component-route-DF5feXJI.mjs";
4
+ import { a as TypedHandler, i as RouteSchema, n as HandlerContextWithExtra, o as TypedRouteConfig, r as InferSchema, t as HandlerContext } from "../schema-DOKg31ZX.mjs";
5
+ import "../index-CTHojwxd.mjs";
6
6
  export { BaseRouteConfig, CompatibleRoute, ComponentRoute, ExtendedRouteConfig, FlattenedComponentRoute, FlattenedRoute, Handler, HandlerContext, HandlerContextWithExtra, InferSchema, Method, Middleware, NestedComponentRoute, NestedRoute, NestedRouteConfig, ResponseBody, Route, RouteSchema, TypedHandler, TypedRoute, TypedRouteConfig, createTypedRoute, isTypedRoute };
@@ -1,3 +1,3 @@
1
- import { n as isTypedRoute, t as createTypedRoute } from "../route-9pAVP1GC.mjs";
1
+ import { n as isTypedRoute, t as createTypedRoute } from "../route-B3ONOzxQ.mjs";
2
2
 
3
3
  export { createTypedRoute, isTypedRoute };
@@ -1,2 +1,2 @@
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-BJ-40LNI.mjs";
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-CUbNpSwz.mjs";
2
2
  export { BaseRouteConfig, CompatibleRoute, ExtendedRouteConfig, FlattenedRoute, Middleware, NestedRouteConfig, TypedRoute, createTypedRoute, isTypedRoute };
@@ -1,3 +1,3 @@
1
- import { n as isTypedRoute, t as createTypedRoute } from "../route-9pAVP1GC.mjs";
1
+ import { n as isTypedRoute, t as createTypedRoute } from "../route-B3ONOzxQ.mjs";
2
2
 
3
3
  export { createTypedRoute, isTypedRoute };
@@ -1,2 +1,2 @@
1
- import { a as TypedHandler, i as RouteSchema, n as HandlerContextWithExtra, o as TypedRouteConfig, r as InferSchema, t as HandlerContext } from "../schema-CPQudJpE.mjs";
1
+ import { a as TypedHandler, i as RouteSchema, n as HandlerContextWithExtra, o as TypedRouteConfig, r as InferSchema, t as HandlerContext } from "../schema-DOKg31ZX.mjs";
2
2
  export { HandlerContext, HandlerContextWithExtra, InferSchema, RouteSchema, TypedHandler, TypedRouteConfig };
@@ -1,2 +1,2 @@
1
- import { a as Method, c as ResponseBody, i as LegacyHandler, l as Route, n as FlattenedRoute, o as Middleware, r as Handler, s as NestedRoute, t as FactoryHandler } from "../types-DuTa8AVN.mjs";
1
+ import { a as Method, c as ResponseBody, i as LegacyHandler, l as Route, n as FlattenedRoute, o as Middleware, r as Handler, s as NestedRoute, t as FactoryHandler } from "../types-mpeSaHdI.mjs";
2
2
  export { FactoryHandler, FlattenedRoute, Handler, LegacyHandler, Method, Middleware, NestedRoute, ResponseBody, Route };
@@ -42,4 +42,4 @@ interface FlattenedRoute extends Route {
42
42
  }
43
43
  //#endregion
44
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-DuTa8AVN.d.mts.map
45
+ //# sourceMappingURL=types-mpeSaHdI.d.mts.map
@@ -1,3 +1,3 @@
1
- import { n as base64urlEncode, t as base64urlDecode } from "../base64url-CwQnvZyp.mjs";
1
+ import { n as base64urlEncode, t as base64urlDecode } from "../base64url-DUtluDF0.mjs";
2
2
 
3
3
  export { base64urlDecode, base64urlEncode };
@@ -1,3 +1,3 @@
1
- import "../schema-CPQudJpE.mjs";
2
- import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "../create-handler-Bo-hvWp-.mjs";
1
+ import "../schema-DOKg31ZX.mjs";
2
+ import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "../create-handler-DRcJRkx9.mjs";
3
3
  export { InferableHandler, createHandler, createHandlerWithExtra, simpleHandler };
@@ -1,5 +1,6 @@
1
- import "../parsers-CI_TZ7pO.mjs";
2
- import "../validators-BBrGePBr.mjs";
3
- import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "../create-handler-B_pfxh3m.mjs";
1
+ import "../middleware-CV5o-4wk.mjs";
2
+ import "../parsers-BQ63b0YE.mjs";
3
+ import "../validators-WXQ49LcR.mjs";
4
+ import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "../create-handler-IzOE24L5.mjs";
4
5
 
5
6
  export { createHandler, createHandlerWithExtra, simpleHandler };
@@ -1,2 +1,2 @@
1
- import { t as DependencyManager } from "../dependency-manager-C6vFWP2L.mjs";
1
+ import { t as DependencyManager } from "../dependency-manager-C_qZvkaw.mjs";
2
2
  export { DependencyManager };
@@ -1,4 +1,4 @@
1
- import { n as init_dependency_manager, t as DependencyManager } from "../dependency-manager-Czg7Po2j.mjs";
1
+ import { n as init_dependency_manager, t as DependencyManager } from "../dependency-manager-BpN2YufZ.mjs";
2
2
 
3
3
  init_dependency_manager();
4
4
  export { DependencyManager };
@@ -1,3 +1,3 @@
1
- import { t as goAwait } from "../go-await-BGAGJfrB.mjs";
1
+ import { t as goAwait } from "../go-await-2Pzj4snS.mjs";
2
2
 
3
3
  export { goAwait };
@@ -1,4 +1,4 @@
1
- import "../parsers-CI_TZ7pO.mjs";
2
- import { i as setLocals, n as getLocals, r as setCookie, t as getCookie } from "../handle-Csjtywdc.mjs";
1
+ import "../parsers-BQ63b0YE.mjs";
2
+ import { i as setLocals, n as getLocals, r as setCookie, t as getCookie } from "../handle-s4V-E2RE.mjs";
3
3
 
4
4
  export { getCookie, getLocals, setCookie, setLocals };
@@ -1,4 +1,4 @@
1
- import { n as init_html_renderer, t as HtmlRenderer } from "../html-renderer-CczE8mwC.mjs";
1
+ import { n as init_html_renderer, t as HtmlRenderer } from "../html-renderer-CuakkPIt.mjs";
2
2
 
3
3
  init_html_renderer();
4
4
  export { HtmlRenderer };
@@ -1,9 +1,10 @@
1
- import "../schema-CPQudJpE.mjs";
2
- import "../index-CzItj62a.mjs";
3
- import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "../create-handler-Bo-hvWp-.mjs";
4
- import { t as DependencyManager } from "../dependency-manager-C6vFWP2L.mjs";
1
+ import "../schema-DOKg31ZX.mjs";
2
+ import "../index-CTHojwxd.mjs";
3
+ import { i as simpleHandler, n as createHandler, r as createHandlerWithExtra, t as InferableHandler } from "../create-handler-DRcJRkx9.mjs";
4
+ import { t as DependencyManager } from "../dependency-manager-C_qZvkaw.mjs";
5
+ import "../middleware-5PjaxPMA.mjs";
5
6
  import { a as parseBody, c as parseCookiesFast, d as parseHeaders, f as parseQuery, i as getHeader, p as parseQueryFast, r as getCookie, s as parseCookies } from "../parsers-7lvt3Oss.mjs";
6
- import { a as redirect, n as html, o as stream, r as json, s as text, t as empty } from "../response-A-sZZiJ7.mjs";
7
+ import { c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-CxYf6Ep3.mjs";
7
8
  import { t as goAwait } from "../go-await-DRItVwwh.mjs";
8
9
  import { n as base64urlEncode, t as base64urlDecode } from "../base64url-0N9uQPjZ.mjs";
9
10
  import { i as setLocals, n as getLocals } from "../handle-D0TFoOiX.mjs";
@@ -11,6 +12,6 @@ import { a as ValidationError, c as getValidatorCacheStats, d as validateFast, f
11
12
  import { a as parseAndValidateRequest, i as createRequestValidator, o as parseRequest, s as validateRequest } from "../request-validator-42lY21gn.mjs";
12
13
  import { t as HtmlRenderer } from "../html-renderer-CMGKJoIy.mjs";
13
14
  import { i as registerFormats, n as hasFormat, r as registerFormat, t as Patterns } from "../formats-CYLwo9GJ.mjs";
14
- import { a as createSSEHandler, i as SSEMarker, r as SSEHandler, t as SSEEvent } from "../sse-BMM6KTfy.mjs";
15
- import { a as getAllRoutes, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry--tx1PNui.mjs";
16
- export { DependencyManager, HtmlRenderer, type InferableHandler, Patterns, type RouteMeta, RouteRegistry, type SSEEvent, type SSEHandler, type SSEMarker, type SchemaConfig, type ValidationError, type ValidationResult, base64urlDecode, base64urlEncode, createHandler, createHandlerWithExtra, createRequestValidator, createRouteRegistry, createSSEHandler, createValidator, empty, filterRoutes, getAllRoutes, getCookie, getHeader, getLocals, getRoute, getRouteRegistry, getValidatorCacheStats, goAwait, hasFormat, html, json, parseAndValidateRequest, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, parseRequest, precompileSchemas, redirect, registerFormat, registerFormats, setLocals, simpleHandler, stream, text, validateAllSchemas, validateFast, validateRequest, validateSchema, validateSchemaOrThrow };
15
+ import { a as createSSEHandler, i as SSEMarker, r as SSEHandler, t as SSEEvent } from "../sse-BDIptC85.mjs";
16
+ import { a as getAllRoutes, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry-CYD7m6QP.mjs";
17
+ export { DependencyManager, HtmlRenderer, type InferableHandler, Patterns, type RouteMeta, RouteRegistry, type SSEEvent, type SSEHandler, type SSEMarker, type SchemaConfig, type ValidationError, type ValidationResult, base64urlDecode, base64urlEncode, createHandler, createHandlerWithExtra, createRequestValidator, createRouteRegistry, createSSEHandler, createValidator, empty, err, filterRoutes, getAllRoutes, getCookie, getHeader, getLocals, getRoute, getRouteRegistry, getValidatorCacheStats, goAwait, hasFormat, html, json, parseAndValidateRequest, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, parseRequest, precompileSchemas, redirect, registerFormat, registerFormats, setLocals, simpleHandler, stream, text, validateAllSchemas, validateFast, validateRequest, validateSchema, validateSchemaOrThrow };
@@ -1,16 +1,16 @@
1
- import { c as text, i as json, n as html, o as redirect, r as init_response, s as stream, t as empty } from "../response-DXg4i_yh.mjs";
2
- import { a as getRoute, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-mcTG0M-t.mjs";
3
- import { n as init_html_renderer, t as HtmlRenderer } from "../html-renderer-CczE8mwC.mjs";
4
- import { n as init_dependency_manager, t as DependencyManager } from "../dependency-manager-Czg7Po2j.mjs";
5
- import { a as parseCookies, d as parseQueryFast, l as parseHeaders, n as getHeader, o as parseCookiesFast, r as parseBody, t as getCookie, u as parseQuery } from "../parsers-CI_TZ7pO.mjs";
6
- import { t as goAwait } from "../go-await-BGAGJfrB.mjs";
7
- import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema } from "../validators-BBrGePBr.mjs";
8
- import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "../create-handler-B_pfxh3m.mjs";
9
- import { n as base64urlEncode, t as base64urlDecode } from "../base64url-CwQnvZyp.mjs";
10
- import { i as setLocals, n as getLocals } from "../handle-Csjtywdc.mjs";
11
- import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "../request-validator-_J5HloRq.mjs";
1
+ import { a as err, c as json, d as stream, f as text, i as empty, o as html, s as init_response, u as redirect } from "../middleware-CV5o-4wk.mjs";
2
+ import { a as getRoute, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-BVvbghgH.mjs";
3
+ import { n as init_html_renderer, t as HtmlRenderer } from "../html-renderer-CuakkPIt.mjs";
4
+ import { n as init_dependency_manager, t as DependencyManager } from "../dependency-manager-BpN2YufZ.mjs";
5
+ import { a as parseCookies, d as parseQueryFast, l as parseHeaders, n as getHeader, o as parseCookiesFast, r as parseBody, t as getCookie, u as parseQuery } from "../parsers-BQ63b0YE.mjs";
6
+ import { t as goAwait } from "../go-await-2Pzj4snS.mjs";
7
+ import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema } from "../validators-WXQ49LcR.mjs";
8
+ import { n as createHandlerWithExtra, r as simpleHandler, t as createHandler } from "../create-handler-IzOE24L5.mjs";
9
+ import { n as base64urlEncode, t as base64urlDecode } from "../base64url-DUtluDF0.mjs";
10
+ import { i as setLocals, n as getLocals } from "../handle-s4V-E2RE.mjs";
11
+ import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "../request-validator-DLFtm4uV.mjs";
12
12
  import { Patterns, hasFormat, registerFormat, registerFormats } from "./formats.mjs";
13
- import { t as createSSEHandler } from "../sse-BT5yyLgX.mjs";
13
+ import { t as createSSEHandler } from "../sse-CCVfFW6s.mjs";
14
14
 
15
15
  //#region src/utils/index.ts
16
16
  init_response();
@@ -19,5 +19,5 @@ init_dependency_manager();
19
19
  init_route_registry();
20
20
 
21
21
  //#endregion
22
- export { DependencyManager, HtmlRenderer, Patterns, RouteRegistry, base64urlDecode, base64urlEncode, createHandler, createHandlerWithExtra, createRequestValidator, createRouteRegistry, createSSEHandler, createValidator, empty, filterRoutes, getAllRoutes, getCookie, getHeader, getLocals, getRoute, getRouteRegistry, getValidatorCacheStats, goAwait, hasFormat, html, json, parseAndValidateRequest, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, parseRequest, precompileSchemas, redirect, registerFormat, registerFormats, setLocals, simpleHandler, stream, text, validateAllSchemas, validateFast, validateRequest, validateSchema, validateSchemaOrThrow };
22
+ export { DependencyManager, HtmlRenderer, Patterns, RouteRegistry, base64urlDecode, base64urlEncode, createHandler, createHandlerWithExtra, createRequestValidator, createRouteRegistry, createSSEHandler, createValidator, empty, err, filterRoutes, getAllRoutes, getCookie, getHeader, getLocals, getRoute, getRouteRegistry, getValidatorCacheStats, goAwait, hasFormat, html, json, parseAndValidateRequest, parseBody, parseCookies, parseCookiesFast, parseHeaders, parseQuery, parseQueryFast, parseRequest, precompileSchemas, redirect, registerFormat, registerFormats, setLocals, simpleHandler, stream, text, validateAllSchemas, validateFast, validateRequest, validateSchema, validateSchemaOrThrow };
23
23
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["/**\n * 工具函数模块导出\n */\n\n// 处理器工厂\nexport {\n createHandler,\n createHandlerWithExtra,\n simpleHandler,\n type InferableHandler,\n} from \"./create-handler\";\n\n// 请求解析\nexport {\n parseBody,\n parseQuery,\n parseQueryFast,\n parseHeaders,\n getHeader,\n parseCookies,\n parseCookiesFast,\n getCookie,\n} from \"./parsers\";\n\n// 响应工具\nexport { json, text, html, redirect, empty, stream } from \"./response\";\n\n// Go 风格错误处理\nexport { goAwait } from \"./go-await\";\n\n// Base64 编码\nexport { base64urlEncode, base64urlDecode } from \"./base64url\";\n\n// 请求上下文\nexport { setLocals, getLocals } from \"./handle\";\n\n// 请求验证\nexport {\n parseRequest,\n validateRequest,\n parseAndValidateRequest,\n createRequestValidator,\n} from \"./request-validator\";\n\n// HTML 渲染 (SSR)\nexport { HtmlRenderer } from \"./html-renderer\";\n\n// 依赖管理\nexport { DependencyManager } from \"./dependency-manager\";\n\n// 验证器(JIT 编译 + Format 支持)\nexport {\n validateSchema,\n validateSchemaOrThrow,\n validateFast,\n validateAllSchemas,\n precompileSchemas,\n createValidator,\n getValidatorCacheStats,\n type SchemaConfig,\n type ValidationError,\n type ValidationResult,\n} from \"./validators/validators\";\n\n// Format 验证器(内置常用 format)\nexport {\n registerFormats,\n registerFormat,\n hasFormat,\n Patterns,\n} from \"./formats\";\n\n// SSE (Server-Sent Events) 支持\nexport {\n createSSEHandler,\n type SSEEvent,\n type SSEHandler,\n type SSEMarker,\n} from \"./sse\";\n\n// 路由注册表\nexport {\n RouteRegistry,\n createRouteRegistry,\n // 全局访问函数(Server 创建后可在任意位置使用)\n getRouteRegistry,\n getRoute,\n getAllRoutes,\n filterRoutes,\n type RouteMeta,\n} from \"./route-registry\";\n"],"mappings":";;;;;;;;;;;;;;;eAyBuE;oBAoBxB;yBAGU;qBA0C/B"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["/**\n * 工具函数模块导出\n */\n\n// 处理器工厂\nexport {\n createHandler,\n createHandlerWithExtra,\n simpleHandler,\n type InferableHandler,\n} from \"./create-handler\";\n\n// 请求解析\nexport {\n parseBody,\n parseQuery,\n parseQueryFast,\n parseHeaders,\n getHeader,\n parseCookies,\n parseCookiesFast,\n getCookie,\n} from \"./parsers\";\n\n// 响应工具\nexport { json, text, html, redirect, empty, stream, err } from \"./response\";\n\n// Go 风格错误处理\nexport { goAwait } from \"./go-await\";\n\n// Base64 编码\nexport { base64urlEncode, base64urlDecode } from \"./base64url\";\n\n// 请求上下文\nexport { setLocals, getLocals } from \"./handle\";\n\n// 请求验证\nexport {\n parseRequest,\n validateRequest,\n parseAndValidateRequest,\n createRequestValidator,\n} from \"./request-validator\";\n\n// HTML 渲染 (SSR)\nexport { HtmlRenderer } from \"./html-renderer\";\n\n// 依赖管理\nexport { DependencyManager } from \"./dependency-manager\";\n\n// 验证器(JIT 编译 + Format 支持)\nexport {\n validateSchema,\n validateSchemaOrThrow,\n validateFast,\n validateAllSchemas,\n precompileSchemas,\n createValidator,\n getValidatorCacheStats,\n type SchemaConfig,\n type ValidationError,\n type ValidationResult,\n} from \"./validators/validators\";\n\n// Format 验证器(内置常用 format)\nexport {\n registerFormats,\n registerFormat,\n hasFormat,\n Patterns,\n} from \"./formats\";\n\n// SSE (Server-Sent Events) 支持\nexport {\n createSSEHandler,\n type SSEEvent,\n type SSEHandler,\n type SSEMarker,\n} from \"./sse\";\n\n// 路由注册表\nexport {\n RouteRegistry,\n createRouteRegistry,\n // 全局访问函数(Server 创建后可在任意位置使用)\n getRouteRegistry,\n getRoute,\n getAllRoutes,\n filterRoutes,\n type RouteMeta,\n} from \"./route-registry\";\n"],"mappings":";;;;;;;;;;;;;;;eAyB4E;oBAoB7B;yBAGU;qBA0C/B"}
@@ -1,3 +1,3 @@
1
- import { a as parseCookies, c as parseFormData, d as parseQueryFast, i as parseBodyAs, l as parseHeaders, n as getHeader, o as parseCookiesFast, r as parseBody, s as parseFile, t as getCookie, u as parseQuery } from "../parsers-CI_TZ7pO.mjs";
1
+ import { a as parseCookies, c as parseFormData, d as parseQueryFast, i as parseBodyAs, l as parseHeaders, n as getHeader, o as parseCookiesFast, r as parseBody, s as parseFile, t as getCookie, u as parseQuery } from "../parsers-BQ63b0YE.mjs";
2
2
 
3
3
  export { getCookie, getHeader, parseBody, parseBodyAs, parseCookies, parseCookiesFast, parseFile, parseFormData, parseHeaders, parseQuery, parseQueryFast };
@@ -1,4 +1,4 @@
1
- import { n as init_path_matcher, t as PathMatcher } from "../path-matcher-73cJd5Y7.mjs";
1
+ import { n as init_path_matcher, t as PathMatcher } from "../path-matcher-BNaaJgI3.mjs";
2
2
 
3
3
  init_path_matcher();
4
4
  export { PathMatcher };
@@ -1,5 +1,5 @@
1
- import "../parsers-CI_TZ7pO.mjs";
2
- import "../validators-BBrGePBr.mjs";
3
- import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "../request-validator-_J5HloRq.mjs";
1
+ import "../parsers-BQ63b0YE.mjs";
2
+ import "../validators-WXQ49LcR.mjs";
3
+ import { i as validateRequest, n as parseAndValidateRequest, r as parseRequest, t as createRequestValidator } from "../request-validator-DLFtm4uV.mjs";
4
4
 
5
5
  export { createRequestValidator, parseAndValidateRequest, parseRequest, validateRequest };
@@ -1,2 +1,5 @@
1
- import { a as redirect, i as mapResponse, n as html, o as stream, r as json, s as text, t as empty } from "../response-A-sZZiJ7.mjs";
2
- export { empty, html, json, mapResponse, redirect, stream, text };
1
+ import "../schema-DOKg31ZX.mjs";
2
+ import "../index-CTHojwxd.mjs";
3
+ import "../middleware-5PjaxPMA.mjs";
4
+ import { a as mapResponse, c as text, i as json, n as err, o as redirect, r as html, s as stream, t as empty } from "../response-CxYf6Ep3.mjs";
5
+ export { empty, err, html, json, mapResponse, redirect, stream, text };
@@ -1,4 +1,4 @@
1
- import { a as mapResponse, c as text, i as json, n as html, o as redirect, r as init_response, s as stream, t as empty } from "../response-DXg4i_yh.mjs";
1
+ import { a as err, c as json, d as stream, f as text, i as empty, l as mapResponse, o as html, s as init_response, u as redirect } from "../middleware-CV5o-4wk.mjs";
2
2
 
3
3
  init_response();
4
- export { empty, html, json, mapResponse, redirect, stream, text };
4
+ export { empty, err, html, json, mapResponse, redirect, stream, text };
@@ -1,4 +1,4 @@
1
- import "../schema-CPQudJpE.mjs";
2
- import "../index-CzItj62a.mjs";
3
- import { a as getAllRoutes, c as setGlobalRegistry, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry--tx1PNui.mjs";
1
+ import "../schema-DOKg31ZX.mjs";
2
+ import "../index-CTHojwxd.mjs";
3
+ import { a as getAllRoutes, c as setGlobalRegistry, i as filterRoutes, n as RouteRegistry, o as getRoute, r as createRouteRegistry, s as getRouteRegistry, t as RouteMeta } from "../route-registry-CYD7m6QP.mjs";
4
4
  export { RouteMeta, RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, setGlobalRegistry };
@@ -1,4 +1,4 @@
1
- import { a as getRoute, c as setGlobalRegistry, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-mcTG0M-t.mjs";
1
+ import { a as getRoute, c as setGlobalRegistry, i as getAllRoutes, n as createRouteRegistry, o as getRouteRegistry, r as filterRoutes, s as init_route_registry, t as RouteRegistry } from "../route-registry-BVvbghgH.mjs";
2
2
 
3
3
  init_route_registry();
4
4
  export { RouteRegistry, createRouteRegistry, filterRoutes, getAllRoutes, getRoute, getRouteRegistry, setGlobalRegistry };
@@ -1,3 +1,3 @@
1
- import "../schema-CPQudJpE.mjs";
2
- import { a as createSSEHandler, i as SSEMarker, n as SSEGenerator, r as SSEHandler, t as SSEEvent } from "../sse-BMM6KTfy.mjs";
1
+ import "../schema-DOKg31ZX.mjs";
2
+ import { a as createSSEHandler, i as SSEMarker, n as SSEGenerator, r as SSEHandler, t as SSEEvent } from "../sse-BDIptC85.mjs";
3
3
  export { SSEEvent, SSEGenerator, SSEHandler, SSEMarker, createSSEHandler };
@@ -1,5 +1,5 @@
1
- import "../parsers-CI_TZ7pO.mjs";
2
- import "../validators-BBrGePBr.mjs";
3
- import { t as createSSEHandler } from "../sse-BT5yyLgX.mjs";
1
+ import "../parsers-BQ63b0YE.mjs";
2
+ import "../validators-WXQ49LcR.mjs";
3
+ import { t as createSSEHandler } from "../sse-CCVfFW6s.mjs";
4
4
 
5
5
  export { createSSEHandler };
@@ -1,3 +1,3 @@
1
- import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema, t as Type } from "../../validators-BBrGePBr.mjs";
1
+ import { a as validateAllSchemas, c as validateSchemaOrThrow, i as precompileSchemas, n as createValidator, o as validateFast, r as getValidatorCacheStats, s as validateSchema, t as Type } from "../../validators-WXQ49LcR.mjs";
2
2
 
3
3
  export { Type, createValidator, getValidatorCacheStats, precompileSchemas, validateAllSchemas, validateFast, validateSchema, validateSchemaOrThrow };
@@ -109,4 +109,4 @@ function getValidatorCacheStats() {
109
109
 
110
110
  //#endregion
111
111
  export { validateAllSchemas as a, validateSchemaOrThrow as c, precompileSchemas as i, createValidator as n, validateFast as o, getValidatorCacheStats as r, validateSchema as s, Type as t };
112
- //# sourceMappingURL=validators-BBrGePBr.mjs.map
112
+ //# sourceMappingURL=validators-WXQ49LcR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators-BBrGePBr.mjs","names":[],"sources":["../src/utils/validators/validators.ts"],"sourcesContent":["/**\n * Schema 验证器 - 简洁版\n *\n * 特点:\n * - WeakMap 缓存避免内存泄漏\n * - TypeCompiler JIT 编译,性能最佳\n * - 支持 FormatRegistry(需确保同一实例)\n *\n * @version 7.0.0\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport { TypeCompiler, type TypeCheck } from \"@sinclair/typebox/compiler\";\nimport { Value } from \"@sinclair/typebox/value\";\n\n// ============== 类型定义 ==============\n\n/** Schema 配置接口 */\nexport interface SchemaConfig {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n/** 验证错误接口 */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n value?: unknown;\n}\n\n/** 验证结果 */\nexport type ValidationResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; errors: ValidationError[] };\n\n// ============== 缓存 ==============\n\n/** 编译器缓存 - WeakMap 避免内存泄漏 */\nconst compilerCache = new WeakMap<TSchema, TypeCheck<TSchema>>();\n\n// ============== 核心函数 ==============\n\n/**\n * 获取或创建编译后的验证器\n */\nfunction getCompiledValidator<T extends TSchema>(schema: T): TypeCheck<T> {\n let compiler = compilerCache.get(schema);\n if (!compiler) {\n compiler = TypeCompiler.Compile(schema);\n compilerCache.set(schema, compiler);\n }\n return compiler as TypeCheck<T>;\n}\n\n/**\n * 验证单个 Schema(返回结果对象)\n */\nexport function validateSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n): ValidationResult<Static<T>> {\n try {\n const compiler = getCompiledValidator(schema);\n\n if (compiler.Check(data)) {\n return { success: true, data: data as Static<T> };\n }\n\n // 收集错误\n const errors: ValidationError[] = [];\n for (const error of compiler.Errors(data)) {\n errors.push({\n path: error.path,\n message: error.message,\n code: \"VALIDATION_FAILED\",\n value: error.value,\n });\n }\n return { success: false, errors };\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : \"验证异常\",\n code: \"VALIDATION_EXCEPTION\",\n },\n ],\n };\n }\n}\n\n/**\n * 验证 Schema(抛出异常版本,用于框架内部)\n */\nexport function validateSchemaOrThrow<T extends TSchema>(\n schema: T,\n data: unknown,\n context: string,\n): Static<T> {\n const compiler = getCompiledValidator(schema);\n\n if (!compiler.Check(data)) {\n throw new Error(`${context}验证失败`);\n }\n\n return data as Static<T>;\n}\n\n/**\n * 快速验证(只返回布尔值)\n */\nexport function validateFast<T extends TSchema>(\n schema: T,\n data: unknown,\n): data is Static<T> {\n const compiler = getCompiledValidator(schema);\n return compiler.Check(data);\n}\n\n/**\n * 批量验证所有 Schema(用于请求验证)\n */\nexport function validateAllSchemas(\n config: SchemaConfig,\n data: {\n body: unknown;\n query: unknown;\n params: unknown;\n headers: unknown;\n cookies: unknown;\n },\n): typeof data {\n if (config.body) {\n validateSchemaOrThrow(config.body, data.body, \"请求体\");\n }\n if (config.query) {\n validateSchemaOrThrow(config.query, data.query, \"Query参数\");\n }\n if (config.params) {\n validateSchemaOrThrow(config.params, data.params, \"路径参数\");\n }\n if (config.headers) {\n validateSchemaOrThrow(config.headers, data.headers, \"请求头\");\n }\n if (config.cookies) {\n validateSchemaOrThrow(config.cookies, data.cookies, \"Cookie\");\n }\n return data;\n}\n\n/**\n * 预编译 Schema(启动时调用,避免首次请求开销)\n */\nexport function precompileSchemas(config: SchemaConfig): void {\n if (config.body) getCompiledValidator(config.body);\n if (config.query) getCompiledValidator(config.query);\n if (config.params) getCompiledValidator(config.params);\n if (config.headers) getCompiledValidator(config.headers);\n if (config.cookies) getCompiledValidator(config.cookies);\n}\n\n/**\n * 创建类型特化的验证器(高频使用场景)\n */\nexport function createValidator<T extends TSchema>(\n schema: T,\n): (data: unknown) => ValidationResult<Static<T>> {\n return (data: unknown) => validateSchema(schema, data);\n}\n\n/**\n * 获取缓存统计(调试用)\n */\nexport function getValidatorCacheStats(): { cacheType: string; note: string } {\n return {\n cacheType: \"WeakMap\",\n note: \"WeakMap 缓存会随 Schema 对象自动清理,无内存泄漏风险\",\n };\n}\n\n// 导出 TypeBox 类型\nexport { Type, Static, TSchema };\n"],"mappings":";;;;;;;;;;;;;;;AA2CA,MAAM,gCAAgB,IAAI,SAAsC;;;;AAOhE,SAAS,qBAAwC,QAAyB;CACxE,IAAI,WAAW,cAAc,IAAI,OAAO;AACxC,KAAI,CAAC,UAAU;AACb,aAAW,aAAa,QAAQ,OAAO;AACvC,gBAAc,IAAI,QAAQ,SAAS;;AAErC,QAAO;;;;;AAMT,SAAgB,eACd,QACA,MAC6B;AAC7B,KAAI;EACF,MAAM,WAAW,qBAAqB,OAAO;AAE7C,MAAI,SAAS,MAAM,KAAK,CACtB,QAAO;GAAE,SAAS;GAAY;GAAmB;EAInD,MAAM,SAA4B,EAAE;AACpC,OAAK,MAAM,SAAS,SAAS,OAAO,KAAK,CACvC,QAAO,KAAK;GACV,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,MAAM;GACN,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;GAAE,SAAS;GAAO;GAAQ;UAC1B,OAAO;AACd,SAAO;GACL,SAAS;GACT,QAAQ,CACN;IACE,MAAM;IACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;IAClD,MAAM;IACP,CACF;GACF;;;;;;AAOL,SAAgB,sBACd,QACA,MACA,SACW;AAGX,KAAI,CAFa,qBAAqB,OAAO,CAE/B,MAAM,KAAK,CACvB,OAAM,IAAI,MAAM,GAAG,QAAQ,MAAM;AAGnC,QAAO;;;;;AAMT,SAAgB,aACd,QACA,MACmB;AAEnB,QADiB,qBAAqB,OAAO,CAC7B,MAAM,KAAK;;;;;AAM7B,SAAgB,mBACd,QACA,MAOa;AACb,KAAI,OAAO,KACT,uBAAsB,OAAO,MAAM,KAAK,MAAM,MAAM;AAEtD,KAAI,OAAO,MACT,uBAAsB,OAAO,OAAO,KAAK,OAAO,UAAU;AAE5D,KAAI,OAAO,OACT,uBAAsB,OAAO,QAAQ,KAAK,QAAQ,OAAO;AAE3D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,MAAM;AAE5D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,SAAS;AAE/D,QAAO;;;;;AAMT,SAAgB,kBAAkB,QAA4B;AAC5D,KAAI,OAAO,KAAM,sBAAqB,OAAO,KAAK;AAClD,KAAI,OAAO,MAAO,sBAAqB,OAAO,MAAM;AACpD,KAAI,OAAO,OAAQ,sBAAqB,OAAO,OAAO;AACtD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;AACxD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;;;;;AAM1D,SAAgB,gBACd,QACgD;AAChD,SAAQ,SAAkB,eAAe,QAAQ,KAAK;;;;;AAMxD,SAAgB,yBAA8D;AAC5E,QAAO;EACL,WAAW;EACX,MAAM;EACP"}
1
+ {"version":3,"file":"validators-WXQ49LcR.mjs","names":[],"sources":["../src/utils/validators/validators.ts"],"sourcesContent":["/**\n * Schema 验证器 - 简洁版\n *\n * 特点:\n * - WeakMap 缓存避免内存泄漏\n * - TypeCompiler JIT 编译,性能最佳\n * - 支持 FormatRegistry(需确保同一实例)\n *\n * @version 7.0.0\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport { TypeCompiler, type TypeCheck } from \"@sinclair/typebox/compiler\";\nimport { Value } from \"@sinclair/typebox/value\";\n\n// ============== 类型定义 ==============\n\n/** Schema 配置接口 */\nexport interface SchemaConfig {\n body?: TSchema;\n query?: TSchema;\n params?: TSchema;\n headers?: TSchema;\n cookies?: TSchema;\n}\n\n/** 验证错误接口 */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n value?: unknown;\n}\n\n/** 验证结果 */\nexport type ValidationResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; errors: ValidationError[] };\n\n// ============== 缓存 ==============\n\n/** 编译器缓存 - WeakMap 避免内存泄漏 */\nconst compilerCache = new WeakMap<TSchema, TypeCheck<TSchema>>();\n\n// ============== 核心函数 ==============\n\n/**\n * 获取或创建编译后的验证器\n */\nfunction getCompiledValidator<T extends TSchema>(schema: T): TypeCheck<T> {\n let compiler = compilerCache.get(schema);\n if (!compiler) {\n compiler = TypeCompiler.Compile(schema);\n compilerCache.set(schema, compiler);\n }\n return compiler as TypeCheck<T>;\n}\n\n/**\n * 验证单个 Schema(返回结果对象)\n */\nexport function validateSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n): ValidationResult<Static<T>> {\n try {\n const compiler = getCompiledValidator(schema);\n\n if (compiler.Check(data)) {\n return { success: true, data: data as Static<T> };\n }\n\n // 收集错误\n const errors: ValidationError[] = [];\n for (const error of compiler.Errors(data)) {\n errors.push({\n path: error.path,\n message: error.message,\n code: \"VALIDATION_FAILED\",\n value: error.value,\n });\n }\n return { success: false, errors };\n } catch (error) {\n return {\n success: false,\n errors: [\n {\n path: \"\",\n message: error instanceof Error ? error.message : \"验证异常\",\n code: \"VALIDATION_EXCEPTION\",\n },\n ],\n };\n }\n}\n\n/**\n * 验证 Schema(抛出异常版本,用于框架内部)\n */\nexport function validateSchemaOrThrow<T extends TSchema>(\n schema: T,\n data: unknown,\n context: string,\n): Static<T> {\n const compiler = getCompiledValidator(schema);\n\n if (!compiler.Check(data)) {\n throw new Error(`${context}验证失败`);\n }\n\n return data as Static<T>;\n}\n\n/**\n * 快速验证(只返回布尔值)\n */\nexport function validateFast<T extends TSchema>(\n schema: T,\n data: unknown,\n): data is Static<T> {\n const compiler = getCompiledValidator(schema);\n return compiler.Check(data);\n}\n\n/**\n * 批量验证所有 Schema(用于请求验证)\n */\nexport function validateAllSchemas(\n config: SchemaConfig,\n data: {\n body: unknown;\n query: unknown;\n params: unknown;\n headers: unknown;\n cookies: unknown;\n },\n): typeof data {\n if (config.body) {\n validateSchemaOrThrow(config.body, data.body, \"请求体\");\n }\n if (config.query) {\n validateSchemaOrThrow(config.query, data.query, \"Query参数\");\n }\n if (config.params) {\n validateSchemaOrThrow(config.params, data.params, \"路径参数\");\n }\n if (config.headers) {\n validateSchemaOrThrow(config.headers, data.headers, \"请求头\");\n }\n if (config.cookies) {\n validateSchemaOrThrow(config.cookies, data.cookies, \"Cookie\");\n }\n return data;\n}\n\n/**\n * 预编译 Schema(启动时调用,避免首次请求开销)\n */\nexport function precompileSchemas(config: SchemaConfig): void {\n if (config.body) getCompiledValidator(config.body);\n if (config.query) getCompiledValidator(config.query);\n if (config.params) getCompiledValidator(config.params);\n if (config.headers) getCompiledValidator(config.headers);\n if (config.cookies) getCompiledValidator(config.cookies);\n}\n\n/**\n * 创建类型特化的验证器(高频使用场景)\n */\nexport function createValidator<T extends TSchema>(\n schema: T,\n): (data: unknown) => ValidationResult<Static<T>> {\n return (data: unknown) => validateSchema(schema, data);\n}\n\n/**\n * 获取缓存统计(调试用)\n */\nexport function getValidatorCacheStats(): { cacheType: string; note: string } {\n return {\n cacheType: \"WeakMap\",\n note: \"WeakMap 缓存会随 Schema 对象自动清理,无内存泄漏风险\",\n };\n}\n\n// 导出 TypeBox 类型\nexport { Type, Static, TSchema };\n"],"mappings":";;;;;;;;;;;;;;;AA2CA,MAAM,gCAAgB,IAAI,SAAsC;;;;AAOhE,SAAS,qBAAwC,QAAyB;CACxE,IAAI,WAAW,cAAc,IAAI,OAAO;AACxC,KAAI,CAAC,UAAU;AACb,aAAW,aAAa,QAAQ,OAAO;AACvC,gBAAc,IAAI,QAAQ,SAAS;;AAErC,QAAO;;;;;AAMT,SAAgB,eACd,QACA,MAC6B;AAC7B,KAAI;EACF,MAAM,WAAW,qBAAqB,OAAO;AAE7C,MAAI,SAAS,MAAM,KAAK,CACtB,QAAO;GAAE,SAAS;GAAY;GAAmB;EAInD,MAAM,SAA4B,EAAE;AACpC,OAAK,MAAM,SAAS,SAAS,OAAO,KAAK,CACvC,QAAO,KAAK;GACV,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,MAAM;GACN,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;GAAE,SAAS;GAAO;GAAQ;UAC1B,OAAO;AACd,SAAO;GACL,SAAS;GACT,QAAQ,CACN;IACE,MAAM;IACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;IAClD,MAAM;IACP,CACF;GACF;;;;;;AAOL,SAAgB,sBACd,QACA,MACA,SACW;AAGX,KAAI,CAFa,qBAAqB,OAAO,CAE/B,MAAM,KAAK,CACvB,OAAM,IAAI,MAAM,GAAG,QAAQ,MAAM;AAGnC,QAAO;;;;;AAMT,SAAgB,aACd,QACA,MACmB;AAEnB,QADiB,qBAAqB,OAAO,CAC7B,MAAM,KAAK;;;;;AAM7B,SAAgB,mBACd,QACA,MAOa;AACb,KAAI,OAAO,KACT,uBAAsB,OAAO,MAAM,KAAK,MAAM,MAAM;AAEtD,KAAI,OAAO,MACT,uBAAsB,OAAO,OAAO,KAAK,OAAO,UAAU;AAE5D,KAAI,OAAO,OACT,uBAAsB,OAAO,QAAQ,KAAK,QAAQ,OAAO;AAE3D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,MAAM;AAE5D,KAAI,OAAO,QACT,uBAAsB,OAAO,SAAS,KAAK,SAAS,SAAS;AAE/D,QAAO;;;;;AAMT,SAAgB,kBAAkB,QAA4B;AAC5D,KAAI,OAAO,KAAM,sBAAqB,OAAO,KAAK;AAClD,KAAI,OAAO,MAAO,sBAAqB,OAAO,MAAM;AACpD,KAAI,OAAO,OAAQ,sBAAqB,OAAO,OAAO;AACtD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;AACxD,KAAI,OAAO,QAAS,sBAAqB,OAAO,QAAQ;;;;;AAM1D,SAAgB,gBACd,QACgD;AAChD,SAAQ,SAAkB,eAAe,QAAQ,KAAK;;;;;AAMxD,SAAgB,yBAA8D;AAC5E,QAAO;EACL,WAAW;EACX,MAAM;EACP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vafast",
3
- "version": "0.4.4",
3
+ "version": "0.4.6",
4
4
  "description": "极简结构化Web框架,支持 Bun 和 Node.js。Go风格,函数优先。",
5
5
  "type": "module",
6
6
  "repository": {
@@ -1,59 +0,0 @@
1
- import { t as __esmMin } from "./chunk-DW4-Jl94.mjs";
2
- import { a as mapResponse, i as json, r as init_response } from "./response-DXg4i_yh.mjs";
3
-
4
- //#region src/middleware.ts
5
- /**
6
- * 组合类型: 自动注入错误处理器进行中间件组合
7
- */
8
- function composeMiddleware(middleware, finalHandler) {
9
- const all = [errorHandler, ...middleware];
10
- return function composedHandler(req) {
11
- let i = -1;
12
- const dispatch = (index) => {
13
- if (index <= i) return Promise.reject(/* @__PURE__ */ new Error("next() called multiple times"));
14
- i = index;
15
- if (index < all.length) {
16
- const mw = all[index];
17
- return Promise.resolve(mw(req, () => dispatch(index + 1)));
18
- }
19
- return Promise.resolve(finalHandler(req)).then(mapResponse);
20
- };
21
- return dispatch(0);
22
- };
23
- }
24
- var VafastError, errorHandler;
25
- var init_middleware = __esmMin((() => {
26
- init_response();
27
- VafastError = class extends Error {
28
- status;
29
- type;
30
- expose;
31
- constructor(message, options = {}) {
32
- super(message);
33
- this.name = "VafastError";
34
- this.status = options.status ?? 500;
35
- this.type = options.type ?? "internal_error";
36
- this.expose = options.expose ?? false;
37
- if (options.cause) this.cause = options.cause;
38
- }
39
- };
40
- errorHandler = async (req, next) => {
41
- try {
42
- return await next();
43
- } catch (err) {
44
- console.error("未处理的错误:", err);
45
- if (err instanceof VafastError) return json({
46
- error: err.type,
47
- message: err.expose ? err.message : "发生了一个错误"
48
- }, err.status);
49
- return json({
50
- error: "internal_error",
51
- message: "出现了一些问题"
52
- }, 500);
53
- }
54
- };
55
- }));
56
-
57
- //#endregion
58
- export { composeMiddleware as n, init_middleware as r, VafastError as t };
59
- //# sourceMappingURL=middleware-Byp3Hjae.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware-Byp3Hjae.mjs","names":[],"sources":["../src/middleware.ts"],"sourcesContent":["// src/middleware.ts\n\nimport { json, mapResponse } from \"./utils/response\";\n\nimport type { Handler, Middleware } from \"./types\";\n/** 中间件类型:使用 next() 传递给下一个处理 */\n\n/** Vafast 自定义错误类型 */\nexport class VafastError extends Error {\n status: number;\n type: string;\n expose: boolean;\n\n constructor(\n message: string,\n options: {\n status?: number;\n type?: string;\n expose?: boolean;\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = \"VafastError\";\n this.status = options.status ?? 500;\n this.type = options.type ?? \"internal_error\";\n this.expose = options.expose ?? false;\n if (options.cause) (this as any).cause = options.cause;\n }\n}\n\n/**\n * 组合类型: 自动注入错误处理器进行中间件组合\n */\nexport function composeMiddleware(\n middleware: Middleware[],\n finalHandler: Handler,\n): (req: Request) => Promise<Response> {\n const all = [errorHandler, ...middleware];\n\n return function composedHandler(req: Request): Promise<Response> {\n let i = -1;\n\n const dispatch = (index: number): Promise<Response> => {\n if (index <= i)\n return Promise.reject(new Error(\"next() called multiple times\"));\n i = index;\n\n // 中间件阶段\n if (index < all.length) {\n const mw = all[index];\n return Promise.resolve(mw(req, () => dispatch(index + 1)));\n }\n\n // 最终 handler - 使用 mapResponse 转换返回值\n return Promise.resolve(finalHandler(req)).then(mapResponse);\n };\n\n return dispatch(0);\n };\n}\n\n/** 默认包含的全局错误处理器 */\nconst errorHandler: Middleware = async (req, next) => {\n try {\n return await next();\n } catch (err) {\n console.error(\"未处理的错误:\", err);\n\n if (err instanceof VafastError) {\n return json(\n {\n error: err.type,\n message: err.expose ? err.message : \"发生了一个错误\",\n },\n err.status,\n );\n }\n\n return json({ error: \"internal_error\", message: \"出现了一些问题\" }, 500);\n }\n};\n"],"mappings":";;;;;;;AAkCA,SAAgB,kBACd,YACA,cACqC;CACrC,MAAM,MAAM,CAAC,cAAc,GAAG,WAAW;AAEzC,QAAO,SAAS,gBAAgB,KAAiC;EAC/D,IAAI,IAAI;EAER,MAAM,YAAY,UAAqC;AACrD,OAAI,SAAS,EACX,QAAO,QAAQ,uBAAO,IAAI,MAAM,+BAA+B,CAAC;AAClE,OAAI;AAGJ,OAAI,QAAQ,IAAI,QAAQ;IACtB,MAAM,KAAK,IAAI;AACf,WAAO,QAAQ,QAAQ,GAAG,WAAW,SAAS,QAAQ,EAAE,CAAC,CAAC;;AAI5D,UAAO,QAAQ,QAAQ,aAAa,IAAI,CAAC,CAAC,KAAK,YAAY;;AAG7D,SAAO,SAAS,EAAE;;;;;gBAxD+B;CAMxC,cAAb,cAAiC,MAAM;EACrC;EACA;EACA;EAEA,YACE,SACA,UAKI,EAAE,EACN;AACA,SAAM,QAAQ;AACd,QAAK,OAAO;AACZ,QAAK,SAAS,QAAQ,UAAU;AAChC,QAAK,OAAO,QAAQ,QAAQ;AAC5B,QAAK,SAAS,QAAQ,UAAU;AAChC,OAAI,QAAQ,MAAO,CAAC,KAAa,QAAQ,QAAQ;;;CAoC/C,eAA2B,OAAO,KAAK,SAAS;AACpD,MAAI;AACF,UAAO,MAAM,MAAM;WACZ,KAAK;AACZ,WAAQ,MAAM,WAAW,IAAI;AAE7B,OAAI,eAAe,YACjB,QAAO,KACL;IACE,OAAO,IAAI;IACX,SAAS,IAAI,SAAS,IAAI,UAAU;IACrC,EACD,IAAI,OACL;AAGH,UAAO,KAAK;IAAE,OAAO;IAAkB,SAAS;IAAW,EAAE,IAAI"}
@@ -1,21 +0,0 @@
1
- //#region src/utils/response.d.ts
2
- /** 生成 JSON 响应 */
3
- declare function json(data: unknown, status?: number, headers?: HeadersInit): Response;
4
- /**
5
- * 类型特化的响应映射
6
- * 根据返回值类型直接生成 Response,避免不必要的检查
7
- */
8
- declare function mapResponse(response: unknown): Response;
9
- /** 生成重定向响应 */
10
- declare function redirect(location: string, status?: 301 | 302): Response;
11
- /** 生成纯文本响应 */
12
- declare function text(content: string, status?: number, headers?: HeadersInit): Response;
13
- /** 生成HTML响应 */
14
- declare function html(content: string, status?: number, headers?: HeadersInit): Response;
15
- /** 生成空响应(204 No Content) */
16
- declare function empty(status?: number, headers?: HeadersInit): Response;
17
- /** 生成流式响应 */
18
- declare function stream(stream: ReadableStream, status?: number, headers?: HeadersInit): Response;
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-A-sZZiJ7.d.mts.map